Handle hostnames with upper-case letters
[webmin.git] / custom / save_cmd.cgi
1 #!/usr/local/bin/perl
2 # save_cmd.cgi
3 # Save, create or delete a custom command
4
5 require './custom-lib.pl';
6 &ReadParse();
7
8 $access{'edit'} || &error($text{'save_ecannot'});
9 if ($in{'delete'}) {
10         $cmd = &get_command($in{'id'}, $in{'idx'});
11         &delete_command($cmd);
12         &webmin_log("delete", "command", $cmd->{'id'}, $cmd);
13         &redirect("");
14         }
15 elsif ($in{'clone'}) {
16         &redirect("edit_cmd.cgi?id=$in{'id'}&idx=$in{'idx'}&clone=1&new=1");
17         }
18 else {
19         &error_setup($text{'save_err'});
20         if (!$in{'new'}) {
21                 $cmd = &get_command($in{'id'}, $in{'idx'});
22                 }
23         else {
24                 $cmd = { 'id' => time() };
25                 }
26
27         # parse and validate inputs
28         $in{'cmd'} =~ s/\r//g;
29         $in{'cmd'} =~ s/\n/ /g;
30         $in{'cmd'} =~ /\S/ || &error($text{'save_ecmd'});
31         if ($in{'dir_def'}) {
32                 $cmd->{'cmd'} = $in{'cmd'};
33                 }
34         else {
35                 $in{'dir'} =~ /^\S+$/ || &error($text{'save_edir'});
36                 $cmd->{'cmd'} = "cd $in{'dir'} ; $in{'cmd'}";
37                 }
38         $in{'order_def'} || $in{'order'} =~ /^\-?(\d+)$/ ||
39                 &error($text{'save_eorder'});
40         $in{'timeout_def'} || $in{'timeout'} =~ /^(\d+)$/ ||
41                 &error($text{'save_etimeout'});
42         $cmd->{'desc'} = $in{'desc'};
43         $in{'html'} =~ s/\r//g;
44         $in{'html'} =~ s/\n*/\n/;
45         $cmd->{'html'} = $in{'html'};
46         if (&supports_users()) {
47                 $in{'user_def'} || (@u = getpwnam($in{'user'})) ||
48                         &error($text{'save_euser'});
49                 $cmd->{'user'} = $in{'user_def'} ? "*" : $in{'user'};
50                 $cmd->{'su'} = $in{'su'};
51                 }
52         else {
53                 $cmd->{'user'} = 'root';
54                 }
55         $cmd->{'raw'} = $in{'raw'};
56         $cmd->{'order'} = $in{'order_def'} ? 0 : int($in{'order'});
57         $cmd->{'timeout'} = $in{'timeout_def'} ? 0 : int($in{'timeout'});
58         $cmd->{'clear'} = $in{'clear'};
59         if ($in{'format_def'} == 0) {
60                 delete($cmd->{'format'});
61                 }
62         elsif ($in{'format_def'} == 2) {
63                 $cmd->{'format'} = 'redirect';
64                 }
65         else {
66                 $in{'format'} =~ /^[a-z0-9\.\_\-]+\/[a-z0-9\.\_\-]+/i ||
67                         &error($text{'save_eformat'});
68                 $cmd->{'format'} = $in{'format'};
69                 }
70         $cmd->{'noshow'} = $in{'noshow'};
71         $cmd->{'usermin'} = $in{'usermin'};
72         @hosts = split(/\0/, $in{'hosts'});
73         if (!@hosts || (@hosts == 1 && $hosts[0] eq "0")) {
74                 delete($cmd->{'hosts'});
75                 }
76         else {
77                 $cmd->{'usermin'} && &error($text{'save_eusermin'});
78                 $cmd->{'hosts'} = \@hosts;
79                 }
80         &parse_params_inputs($cmd);
81         &save_command($cmd);
82         &webmin_log($in{'new'} ? "create" : "modify", "command",
83                     $cmd->{'id'}, $cmd);
84
85         if ($in{'new'} && $access{'cmds'} ne '*') {
86                 $access{'cmds'} .= " ".$cmd->{'id'};
87                 &save_module_acl(\%access);
88                 }
89         &redirect("");
90         }
91