#!/usr/bin/perl # # Based on script from https://www.zabbix.com/forum/showthread.php?t=17273 # # Backuppc use lib "/usr/share/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() { $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"; }