Handle hostnames with upper-case letters
[webmin.git] / status / edit_mon.cgi
1 #!/usr/local/bin/perl
2 # edit_mon.cgi
3 # Display a form for editing or creating a monitor
4
5 require './status-lib.pl';
6 $access{'edit'} || &error($text{'mon_ecannot'});
7 &foreign_require("servers", "servers-lib.pl");
8 &ReadParse();
9 @handlers = &list_handlers();
10 if ($in{'type'}) {
11         # Create a new monitor
12         $type = $in{'type'};
13         $title = $text{'mon_create'};
14         if ($in{'clone'}) {
15                 # Clone of existing
16                 $serv = &get_service($in{'clone'});
17                 }
18         else {
19                 # Totally new
20                 $serv = { 'notify' => 'email pager snmp sms',
21                           'fails' => 1,
22                           'nosched' => 0,
23                           'remote' => '*' };
24                 }
25         }
26 else {
27         # Editing an existing monitor
28         $serv = &get_service($in{'id'});
29         $type = $serv->{'type'};
30         $title = $text{'mon_edit'};
31         }
32 ($han) = grep { $_->[0] eq $type } @handlers;
33 if ($in{'type'} && !$in{'clone'}) {
34         $serv->{'desc'} = $han->[1];
35         }
36 &ui_print_header($han->[1], $title, "");
37
38 print &ui_form_start("save_mon.cgi", "post");
39 print &ui_hidden("type", $in{'type'}),"\n";
40 print &ui_hidden("id", $in{'id'}),"\n";
41 @tds = ( "width=30%" );
42 print &ui_table_start($text{'mon_header'}, "width=100%", 2, \@tds);
43
44 # Check for clone modules of the monitor type
45 if (-d "../$type") {
46         local @st = stat("../$type");
47         opendir(DIR, "..");
48         foreach $m (readdir(DIR)) {
49                 local @lst = stat("../$m");
50                 if (-l "../$m" && $st[1] == $lst[1]) {
51                         # found a clone
52                         push(@clones, $m);
53                         }
54                 }
55         }
56
57 # Show input for description
58 print &ui_table_row($text{'mon_desc'},
59                     &ui_textbox("desc", $serv->{'desc'}, 50),
60                     undef, \@tds);
61
62 # Show current status
63 if (!$in{'type'}) {
64         @stats = &service_status($serv, 1);
65         $stable = "<table cellpadding=1 cellspacing=1>\n";
66         foreach $stat (@stats) {
67                 $stable .= "<tr>\n";
68                 if (@stats > 1 || $stat->{'remote'} ne "*") {
69                         $stable .=
70                             "<td>".
71                             ($stat->{'remote'} eq "*" ? $text{'mon_local'}
72                                                       : $stat->{'remote'}).
73                             "</td>\n";
74                         $stable .= "<td>:</td>\n";
75                         }
76                 $stable .= "<td>".
77                       ($stat->{'desc'} && $stat->{'up'} == 0 ?
78                          "<font color=#ff0000>$stat->{'desc'}</font>" :
79                        $stat->{'desc'} ? $stat->{'desc'} :
80                        $stat->{'up'} == 1 ? $text{'mon_up'} :
81                        $stat->{'up'} == -1 ? $text{'mon_not'} :
82                        $stat->{'up'} == -2 ? $text{'mon_webmin'} :
83                        $stat->{'up'} == -3 ? $text{'mon_timeout'} :
84                        $stat->{'up'} == -4 ? $text{'mon_skip'} :
85                          "<font color=#ff0000>$text{'mon_down'}</font>").
86                         "</td>\n";
87                 $stable .= "</tr>\n";
88                 }
89         $stable .= "</table>\n";
90         print &ui_table_row($text{'mon_status'}, $stable,
91                             undef, \@tds);
92         }
93
94 # Show servers to run on
95 @servs = grep { $_->{'user'} } &servers::list_servers_sorted();
96 @servs = sort { $a->{'host'} cmp $b->{'host'} } @servs;
97 if (@servs) {
98         # Show list of remote servers, and maybe groups
99         $s = &ui_select("remotes", [ split(/\s+/, $serv->{'remote'}) ],
100                          [ [ "*", "&lt;$text{'mon_local'}&gt;" ],
101                            map { [ $_->{'host'}, $_->{'host'} ] } @servs ],
102                          5, 1, 1),
103         @groups = &servers::list_all_groups(\@servs);
104         @groups = sort { $a->{'name'} cmp $b->{'name'} } @groups;
105         if (@groups) {
106                 $s .= &ui_select("groups", [ split(/\s+/, $serv->{'groups'}) ],
107                          [ map { [ $_->{'name'}, &group_desc($_) ] } @groups ],
108                          5, 1, 1),
109                 }
110         print &ui_table_row($text{'mon_remotes2'}, $s, undef, \@tds);
111         }
112 else {
113         # Only local is available
114         print &ui_hidden("remotes", "*"),"\n";
115         }
116
117 # Show emailing schedule
118 print &ui_table_row($text{'mon_nosched'},
119                     &ui_select("nosched", int($serv->{'nosched'}),
120                                [ [ 1, $text{'no'} ],
121                                  [ 0, $text{'mon_warndef'} ],
122                                  [ 3,  $text{'mon_warn1'} ],
123                                  [ 2,  $text{'mon_warn0'} ],
124                                  [ 4,  $text{'mon_warn2'} ],
125                                  [ 5,  $text{'mon_warn3'} ] ]),
126                     undef, \@tds);
127
128 # Show number of failures
129 print &ui_table_row($text{'mon_fails'},
130                     &ui_textbox("fails", $serv->{'fails'}, 5),
131                     undef, \@tds);
132
133 # Show notification mode
134 $notify = "";
135 %notify = map { $_, 1 } split(/\s+/, $serv->{'notify'});
136 foreach $n (&list_notification_modes()) {
137         $notify .= &ui_checkbox("notify", $n, $text{'mon_notify'.$n},
138                                 $notify{$n})."\n";
139         delete($notify{$n});
140         }
141 foreach $n (keys %notify) {
142         # Don't clear set but un-usable modes
143         print &ui_hidden("notify", $n);
144         }
145 print &ui_table_row($text{'mon_notify'}, $notify,
146                     undef, \@tds);
147
148 # Show extra address to email
149 print &ui_table_row($text{'mon_email'},
150                     &ui_textbox("email", $serv->{'email'}, 60),
151                     undef, \@tds);
152
153 # Show template to use
154 @tmpls = &list_templates();
155 if (@tmpls) {
156         if ($in{'type'}) {
157                 ($deftmpl) = grep { $_->{'desc'} eq $config{'def_tmpl'}} @tmpls;
158                 if ($deftmpl) {
159                         $tid = $deftmpl->{'id'};
160                         }
161                 }
162         else {
163                 $tid = $serv->{'tmpl'};
164                 }
165         print &ui_table_row($text{'mon_tmpl'},
166                 &ui_select("tmpl", $tid,
167                            [ [ "", "&lt;$text{'mon_notmpl'}&gt;" ],
168                              map { [ $_->{'id'}, $_->{'desc'} ] } @tmpls ]));
169         }
170
171 # Which clone module to use
172 if (@clones) {
173         local %minfo = &get_module_info($type);
174         print &ui_table_row($text{'mon_clone'},
175                    &ui_select("clone", $serv->{'clone'},
176                               [ [ "", $minfo{'desc'} ],
177                                 map { local %cminfo = &get_module_info($_);
178                                       [ $_, $cminfo{'desc'} ] } @clones ]),
179                    undef, \@tds);
180         }
181
182 # Skip if some other monitor is down
183 @servs = &list_services();
184 if (@servs) {
185         print &ui_table_row($text{'mon_depend'},
186           &ui_select("depend", $serv->{'depend'},
187                  [ [ "", "&nbsp;" ],
188                    map { [ $_->{'id'}, $_->{'desc'}.
189                                        " (".&nice_remotes($_).")" ] }
190                      sort { $a->{'desc'} cmp $b->{'desc'} } @servs ]),
191           undef, \@tds);
192         }
193
194 print &ui_table_end();
195 print "<p>\n";
196 print &ui_table_start($text{'mon_header2'}, "width=100%", 2, \@tds);
197
198 # Show commands to run on up/down
199 print &ui_table_row($text{'mon_ondown'},
200                     &ui_textbox("ondown", $serv->{'ondown'}, 60),
201                     undef, \@tds);
202
203 print &ui_table_row($text{'mon_onup'},
204                     &ui_textbox("onup", $serv->{'onup'}, 60),
205                     undef, \@tds);
206
207 print &ui_table_row($text{'mon_ontimeout'},
208                     &ui_textbox("ontimeout", $serv->{'ontimeout'}, 60),
209                     undef, \@tds);
210
211 print &ui_table_row(" ", "<font size=-1>$text{'mon_oninfo'}</font>",
212                     undef, \@tds);
213
214 # Radio button for where to run commands
215 print &ui_table_row($text{'mon_runon'},
216                     &ui_radio("runon", $serv->{'runon'} ? 1 : 0,
217                               [ [ 0, $text{'mon_runon0'} ],
218                                 [ 1, $text{'mon_runon1'} ] ]),
219                     undef, \@tds);
220
221 print &ui_table_end();
222
223 # Display inputs for this monitor type
224 if ($type =~ /^(\S+)::(\S+)$/) {
225         # From another module
226         ($mod, $mtype) = ($1, $2);
227         &foreign_require($mod, "status_monitor.pl");
228         print &ui_table_start($text{'mon_header3'}, "width=100%", 4,
229                               \@tds);
230         &foreign_call($mod, "load_theme_library");
231         print &foreign_call($mod, "status_monitor_dialog", $mtype, $serv);
232         print &ui_table_end();
233         }
234 else {
235         # From this module
236         do "./${type}-monitor.pl";
237         $func = "show_${type}_dialog";
238         if (defined(&$func)) {
239                 print &ui_table_start($text{'mon_header3'}, "width=100%", 4,
240                                       \@tds);
241                 &$func($serv);
242                 print &ui_table_end();
243                 }
244         }
245
246 # Show create/delete buttons
247 if ($in{'type'}) {
248         print &ui_form_end([ [ "create", $text{'create'} ] ]);
249         }
250 else {
251         print &ui_form_end([ [ "save", $text{'save'} ],
252                              [ "newclone", $text{'mon_clone2'} ],
253                              [ "delete", $text{'delete'} ] ]);
254         }
255
256 &ui_print_footer("", $text{'index_return'});
257