antipode.info
2b3440a429
Corrected so the values for hosts with spaces in their names are correctly proceeded. And escaped print for verification function.
398 lines
16 KiB
Perl
398 lines
16 KiB
Perl
#!/usr/bin/perl
|
|
#
|
|
# Based on script from https://www.zabbix.com/forum/showthread.php?t=17273
|
|
#
|
|
# Backuppc
|
|
use lib "/usr/local/BackupPC/lib";
|
|
use BackupPC::Lib;
|
|
use BackupPC::CGI::Lib;
|
|
|
|
#Other
|
|
use Data::Dumper;
|
|
|
|
# Globals
|
|
$bpc = BackupPC::Lib->new();
|
|
$hosts = $bpc->HostInfoRead();
|
|
|
|
# Setup
|
|
&var_config();
|
|
&zabbix_config();
|
|
|
|
# %Info = Pool Info
|
|
# %QueueLen = Command Queues
|
|
# %Jobs = jobs
|
|
|
|
# Collect Data
|
|
GetStatusInfo("jobs queueLen info");
|
|
#print Dumper(%Info);
|
|
&jobs_info();
|
|
&pool_info();
|
|
&queue_info();
|
|
&general_info();
|
|
&hosts_info();
|
|
|
|
# Push Data to Zabbix
|
|
foreach my $key (keys %Val) {
|
|
if ($Var{$key})
|
|
{
|
|
zabbix_post($Var{$key},$Val{$key});
|
|
#print "$Var{$key} | $Val{$key}\n";
|
|
}
|
|
}
|
|
print "1";
|
|
|
|
|
|
# Functions
|
|
sub hosts_info
|
|
{
|
|
# Variables
|
|
$fullSizeTot = 0;
|
|
$fullCnt = 0;
|
|
$fullCnt2 = 0;
|
|
$incrSizeTot = 0;
|
|
$incrCnt = 0;
|
|
$incrCnt2 = 0;
|
|
$total_speed_full = 0;
|
|
$total_speed_incr = 0;
|
|
|
|
$no_backups_2 = "NONE";
|
|
$no_backups_3 = "NONE";
|
|
$no_backups_4 = "NONE";
|
|
$no_backups_5 = "NONE";
|
|
|
|
while ( my ($host, $value) = each(%$hosts) )
|
|
{
|
|
|
|
my @Backups = $bpc->BackupInfoRead($host);
|
|
$bpc->ConfigRead($host);
|
|
my %Conf = $bpc->Conf();
|
|
|
|
# Variables
|
|
my $fullAge;
|
|
my $fullSize;
|
|
my $fullDur;
|
|
my $incrAge;
|
|
my $incrSize;
|
|
my $incrDur;
|
|
my $vfullAge="fullAge".$host;
|
|
my $vfullSize="fullSize".$host;
|
|
my $vfullDur="fullDur".$host;
|
|
my $vincrAge="incrAge".$host;
|
|
my $vincrSize="incrSize".$host;
|
|
my $vincrDur="incrDur".$host;
|
|
my $vfullErrs="fullErrs".$host;
|
|
my $vfullBadShare="fullBadShare".$host;
|
|
my $vfullBadFile="fullBadFile".$host;
|
|
my $vfulltarErrs="fulltarErrs".$host;
|
|
my $vincrErrs="incrErrs".$host;
|
|
my $vincrBadShare="incrBadShare".$host;
|
|
my $vincrBadFile="incrBadFile".$host;
|
|
my $vincrtarErrs="incrtarErrs".$host;
|
|
|
|
$Var{$vfullAge}="backuppc.fullage[".$host."]";
|
|
$Var{$vfullSize}="backuppc.fullsize[".$host."]";
|
|
$Var{$vfullDur}="backuppc.fulldur[".$host."]";
|
|
$Var{$vincrAge}="backuppc.incrage[".$host."]";
|
|
$Var{$vincrSize}="backuppc.incrsize[".$host."]";
|
|
$Var{$vincrDur}="backuppc.incrdur[".$host."]";
|
|
$Var{$vfullErrs}="backuppc.fullerrs[".$host."]";
|
|
$Var{$vfullBadShare}="backuppc.fullbadshare[".$host."]";
|
|
$Var{$vfullBadFile}="backuppc.fullbadfile[".$host."]";
|
|
$Var{$vfulltarErrs}="backuppc.fulltarerrs[".$host."]";
|
|
$Var{$vincrErrs}="backuppc.increrrs[".$host."]";
|
|
$Var{$vincrBadShare}="backuppc.incrbadshare[".$host."]";
|
|
$Var{$vincrBadFile}="backuppc.incrbadfile[".$host."]";
|
|
$Var{$vincrtarErrs}="backuppc.incrtarerrs[".$host."]";
|
|
for ( my $i = 0 ; $i < @Backups ; $i++ )
|
|
{
|
|
if ( $Backups[$i]{type} eq "full" )
|
|
{
|
|
$fullCnt++;
|
|
if ( $fullAge < 0 || $Backups[$i]{startTime} > $fullAge )
|
|
{
|
|
$fullAge = $Backups[$i]{startTime};
|
|
$fullSize = $Backups[$i]{size};
|
|
$fullDur = $Backups[$i]{endTime} - $Backups[$i]{startTime};
|
|
$Val{$vfullErrs}=$Backups[$i]{xferErrs};
|
|
$Val{$vfullBadShare}=$Backups[$i]{xferBadShare};
|
|
$Val{$vfullBadFile}=$Backups[$i]{xferBadFile};
|
|
$Val{$vfulltarErrs}=$Backups[$i]{tarErrs};
|
|
$Val{$vfullAge}=(time() - $fullAge)/86400;
|
|
$Val{$vfullSize}=$fullSize;
|
|
$Val{$vfullDur}=$fullDur;
|
|
}
|
|
$fullSizeTot += $Backups[$i]{size};
|
|
}
|
|
else
|
|
{
|
|
$incrCnt++;
|
|
if ( $incrAge < 0 || $Backups[$i]{startTime} > $incrAge )
|
|
{
|
|
$incrAge = $Backups[$i]{startTime};
|
|
$incrSize = $Backups[$i]{size};
|
|
$incrDur = $Backups[$i]{endTime} - $Backups[$i]{startTime};
|
|
$Val{$vincrErrs}=$Backups[$i]{xferErrs};
|
|
$Val{$vincrBadShare}=$Backups[$i]{xferBadShare};
|
|
$Val{$vincrBadFile}=$Backups[$i]{xferBadFile};
|
|
$Val{$vincrtarErrs}=$Backups[$i]{tarErrs};
|
|
$Val{$vincrAge}=(time() - $incrAge)/86400;
|
|
$Val{$vincrSize}=$incrSize;
|
|
$Val{$vincrDur}=$incrDur;
|
|
}
|
|
$incrSizeTot += $Backups[$i]{size};
|
|
}
|
|
}
|
|
# Sum the Last Full Backup Speed
|
|
if ($fullSize > 0 && $fullDur >0)
|
|
{
|
|
$total_speed_full += ($fullSize / $fullDur);
|
|
$fullCnt2++;
|
|
}
|
|
# Sum the Last Full Incr Speed
|
|
if ($incrSize > 0 && $incrDur >0)
|
|
{
|
|
$total_speed_incr += ($incrSize / $incrDur);
|
|
$incrCnt2++;
|
|
}
|
|
|
|
if ($host eq "haulingaz")
|
|
{
|
|
print "Full Age: $fullAge\n";
|
|
print "Full Period: $Conf{FullPeriod}\n";
|
|
print "Incr Age: $incrAge\n";
|
|
print "Incr Period: $Conf{IncrPeriod}\n";
|
|
}
|
|
|
|
# Check for Hosts that don't have backups (Full)
|
|
my $skip_inc = 0;
|
|
|
|
# If we have a full that less than 2 days old we can skip
|
|
if ( (time() - $fullAge) < ( (86400 * 2) ) && $Conf{BackupsDisable} == 0 )
|
|
{ $skip_inc = 1;}
|
|
|
|
# If we don't have any fulls, we are going to set the no_backups so we can skip inc
|
|
if ( (time() - $fullAge) > ( ($Conf{FullPeriod} * 86400) + (86400 * 2) ) && $Conf{BackupsDisable} == 0 )
|
|
{ if ($no_backups_2 eq "NONE") { $no_backups_2 = "$host"} else { $no_backups_2 .= "\n$host" } $skip_inc = 1;}
|
|
|
|
if ( (time() - $fullAge) > ( ($Conf{FullPeriod} * 86400) + (86400 * 3) ) && $Conf{BackupsDisable} == 0 )
|
|
{ if ($no_backups_3 eq "NONE") { $no_backups_3 = "$host"} else { $no_backups_3 .= "\n$host" } $skip_inc = 1;}
|
|
|
|
if ( (time() - $fullAge) > ( ($Conf{FullPeriod} * 86400) + (86400 * 4) ) && $Conf{BackupsDisable} == 0 )
|
|
{ if ($no_backups_4 eq "NONE") { $no_backups_4 = "$host"} else { $no_backups_4 .= "\n$host" } $skip_inc = 1;}
|
|
|
|
if ( (time() - $fullAge) > ( ($Conf{FullPeriod} * 86400) + (86400 * 5) ) && $Conf{BackupsDisable} == 0 )
|
|
{ if ($no_backups_5 eq "NONE") { $no_backups_5 = "$host"} else { $no_backups_5 .= "\n$host" } $skip_inc = 1;}
|
|
|
|
# Check for Hosts that don't have backups (Incremental)
|
|
if ( (time() - $incrAge) > ( ($Conf{IncrPeriod} * 86400) + (86400 * 2) ) && $Conf{BackupsDisable} == 0 && $Conf{IncrKeepCnt} > 0 && $skip_inc == 0)
|
|
{ if ($no_backups_2 eq "NONE") { $no_backups_2 = "$host"} else { $no_backups_2 .= "\n$host" } }
|
|
|
|
if ( (time() - $incrAge) > ( ($Conf{IncrPeriod} * 86400) + (86400 * 3) ) && $Conf{BackupsDisable} == 0 && $Conf{IncrKeepCnt} > 0 && $skip_inc == 0)
|
|
{ if ($no_backups_3 eq "NONE") { $no_backups_3 = "$host"} else { $no_backups_3 .= "\n$host" } }
|
|
|
|
if ( (time() - $incrAge) > ( ($Conf{IncrPeriod} * 86400) + (86400 * 4) ) && $Conf{BackupsDisable} == 0 && $Conf{IncrKeepCnt} > 0 && $skip_inc == 0)
|
|
{ if ($no_backups_4 eq "NONE") { $no_backups_4 = "$host"} else { $no_backups_4 .= "\n$host" } }
|
|
|
|
if ( (time() - $incrAge) > ( ($Conf{IncrPeriod} * 86400) + (86400 * 5) ) && $Conf{BackupsDisable} == 0 && $Conf{IncrKeepCnt} > 0 && $skip_inc == 0)
|
|
{ if ($no_backups_5 eq "NONE") { $no_backups_5 = "$host"} else { $no_backups_5 .= "\n$host" } }
|
|
|
|
|
|
}
|
|
if ($fullCnt2 > 0 )
|
|
{ $Val{hostsAvgFullSpeed} = ($total_speed_full / $fullCnt2); }
|
|
if ($incrCnt2 > 0 )
|
|
{ $Val{hostsAvgIncrSpeed} = ($total_speed_incr / $incrCnt2); }
|
|
$Val{hostsFullSize} = $fullSizeTot;
|
|
$Val{hostsFullCount} = $fullCnt;
|
|
$Val{hostsIncrSize} = $incrSizeTot;
|
|
$Val{hostsIncrCount} = $incrCnt;
|
|
$Val{hostsNoBackups2} = $no_backups_2;
|
|
$Val{hostsNoBackups3} = $no_backups_3;
|
|
$Val{hostsNoBackups4} = $no_backups_4;
|
|
$Val{hostsNoBackups5} = $no_backups_5;
|
|
}
|
|
|
|
sub pool_info
|
|
{
|
|
while ( my ($key, $value) = each(%Info) )
|
|
{
|
|
if ($key =~ /pool/)
|
|
{$Val{$key} = int($Info{$key}); }
|
|
}
|
|
}
|
|
|
|
|
|
sub general_info
|
|
{
|
|
$Val{startTime} = time() - $Info{startTime};
|
|
$Val{Version} = $Info{Version};
|
|
$Val{ConfigLTime} = time() - $Info{ConfigLTime};
|
|
|
|
}
|
|
|
|
sub queue_info
|
|
{
|
|
while ( my ($key, $value) = each(%QueueLen) )
|
|
{
|
|
if ($key =~ /Queue/)
|
|
{$Val{$key} = $QueueLen{$key};}
|
|
}
|
|
}
|
|
|
|
sub jobs_info
|
|
{
|
|
$Val{JobsIncr} = 0;
|
|
$Val{JobsFull} = 0;
|
|
$Val{JobsOther} = 0;
|
|
|
|
# Jobs
|
|
while ( my ($key, $value) = each(%Jobs) ) {
|
|
#print "$key => $value\n";
|
|
#print Dumper($value);
|
|
if (!($key =~ /trashClean/i))
|
|
{
|
|
# Count Incrementail Jobs
|
|
if( $value->{'type'} eq 'incr')
|
|
{ $Val{JobsIncr}++; }
|
|
|
|
# Count Full Jobs
|
|
elsif( $value->{'type'} eq 'full')
|
|
{ $Val{JobsFull}++; }
|
|
|
|
# Everything Else
|
|
else { $Val{JobsOther}++; }
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
sub GetStatusInfo
|
|
{
|
|
my($status) = @_;
|
|
ServerConnect();
|
|
%Status = () if ( $status =~ /\bhosts\b/ );
|
|
%StatusHost = () if ( $status =~ /\bhost\(/ );
|
|
my $reply = $bpc->ServerMesg("status $status");
|
|
$reply = $1 if ( $reply =~ /(.*)/s );
|
|
eval($reply);
|
|
# ignore status related to admin and trashClean jobs
|
|
if ( $status =~ /\bhosts\b/ ) {
|
|
foreach my $host ( grep(/admin/, keys(%Status)) ) {
|
|
delete($Status{$host}) if ( $bpc->isAdminJob($host) );
|
|
}
|
|
delete($Status{$bpc->trashJob});
|
|
}
|
|
}
|
|
|
|
#
|
|
# Returns the list of hosts that should appear in the navigation bar
|
|
# for this user. If $getAll is set, the admin gets all the hosts.
|
|
# Otherwise, regular users get hosts for which they are the user or
|
|
# are listed in the moreUsers column in the hosts file.
|
|
#
|
|
sub GetUserHosts
|
|
{
|
|
my($getAll) = @_;
|
|
my @hosts;
|
|
|
|
if ( $getAll ) {
|
|
@hosts = sort keys %$Hosts;
|
|
} else {
|
|
@hosts = sort grep { $Hosts->{$_}{user} eq $User ||
|
|
defined($Hosts->{$_}{moreUsers}{$User}) } keys(%$Hosts);
|
|
}
|
|
return @hosts;
|
|
}
|
|
|
|
|
|
sub ServerConnect
|
|
{
|
|
#
|
|
# Verify that the server connection is ok
|
|
#
|
|
return if ( $bpc->ServerOK() );
|
|
$bpc->ServerDisconnect();
|
|
if ( my $err = $bpc->ServerConnect($Conf{ServerHost}, $Conf{ServerPort}) ) {
|
|
if ( CheckPermission()
|
|
&& -f $Conf{ServerInitdPath}
|
|
&& $Conf{ServerInitdStartCmd} ne "" ) {
|
|
my $content = eval("qq{$Lang->{Admin_Start_Server}}");
|
|
Header(eval("qq{$Lang->{Unable_to_connect_to_BackupPC_server}}"), $content);
|
|
Trailer();
|
|
exit(1);
|
|
} else {
|
|
ErrorExit(eval("qq{$Lang->{Unable_to_connect_to_BackupPC_server}}"));
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
sub zabbix_config {
|
|
|
|
open(CONFIG,"/etc/zabbix/zabbix_agentd.conf");
|
|
foreach(<CONFIG>)
|
|
{
|
|
$zabbix_host = $1 if (/Hostname\s*=\s*(.*)/);
|
|
$zabbix_server = $1 if (/Server\s*=\s*(.*)/);
|
|
}
|
|
close CONFIG;
|
|
}
|
|
|
|
sub zabbix_post {
|
|
my $key = $_[0];
|
|
my $val = $_[1];
|
|
my @servers = split(',', $zabbix_server);
|
|
|
|
foreach my $server (@servers) {
|
|
my $cmd = "zabbix_sender -z $server -p 10051 -s $zabbix_host -k '$key' -o '$val'";
|
|
system("$cmd >/dev/null");
|
|
}
|
|
}
|
|
|
|
|
|
sub var_config {
|
|
|
|
# Pool Info
|
|
$Var{poolFileCnt} = "backuppc.pool_file_count";
|
|
$Var{poolDirCnt} = "backuppc.pool_dir_count";
|
|
#$Var{poolFileCntRm} = "backuppc.pool_file_removed";
|
|
$Var{poolFileCntRep} = "backuppc.pool_file_repeat";
|
|
$Var{poolFileRepMax} = "backuppc.pool_file_repeat_max";
|
|
$Var{poolFileLinkMax} = "backuppc.pool_file_link_max";
|
|
$Var{poolKb} = "backuppc.pool_size";
|
|
$Var{cpoolFileCnt} = "backuppc.cpool_file_count";
|
|
$Var{cpoolDirCnt} = "backuppc.cpool_dir_count";
|
|
#$Var{cpoolFileCntRm} = "backuppc.cpool_file_removed";
|
|
$Var{cpoolFileCntRep} = "backuppc.cpool_file_repeat";
|
|
$Var{cpoolFileRepMax} = "backuppc.cpool_file_repeat_max";
|
|
$Var{cpoolFileLinkMax} = "backuppc.cpool_file_link_max";
|
|
$Var{cpoolKb} = "backuppc.cpool_size";
|
|
|
|
# General Stats
|
|
$Var{startTime} = "backuppc.uptime";
|
|
$Var{Version} = "backuppc.version";
|
|
$Var{ConfigLTime} = "backuppc.config_load_time";
|
|
|
|
# Queues
|
|
$Var{CmdQueue} = "backuppc.queue_command";
|
|
$Var{UserQueue} = "backuppc.queue_user";
|
|
$Var{BgQueue} = "backuppc.queue_background";
|
|
|
|
# Jobs
|
|
$Var{JobsIncr} = "backuppc.jobs_incr";
|
|
$Var{JobsFull} = "backuppc.jobs_full";
|
|
$Var{JobsOther} = "backuppc.jobs_other";
|
|
|
|
# Hosts
|
|
$Var{hostsAvgFullSpeed} = "backuppc.hosts_full_speed";
|
|
$Var{hostsAvgIncrSpeed} = "backuppc.hosts_incr_speed";
|
|
$Var{hostsFullSize} = "backuppc.hosts_full_size";
|
|
$Var{hostsFullCount} = "backuppc.hosts_full_count";
|
|
$Var{hostsIncrSize} = "backuppc.hosts_incr_size";
|
|
$Var{hostsIncrCount} = "backuppc.hosts_incr_count";
|
|
$Var{hostsNoBackups2} = "backuppc.hosts_nobackup_2";
|
|
$Var{hostsNoBackups3} = "backuppc.hosts_nobackup_3";
|
|
$Var{hostsNoBackups4} = "backuppc.hosts_nobackup_4";
|
|
$Var{hostsNoBackups5} = "backuppc.hosts_nobackup_5";
|
|
}
|