Handle hostnames with upper-case letters
[webmin.git] / lvm / save_lv.cgi
1 #!/usr/local/bin/perl
2 # save_lv.cgi
3 # Create, update or delete a logical volume
4
5 require './lvm-lib.pl';
6 &ReadParse();
7
8 ($vg) = grep { $_->{'name'} eq $in{'vg'} } &list_volume_groups();
9 $vg || &error($text{'vg_egone'});
10 if ($in{'lv'}) {
11         ($lv) = grep { $_->{'name'} eq $in{'lv'} }
12                      &list_logical_volumes($in{'vg'});
13         $lv || &error($text{'lv_egone'});
14         $oldlv = { %$lv };
15         }
16
17 if ($in{'confirm'}) {
18         # Delete the logical volume
19         &error_setup($text{'lv_err2'});
20         $err = &delete_logical_volume($lv);
21         &error("<pre>$err</pre>") if ($err);
22         &webmin_log("delete", "lv", $in{'lv'}, $lv);
23         &redirect("index.cgi?mode=lvs");
24         }
25 elsif ($in{'delete'}) {
26         # Ask the user if he is sure
27         &ui_print_header(undef, $text{'lv_delete'}, "");
28         print "<center>\n";
29         print &ui_form_start("save_lv.cgi");
30         print &ui_hidden("vg", $in{'vg'});
31         print &ui_hidden("lv", $in{'lv'});
32         print "<b>",&text($lv->{'is_snap'} ? 'lv_rusnap' : 'lv_rusure',
33                           "<tt>$lv->{'device'}</tt>"),"</b><p>\n";
34         print &ui_form_end([ [ 'confirm', $text{'lv_deleteok'} ] ]);
35         print "</center>\n";
36         &ui_print_footer("index.cgi?mode=lvs", $text{'index_return'});
37         }
38 else {
39         # Validate inputs
40         &error_setup($text{'lv_err'});
41         $in{'name'} =~ /^[A-Za-z0-9\.\-\_]+$/ || &error($text{'lv_ename'});
42         ($same) = grep { $_->{'name'} eq $in{'name'} }
43                        &list_logical_volumes($in{'vg'});
44         $same && (!$in{'lv'} || $in{'lv'} ne $in{'name'}) &&
45                 &error($text{'lv_esame'});
46         if ($in{'size_mode'} == 0) {
47                 # Absolute size
48                 $in{'size'} =~ /^\d+$/ || &error($text{'lv_esize'});
49                 $size = $in{'size'};
50                 if (defined($in{'size_units'})) {
51                         # Convert selected units to kB
52                         $size *= $in{'size_units'}/1024;
53                         }
54                 $sizeof = undef;
55                 }
56         elsif ($in{'size_mode'} == 1) {
57                 # Size of VG
58                 $in{'vgsize'} =~ /^\d+$/ &&
59                         $in{'vgsize'} > 0 &&
60                         $in{'vgsize'} <= 100 || &error($text{'lv_evgsize'});
61                 $size = $in{'vgsize'};
62                 $sizeof = 'VG';
63                 }
64         elsif ($in{'size_mode'} == 2) {
65                 # Size of free space
66                 $in{'freesize'} =~ /^\d+$/ &&
67                         $in{'freesize'} > 0 &&
68                         $in{'freesize'} <= 100 || &error($text{'lv_efreesize'});
69                 $size = $in{'freesize'};
70                 $sizeof = 'FREE';
71                 }
72         elsif ($in{'size_mode'} == 3) {
73                 # Size of some PV
74                 $in{'pvsize'} =~ /^\d+$/ &&
75                         $in{'pvsize'} > 0 &&
76                         $in{'pvsize'} <= 100 || &error($text{'lv_epvsize'});
77                 $size = $in{'pvsize'};
78                 $sizeof = $in{'pvof'};
79                 }
80         elsif ($in{'size_mode'} == 4) {
81                 # Size in kB
82                 $in{'sizekb'} =~ /^\d+$/ || &error($text{'lv_esize'});
83                 $size = $in{'sizekb'};
84                 $sizeof = undef;
85                 }
86         else {
87                 &error("Invalid size mode ".$in{'size_mode'});
88                 }
89         $in{'snap'} || $in{'lv'} || $in{'stripe_def'} ||
90                 $in{'stripe'} =~ /^[1-9]\d*$/ || &error($text{'lv_estripe'});
91
92         if (!$in{'lv'}) {
93                 # Just create the logical volume
94                 $lv->{'vg'} = $in{'vg'};
95                 $lv->{'name'} = $in{'name'};
96                 $lv->{'size'} = $size;
97                 $lv->{'size_of'} = $sizeof;
98                 if ($in{'snap'}) {
99                         $lv->{'is_snap'} = 1;
100                         $lv->{'snapof'} = $in{'snapof'};
101                         }
102                 else {
103                         $lv->{'perm'} = $in{'perm'};
104                         $lv->{'alloc'} = $in{'alloc'};
105                         $lv->{'stripe'} = $in{'stripe'} if (!$in{'stripe_def'});
106                         $lv->{'stripesize'} = $in{'stripesize'};
107                         $lv->{'readahead'} = $in{'readahead'};
108                         }
109                 $err = &create_logical_volume($lv);
110                 &error("<pre>$err</pre>") if ($err);
111                 &webmin_log("create", "lv", $in{'name'}, $lv);
112                 }
113         elsif ($lv->{'is_snap'}) {
114                 # Modifying a snapshot
115                 if ($lv->{'size'} != $size) {
116                         $err = &resize_logical_volume($lv, $size);
117                         &error("<pre>$err</pre>") if ($err);
118                         $lv->{'size'} = $size;
119                         }
120                 if ($lv->{'name'} ne $in{'name'}) {
121                         # Need to rename
122                         $err = &rename_logical_volume($lv, $in{'name'});
123                         &error("<pre>$err</pre>") if ($err);
124                         $lv->{'name'} = $in{'name'};
125                         }
126                 }
127         else {
128                 # Modifying the logical volume
129                 @stat = &device_status($lv->{'device'});
130                 if ($lv->{'size'} != $size) {
131                         # Is the new size too big?
132                         local $nblocks = &round_up(
133                                 $size * 1.0 / $vg->{'pe_size'});
134                         local $oblocks = &round_up(
135                                 $lv->{'size'} * 1.0 / $vg->{'pe_size'});
136                         if ($vg->{'pe_alloc'} - $oblocks + $nblocks > $vg->{'pe_total'}) {
137                                 #&error(&text('lv_toobig', $nblocks, "$vg->{'pe_size'} kB", $vg->{'pe_total'} - $vg->{'pe_alloc'}));
138                                 }
139
140                         local $realsize = $nblocks * $vg->{'pe_size'};
141                         if ($in{'sizeconfirm'}) {
142                                 # Just resize the logical volume
143                                 $err = &resize_logical_volume($lv, $realsize);
144                                 &error("<pre>$err</pre>") if ($err);
145                                 }
146                         else {
147                                 local $can = &can_resize_lv_stat(@stat);
148                                 if (($can == 2 ||
149                                      $can == 1 && $realsize > $lv->{'size'}) &&
150                                     $stat[1]) {
151                                         # Attempt to resize FS properly
152                                         $err = &resize_filesystem($lv, $stat[1],
153                                                                   $realsize);
154                                         if ($err) {
155                                                 $err = &text('resize_fs',
156                                                         $stat[1],
157                                                         "</center><pre>$err".
158                                                          "</pre><center>");
159                                                 }
160                                         }
161                                 elsif ($stat[2]) {
162                                         # Cannot resize while mounted
163                                         &error($can == 1 ? 
164                                                 $text{'resize_emounted2'} :
165                                                 $text{'resize_emounted'});
166                                         }
167                                 else {
168                                         # Cannot resize .. ask for confirmation
169                                         $err = @stat && $stat[1] ne '*' &&
170                                                $stat[1] ne 'auto' ?
171                                                 &text('resize_mesg', $stat[1]) :
172                                                 $text{'resize_mesg2'};
173                                         }
174                                 if ($err) {
175                                         &ui_print_header(undef, $text{'resize_title'}, "");
176                                         print "<center><form action=save_lv.cgi>\n";
177                                         foreach $i (keys %in) {
178                                                 print "<input type=hidden name=$i value='$in{$i}'>\n";
179                                                 }
180                                         print "<b>$err</b> <p>\n";
181                                         print "<input type=submit name=sizeconfirm value='$text{'resize_ok'}'>\n";
182                                         print "</form></center>\n";
183                                         &ui_print_footer("", $text{'index_return'});
184                                         exit;
185                                         }
186                                 }
187                         $lv->{'size'} = $realsize;
188                         }
189                 if ($lv->{'perm'} ne $in{'perm'} ||
190                     $lv->{'alloc'} ne $in{'alloc'} ||
191                     $lv->{'readahead'} ne $in{'readahead'}) {
192                         # Need to change options
193                         $lv->{'perm'} = $in{'perm'};
194                         $lv->{'alloc'} = $in{'alloc'};
195                         $lv->{'readahead'} = $in{'readahead'};
196                         $err = &change_logical_volume($lv, $oldlv);
197                         &error("<pre>$err</pre>") if ($err);
198                         }
199                 if ($lv->{'name'} ne $in{'name'}) {
200                         # Need to rename
201                         $err = &rename_logical_volume($lv, $in{'name'});
202                         &error("<pre>$err</pre>") if ($err);
203                         $lv->{'name'} = $in{'name'};
204                         }
205                 &webmin_log("modify", "lv", $in{'lv'}, $lv);
206                 }
207         &redirect("index.cgi?mode=lvs");
208         }
209
210 sub round_up
211 {
212 local ($n) = @_;
213 if (int($n) != $n) {
214         return int($n)+1;
215         }
216 return $n;
217 }