Handle hostnames with upper-case letters
[webmin.git] / init / save_action.cgi
1 #!/usr/local/bin/perl
2 # save_action.cgi
3 # Save or create an action
4
5 require './init-lib.pl';
6 &error_setup($text{'save_err'});
7 &ReadParseMime();
8
9 # Redirect to other CGIs for delete / start / stop
10 if ($in{'delete'} && $in{'old'}) {
11         &redirect("delete_action.cgi?type=".&urlize($in{'type'}).
12                   "&action=".&urlize($in{'old'}).
13                   "&runlevel=".&urlize($in{'runlevel'}).
14                   "&startstop=".&urlize($in{'startstop'}).
15                   "&number=".&urlize($in{'number'}));
16         }
17 elsif ($in{'old'}) {
18         foreach $a (@action_buttons) {
19                 if ($in{$a}) {
20                         &redirect("start_stop.cgi?file=".&urlize($in{'file'}).
21                                   "&name=".&urlize($in{'old'})."&$a=1".
22                                   "&back=".&urlize($in{'back'}));
23                         exit;
24                         }
25                 }
26         }
27
28 $access{'bootup'} == 1 || &error($text{'save_ecannot'});
29
30 # Check inputs
31 $in{'extra'} || $in{name} =~ /^[A-z0-9\_\-\.]+$/ ||
32         &error($text{'save_ename'});
33 $dig = $config{'order_digits'};
34 foreach $rl (&list_runlevels()) {
35         # If no priority was given for start/stop, make it 99
36         if ($in{"S$rl"}) {
37                 if (!$in{"pri_S$rl"}) {
38                         $in{"pri_S$rl"} = "9" x $dig;
39                         }
40                 else {
41                         $in{"pri_S$rl"} = sprintf "%${dig}.${dig}d",
42                                                   $in{"pri_S$rl"};
43                         }
44                 }
45         if ($in{"K$rl"}) {
46                 if (!$in{"pri_K$rl"}) {
47                         $in{"pri_K$rl"} = "9" x $dig;
48                         }
49                 else {
50                         $in{"pri_K$rl"} = sprintf "%${dig}.${dig}d",
51                                                   $in{"pri_K$rl"};
52                         }
53                 }
54         }
55
56 if ($in{'old'} && $in{'type'} == 0) {
57         # Changing a 'sane' action
58         local $dd = $config{'daemons_dir'};
59         $in{data} =~ s/\r//g;
60         if ($in{old} ne $in{name}) {
61                 # Need to rename the action..
62                 if (-r &action_filename($in{name})) {
63                         &error(&text('save_ealready', $in{name}));
64                         }
65                 &rename_action($in{old}, $in{name});
66                 if ($dd) {
67                         # Need to rename the caldera daemons file too
68                         &rename_logged("$dd/$in{old}", "$dd/$in{name}");
69                         &lock_file("$dd/$in{'name'}");
70                         &read_env_file("$dd/$in{name}", \%daemon);
71                         $daemon{'IDENT'} = $in{'name'}
72                                 if ($daemon{'IDENT'} eq $in{'old'});
73                         &write_env_file("$dd/$in{name}", \%daemon);
74                         }
75                 }
76         &lock_file("$dd/$in{'name'}") if ($dd);
77         $file = &action_filename($in{name});
78         &lock_file($file);
79         foreach (&action_levels('S', $in{name})) {
80                 /^(\S+)\s+(\S+)\s+(\S+)$/;
81                 $slvl{$1} = $2;
82                 }
83         foreach (&action_levels('K', $in{name})) {
84                 /^(\S+)\s+(\S+)\s+(\S+)$/;
85                 $klvl{$1} = $2;
86                 }
87         if ($config{'expert'}) {
88                 # Update all runlevels
89                 foreach $rl (&list_runlevels()) {
90                         if ($in{"S$rl"} && !$slvl{$rl}) {
91                                 &add_rl_action($in{name}, $rl,
92                                                'S', $in{"pri_S$rl"});
93                                 }
94                         elsif (!$in{"S$rl"} && $slvl{$rl}) {
95                                 &delete_rl_action($in{name}, $rl, 'S');
96                                 }
97                         elsif ($in{"pri_S$rl"} != $slvl{$rl}) {
98                                 &reorder_rl_action($in{name}, $rl,
99                                                    'S', $in{"pri_S$rl"});
100                                 }
101                         if ($in{"K$rl"} && !$klvl{$rl}) {
102                                 &add_rl_action($in{name}, $rl,
103                                                'K', $in{"pri_K$rl"});
104                                 }
105                         elsif (!$in{"K$rl"} && $klvl{$rl}) {
106                                 &delete_rl_action($in{name}, $rl, 'K');
107                                 }
108                         elsif ($in{"pri_K$rl"} != $klvl{$rl}) {
109                                 &reorder_rl_action($in{name}, $rl,
110                                                    'K',$in{"pri_K$rl"});
111                                 }
112                         }
113
114                 if (defined($in{'boot'}) && $dd) {
115                         # Update onboot flag in daemons file
116                         &read_env_file("$dd/$in{'name'}", \%daemon);
117                         $daemon{'ONBOOT'} = $in{'boot'} ? 'yes' : 'no';
118                         &write_env_file("$dd/$in{'name'}", \%daemon);
119                         }
120                 }
121         else {
122                 # Just change whether it gets started or not
123                 if ($in{'boot'} && !$in{'oldboot'}) {
124                         &enable_at_boot($in{'name'});
125                         }
126                 elsif (!$in{'boot'} && $in{'oldboot'}) {
127                         &disable_at_boot($in{'name'});
128                         }
129                 }
130         &open_tempfile(ACTION, ">$file");
131         &print_tempfile(ACTION, $in{data});
132         &close_tempfile(ACTION);
133         &unlock_file($file);
134         &unlock_file("$dd/$in{'name'}") if ($dd);
135         delete($in{'data'});
136         &webmin_log("modify", "action", $in{'name'}, \%in);
137         }
138 elsif ($in{'old'} && $in{'type'} == 1) {
139         # Changing an odd action
140         $in{data} =~ s/\r//g;
141         $file = &runlevel_filename($in{runlevel}, $in{startstop},
142                                    $in{number}, $in{name});
143         &lock_file($file);
144         if ($in{old} ne $in{name}) {
145                 if (-r &action_filename($in{name})) {
146                         &error("An action called $in{name} already exists");
147                         }
148                 &rename_rl_action($in{runlevel}, $in{startstop}, $in{number},
149                                   $in{old}, $in{name});
150                 }
151         &open_tempfile(ACTION, ">$file");
152         &print_tempfile(ACTION, $in{data});
153         &close_tempfile(ACTION);
154         &unlock_file($file);
155         delete($in{'data'});
156         &webmin_log("modify", "action", $in{'name'}, \%in);
157         }
158 else {
159         # Creating a new action, and add it to multiple runlevels
160         if (-r &action_filename($in{name})) {
161                 &error(&text('save_ealready', $in{name}));
162                 }
163         @start = &get_start_runlevels();
164         &lock_file(&action_filename($in{name}));
165         $in{desc} =~ s/\r//g; $in{start} =~ s/\r//g; $in{stop} =~ s/\r//g;
166         $data = "#!/bin/sh\n";
167         if ($config{'chkconfig'}) {
168                 # Redhat-style description: and chkconfig: lines
169                 $desc = "description:";
170                 foreach (split(/\n/, $in{desc})) {
171                         $data .= "# $desc $_\n";
172                         $desc = " " x length($desc);
173                         }
174                 $startorder = "9" x $dig;
175                 $stoporder = "0" x $dig;
176                 foreach $rl (&list_runlevels()) {
177                         $startorder = $in{"pri_S$rl"} if ($in{"S$rl"});
178                         $stoporder = $in{"pri_K$rl"} if ($in{"K$rl"});
179                         }
180                 $data .= "# chkconfig: $config{'chkconfig'} ".
181                          "$startorder $stoporder\n";
182                 }
183         elsif ($config{'init_info'}) {
184                 # Suse-style init info section
185                 $data .= "### BEGIN INIT INFO\n".
186                          "# Provides: $in{'name'}\n".
187                          "# Required-Start: \$network\n".
188                          "# Required-Stop: \$network\n".
189                          "# Default-Start: ".join(" ", @start)."\n".
190                          "# Description: $in{'desc'}\n".
191                          "### END INIT INFO\n";
192                 }
193         else {
194                 foreach (split(/\n/, $in{'desc'})) {
195                         $data .= "# $_\n";
196                         }
197                 }
198         $data .= "\ncase \"\$1\" in\n";
199         if ($config{'start_stop_msg'}) {
200                 $data .= "'start_msg')\n";
201                 $data .= "\techo \"$in{'start_msg'}\"\n";
202                 $data .= "\t;;\n";
203                 $data .= "'stop_msg')\n";
204                 $data .= "\techo \"$in{'stop_msg'}\"\n";
205                 $data .= "\t;;\n";
206                 }
207         $subsys = $config{'subsys'};
208         $data .= "'start')\n";
209         foreach (split(/\n/, $in{start})) {
210                 $data .= "\t$_\n";
211                 }
212         if ($subsys) {
213                 $data .= "\ttouch $subsys/$in{'name'}\n";
214                 }
215         $data .= "\t;;\n";
216         $data .= "'stop')\n";
217         foreach (split(/\n/, $in{stop})) {
218                 $data .= "\t$_\n";
219                 }
220         if ($subsys) {
221                 $data .= "\trm -f $subsys/$in{'name'}\n";
222                 }
223         $data .= "\t;;\n";
224         $data .= "*)\n";
225         if ($config{'start_stop_msg'}) {
226                 $data .= "\techo \"Usage: \$0 { start | stop | start_msg | stop_msg }\"\n";
227                 }
228         else {
229                 $data .= "\techo \"Usage: \$0 { start | stop }\"\n";
230                 }
231         $data .= "\t;;\n";
232         $data .= "esac\n";
233         $data .= "exit 0\n";
234         $file = &action_filename($in{name});
235         &open_tempfile(ACTION, ">$file");
236         &print_tempfile(ACTION, $data);
237         &close_tempfile(ACTION);
238         chmod(0755, $file);
239
240         if ($config{'expert'}) {
241                 # Make links from runlevels
242                 foreach $rl (&list_runlevels()) {
243                         if ($in{"S$rl"}) {
244                                 &add_rl_action($in{name}, $rl, 'S',
245                                                $in{"pri_S$rl"});
246                                 }
247                         if ($in{"K$rl"}) {
248                                 &add_rl_action($in{name}, $rl, 'K',
249                                                $in{"pri_K$rl"});
250                                 }
251                         }
252                 }
253         else {
254                 # Just make one runlevel link
255                 if ($in{'boot'}) {
256                         &enable_at_boot($in{'name'});
257                         }
258                 }
259         &unlock_file(&action_filename($in{name}));
260         delete($in{'data'});
261         &webmin_log("create", "action", $in{'name'}, \%in);
262         }
263 &redirect("");
264