Front page ui-lib-ification and re-design

This commit is contained in:
Jamie Cameron
2008-01-06 02:02:33 +00:00
parent 76ee807584
commit a929d773ca
6 changed files with 200 additions and 63 deletions

View File

@@ -6,3 +6,5 @@ Added support for LVM2, as used in the new 2.6 Linux kernel.
When viewing a physical volume, the space used by each logical volume on it is displayed. Similarly, when viewing a logical volume, the amount of space contributed by each physical volume is displayed.
---- Changes since 1.290 ----
Fixed display of space used on each physical volume by a logical volume for LVM version 2.
---- Changes since 1.390 ----
Re-designed the module's main page to use tabs, and added an option to show volumes and groups in tables (with more information) instead of using icons.

1
lvm/config Normal file
View File

@@ -0,0 +1 @@
show_table=0

1
lvm/config.info Normal file
View File

@@ -0,0 +1 @@
show_table=Show volumes and groups as,1,1-Table,0-Icons

View File

@@ -3,10 +3,11 @@
# Display a table of all volumne groups and their physical and logical volumes.
require './lvm-lib.pl';
&ReadParse();
if (!&has_command("vgdisplay")) {
&lvm_header();
print "<p>",&text('index_ecommands', "<tt>vgdisplay</tt>"),"<p>\n";
print &text('index_ecommands', "<tt>vgdisplay</tt>"),"<p>\n";
&ui_print_footer("/", $text{'index'});
exit;
}
@@ -18,7 +19,7 @@ if ($lvm_version && $lvm_version < 2) {
}
if (!-d $lvm_proc) {
&lvm_header();
print "<p>",&text('index_emodule', "<tt>$lvm_proc</tt>",
print &text('index_emodule', "<tt>$lvm_proc</tt>",
"<tt>lvm-mod</tt>"),"<p>\n";
&ui_print_footer("/", $text{'index'});
exit;
@@ -26,76 +27,184 @@ if ($lvm_version && $lvm_version < 2) {
}
if (!$lvm_version) {
&lvm_header();
print "<p>",&text('index_eversion', "<tt>vgdisplay --version</tt>",
print &text('index_eversion', "<tt>vgdisplay --version</tt>",
"<pre>$out</pre>"),"<p>\n";
&ui_print_footer("/", $text{'index'});
exit;
}
&lvm_header();
# Show table of volume groups
@vgs = &list_volume_groups();
if (@vgs) {
print "<table border width=100%>\n";
print "<tr $tb> <td><b>$text{'index_vgs'}</b></td> ",
"<td><b>$text{'index_pvs'}</b></td> ",
"<td><b>$text{'index_lvs'}</b></td> </tr>\n";
foreach $v (sort { $a->{'number'} <=> $b->{'number'} } @vgs) {
# Show volume group icon
print "<tr $cb> <td valign=top width=20%>\n";
&icons_table( [ "edit_vg.cgi?vg=".&urlize($v->{'name'}) ],
[ &html_escape($v->{'name'}).
"<br>".&nice_size($v->{'size'}*1024) ],
[ "images/vg.gif" ], 1);
print &ui_links_row([
"<a href='edit_vg.cgi'>$text{'index_add'}</a>" ]);
print "</td> <td valign=top width=40%>\n";
# Start tabs for volume groups, physical volumes and logical volumes
@tabs = ( [ 'vgs', $text{'index_vgs'}, 'index.cgi?mode=vgs' ],
[ 'pvs', $text{'index_pvs'}, 'index.cgi?mode=pvs' ],
[ 'lvs', $text{'index_lvs'}, 'index.cgi?mode=lvs' ] );
print &ui_tabs_start(\@tabs, "mode", $in{'mode'} || 'vgs', 1);
# Show physical volume icons
local @pvs = sort { $a->{'number'} <=> $b->{'number'} }
&list_physical_volumes($v->{'name'});
if (@pvs) {
local (@icons, @titles, @links);
@icons = map { "images/pv.gif" } @pvs;
@titles = map { &html_escape($_->{'device'}).
"<br>".&nice_size($_->{'size'}*1024) } @pvs;
@links = map { "edit_pv.cgi?vg=".&urlize($v->{'name'}).
"&pv=".&urlize($_->{'name'}) } @pvs;
&icons_table(\@links, \@titles, \@icons, 3);
# Show volume groups
print &ui_tabs_start_tab("mode", "vgs");
print $text{'index_vgsdesc'},"<p>\n";
@vgs = sort { $a->{'number'} <=> $b->{'number'} } @vgs;
@links = ( "<a href='edit_vg.cgi'>$text{'index_add'}</a>" );
if ($config{'show_table'}) {
# As table
print &ui_links_row(\@links);
print &ui_columns_start([ $text{'index_vgname'},
$text{'index_vgsize'},
$text{'index_vgtotal'},
$text{'index_vgtotal2'} ], 100);
foreach $v (@vgs) {
print &ui_columns_row([
"<a href='edit_vg.cgi?vg=".
&urlize($v->{'name'})."'>".
&html_escape($v->{'name'})."</a>",
&nice_size($v->{'size'}*1024),
&text('lv_petotals', $v->{'pe_alloc'},
$v->{'pe_total'}),
&text('lv_petotals',
&nice_size($v->{'pe_alloc'}*$v->{'pe_size'}*1024),
&nice_size($v->{'pe_total'}*$v->{'pe_size'}*1024))
]);
}
else {
print "<b>$text{'index_nopvs'}</b><p>\n";
}
print &ui_links_row([
"<a href='edit_pv.cgi?vg=".&urlize($v->{'name'}).
"'>$text{'index_addpv'}</a>" ]);
# Show logical volume icons
print "</td> <td valign=top width=40%>\n";
local @lvs = sort { $a->{'number'} <=> $b->{'number'} }
&list_logical_volumes($v->{'name'});
if (@lvs) {
@icons = map { $_->{'is_snap'} ? "images/snap.gif"
: "images/lv.gif" } @lvs;
@titles = map { &html_escape($_->{'name'}).
"<br>".&nice_size($_->{'size'}*1024) } @lvs;
@links = map { "edit_lv.cgi?vg=".&urlize($v->{'name'}).
"&lv=".&urlize($_->{'name'}) } @lvs;
&icons_table(\@links, \@titles, \@icons, 3);
}
else {
print "<b>$text{'index_nolvs'}</b><p>\n";
}
print &ui_links_row([
"<a href='edit_lv.cgi?vg=".&urlize($v->{'name'}).
"'>$text{'index_addlv'}</a>",
@lvs ? (
"<a href='edit_lv.cgi?vg=".&urlize($v->{'name'}).
"&snap=1'>$text{'index_addsnap'}</a>" ) : ( )
]);
print "</td> </tr>\n";
print &ui_columns_end();
}
print "</table><p>\n";
else {
# As icons
print &ui_links_row(\@links);
foreach $v (@vgs) {
push(@vgicons, "edit_vg.cgi?vg=".&urlize($v->{'name'}));
push(@vgtitles, &html_escape($v->{'name'}).
"<br>".&nice_size($v->{'size'}*1024));
push(@vglinks, "images/vg.gif");
}
&icons_table(\@vgicons, \@vgtitles, \@vglinks);
}
print &ui_links_row(\@links);
print &ui_tabs_end_tab();
# Show physical volumes
print &ui_tabs_start_tab("mode", "pvs");
print $text{'index_pvsdesc'},"<p>\n";
foreach $v (@vgs) {
push(@allpvs, &list_physical_volumes($v->{'name'}));
}
@allpvs = sort { $a->{'name'} cmp $b->{'name'} } @allpvs;
@links = ( );
foreach $v (@vgs) {
push(@links, "<a href='edit_pv.cgi?vg=".&urlize($v->{'name'}).
"'>".&text('index_addpv2', $v->{'name'})."</a>");
}
if (!@allpvs) {
# None yet
print "<b>$text{'index_nopvs2'}</b><p>\n";
}
elsif ($config{'show_table'}) {
# Show table of PVs
print &ui_links_row(\@links);
print &ui_columns_start([ $text{'index_pvname'},
$text{'index_pvvg'},
$text{'index_pvsize'},
$text{'index_pvtotal'},
$text{'index_pvtotal2'} ], 100);
foreach $p (@allpvs) {
($v) = grep { $_->{'name'} eq $p->{'vg'} } @vgs;
print &ui_columns_row([
"<a href='edit_pv.cgi?vg=".&urlize($v->{'name'}).
"&pv=".&urlize($p->{'name'})."'>$p->{'name'}</a>",
$v->{'name'},
&nice_size($p->{'size'}*1024),
&text('lv_petotals', $p->{'pe_alloc'},
$p->{'pe_total'}),
&text('lv_petotals',
&nice_size($p->{'pe_alloc'}*$p->{'pe_size'}*1024),
&nice_size($p->{'pe_total'}*$p->{'pe_size'}*1024)),
]);
}
print &ui_columns_end();
}
else {
# Show PV icons
print &ui_links_row(\@links);
foreach $p (@allpvs) {
($v) = grep { $_->{'name'} eq $p->{'vg'} } @vgs;
push(@pvicons, "edit_pv.cgi?vg=".&urlize($v->{'name'}).
"&pv=".&urlize($p->{'name'}));
push(@pvtitles, &html_escape($p->{'name'}).
"<br>".&nice_size($p->{'size'}*1024));
push(@pvlinks, "images/vg.gif");
}
&icons_table(\@pvicons, \@pvtitles, \@pvlinks);
}
print &ui_links_row(\@links);
print &ui_tabs_end_tab();
# Show logical volumes
print &ui_tabs_start_tab("mode", "lvs");
print $text{'index_lvsdesc'},"<p>\n";
foreach $v (@vgs) {
push(@alllvs, &list_logical_volumes($v->{'name'}));
}
@alllvs = sort { $a->{'name'} cmp $b->{'name'} } @alllvs;
@links = ( );
foreach $v (@vgs) {
push(@links, "<a href='edit_lv.cgi?vg=".&urlize($v->{'name'}).
"'>".&text('index_addlv2', $v->{'name'})."</a>");
push(@links, "<a href='edit_lv.cgi?vg=".&urlize($v->{'name'}).
"&snap=1'>".&text('index_addlv2s', $v->{'name'})."</a>");
}
if (!@alllvs) {
# None yet
print "<b>$text{'index_nolvs2'}</b><p>\n";
}
elsif ($config{'show_table'}) {
# Show table of LVs
print &ui_links_row(\@links);
print &ui_columns_start([ $text{'index_lvname'},
$text{'index_lvvg'},
$text{'index_lvsize'},
$text{'index_lvuse'} ], 100);
foreach $l (@alllvs) {
($v) = grep { $_->{'name'} eq $l->{'vg'} } @vgs;
if ($lv->{'is_snap'}) {
($snapof) = grep {
$_->{'size'} == $l->{'size'} &&
$_->{'vg'} eq $l->{'vg'} &&
$_->{'has_snap'} } @alllvs;
}
else {
$snapof = undef;
}
@stat = &device_status($l->{'device'});
print &ui_columns_row([
"<a href='edit_lv.cgi?vg=".&urlize($v->{'name'}).
"&lv=".&urlize($l->{'name'})."'>$l->{'name'}</a>",
$v->{'name'},
&nice_size($l->{'size'}*1024),
(@stat ? &device_message(@stat) : undef).
($snap ? " ".&text('index_snapof', $snap->{'name'})
: ""),
]);
}
print &ui_columns_end();
}
else {
# Show PV icons
print &ui_links_row(\@links);
foreach $l (@alllvs) {
($v) = grep { $_->{'name'} eq $l->{'vg'} } @vgs;
push(@lvicons, "edit_lv.cgi?vg=".&urlize($v->{'name'}).
"&lv=".&urlize($l->{'name'}));
push(@lvtitles, &html_escape($l->{'name'}).
"<br>".&nice_size($l->{'size'}*1024));
push(@lvlinks, "images/lv.gif");
}
&icons_table(\@lvicons, \@lvtitles, \@lvlinks);
}
print &ui_links_row(\@links);
print &ui_tabs_end_tab();
print &ui_tabs_end(1);
}
else {
print "<b>$text{'index_none'}</b> <p>\n";
@@ -112,7 +221,7 @@ else {
sub lvm_header
{
&ui_print_header(undef, $text{'index_title'}, "", undef, 0, 1, 0,
&ui_print_header(undef, $text{'index_title'}, "", undef, 1, 1, 0,
&help_search_link("lvm", "man", "doc", "google"), undef, undef,
$lvm_version ? &text('index_version', $lvm_version) : undef);
}

View File

@@ -8,13 +8,35 @@ index_none=No volume groups were found on your system.
index_add=Add a new volume group.
index_nolvs=This volume group has<br>no logical volumes yet.
index_nopvs=This volume group has<br>no physical volumes yet.
index_addpv=Add a physical volume to the group.
i2ndex_addpv=Add a physical volume to the group.
index_addpv2=Add a physical volume to <tt>$1</tt>.
index_addlv2=Create a logical volume in <tt>$1</tt>.
index_addlv2s=Create a snapshot in <tt>$1</tt>.
index_addlv=Create a new logical volume.
index_addsnap=Create a new snapshot.
index_return=volume groups
index_init=This may be because LVM has not been activated yet. <a href='$1'>Activate it now</a> to view all volume groups.
index_eversion=Webmin only supports LVM versions 1.0 and above. The output from $1 on your system was : $2
index_version=LVM version $1
index_vgname=Volume group name
index_vgsize=Total size
index_vgtotal=Blocks used
index_vgtotal2=Size used
index_nopvs2=No physical volumes have been added to any volume groups yet.
index_nolvs2=No logical volumes have been created from any volume groups yet.
index_pvname=Physical volume device
index_pvvg=In volume group
index_pvsize=Device size
index_pvtotal=Blocks used
index_pvtotal2=Size used
index_vgsdesc=A volume group is a set of disks that can be allocated to one or more logical volumes. Most systems will have only one.
index_pvsdesc=A physical volume is a disk partition or RAID device that is part of a volume group. Its disk space can then be used by one or more logical volumes.
index_lvsdesc=A logical volume is a virtual partition created from the combined disk space of a volume group. Each can have a filesystem which is then mounted to store files.
index_lvname=Logical volume
index_lvvg=Volume group
index_lvsize=Size
index_lvuse=Used for
index_snapof=(Snapshot of $1)
lv_edit=Edit Logical Volume
lv_edit_snap=Edit Snapshot

View File

@@ -42,6 +42,7 @@ if (-d $lvm_proc) {
else {
# Use pvdisplay command
local $pv;
local $_;
open(DISPLAY, "pvdisplay |");
while(<DISPLAY>) {
s/\r|\n//g;
@@ -258,6 +259,7 @@ if (-d $lvm_proc) {
else {
# Use the lvdisplay command
local $lv;
local $_;
open(DISPLAY, "lvdisplay |");
while(<DISPLAY>) {
s/\r|\n//g;