Sometimes you would like to know on sun zfs head, which project occupies most of the space, and which shares of that occupies most space of that project.
Here’s a perl script to fulfill this(it’s a little cumbersome, but it works anyway)
#!/usr/bin/perl
use strict;
use warnings;
use Net::SSH::Perl;
use List::Util qw/sum/;
my $host = ‘test-zfs-host’;
my $user = ‘root’;
my $password = ‘password’;
my $ssh = Net::SSH::Perl->new($host);
$ssh->login($user,$password);
my ($stdout,$stderr,$exit) = $ssh->cmd(“shares show”);
my @std_arr=split(/:/,$stdout);
my @projects_arr = split(/\n/, $std_arr[2]);
foreach(@projects_arr){
$_ =~ s/^\s+|\s+$//g;
}
shift @projects_arr;
pop @projects_arr;
pop @projects_arr;
my @space_projects;
foreach(@projects_arr){
my ($stdout2,$stderr2,$exit2) = $ssh->cmd(“shares select $_ get”);
my @stdout_arr=split(/\n/,$stdout2);
my $space_temp=join(“\n”,grep(/space_total/,@stdout_arr));
my @space_total_project = “project “.$_.$space_temp;
push(@space_projects,@space_total_project);
}
my @space_projects3;
foreach(@projects_arr){
my ($stdout3,$stderr3,$exit3) = $ssh->cmd(“shares select $_ ls”);
my @stdout_arr3=split(/\n/,$stdout3);
my @space_temp3=grep(/\/export\//,@stdout_arr3);
my @space_temp4=grep(!/mountpoint/,@space_temp3);
push(@space_projects3,@space_temp4);
}
open(my $temp1,’>’,'/var/tmp/temp1′) or die(“cannot open file temp1″);
open(my $temp2,’>’,'/var/tmp/temp2′) or die(“cannot open file temp2″);
open(my $temp3,’>’,'/var/tmp/temp3′) or die(“cannot open file temp3″);
open(my $temp4,’>’,'/var/tmp/temp4′) or die(“cannot open file temp4″);
my @var_T;
my @var_G;
my @var_M;
my @var_K;
foreach(@space_projects){
if($_ =~ /.+space_total\s+(.*)K/){
push(@var_K,$_);
}
elsif($_ =~ /.+space_total\s+(.*)M/){
push(@var_M,$_);
}
elsif($_ =~ /.+space_total\s+(.*)G/){
push(@var_G,$_);
}
elsif($_ =~ /.+space_total\s+(.*)T/){
push(@var_T,$_);
}
}
select $temp1;
foreach(@var_T){
print $_.”\n”;
}
close $temp1;
select $temp2;
foreach(@var_G){
print $_.”\n”;
}
close $temp2;
select $temp3;
foreach(@var_M){
print $_.”\n”;
}
close $temp3;
select $temp4;
foreach(@var_K){
print $_.”\n”;
}
close $temp4;
system(“echo \”======zfs project usage info(Descending)======\”");
system(“sort -r -n -k 5 /var/tmp/temp1;sort -r -n -k 5 /var/tmp/temp2;sort -r -n -k 5 /var/tmp/temp3;sort -r -n -k 5 /var/tmp/temp4″);
open(my $temp5,’>’,'/var/tmp/temp5′) or die(“cannot open file temp5″);
open(my $temp6,’>’,'/var/tmp/temp6′) or die(“cannot open file temp6″);
open(my $temp7,’>’,'/var/tmp/temp7′) or die(“cannot open file temp7″);
open(my $temp8,’>’,'/var/tmp/temp8′) or die(“cannot open file temp8″);
my @var_T_2;
my @var_G_2;
my @var_M_2;
my @var_K_2;
foreach(@space_projects3){
if($_ =~ /\s+.*K\s+.*/){
push(@var_K_2,$_);
}
elsif($_ =~ /\s+.*M\s+.*/){
push(@var_M_2,$_);
}
elsif($_ =~ /\s+.*G\s+.*/){
push(@var_G_2,$_);
}
elsif($_ =~ /\s+.*T\s+.*/){
push(@var_T_2,$_);
}
}
select $temp5;
foreach(@var_T_2){
print $_.”\n”;
}
close $temp5;
select $temp6;
foreach(@var_G_2){
print $_.”\n”;
}
close $temp6;
select $temp7;
foreach(@var_M_2){
print $_.”\n”;
}
close $temp7;
select $temp8;
foreach(@var_K_2){
print $_.”\n”;
}
close $temp8;
system(“echo \”\n\n\n======zfs share usage info(Descending)======\”");
system(“sort -r -n -k 2 /var/tmp/temp5;sort -r -n -k 2 /var/tmp/temp6;sort -r -n -k 2 /var/tmp/temp7;sort -r -n -k 2 /var/tmp/temp8″);