perl script for getting sun zfs head project and share usage info
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″);
The output would be like:
======zfs project usage info(Descending)======
project DC2_DMZ space_total = 7.68T
project dc2_c9testga space_total = 1.10T
project fa_trialadcf space_total = 277G
project fa_rehydration space_total = 266G
project common space_total = 10.0G
project NODE_8 space_total = 93K
project default space_total = 31K
======zfs share usage info(Descending)======
Service_Mid-2 1.44T /export/DC2_DMZ/Service_Mid-2
Service_Web 1.22T /export/DC2_DMZ/Service_Web
dc2_shared_idm 743G /export/DC2_DMZ/dc2_shared_idm
Infra_Web 400G /export/DC2_DMZ/Infra_Web
nuviaq_local02 988M /export/DC2_DMZ/nuviaq_local02
sftp_staging 127M /export/DC2_DMZ/sftp_staging
sftp_local03 14.8M /export/DC2_DMZ/sftp_local03
sftp_manager_local01 85K /export/DC2_DMZ/sftp_manager_local01













