Handle hostnames with upper-case letters
[webmin.git] / status / query-monitor.pl
1 # query-monitor.pl
2 # Try an SQL query on a MySQL or PostgreSQL server
3
4 sub get_query_status
5 {
6 # Load the driver
7 local $drh;
8 eval <<EOF;
9 use DBI;
10 \$drh = DBI->install_driver(\$_[0]->{'driver'});
11 EOF
12 if ($@) {
13         return { 'up' => -1,
14                  'desc' => &text('query_edriver',
15                                  "<tt>DBD::$_[0]->{'driver'}</tt>") };
16         }
17
18 # Connect to the database server
19 local $dbistr = &make_dbistr($_[0]->{'driver'}, $_[0]->{'db'}, $_[0]->{'host'});
20 local $dbh = $drh->connect($dbistr,
21                            $_[0]->{'user'}, $_[0]->{'pass'}, { });
22 if (!$dbh) {
23         return { 'up' => 0,
24                  'desc' => &text('query_elogin', $drh->errstr) };
25         }
26
27 # Execute the query
28 local $cmd = $dbh->prepare($_[0]->{'sql'});
29 if (!$cmd) {
30         return { 'up' => 0,
31                  'desc' => &text('query_eprepare', $dbh->errstr) };
32         }
33 if (!$cmd->execute()) {
34         return { 'up' => 0,
35                  'desc' => &text('query_eexecute', $dbh->errstr) };
36         }
37 local @r = $cmd->fetchrow();
38 $cmd->finish();
39
40 if ($_[0]->{'result'} && $r[0] ne $_[0]->{'result'}) {
41         return { 'up' => 0,
42                  'desc' => &text('query_ewrong', $r[0]) };
43         }
44
45 return { 'up' => 1 };
46 }
47
48 sub show_query_dialog
49 {
50 print &ui_table_row($text{'query_driver'},
51         &ui_select("driver", $_[0]->{'driver'},
52                    [ [ "mysql", "MySQL" ],
53                      [ "Pg", "PostgreSQL" ],
54                      [ "Oracle", "Oracle" ] ]));
55
56 print &ui_table_row($text{'query_db'},
57         &ui_textbox("db", $_[0]->{'db'}, 20));
58
59 print &ui_table_row($text{'query_user'},
60         &ui_textbox("quser", $_[0]->{'user'}, 20));
61
62 print &ui_table_row($text{'query_pass'},
63         &ui_password("qpass", $_[0]->{'pass'}, 20));
64
65 print &ui_table_row($text{'query_host'},
66         &ui_opt_textbox("host", $_[0]->{'host'}, 40, $text{'query_local'}), 3);
67
68 print &ui_table_row($text{'query_sql'},
69         &ui_textbox("sql", $_[0]->{'sql'}, 60), 3);
70
71 print &ui_table_row($text{'query_result'},
72         &ui_opt_textbox("result", $_[0]->{'result'}, 40,
73                         $text{'query_ignore'}), 3);
74 }
75
76 sub parse_query_dialog
77 {
78 eval "use DBD::$in{'driver'}";
79 &error(&text('query_edriver', "<tt>DBD::$in{'driver'}</tt>")) if ($@);
80 $_[0]->{'driver'} = $in{'driver'};
81
82 $in{'db'} =~ /^\S+$/ || &error($text{'query_edb'});
83 $_[0]->{'db'} = $in{'db'};
84
85 if ($in{'host_def'}) {
86         delete($_[0]->{'host'});
87         }
88 else {
89         &to_ipaddress($in{'host'}) || &to_ip6address($in{'host'}) ||
90                 &error($text{'query_ehost'});
91         $_[0]->{'host'} = $in{'host'};
92         }
93
94 $in{'quser'} =~ /^\S*$/ || &error($text{'query_euser'});
95 $_[0]->{'user'} = $in{'quser'};
96
97 $in{'qpass'} =~ /^\S*$/ || &error($text{'query_epass'});
98 $_[0]->{'pass'} = $in{'qpass'};
99
100 $in{'sql'} =~ /\S/ || &error($text{'query_esql'});
101 $_[0]->{'sql'} = $in{'sql'};
102
103 if ($in{'result_def'}) {
104         delete($_[0]->{'result'});
105         }
106 else {
107         $in{'result'} =~ /\S/ || &error($text{'query_eresult'});
108         $_[0]->{'result'} = $in{'result'};
109         }
110 }
111
112 sub make_dbistr
113 {
114 local ($driver, $db, $host) = @_;
115 local $rv;
116 if ($driver eq "mysql") {
117         $rv = "database=$db";
118         }
119 elsif ($driver eq "Pg") {
120         $rv = "dbname=$db";
121         }
122 else {
123         $rv = $db;
124         }
125 if ($host) {
126         $rv .= ";host=$host";
127         }
128 return $rv;
129 }
130
131