You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
219 lines
5.8 KiB
219 lines
5.8 KiB
#!/usr/bin/perl |
|
|
|
use strict; |
|
use warnings; |
|
use Anvil::Tools; |
|
use Data::Dumper; |
|
use Text::Diff; |
|
use Term::Cap; |
|
use Time::Local; |
|
|
|
$| = 1; |
|
|
|
my $THIS_FILE = ($0 =~ /^.*\/(.*)$/)[0]; |
|
my $running_directory = ($0 =~ /^(.*?)\/$THIS_FILE$/)[0]; |
|
if (($running_directory =~ /^\./) && ($ENV{PWD})) |
|
{ |
|
$running_directory =~ s/^\./$ENV{PWD}/; |
|
} |
|
|
|
my $anvil = Anvil::Tools->new(); |
|
|
|
# Get a list of all interfaces with IP addresses. |
|
$anvil->Get->switches({debug => 2, list => ["watch"]}); |
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => $anvil->data->{switches}}); |
|
|
|
|
|
our $t = Term::Cap->Tgetent; |
|
|
|
# One shot or continuous? |
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { |
|
'switches::watch' => $anvil->data->{switches}{watch}, |
|
}}); |
|
if ($anvil->data->{switches}{watch}) |
|
{ |
|
# Do we have an interval? |
|
my $interval = 2; |
|
if ($anvil->data->{switches}{watch} =~ /^\d+$/) |
|
{ |
|
$interval = $anvil->data->{switches}{watch}; |
|
} |
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 1, list => { interval => $interval }}); |
|
|
|
# Loop until terminated. |
|
while(1) |
|
{ |
|
show_status($anvil); |
|
sleep $interval; |
|
} |
|
} |
|
else |
|
{ |
|
# Once and exit. |
|
show_status($anvil); |
|
} |
|
|
|
$anvil->nice_exit({exit_code => 0}); |
|
|
|
|
|
sub show_status |
|
{ |
|
my ($anvil) = @_; |
|
|
|
if ($anvil->data->{switches}{watch}) |
|
{ |
|
system('clear'); |
|
print $t->Tgoto("cm", 0, 0); |
|
} |
|
|
|
if ($anvil->data->{switches}{watch}) |
|
{ |
|
my $date = $anvil->Get->date_and_time(); |
|
print "-=] Updated: ".$date." - Press '<ctrl> + <c>' to exit\n"; |
|
} |
|
|
|
my $vms = {}; |
|
my $longest_resource = 3; # Res |
|
my $longest_connection = 2; # To |
|
my $longest_volume = 3; # Vol |
|
my $total_transfer = 0; |
|
|
|
my $root_directory = $anvil->data->{path}{directories}{resource_status}; |
|
local(*DIRECTORY); |
|
opendir(DIRECTORY, $root_directory); |
|
while(my $file = readdir(DIRECTORY)) |
|
{ |
|
next if $file eq "."; |
|
next if $file eq ".."; |
|
my $full_path = $root_directory."/".$file; |
|
if (-d $full_path) |
|
{ |
|
my $resource = $file; |
|
if (length($resource) > $longest_resource) |
|
{ |
|
$longest_resource = length($resource); |
|
} |
|
$vms->{resource}{$resource} = {}; |
|
#print "Resource found: [".$resource."]\n"; |
|
} |
|
} |
|
closedir(DIRECTORY); |
|
|
|
foreach my $resource (sort {$a cmp $b} keys %{$vms->{resource}}) |
|
{ |
|
my $directory = $root_directory."/".$resource."/connections"; |
|
local(*DIRECTORY); |
|
opendir(DIRECTORY, $directory); |
|
while(my $file = readdir(DIRECTORY)) |
|
{ |
|
next if $file eq "."; |
|
next if $file eq ".."; |
|
my $full_path = $directory."/".$file; |
|
if (-d $full_path) |
|
{ |
|
my $connection = $file; |
|
if (length($connection) > $longest_connection) |
|
{ |
|
$longest_connection = length($connection); |
|
} |
|
#print "Found connection: [".$resource."] -> [".$connection."]\n"; |
|
$vms->{resource}{$resource}{connection}{$connection} = {}; |
|
} |
|
} |
|
closedir(DIRECTORY); |
|
|
|
foreach my $connection (sort {$a cmp $b} keys %{$vms->{resource}{$resource}{connection}}) |
|
{ |
|
my $directory = $root_directory."/".$resource."/connections/".$connection; |
|
local(*DIRECTORY); |
|
opendir(DIRECTORY, $directory); |
|
while(my $file = readdir(DIRECTORY)) |
|
{ |
|
next if $file eq "."; |
|
next if $file eq ".."; |
|
my $full_path = $directory."/".$file."/proc_drbd"; |
|
if (-r $full_path) |
|
{ |
|
my $volume = $file; |
|
if (length($volume) > $longest_volume) |
|
{ |
|
$longest_volume = length($volume); |
|
} |
|
#print "Found volume: [".$resource."] -> [".$connection."] -> [".$volume."]\n"; |
|
$vms->{resource}{$resource}{connection}{$connection}{volume}{$volume}{proc_drbd} = $full_path; |
|
} |
|
} |
|
closedir(DIRECTORY); |
|
} |
|
} |
|
|
|
print "Sync progress:\n"; |
|
print " ".sprintf("%-${longest_resource}s", "Res")." ".sprintf("%-${longest_connection}s", "To")." Vol\n"; |
|
foreach my $resource (sort {$a cmp $b} keys %{$vms->{resource}}) |
|
{ |
|
foreach my $connection (sort {$a cmp $b} keys %{$vms->{resource}{$resource}{connection}}) |
|
{ |
|
foreach my $volume (sort {$a cmp $b} keys %{$vms->{resource}{$resource}{connection}{$connection}{volume}}) |
|
{ |
|
my $local_role = ""; |
|
my $peer_role = ""; |
|
my $local_disk = ""; |
|
my $peer_disk = ""; |
|
my $proc_file = $vms->{resource}{$resource}{connection}{$connection}{volume}{$volume}{proc_drbd}; |
|
my $progress = ""; |
|
open (my $file_handle, "<", $proc_file) or die "Failed to read: [".$proc_file."], error: $!\n"; |
|
while(<$file_handle>) |
|
{ |
|
chomp; |
|
my $line = $_; |
|
if ($line =~ /ds:(.*?)\/(.*?) /) |
|
{ |
|
$local_disk = $1; |
|
$peer_disk = $2; |
|
if (($local_disk eq "UpToDate") && ($peer_disk eq "UpToDate")) |
|
{ |
|
$progress = "(UpToDate)"; |
|
} |
|
} |
|
if ($line =~ /ro:(.*?)\/(.*?) /) |
|
{ |
|
$local_role = $1; |
|
$peer_role = $2; |
|
if ($peer_role eq "Unknown") |
|
{ |
|
$progress = "(Disconnected)"; |
|
} |
|
} |
|
|
|
if ($line =~ /(\[.*?\])/) |
|
{ |
|
$progress = $1." "; |
|
} |
|
if ($line =~ /sync'ed: (.*?\%)/) |
|
{ |
|
$progress .= $1." "; |
|
} |
|
if ($line =~ /speed: (.*?) \(/) |
|
{ |
|
my $speed = $1; |
|
$progress .= $speed." KiB/Sec "; |
|
$speed =~ s/\D//g; |
|
$total_transfer += $speed; |
|
} |
|
if ($line =~ /finish: (.*?) speed/) |
|
{ |
|
$progress .= "(ETA ".$1.")"; |
|
} |
|
} |
|
close $file_handle; |
|
my $say_resource = sprintf("%-${longest_resource}s", $resource); |
|
my $say_connection = sprintf("%${longest_connection}s", $connection); |
|
my $say_volume = sprintf("%${longest_volume}s", $volume); |
|
print "- ".$say_resource." -> ".$say_connection." -> ".$say_volume.": ".$progress." // ds:".$local_disk."/".$peer_disk.", ro:".$local_role."/".$peer_role."\n"; |
|
} |
|
} |
|
} |
|
my $say_speed = $total_transfer / 1024; |
|
$say_speed =~ s/^(\d+\.\d{3})\d+/$1/; |
|
print "* Total transfer speed is about: [".$say_speed." MiB/sec]\n"; |
|
}
|
|
|