Handle hostnames with upper-case letters
[webmin.git] / raid / view_raid.cgi
1 #!/usr/local/bin/perl
2 # view_raid.cgi
3 # Display information about a raid device
4
5 require './raid-lib.pl';
6 &foreign_require("mount");
7 &foreign_require("lvm");
8 &ReadParse();
9
10 print "Refresh: $config{'refresh'}\r\n"
11         if ($config{'refresh'});
12 &ui_print_header(undef, $text{'view_title'}, "");
13 $conf = &get_raidtab();
14 $raid = $conf->[$in{'idx'}];
15
16 print &ui_form_start("save_raid.cgi");
17 print &ui_hidden("idx", $in{'idx'});
18 print &ui_table_start($text{'view_header'}, undef, 2);
19
20 # Device name
21 print &ui_table_row($text{'view_device'}, "<tt>$raid->{'value'}</tt>");
22
23 # RAID level
24 $lvl = &find_value('raid-level', $raid->{'members'});
25 print &ui_table_row($text{'view_level'},
26         $lvl eq 'linear' ? $text{'linear'} : $text{"raid$lvl"});
27
28 # Current status
29 @st = &device_status($raid->{'value'});
30 print &ui_table_row($text{'view_status'},
31       $st[1] eq 'lvm' ? &text('view_lvm', "<tt>$st[0]</tt>") :
32       $st[2] ? &text('view_mounted', "<tt>$st[0]</tt>") :
33       @st ? &text('view_mount', "<tt>$st[0]</tt>") :
34       $raid->{'active'} ? $text{'view_active'} :
35                           $text{'view_inactive'});
36
37 if ($raid->{'size'}) {
38         print &ui_table_row($text{'view_size'},
39                 &text('view_blocks', $raid->{'size'})." ".
40                 "(".&nice_size($raid->{'size'}*1024).")");
41         }
42 if ($raid->{'resync'}) {
43         print &ui_table_row($text{'view_resync'}, "$raid->{'resync'} \%");
44         }
45
46 # Superblock?
47 $super = &find_value('persistent-superblock', $raid->{'members'});
48 print &ui_table_row($text{'view_super'},
49         $super ? $text{'yes'} : $text{'no'});
50
51 # Parity method
52 if ($lvl eq '5') {
53         $layout = &find_value('parity-algorithm', $raid->{'members'});
54         print &ui_table_row($text{'view_parity'}, $layout || $text{'default'});
55         }
56
57 # Chunk size
58 $chunk = &find_value('chunk-size', $raid->{'members'});
59 print &ui_table_row($text{'view_chunk'},
60         $chunk ? "$chunk kB" : $text{'default'});
61
62 # Current errors
63 if (ref($raid->{'errors'})) {
64         for($i=0; $i<@{$raid->{'errors'}}; $i++) {
65                 if ($raid->{'errors'}->[$i] ne "U") {
66                         push(@badlist, $raid->{'devices'}->[$i]);
67                         }
68                 }
69         if (@badlist) {
70                 print &ui_table_row($text{'view_errors'},
71                         "<font color=#ff0000>".
72                         &text('view_bad', scalar(@badlist)).
73                         "</font>");
74                 }
75         }
76
77 # Current state
78 if ($raid->{'state'}) {
79         print &ui_table_row($text{'view_state'}, $raid->{'state'});
80         }
81
82 # Rebuild percent
83 if ($raid->{'rebuild'}) {
84         print &ui_table_row($text{'view_rebuild'},
85                 $raid->{'rebuild'}." \% (".$raid->{'remain'}." min, ".
86                 $raid->{'speed'}." KBytes/s)");
87         }
88
89
90 # Display partitions in RAID
91 $rp = undef;
92 @devs = sort { $a->{'value'} cmp $b->{'value'} }
93              &find('device', $raid->{'members'});
94 foreach $d (@devs) {
95         if (&find('raid-disk', $d->{'members'}) ||
96             &find('parity-disk', $d->{'members'})) {
97                 local $name = &mount::device_name($d->{'value'});
98                 $rp .= $name."\n";
99                 if (!&indevlist($d->{'value'}, $raid->{'devices'}) &&
100                     $raid->{'active'}) {
101                         $rp .= "<font color=#ff0000>$text{'view_down'}</font>\n";
102                         }
103                 $rp .= "<br>\n";
104                 push(@rdisks, [ $d->{'value'}, $name ]);
105                 }
106         }
107
108 $raidcnt = @rdisks;
109
110 print &ui_table_row($text{'view_disks'}, $rp);
111
112 # Display spare partitions
113 $sp = undef;
114 $sparescnt = 0;
115 $newdisks = @rdisks;
116 @spares = ( );
117 foreach $d (@devs) {
118         if (&find('spare-disk', $d->{'members'})) {
119                 local $name = &mount::device_name($d->{'value'});
120                 $sp .= "$name<br>\n";
121                 push(@rdisks, [ $d->{'value'}, $name ]);
122                 $sparescnt++;
123                 $newdisks++;
124                 push(@spares, [ "$newdisks", "+ $sparescnt" ]);
125                 }
126         }
127 if ($sp) {
128         print &ui_table_row($text{'view_spares'}, $sp);
129         }
130
131 # Display spare group, if any
132 $sg = &find_value("spare-group", $raid->{'members'});
133 if ($sg) {
134         print &ui_table_row($text{'view_sparegroup'}, "<tt>$sg</tt>");
135         }
136
137 print &ui_table_end();
138
139 print &ui_hr();
140 @grid = ( );
141
142 if ($raid_mode eq "raidtools" && !$st[2]) {
143         # Only classic raid tools can disable a RAID
144         local $act = $raid->{'active'} ? "stop" : "start";
145         push(@grid, &ui_submit($text{'view_'.$act}, $act),
146                     $text{'view_'.$act.'desc'});
147         }
148
149 if ($raid_mode eq "mdadm") {
150         # Only MDADM can add or remove a device (so far)
151         @disks = &find_free_partitions([ $raid->{'value'} ], 0, 1);
152         if (@disks) {
153                 push(@grid, &ui_submit($text{'view_add'}, "add")." ".
154                             &ui_select("disk", undef, \@disks),
155                             $text{'view_adddesc'});
156                 }
157         if (@rdisks > 1) {
158                 @rdisks = sort { $a->[0] cmp $b->[0] } @rdisks;
159                 push(@grid, &ui_submit($text{'view_remove'}, "remove")." ".
160                             &ui_select("rdisk", undef, \@rdisks),
161                             $text{'view_removedesc'});
162                 push(@grid, &ui_submit($text{'view_remove_det'}, "remove_det"),
163                             $text{'view_remove_detdesc'});
164                 }
165         if ($sparescnt > 0 && $lvl != 10) {
166                 @spares = sort { $a->[0] cmp $b->[0] } @spares;
167                 push(@grid, &ui_submit($text{'view_grow'}, "grow")." ".
168                             &ui_select("ndisk_grow", undef, \@spares),
169                             $text{'view_growdesc'});
170                 if ($lvl == 5 && &get_mdadm_version() >= 3.1) {
171                         push(@grid, &ui_submit($text{'view_convert_to_raid6'}, "convert_to_raid6")." ".
172                         &ui_select("ndisk_convert", undef, \@spares)." ".&ui_hidden("oldcount", $raidcnt),
173                         $text{'view_convert_to_raid6desc'});
174                         }
175                 }
176         if ($lvl == 6 && &get_mdadm_version() >= 3.1) {
177                 push(@grid, &ui_submit($text{'view_convert_to_raid5'}, "convert_to_raid5")." ".&ui_hidden("oldcount", $raidcnt),
178                         $text{'view_convert_to_raid5desc'});
179                 }
180         }
181
182 if ($raid->{'active'} && !$st[2]) {
183         # Show buttons for creating filesystems
184         $fstype = $st[1] || "ext3";
185         push(@grid, &ui_submit($text{'view_mkfs2'}, "mkfs")." ".
186             &ui_select("fs", $fstype,
187                         [ map { [ $_, $fdisk::text{"fs_".$_}." ($_)" ] }
188                               &fdisk::supported_filesystems() ]),
189             $text{'view_mkfsdesc'});
190         }
191
192 if (!@st) {
193         # Show button for mounting filesystem
194         push(@grid, &ui_submit($text{'view_newmount'}, "mount")." ".
195                     &ui_textbox("newdir", undef, 20),
196                     $text{'view_mountmsg'});
197
198         # Show button for mounting as swap
199         push(@grid, &ui_submit($text{'view_newmount2'}, "mountswap"),
200                     $text{'view_mountmsg2'});
201         }
202
203 if (!$st[2]) {
204         push(@grid, &ui_submit($text{'view_delete'}, "delete"),
205                     $text{'view_deletedesc'});
206         }
207
208 if (@grid) {
209         print &ui_grid_table(\@grid, 2, 100, [ "width=20% nowrap" ],
210                              "cellpadding=5"),"<p>\n";
211         }
212 if ($st[2]) {
213         print "<b>$text{'view_cannot2'}</b><p>\n";
214         }
215 print &ui_form_end();
216
217 &ui_print_footer("", $text{'index_return'});
218
219 # indevlist(device, &list)
220 sub indevlist
221 {
222 local $d;
223 foreach $d (@{$_[1]}) {
224         return 1 if (&same_file($_[0], $d));
225         }
226 return 0;
227 }
228