123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- #!/usr/bin/perl -w
- use strict;
- use warnings;
- use Getopt::Long;
- use constant BITS => 8;
- use constant BYTES => 1;
- my $iface = "";
- my $bandwidth = "";
- my $warning = "";
- my $critical = "";
- my $percent = "";
- GetOptions(
- "i|interface=s" => \$iface,
- "w|warning=s" => \$warning,
- "c|critical=s" => \$critical,
- "b|bandwidth=s" => \$bandwidth,
- "p|percent" => \$percent
- );
- my $bitmod = BYTES;
- my $tmpfile = "/tmp/traffic";
- my $output = "";
- my $line = "";
- my %status = ( 'OK' => 0,
- 'WARNING' => 1,
- 'CRITICAL' => 2,
- 'UNKNOWN' => 3
- );
- my $exit_status = $status{OK};
- my %data = ( 'time' => 0, 'last_time' => 0,
- 'rxbytes' => 0, 'last_rxbytes' => 0,
- 'txbytes' => 0, 'last_txbytes' => 0
- );
- my %speed = ( 'tx' => 0,
- 'rx' => 0,
- 'interval' => 1
- );
- usage() if ( !$iface || !$warning || !$critical );
- if ( $percent ) {
- usage() if ( !$bandwidth || $bandwidth !~ /^\d+[kKmMgG]$/ );
- usage() if ( $warning !~ /^\d{1,3}$/ || $warning>100 || $critical !~ /^\d{1,3}$/ || $critical>100 );
- $bandwidth = human2bytes($bandwidth);
- } else {
- $warning = human2bytes($warning);
- $critical = human2bytes($critical);
- usage() if ( !$warning || !$critical )
- }
- usage() if ( $warning > $critical );
- open ( NET, "</proc/net/dev" ) or die ( "Can't open /proc/net/dev: $!" );
- while ( <NET> ) {
- chomp();
- if ( $_ =~ /^\s*$iface\:\s*(\d+)(?:\s*(?:\d+)){7}\s*(\d+)(?:\s*(?:\d+)){7}\s*$/ ) {
- $data{time} = time - 1;
- $data{rxbytes} = $1;
- $data{txbytes} = $2;
- last;
- }
- }
- close( NET );
- if ( $data{time} == 0 && $data{rxbytes} == 0 && $data{txbytes} == 0 ) {
- exit $status{UNKNOWN};
- }
- if ( open( TMP, "<$tmpfile-$iface" ) ) {
- my @line = <TMP>; chomp( @line );
- ( $data{last_time}, $data{last_rxbytes}, $data{last_txbytes} ) = split( ":", $line[0] );
- }
- if ( open( TMP, ">$tmpfile-$iface" ) ) {
- print( TMP "$data{time}:$data{rxbytes}:$data{txbytes}\n" );
- close( TMP );
- }
- $data{last_time} = $data{time} if ( !$data{last_time} || $data{last_time} > $data{time} );
- $data{last_rxbytes} = $data{rxbytes} if ( !$data{last_rxbytes} || $data{last_rxbytes} > $data{rxbytes} );
- $data{last_txbytes} = $data{txbytes} if ( !$data{last_txbytes} || $data{last_txbytes} > $data{txbytes} );
- $speed{interval} = $data{time} - $data{last_time} + 1;
- $speed{rx} = ( $data{rxbytes} - $data{last_rxbytes} ) / $speed{interval};
- $speed{tx} = ( $data{txbytes} - $data{last_txbytes} ) / $speed{interval};
- $output = "RX Bytes: ". bytes2human($data{rxbytes}) ."B, TX Bytes: ". bytes2human($data{txbytes}) ."B; ";
- $output .= sprintf( "RX Speed: %s%sps, TX Speed: %s%sps; ",
- bytes2human($speed{rx}*$bitmod), ($bitmod==BITS)?"b":"B", bytes2human($speed{tx}*$bitmod), ($bitmod==BITS)?"b":"B" );
- if ( $percent ) {
- if ( ( $speed{rx} / $bandwidth ) * 100 > $critical || ( $speed{tx} / $bandwidth ) * 100 > $critical ) {
- $exit_status = $status{CRITICAL};
- $output .= "CRITICAL";
- } elsif ( ( $speed{rx} / $bandwidth ) * 100 > $warning || ( $speed{tx} / $bandwidth ) * 100 > $warning ) {
- $exit_status = $status{WARNING};
- $output .= "WARNING";
- } else {
- $output .= "OK";
- }
- } else {
- if ( ( $speed{rx} > $critical ) or ( $speed{tx} > $critical ) ) {
- $exit_status = $status{CRITICAL};
- $output .= "CRITICAL";
- } elsif ( ( $speed{rx} > $warning ) or ( $speed{tx} > $warning ) ) {
- $exit_status = $status{WARNING};
- $output .= "WARNING";
- } else {
- $output .= "OK";
- }
- }
- $output .= " bandwidth utilization";
- $output .= sprintf( " | rx=%.0f;%2.0f;%2.0f tx=%.0f;%2.0f;%2.0f",
- $speed{rx}*$bitmod, ($percent)?$warning*$bandwidth/100:$warning, ($percent)?$critical*$bandwidth/100:$critical,
- $speed{tx}*$bitmod, ($percent)?$warning*$bandwidth/100:$warning, ($percent)?$critical*$bandwidth/100:$critical );
- print "$output\n";
- exit( $exit_status );
- # helper function
- sub bytes2human {
- my $bytes = shift;
- return 0 if !$bytes;
- my @units = ( '','K','M','G','T' );
- my $offset = 0;
- while ( $bytes > 1024 ){
- $bytes = $bytes / 1024;
- $offset++;
- }
- return sprintf( "%2.0f%s", $bytes, $units[$offset] );
- }
- sub human2bytes {
- my $value = shift;
- return 0 if ( !$value || $value !~ /^(\d+)(\w)$/ );
- my ($number, $scale) = ($1,$2);
- my $bitmod = ( $scale =~ /[kmg]/ ) ? BITS : BYTES;
- my @units = ( '','K','M','G','T' );
- my $offset = 0;
- while( $units[$offset] ne "\u$scale" && $offset <= scalar(@units) ) {
- $number *= 1024;
- $offset++;
- }
- return $number/$bitmod;
- }
- sub usage {
- print <<EOU;
- Usage: $0 -i <interface> -w <warn> -c <critical> [-p -b <bandwidth>]
- -i, --interface STRING
- Network interface name (example: eth0)
- -w, --warning STRING
- Warning interface speed level (K/M/G Bps, k/m/g bps)
- If using with -p value should be in percentage (1-100)
- -c, --critilcal STRING
- Critical interface speed level (K/M/G Bps, k/m/g bps)
- If using with -p value should be in percentage (1-100)
- -p
- Calculate warning and critical levels in percentage based on interface bandwidth
- -b, --bandwidth STRING
- Interface bandwidth value (K/M/G Bps, k/m/g bps)
- EOU
- unlink($tmpfile);
- exit $status{UNKNOWN};
- }
|