[pve-devel] [RFC v2 container] added 'pct df'
Fabian Grünbichler
f.gruenbichler at proxmox.com
Mon Jul 4 15:06:57 CEST 2016
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 at pve.proxmox.com
> http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
>
More information about the pve-devel
mailing list