Handle hostnames with upper-case letters
[webmin.git] / status / save_mon.cgi
1 #!/usr/local/bin/perl
2 # save_mon.cgi
3 # Create, update or delete a monitor
4
5 require './status-lib.pl';
6 $access{'edit'} || &error($text{'mon_ecannot'});
7 &ReadParse();
8 if ($in{'type'}) {
9         $serv->{'type'} = $in{'type'};
10         $serv->{'id'} = time();
11         }
12 else {
13         $serv = &get_service($in{'id'});
14         $serv->{'oldremote'} = $serv->{'remote'};
15         }
16
17 if ($in{'delete'}) {
18         # Delete the monitor
19         &delete_service($serv);
20         &webmin_log("delete", undef, $serv->{'id'}, $serv);
21         }
22 elsif ($in{'newclone'}) {
23         # Redirect to creation form, in clone mode
24         &redirect("edit_mon.cgi?type=$serv->{'type'}&clone=$in{'id'}");
25         exit(0);
26         }
27 else {
28         # Parse and validate inputs
29         &error_setup($text{'mon_err'});
30         $in{'desc'} || &error($text{'mon_edesc'});
31         $serv->{'desc'} = $in{'desc'};
32
33         # Make sure remote monitors exist on remote systems
34         @remotes = split(/\0/, $in{'remotes'});
35         $newremote = join(" ", @remotes);
36         if ($in{'type'} || $serv->{'remote'} ne $newremote) {
37                 # Only need to check for new monitors
38                 foreach $r (@remotes) {
39                         next if ($r eq "*");
40                         eval { local $main::error_must_die = 1;
41                                $ch = &remote_foreign_check($r, 'status') };
42                         &error(&text('mon_elogin', $r))
43                             if ($@ =~ /invalid.*login/i || $@ =~ /HTTP.*401/i);
44                         if ($@) {
45                                 # If down, let it go for now as we can't really
46                                 # check what is installed
47                                 next;
48                                 #$err = $@;
49                                 #$err =~ s/\s+at\s.*\sline\s+(\d+).*$//;
50                                 #&error(&text('mon_eremote2', $r, $err));
51                                 }
52                         $ch || &error(&text('mon_estatus', $r));
53                         &remote_foreign_require($r, 'status',
54                                                 'status-lib.pl');
55                         if ($in{'type'} =~ /^(\S+)::(\S+)$/) {
56                                 # Check if module is installed
57                                 $ok = &remote_foreign_call(
58                                   $r, 'status', "foreign_check", $1);
59                                 }
60                         else {
61                                 $ok = &remote_eval($r, 'status',
62                                    "-r \"\$root_directory/status/$serv->{'type'}-monitor.pl\"");
63                                 }
64                         $ok || &error(&text('mon_ertype', $r));
65                         }
66                 }
67         $serv->{'remote'} = $newremote;
68         $serv->{'groups'} = join(" ", split(/\0/, $in{'groups'}));
69         $serv->{'remote'} || $serv->{'groups'} ||
70                 &error($text{'mon_enoremote'});
71
72         $serv->{'nosched'} = $in{'nosched'};
73         $serv->{'notify'} = join(" ", split(/\0/, $in{'notify'}));
74         $serv->{'ondown'} = $in{'ondown'};
75         $serv->{'onup'} = $in{'onup'};
76         $serv->{'ontimeout'} = $in{'ontimeout'};
77         $serv->{'runon'} = $in{'runon'};
78         $serv->{'clone'} = $in{'clone'};
79         $in{'fails'} =~ /^\d+$/ || &error($text{'mon_efails'});
80         $serv->{'fails'} = $in{'fails'};
81         $serv->{'email'} = $in{'email'};
82         $serv->{'tmpl'} = $in{'tmpl'};
83         $type = $serv->{'type'};
84         if ($in{'depend'} && $in{'depend'} eq $serv->{'id'}) {
85                 &error($text{'mon_edepend'});
86                 }
87         $serv->{'depend'} = $in{'depend'};
88
89         # Parse inputs for this monitor type
90         if ($type =~ /^(\S+)::(\S+)$/) {
91                 # From another module
92                 ($mod, $mtype) = ($1, $2);
93                 &foreign_require($mod, "status_monitor.pl");
94                 &foreign_call($mod, "status_monitor_parse", $mtype, $serv,\%in);
95                 }
96         else {
97                 # From this module
98                 do "./${type}-monitor.pl";
99                 $func = "parse_${type}_dialog";
100                 if (defined(&$func)) {
101                         &$func($serv);
102                         }
103                 }
104
105         # Save or create the monitor
106         &save_service($serv);
107         &webmin_log($in{'type'} ? "create" : "modify", undef,
108                     $serv->{'id'}, $serv);
109         }
110 &redirect("");
111