applied On Mon, Jul 04, 2016 at 02:55:41PM +0200, Wolfgang Bumiller wrote: > This works on both online and offline containers. Offline > containers get mounted (with a 'mounted' lock) during the > operation. > > The output is similar to 'df -h'. > > Example output: > MP Volume Size Used Avail Use% Path > rootfs tank:subvol-400-disk-1 9.0G 184.9M 8.8G 0.0 / > mp0 /Custom/share 31.4G 26.3G 3.4G 0.8 /share > --- > Changes since v1: > * Added 'Volume' and 'Avail' columns > * Not excluding bindmounts anymore > > src/PVE/CLI/pct.pm | 87 > +++++++++++++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 86 insertions(+), 1 deletion(-) > > diff --git a/src/PVE/CLI/pct.pm b/src/PVE/CLI/pct.pm > index ca87229..b660585 100755 > --- a/src/PVE/CLI/pct.pm > +++ b/src/PVE/CLI/pct.pm > @@ -283,6 +283,89 @@ __PACKAGE__->register_method({ > return undef; > }}); > > +__PACKAGE__->register_method({ > + name => 'df', > + path => 'df', > + method => 'GET', > + description => "Get the container's current disk usage.", > + parameters => { > + additionalProperties => 0, > + properties => { > + vmid => get_standard_option('pve-vmid', { completion => > \&PVE::LXC::complete_ctid }), > + }, > + }, > + returns => { type => 'null' }, > + code => sub { > + my ($param) = @_; > + > + my $rpcenv = PVE::RPCEnvironment::get(); > + > + # JSONSchema's format_size is exact, this uses floating point numbers > + my $format = sub { > + my ($size) = @_; > + return $size if $size < 1024.; > + $size /= 1024.; > + return sprintf('%.1fK', ${size}) if $size < 1024.; > + $size /= 1024.; > + return sprintf('%.1fM', ${size}) if $size < 1024.; > + $size /= 1024.; > + return sprintf('%.1fG', ${size}) if $size < 1024.; > + $size /= 1024.; > + return sprintf('%.1fT', ${size}) if $size < 1024.; > + }; > + > + my $vmid = extract_param($param, 'vmid'); > + PVE::LXC::Config->lock_config($vmid, sub { > + my $pid = eval { PVE::LXC::find_lxc_pid($vmid) }; > + my ($conf, $rootdir, $storecfg, $mounted); > + if ($@ || !$pid) { > + $conf = PVE::LXC::Config->set_lock($vmid, 'mounted'); > + $rootdir = "/var/lib/lxc/$vmid/rootfs"; > + $storecfg = PVE::Storage::config(); > + PVE::LXC::mount_all($vmid, $storecfg, $conf); > + $mounted = 1; > + } else { > + $conf = PVE::LXC::Config->load_config($vmid); > + $rootdir = "/proc/$pid/root"; > + } > + > + my @list = [qw(MP Volume Size Used Avail Use% Path)]; > + my @len = map { length($_) } @{$list[0]}; > + > + eval { > + PVE::LXC::Config->foreach_mountpoint($conf, sub { > + my ($name, $mp) = @_; > + my $path = $mp->{mp}; > + > + my $df = PVE::Tools::df("$rootdir/$path", 3); > + my $total = $format->($df->{total}); > + my $used = $format->($df->{used}); > + my $avail = $format->($df->{avail}); > + > + my $pc = sprintf('%.1f', $df->{used}/$df->{total}); > + > + my $entry = [ $name, $mp->{volume}, $total, $used, $avail, > $pc, $path ]; > + push @list, $entry; > + > + foreach my $i (0..5) { > + $len[$i] = length($entry->[$i]) > + if $len[$i] < length($entry->[$i]); > + } > + }); > + > + my $format = "%-$len[0]s %-$len[1]s %$len[2]s %$len[3]s > %$len[4]s %$len[5]s %s\n"; > + printf($format, @$_) foreach @list; > + }; > + warn $@ if $@; > + > + if ($mounted) { > + PVE::LXC::umount_all($vmid, $storecfg, $conf, 0); > + PVE::LXC::Config->remove_lock($vmid, 'mounted'); > + } > + }); > + return undef; > + }}); > + > # File creation with specified ownership and permissions. > # User and group can be names or decimal numbers. > # Permissions are explicit (not affected by umask) and can be numeric with > the > @@ -575,7 +658,9 @@ our $cmddef = { > unmount => [ __PACKAGE__, 'unmount', ['vmid']], > push => [ __PACKAGE__, 'push', ['vmid', 'file', 'destination']], > pull => [ __PACKAGE__, 'pull', ['vmid', 'path', 'destination']], > - > + > + df => [ __PACKAGE__, 'df', ['vmid']], > + > destroy => [ 'PVE::API2::LXC', 'destroy_vm', ['vmid'], > { node => $nodename }, $upid_exit ], > > -- > 2.1.4 > > > _______________________________________________ > pve-devel mailing list > pve-devel@pve.proxmox.com > http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel >
_______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel