3 # Save or create an action
5 require './init-lib.pl';
6 &error_setup($text{'save_err'});
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'}));
18 foreach $a (@action_buttons) {
20 &redirect("start_stop.cgi?file=".&urlize($in{'file'}).
21 "&name=".&urlize($in{'old'})."&$a=1".
22 "&back=".&urlize($in{'back'}));
28 $access{'bootup'} == 1 || &error($text{'save_ecannot'});
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
37 if (!$in{"pri_S$rl"}) {
38 $in{"pri_S$rl"} = "9" x $dig;
41 $in{"pri_S$rl"} = sprintf "%${dig}.${dig}d",
46 if (!$in{"pri_K$rl"}) {
47 $in{"pri_K$rl"} = "9" x $dig;
50 $in{"pri_K$rl"} = sprintf "%${dig}.${dig}d",
56 if ($in{'old'} && $in{'type'} == 0) {
57 # Changing a 'sane' action
58 local $dd = $config{'daemons_dir'};
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}));
65 &rename_action($in{old}, $in{name});
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);
76 &lock_file("$dd/$in{'name'}") if ($dd);
77 $file = &action_filename($in{name});
79 foreach (&action_levels('S', $in{name})) {
80 /^(\S+)\s+(\S+)\s+(\S+)$/;
83 foreach (&action_levels('K', $in{name})) {
84 /^(\S+)\s+(\S+)\s+(\S+)$/;
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"});
94 elsif (!$in{"S$rl"} && $slvl{$rl}) {
95 &delete_rl_action($in{name}, $rl, 'S');
97 elsif ($in{"pri_S$rl"} != $slvl{$rl}) {
98 &reorder_rl_action($in{name}, $rl,
99 'S', $in{"pri_S$rl"});
101 if ($in{"K$rl"} && !$klvl{$rl}) {
102 &add_rl_action($in{name}, $rl,
103 'K', $in{"pri_K$rl"});
105 elsif (!$in{"K$rl"} && $klvl{$rl}) {
106 &delete_rl_action($in{name}, $rl, 'K');
108 elsif ($in{"pri_K$rl"} != $klvl{$rl}) {
109 &reorder_rl_action($in{name}, $rl,
110 'K',$in{"pri_K$rl"});
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);
122 # Just change whether it gets started or not
123 if ($in{'boot'} && !$in{'oldboot'}) {
124 &enable_at_boot($in{'name'});
126 elsif (!$in{'boot'} && $in{'oldboot'}) {
127 &disable_at_boot($in{'name'});
130 &open_tempfile(ACTION, ">$file");
131 &print_tempfile(ACTION, $in{data});
132 &close_tempfile(ACTION);
134 &unlock_file("$dd/$in{'name'}") if ($dd);
136 &webmin_log("modify", "action", $in{'name'}, \%in);
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});
144 if ($in{old} ne $in{name}) {
145 if (-r &action_filename($in{name})) {
146 &error("An action called $in{name} already exists");
148 &rename_rl_action($in{runlevel}, $in{startstop}, $in{number},
149 $in{old}, $in{name});
151 &open_tempfile(ACTION, ">$file");
152 &print_tempfile(ACTION, $in{data});
153 &close_tempfile(ACTION);
156 &webmin_log("modify", "action", $in{'name'}, \%in);
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}));
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);
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"});
180 $data .= "# chkconfig: $config{'chkconfig'} ".
181 "$startorder $stoporder\n";
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";
194 foreach (split(/\n/, $in{'desc'})) {
198 $data .= "\ncase \"\$1\" in\n";
199 if ($config{'start_stop_msg'}) {
200 $data .= "'start_msg')\n";
201 $data .= "\techo \"$in{'start_msg'}\"\n";
203 $data .= "'stop_msg')\n";
204 $data .= "\techo \"$in{'stop_msg'}\"\n";
207 $subsys = $config{'subsys'};
208 $data .= "'start')\n";
209 foreach (split(/\n/, $in{start})) {
213 $data .= "\ttouch $subsys/$in{'name'}\n";
216 $data .= "'stop')\n";
217 foreach (split(/\n/, $in{stop})) {
221 $data .= "\trm -f $subsys/$in{'name'}\n";
225 if ($config{'start_stop_msg'}) {
226 $data .= "\techo \"Usage: \$0 { start | stop | start_msg | stop_msg }\"\n";
229 $data .= "\techo \"Usage: \$0 { start | stop }\"\n";
234 $file = &action_filename($in{name});
235 &open_tempfile(ACTION, ">$file");
236 &print_tempfile(ACTION, $data);
237 &close_tempfile(ACTION);
240 if ($config{'expert'}) {
241 # Make links from runlevels
242 foreach $rl (&list_runlevels()) {
244 &add_rl_action($in{name}, $rl, 'S',
248 &add_rl_action($in{name}, $rl, 'K',
254 # Just make one runlevel link
256 &enable_at_boot($in{'name'});
259 &unlock_file(&action_filename($in{name}));
261 &webmin_log("create", "action", $in{'name'}, \%in);