Handle hostnames with upper-case letters
[webmin.git] / mysql / index.cgi
1 #!/usr/local/bin/perl
2 # index.cgi
3 # Display all existing databases
4
5 require './mysql-lib.pl';
6 &ReadParse();
7
8 # Check for MySQL programs
9 foreach $p ( [ $config{'mysqladmin'}, 'index_eadmin', 'index_mysqladmin' ],
10              [ $config{'mysql'}, 'index_esql', 'index_mysql' ],
11              [ $config{'mysqlshow'}, 'index_eshow', 'index_mysqlshow' ]) {
12         if (!-x $p->[0]) {
13                 &ui_print_header(undef, $text{'index_title'}, "", "intro", 1, 1, 0,
14                         &help_search_link("mysql", "man", "doc", "google"));
15                 print &text($p->[1], "<tt>$p->[0]</tt>",
16                           "$gconfig{'webprefix'}/config.cgi?$module_name"),"<p>\n";
17
18                 &foreign_require("software", "software-lib.pl");
19                 $lnk = &software::missing_install_link(
20                                 "mysql", $text{$p->[2]},
21                                 "../$module_name/", $text{'index_title'});
22                 print $lnk,"<p>\n" if ($lnk);
23
24                 &ui_print_footer("/", $text{'index'});
25                 exit;
26                 }
27         }
28
29 # Try to get the MySQL version
30 $mysql_version = &get_mysql_version(\$out);
31 if ($mysql_version < 0) {
32         &ui_print_header(undef, $text{'index_title'}, "", "intro", 1, 1, 0,
33                 &help_search_link("mysql", "man", "doc", "google"));
34         print &text('index_elibrary', "<tt>$config{'mysql'}</tt>",
35                   "../config.cgi?$module_name"),"<p>\n";
36         print &text('index_mysqlver', "$config{'mysql'} -V"),"\n";
37         print "<pre>$out</pre>\n";
38         &ui_print_footer("/", $text{'index'});
39         exit;
40         }
41 elsif (!$mysql_version) {
42         &ui_print_header(undef, $text{'index_title'}, "", "intro", 1, 1, 0,
43                 &help_search_link("mysql", "man", "doc", "google"));
44         print &text('index_ever', "<tt>$config{'mysql'}</tt>",
45                   "../config.cgi?$module_name"),"<p>\n";
46         print &text('index_mysqlver', "$config{'mysql'} -V"),"\n";
47         print "<pre>$out</pre>\n";
48         &ui_print_footer("/", $text{'index'});
49         exit;
50         }
51 open(VERSION, ">$module_config_directory/version");
52 print VERSION $mysql_version,"\n";
53 close(VERSION);
54
55 # Check if MYSQL_PWD works
56 ($r, $rout) = &is_mysql_running();
57 if ($r > 0 && !&working_env_pass()) {
58         &ui_print_header(undef, $text{'index_title'}, "", "intro", 1, 1, 0,
59                 &help_search_link("mysql", "man", "doc", "google"));
60         print &text('index_eenvpass', "<tt>$config{'mysql'}</tt>",
61                     "../config.cgi?$module_name"),"<p>\n";
62         &ui_print_footer("/", $text{'index'});
63         exit;
64         }
65
66 if ($r == 0) {
67         # Not running .. need to start it
68         &main_header();
69         print "<p> <b>$text{'index_notrun'}</b> <p>\n";
70
71         if ($access{'stop'} && &is_mysql_local()) {
72                 print &ui_hr();
73                 print "<form action=start.cgi>\n";
74                 print "<table width=100%><tr><td>\n";
75                 print "<input type=submit ",
76                       "value=\"$text{'index_start'}\"></td>\n";
77                 print "<td>",&text('index_startmsg',
78                       "<tt>$config{'start_cmd'}</tt>"),"</td> </tr></table>\n";
79                 print "</form>\n";
80                 }
81         }
82 elsif ($r == -1) {
83         # Running, but webmin doesn't know the root (or user's) password!
84         &main_header();
85         print "<b>$text{'index_nopass'}</b> <p>\n";
86
87         print &ui_form_start("login.cgi", "post");
88         print &ui_table_start($text{'index_ltitle'}, undef, 2);
89
90         print &ui_table_row($text{'index_login'},
91                 &ui_textbox("login", $access{'user'} || $config{'login'}, 40));
92
93         print &ui_table_row($text{'index_pass'},
94                 &ui_password("pass", undef, 40));
95
96         print &ui_table_end();
97         print &ui_form_end([ [ undef, $text{'save'} ] ]);
98
99         print &text('index_emsg', "<tt>$rout</tt>"),"<p>\n";
100         }
101 else {
102         # Check if we can re-direct to a single DB's page
103         @alldbs = &list_databases();
104         @titles = grep { &can_edit_db($_) } @alldbs;
105         $can_all = (@alldbs == @titles);
106         if (@titles == 1 && $access{'dbs'} ne '*' && !$access{'perms'} &&
107             !$access{'stop'} && !$access{'create'} && $access{'noconfig'}) {
108                 # Only one DB, so go direct to it!
109                 &redirect("edit_dbase.cgi?db=$titles[0]");
110                 exit;
111                 }
112
113         &main_header();
114         print &ui_subheading($text{'index_dbs'}) if ($access{'perms'});
115         if ($in{'search'}) {
116                 # Limit to those matching search
117                 @titles = grep { /\Q$in{'search'}\E/i } @titles;
118                 print "<table width=100%><tr>\n";
119                 print "<td> <b>",&text('index_showing',
120                     "<tt>".&html_escape($in{'search'})."</tt>"),"</b></td>\n";
121                 print "<td align=right><a href='index.cgi'>",
122                         "$text{'view_searchreset'}</a></td>\n";
123                 print "</tr></table>\n";
124                 }
125         elsif ($in{'show'}) {
126                 # Limit to specific databases
127                 %show = map { $_, 1 } split(/\0/, $in{'show'});
128                 @titles = grep { $show{$_} } @titles;
129                 }
130
131         # DB is running .. list databases
132         @icons = map { "images/db.gif" } @titles;
133         @links = map { "edit_dbase.cgi?db=$_" } @titles;
134         $can_create = $access{'create'} == 1 ||
135                       $access{'create'} == 2 && @titles < $access{'max'};
136
137         @rowlinks = ( );
138         push(@rowlinks, "<a href=newdb_form.cgi>$text{'index_add'}</a>")
139                 if ($can_create);
140         if (!@icons) {
141                 # No databases .. tell user
142                 if (@alldbs) {
143                         print "<b>$text{'index_nodbs'}</b> <p>\n";
144                         }
145                 else {
146                         print "<b>$text{'index_nodbs2'}</b> <p>\n";
147                         }
148                 }
149         elsif (@icons > $max_dbs && !$in{'search'} && !$in{'show'}) {
150                 # Too many databases to show .. display search and jump forms
151                 print &ui_form_start("index.cgi");
152                 print $text{'index_toomany'},"\n";
153                 print &ui_textbox("search", undef, 20),"\n";
154                 print &ui_submit($text{'index_search'}),"<br>\n";
155                 print &ui_form_end();
156
157                 print &ui_form_start("edit_dbase.cgi");
158                 print $text{'index_jump'},"\n";
159                 print &ui_select("db", undef, [ map { [ $_ ] } @titles ],
160                                  1, 0, 0, 0, "onChange='form.submit()'"),"\n";
161                 print &ui_submit($text{'index_jumpok'}),"<br>\n";
162                 print &ui_form_end();
163                 }
164         else {
165                 # Show table of databases
166                 if ($access{'delete'}) {
167                         print &ui_form_start("drop_dbases.cgi");
168                         unshift(@rowlinks, &select_all_link("d", 0),
169                                            &select_invert_link("d", 0));
170                         }
171                 print &ui_links_row(\@rowlinks);
172                 @checks = @titles;
173                 if ($displayconfig{'style'} == 1) {
174                         # Show as DB names and table counts
175                         @tables = map { @t = &list_tables($_); scalar(@t) }
176                                       @titles;
177                         @titles = map { &html_escape($_) } @titles;
178                         &split_table([ "", $text{'index_db'},
179                                        $text{'index_tables'} ],
180                                      \@checks, \@links, \@titles, \@tables)
181                                 if (@titles);
182                         }
183                 elsif ($displayconfig{'style'} == 2) {
184                         # Show just DB names
185                         @grid = ( );
186                         for(my $i=0; $i<@links; $i++) {
187                                 push(@grid, &ui_checkbox("d", $titles[$i]).
188                                   " <a href='$links[$i]'>".
189                                   &html_escape($titles[$i])."</a>");
190                                 }
191                         print &ui_grid_table(\@grid, 4, 100, undef, undef, "");
192                         }
193                 else {
194                         # Show name icons
195                         @checks = map { &ui_checkbox("d", $_) } @checks;
196                         @titles = map { &html_escape($_) } @titles;
197                         &icons_table(\@links, \@titles, \@icons, 5,
198                                      undef, undef, undef, \@checks);
199                         }
200                 }
201         print &ui_links_row(\@rowlinks);
202         if (@icons && $access{'delete'} &&
203             (@icons <= $max_dbs || $in{'search'})) {
204                 print &ui_form_end([ [ "delete", $text{'index_drops'} ] ]);
205                 }
206
207         if ($access{'perms'}) {
208                 # Show icons for editing user permissions and server settings
209                 print &ui_hr();
210                 print &ui_subheading($text{'index_global'});
211                 $canvars = &supports_variables();
212                 @links = ( 'list_users.cgi', 'list_dbs.cgi', 'list_hosts.cgi',
213                            'list_tprivs.cgi', 'list_cprivs.cgi',
214                            'edit_cnf.cgi', 'list_procs.cgi',
215                            $canvars ? ( 'list_vars.cgi' ) : ( ),
216                            'root_form.cgi',
217                          );
218                 @titles = ( $text{'users_title'}, $text{'dbs_title'},
219                             $text{'hosts_title'}, $text{'tprivs_title'},
220                             $text{'cprivs_title'},$text{'cnf_title'},
221                             $text{'procs_title'},
222                             $canvars ? ( $text{'vars_title'} ) : ( ),
223                             $text{'root_title'},
224                           );
225                 @images = ( 'images/users.gif', 'images/dbs.gif',
226                             'images/hosts.gif', 'images/tprivs.gif',
227                             'images/cprivs.gif', 'images/cnf.gif',
228                             'images/procs.gif',
229                             $canvars ? ( 'images/vars.gif' ) : ( ),
230                             'images/root.gif',
231                           );
232                 if ($access{'perms'} == 2) {
233                         # Remove my.cnf and database connections icons
234                         @links = @links[0..4];
235                         @titles = @titles[0..4];
236                         @images = @images[0..4];
237                         }
238                 &icons_table(\@links, \@titles, \@images, 5);
239                 }
240
241         if ($access{'stop'} && &is_mysql_local() ||
242             $can_all && !$access{'edonly'} && $access{'buser'}) {
243                 print &ui_hr();
244                 print &ui_buttons_start();
245                 $started_buttons_row = 1;
246                 }
247
248         # Show stop button
249         if ($access{'stop'} && &is_mysql_local()) {
250                 print &ui_buttons_row("stop.cgi", $text{'index_stop'},
251                                       $text{'index_stopmsg'});
252                 }
253
254         # Show backup all button
255         if ($can_all && !$access{'edonly'} && $access{'buser'}) {
256                 print &ui_buttons_row("backup_form.cgi", $text{'index_backup'},
257                                       $text{'index_backupmsg'},
258                                       &ui_hidden("all", 1));
259                 }
260
261         print &ui_buttons_end() if ($started_buttons_row);
262
263         # Check if the optional perl modules are installed
264         if (foreign_available("cpan")) {
265                 eval "use DBI";
266                 push(@needs, "DBI") if ($@);
267                 $nodbi++ if ($@);
268                 eval "use DBD::mysql";
269                 push(@needs, "DBD::mysql") if ($@);
270                 if (@needs) {
271                         $needs = &urlize(join(" ", @needs));
272                         print "<center><b>",&text(@needs == 2 ? 'index_nomods' : 'index_nomod', @needs,
273                                 "/cpan/download.cgi?source=3&cpan=$needs&mode=2&return=/$module_name/&returndesc=".&urlize($text{'index_return'})),
274                                 "</b></center>\n";
275                         }
276                 }
277         }
278
279 &ui_print_footer("/", "index");
280
281 sub main_header
282 {
283 &ui_print_header(undef, $text{'index_title'}, "", "intro", 1, 1, 0,
284         &help_search_link("mysql", "man", "doc", "google"),
285         undef, undef, &text('index_version', $mysql_version));
286 }
287