#!/usr/bin/perl 


use Getopt::Std;
	       
# Port? This is the standard port#
my $port = 161;
my $ReverseTXRX;

my %opts; 
getopt("-ic", \%opts);
my $host = $opts{'i'} || Usage();
my $community = $opts{'c'} || Usage();
my $Percentage = 1;
my $MAX_RSSI = 40.0;

#################################################################
#---------------------- 4/22/2003 Earl -------------------------#
#################################################################

use Net::SNMP;
# use strict;

# Setup OIDs 
my $Whothisis = '1.3.6.1.4.1.410.1.1.1.1.0'; 
my $Name = '1.3.6.1.4.1.410.1.1.1.1.0'; 
my $TestMode = '1.3.6.1.4.1.410.1.1.8.2.0'; 
my $Mode = '1.3.6.1.4.1.410.1.1.4.1.0'; 
my $Wireless = '1.3.6.1.4.1.410.1.2.7.1.0'; 
my $Ch = '1.3.6.1.4.1.410.1.2.1.1.0'; 
my $EthRx = '1.3.6.1.4.1.410.1.1.7.1.0'; 
my $EthTx = '1.3.6.1.4.1.410.1.1.7.2.0'; 
my $ClientsNum = '1.3.6.1.4.1.410.1.2.1.3.0'; 
my $OID = '1.3.6.1.4.1.410.1.2.8.1.0'; 
my $CR31 = '1.3.6.1.4.1.410.1.1.8.8.0'; 
my $rxB = '1.3.6.1.4.1.410.1.1.7.1.0'; 
my $txB = '1.3.6.1.4.1.410.1.1.7.2.0'; 
my $Data = '00';
my $RBytes = '00';
my $TBytes = '00';
my $fileok = '00';
my $rxlb = 0;
my $rxhb = 0;
my $txlb = 0;
my $txhb = 0;
my $rtotal = 0;
my $ttotal = 0;
my $alltotal = 0;
my $Who = "Test";
my $mo = 0;

# Start the SNMP session
my ($session, $error) = Net::SNMP->session(
	    -hostname  => shift || $host,
             -community => shift || $community,
             -port      => shift || $port
          );


   $Data = snmpQuery($session,$Wireless);
   $Data2 = snmpQuery($session,$Whothisis);
   $Data3 = snmpQuery($session,$ClientsNum);
   $Data4 = snmpQuery($session,$TestMode);
   $Data5 = snmpQuery($session,$Mode);
   $Data6 = snmpQuery($session,$Ch);
   $Data7 = snmpQuery($session,$CR31);

$nam1 = substr($Data, 34, 32);
$d0hb = hex(substr($Data, 34, 1));
$d0lb = hex(substr($Data, 35, 1));
$d1hb = hex(substr($Data, 36, 1));
$d1lb = hex(substr($Data, 37, 1));
$d2hb = hex(substr($Data, 38, 1));
$d2lb = hex(substr($Data, 39, 1));
$d3hb = hex(substr($Data, 40, 1));
$d3lb = hex(substr($Data, 41, 1));
$d4hb = hex(substr($Data, 42, 1));
$d4lb = hex(substr($Data, 43, 1));
$d5hb = hex(substr($Data, 44, 1));
$d5lb = hex(substr($Data, 45, 1));
$d6hb = hex(substr($Data, 46, 1));
$d6lb = hex(substr($Data, 47, 1));
$d7hb = hex(substr($Data, 48, 1));
$d7lb = hex(substr($Data, 49, 1));
$nam1c1 = $d0lb + $d0hb * 16;
$nam1c2 = $d1lb + $d1hb * 16;
$nam1c1 = chr($nam1c1);
$nam1c2 = chr($nam1c2);
$nam1c3 = $d2lb + $d2hb * 16;
$nam1c4 = $d3lb + $d3hb * 16;
$nam1c3 = chr($nam1c3);
$nam1c4 = chr($nam1c4);
$nam1c5 = $d4lb + $d4hb * 16;
$nam1c6 = $d5lb + $d5hb * 16;
$nam1c5 = chr($nam1c5);
$nam1c6 = chr($nam1c6);
$nam1c7 = $d6lb + $d6hb * 16;
$nam1c8 = $d7lb + $d7hb * 16;
$nam1c7 = chr($nam1c7);
$nam1c8 = chr($nam1c8);
$nam1 = "$nam1c1$nam1c2$nam1c3$nam1c4$nam1c5$nam1c6$nam1c7$nam1c8";
$nam1c1 = 0;
$nam1c2 = 0;
$nam1c3 = 0;
$nam1c4 = 0;
$nam1c5 = 0;
$nam1c6 = 0;
$nam1c7 = 0;
$nam1c8 = 0;

$nam2 = substr($Data, 34+96, 32);
$d0hb = hex(substr($Data, 34+96, 1));
$d0lb = hex(substr($Data, 35+96, 1));
$d1hb = hex(substr($Data, 36+96, 1));
$d1lb = hex(substr($Data, 37+96, 1));
$d2hb = hex(substr($Data, 38+96, 1));
$d2lb = hex(substr($Data, 39+96, 1));
$d3hb = hex(substr($Data, 40+96, 1));
$d3lb = hex(substr($Data, 41+96, 1));
$d4hb = hex(substr($Data, 42+96, 1));
$d4lb = hex(substr($Data, 43+96, 1));
$d5hb = hex(substr($Data, 44+96, 1));
$d5lb = hex(substr($Data, 45+96, 1));
$d6hb = hex(substr($Data, 46+96, 1));
$d6lb = hex(substr($Data, 47+96, 1));
$d7hb = hex(substr($Data, 48+96, 1));
$d7lb = hex(substr($Data, 49+96, 1));
$nam1c1 = $d0lb + $d0hb * 16;
$nam1c2 = $d1lb + $d1hb * 16;
$nam1c1 = chr($nam1c1);
$nam1c2 = chr($nam1c2);
$nam1c3 = $d2lb + $d2hb * 16;
$nam1c4 = $d3lb + $d3hb * 16;
$nam1c3 = chr($nam1c3);
$nam1c4 = chr($nam1c4);
$nam1c5 = $d4lb + $d4hb * 16;
$nam1c6 = $d5lb + $d5hb * 16;
$nam1c5 = chr($nam1c5);
$nam1c6 = chr($nam1c6);
$nam1c7 = $d6lb + $d6hb * 16;
$nam1c8 = $d7lb + $d7hb * 16;
$nam1c7 = chr($nam1c7);
$nam1c8 = chr($nam1c8);
$nam2 = "$nam1c1$nam1c2$nam1c3$nam1c4$nam1c5$nam1c6$nam1c7$nam1c8";
$nam1c1 = 0;
$nam1c2 = 0;
$nam1c3 = 0;
$nam1c4 = 0;
$nam1c5 = 0;
$nam1c6 = 0;
$nam1c7 = 0;
$nam1c8 = 0;


$nam3 = substr($Data, 34+96+96, 32);
$d0hb = hex(substr($Data, 34+96+96, 1));
$d0lb = hex(substr($Data, 35+96+96, 1));
$d1hb = hex(substr($Data, 36+96+96, 1));
$d1lb = hex(substr($Data, 37+96+96, 1));
$d2hb = hex(substr($Data, 38+96+96, 1));
$d2lb = hex(substr($Data, 39+96+96, 1));
$d3hb = hex(substr($Data, 40+96+96, 1));
$d3lb = hex(substr($Data, 41+96+96, 1));
$d4hb = hex(substr($Data, 42+96+96, 1));
$d4lb = hex(substr($Data, 43+96+96, 1));
$d5hb = hex(substr($Data, 44+96+96, 1));
$d5lb = hex(substr($Data, 45+96+96, 1));
$d6hb = hex(substr($Data, 46+96+96, 1));
$d6lb = hex(substr($Data, 47+96+96, 1));
$d7hb = hex(substr($Data, 48+96+96, 1));
$d7lb = hex(substr($Data, 49+96+96, 1));
$nam1c1 = $d0lb + $d0hb * 16;
$nam1c2 = $d1lb + $d1hb * 16;
$nam1c1 = chr($nam1c1);
$nam1c2 = chr($nam1c2);
$nam1c3 = $d2lb + $d2hb * 16;
$nam1c4 = $d3lb + $d3hb * 16;
$nam1c3 = chr($nam1c3);
$nam1c4 = chr($nam1c4);
$nam1c5 = $d4lb + $d4hb * 16;
$nam1c6 = $d5lb + $d5hb * 16;
$nam1c5 = chr($nam1c5);
$nam1c6 = chr($nam1c6);
$nam1c7 = $d6lb + $d6hb * 16;
$nam1c8 = $d7lb + $d7hb * 16;
$nam1c7 = chr($nam1c7);
$nam1c8 = chr($nam1c8);
$nam3 = "$nam1c1$nam1c2$nam1c3$nam1c4$nam1c5$nam1c6$nam1c7$nam1c8";
$nam1c1 = 0;
$nam1c2 = 0;
$nam1c3 = 0;
$nam1c4 = 0;
$nam1c5 = 0;
$nam1c6 = 0;
$nam1c7 = 0;
$nam1c8 = 0;

$nam4 = substr($Data, 34+96+96+96, 32);
$d0hb = hex(substr($Data, 34+96+96+96, 1));
$d0lb = hex(substr($Data, 35+96+96+96, 1));
$d1hb = hex(substr($Data, 36+96+96+96, 1));
$d1lb = hex(substr($Data, 37+96+96+96, 1));
$d2hb = hex(substr($Data, 38+96+96+96, 1));
$d2lb = hex(substr($Data, 39+96+96+96, 1));
$d3hb = hex(substr($Data, 40+96+96+96, 1));
$d3lb = hex(substr($Data, 41+96+96+96, 1));
$d4hb = hex(substr($Data, 42+96+96+96, 1));
$d4lb = hex(substr($Data, 43+96+96+96, 1));
$d5hb = hex(substr($Data, 44+96+96+96, 1));
$d5lb = hex(substr($Data, 45+96+96+96, 1));
$d6hb = hex(substr($Data, 46+96+96+96, 1));
$d6lb = hex(substr($Data, 47+96+96+96, 1));
$d7hb = hex(substr($Data, 48+96+96+96, 1));
$d7lb = hex(substr($Data, 49+96+96+96, 1));
$nam1c1 = $d0lb + $d0hb * 16;
$nam1c2 = $d1lb + $d1hb * 16;
$nam1c1 = chr($nam1c1);
$nam1c2 = chr($nam1c2);
$nam1c3 = $d2lb + $d2hb * 16;
$nam1c4 = $d3lb + $d3hb * 16;
$nam1c3 = chr($nam1c3);
$nam1c4 = chr($nam1c4);
$nam1c5 = $d4lb + $d4hb * 16;
$nam1c6 = $d5lb + $d5hb * 16;
$nam1c5 = chr($nam1c5);
$nam1c6 = chr($nam1c6);
$nam1c7 = $d6lb + $d6hb * 16;
$nam1c8 = $d7lb + $d7hb * 16;
$nam1c7 = chr($nam1c7);
$nam1c8 = chr($nam1c8);
$nam4 = "$nam1c1$nam1c2$nam1c3$nam1c4$nam1c5$nam1c6$nam1c7$nam1c8";
$nam1c1 = 0;
$nam1c2 = 0;
$nam1c3 = 0;
$nam1c4 = 0;
$nam1c5 = 0;
$nam1c6 = 0;
$nam1c7 = 0;
$nam1c8 = 0;


$nam5 = substr($Data, 34+96+96+96+96, 32);
$d0hb = hex(substr($Data, 34+96+96+96+96, 1));
$d0lb = hex(substr($Data, 35+96+96+96+96, 1));
$d1hb = hex(substr($Data, 36+96+96+96+96, 1));
$d1lb = hex(substr($Data, 37+96+96+96+96, 1));
$d2hb = hex(substr($Data, 38+96+96+96+96, 1));
$d2lb = hex(substr($Data, 39+96+96+96+96, 1));
$d3hb = hex(substr($Data, 40+96+96+96+96, 1));
$d3lb = hex(substr($Data, 41+96+96+96+96, 1));
$d4hb = hex(substr($Data, 42+96+96+96+96, 1));
$d4lb = hex(substr($Data, 43+96+96+96+96, 1));
$d5hb = hex(substr($Data, 44+96+96+96+96, 1));
$d5lb = hex(substr($Data, 45+96+96+96+96, 1));
$d6hb = hex(substr($Data, 46+96+96+96+96, 1));
$d6lb = hex(substr($Data, 47+96+96+96+96, 1));
$d7hb = hex(substr($Data, 48+96+96+96+96, 1));
$d7lb = hex(substr($Data, 49+96+96+96+96, 1));
$nam1c1 = $d0lb + $d0hb * 16;
$nam1c2 = $d1lb + $d1hb * 16;
$nam1c1 = chr($nam1c1);
$nam1c2 = chr($nam1c2);
$nam1c3 = $d2lb + $d2hb * 16;
$nam1c4 = $d3lb + $d3hb * 16;
$nam1c3 = chr($nam1c3);
$nam1c4 = chr($nam1c4);
$nam1c5 = $d4lb + $d4hb * 16;
$nam1c6 = $d5lb + $d5hb * 16;
$nam1c5 = chr($nam1c5);
$nam1c6 = chr($nam1c6);
$nam1c7 = $d6lb + $d6hb * 16;
$nam1c8 = $d7lb + $d7hb * 16;
$nam1c7 = chr($nam1c7);
$nam1c8 = chr($nam1c8);
$nam5 = "$nam1c1$nam1c2$nam1c3$nam1c4$nam1c5$nam1c6$nam1c7$nam1c8";
$nam1c1 = 0;
$nam1c2 = 0;
$nam1c3 = 0;
$nam1c4 = 0;
$nam1c5 = 0;
$nam1c6 = 0;
$nam1c7 = 0;
$nam1c8 = 0;

# new way ############################################EARL#

$IP1 = substr($Data,2,12);
$whoisthis1 = ($Data2);
$connectedtoo1 = ($Data3);
$ch = $Data6;
$mo = oct($Data5);

 
 if ($mo == 1) {$Data5 = "Point to Multi-Point";
  }
 if ($mo == 2) {$Data5 = "AP";
  }
 if ($mo == 3) {$Data5 = "AP Client";
  }
 if ($mo == 4) {$Data5 = "Point to Point";
  }
 if ($mo == 5) {$Data5 = "Repeater";
  }
 

$d0hb = hex(substr($Data, 14, 1));
$d0lb = hex(substr($Data, 15, 1));
$d1hb = hex(substr($Data, 16, 1));
$d1lb = hex(substr($Data, 17, 1));
$rssi1total = $d0lb + $d0hb * 16;
$lq1total = $d1lb + $d1hb * 16;

  {
 if ( $Percentage == 1 ) {
    $rssi = $rssi1total;
    $link = $lq1total;
    if ($rssi > $MAX_RSSI) {
      $rssi = 40;
    }
    if ($link > $MAX_RSSI) {
      $link = 40;
    }
    $linkvalue = ($MAX_RSSI - $link);
    $rssi1total = ( $rssi / $MAX_RSSI ) * 100;
    $lq1total = ( $linkvalue / $MAX_RSSI ) * 100;
  }

}

$d0hb = hex(substr($Data, 14+96, 1));
$d0lb = hex(substr($Data, 15+96, 1));
$d1hb = hex(substr($Data, 16+96, 1));
$d1lb = hex(substr($Data, 17+96, 1));
$rssi2total = $d0lb + $d0hb * 16;
$lq2total = $d1lb + $d1hb * 16;

  {
 if ( $Percentage == 1 ) {
    $rssi = $rssi2total;
    $link = $lq2total;
    if ($rssi > $MAX_RSSI) {
      $rssi = 40;
    }
    if ($link > $MAX_RSSI) {
      $link = 40;
    }
    $linkvalue = ($MAX_RSSI - $link);
    $rssi2total = ( $rssi / $MAX_RSSI ) * 100;
    $lq2total = ( $linkvalue / $MAX_RSSI ) * 100;
  }

}

$IP2 = substr($Data,2+96,12);

$d0hb = hex(substr($Data, 14+96+96, 1));
$d0lb = hex(substr($Data, 15+96+96, 1));
$d1hb = hex(substr($Data, 16+96+96, 1));
$d1lb = hex(substr($Data, 17+96+96, 1));
$rssi3total = $d0lb + $d0hb * 16;
$lq3total = $d1lb + $d1hb * 16;

   {
  if ( $Percentage == 1 ) {
     $rssi = $rssi3total;
     $link = $lq3total;
     if ($rssi > $MAX_RSSI) {
       $rssi = 40;
     }
     if ($link > $MAX_RSSI) {
       $link = 40;
     }
     $linkvalue = ($MAX_RSSI - $link);
     $rssi3total = ( $rssi / $MAX_RSSI ) * 100;
     $lq3total = ( $linkvalue / $MAX_RSSI ) * 100;
   }
 
 }

$IP3 = substr($Data,2+96+96,12);

$d0hb = hex(substr($Data, 14+96+96+96, 1));
$d0lb = hex(substr($Data, 15+96+96+96, 1));
$d1hb = hex(substr($Data, 16+96+96+96, 1));
$d1lb = hex(substr($Data, 17+96+96+96, 1));
$rssi4total = $d0lb + $d0hb * 16;
$lq4total = $d1lb + $d1hb * 16;

  {
 if ( $Percentage == 1 ) {
    $rssi = $rssi4total;
    $link = $lq4total;
    if ($rssi > $MAX_RSSI) {
      $rssi = 40;
    }
    if ($link > $MAX_RSSI) {
      $link = 40;
    }
    $linkvalue = ($MAX_RSSI - $link);
    $rssi4total = ( $rssi / $MAX_RSSI ) * 100;
    $lq4total = ( $linkvalue / $MAX_RSSI ) * 100;
  }

}

$IP4 = substr($Data,2+96+96+96,12);

$d0hb = hex(substr($Data, 14+96+96+96+96, 1));
$d0lb = hex(substr($Data, 15+96+96+96+96, 1));
$d1hb = hex(substr($Data, 16+96+96+96+96, 1));
$d1lb = hex(substr($Data, 17+96+96+96+96, 1));
$rssi5total = $d0lb + $d0hb * 16;
$lq5total = $d1lb + $d1hb * 16;

  {
 if ( $Percentage == 1 ) {
    $rssi = $rssi5total;
    $link = $lq5total;
    if ($rssi > $MAX_RSSI) {
      $rssi = 40;
    }
    if ($link > $MAX_RSSI) {
      $link = 40;
    }
    $linkvalue = ($MAX_RSSI - $link);
    $rssi5total = ( $rssi / $MAX_RSSI ) * 100;
    $lq5total = ( $linkvalue / $MAX_RSSI ) * 100;
  }

}

$IP5 = substr($Data,2+96+96+96+96,12);
$Data7 = substr($Data7,2,32);
$ch1pwr = substr($Data7,0,2);
$ch2pwr = substr($Data7,2,2);
$ch3pwr = substr($Data7,4,2);
$ch4pwr = substr($Data7,6,2);
$ch5pwr = substr($Data7,8,2);
$ch6pwr = substr($Data7,10,2);
$ch7pwr = substr($Data7,12,2);
$ch8pwr = substr($Data7,14,2);
$ch9pwr = substr($Data7,16,2);
$ch10pwr = substr($Data7,18,2);
$ch11pwr = substr($Data7,20,2);
$ch12pwr = substr($Data7,22,2);
$ch13pwr = substr($Data7,24,2);
$ch14pwr = substr($Data7,26,2);

# Return lines of data to mrtg for IN OUT TIME UP


 
 
    print " \n";
    print "Site Survey Program for Atmel Chipset Radio (SmartBridges APPO , D-Link DWL-900AP)";
    print " \n";
    print "                    by Earl Campbell - UpHi.net 04/22/2003";
    print " \n";
    print " \n";
    print "Name of Radio     ",$Data2;
    print " \n";
    print "Connected to      ",$Data3;
    print " \n";
    print "On Channel        ",$ch;
    print " \n";
    print "In Mode           ",$Data5;
    print " \n";
    print "CR31 Power Regs Min 0----(Max)80----FF Min  ";
    print " \n";
print "  Ch 1                       ",$ch1pwr;
    print " \n";
print "  Ch 2                       ",$ch2pwr;
    print " \n";
print "  Ch 3                       ",$ch3pwr;
    print " \n";
print "  Ch 4                       ",$ch4pwr;
    print " \n";
print "  Ch 5                       ",$ch5pwr;
    print " \n";
print "  Ch 6                       ",$ch6pwr;
    print " \n";
print "  Ch 7                       ",$ch7pwr;
    print " \n";
print "  Ch 8                       ",$ch8pwr;
    print " \n";
print "  Ch 9                       ",$ch9pwr;
    print " \n";
print "  Ch 10                      ",$ch10pwr;
    print " \n";
print "  Ch 11                      ",$ch11pwr;
    print " \n";
print "  Ch 12                      ",$ch12pwr;
    print " \n";
print "  Ch 13                      ",$ch13pwr;
    print " \n"     ;
print "  Ch 14                      ",$ch14pwr;
    print " \n";

    print " \n";

    print "Site 1            ",$IP1," ",$nam1;
    print " \n";
    print "RSSI %            ",$rssi1total;
    print " \n";
    print "Link %            ",$lq1total;
    print " \n";
    print " \n";
 
    print "Site 2            ",$IP2," ",$nam2;
    print " \n";
    print "RSSI %            ",$rssi2total;
    print " \n";
    print "Link %            ",$lq2total;
    print " \n";
    print " \n";
 
    print "Site 3            ",$IP3," ",$nam3;
    print " \n";
    print "RSSI %            ",$rssi3total;
    print " \n";
    print "Link %            ",$lq3total;
    print " \n";
    print " \n";
 
    print "Site 4            ",$IP4," ",$nam4;
    print " \n";
    print "RSSI %            ",$rssi4total;
    print " \n";
    print "Link %            ",$lq4total;
    print " \n";
    print " \n";

    print "Site 5            ",$IP5," ",$nam5;
    print " \n";
    print "RSSI %            ",$rssi5total;
    print " \n";
    print "Link %            ",$lq5total;
    print " \n";
 
  
     print $OID;
     print " \n";
     print $host;
     print " \n";
 
# All Done. Close.  
$session->close;
exit 0;


#The actual query control, depending on the type. 
sub snmpQuery() {
    my ($session, $result,$resultval,@values,$retval,@Rest,$query,$type);
    ($session,$query,$type) = @_;
    $result = $session->get_request(
				    -varbindlist => [$query]
				    );
#
# The error check is important, more so, if the values 
# returned is not correct. This messes up the logs!
#
    if (!defined($result)) {
#
# Ideally this should be handled by the MRTG properly. 
#	printf("ERROR: %s.\n", $session->error);
	$session->close;
# Though its wrong to return '0' as exit code for an error, we'd 
# do this so that MRTG behaves.
	return;
	exit 0;
    }

    $resultval = $result->{$query};
    if ( $type == 0 ) { 
	(@Rest) = split(" ",$resultval);
	($retval,@Rest) = reverse(@Rest);
    }
    if ( $type == 1 ) {
	@values = hexString($resultval);
	($retval,@Rest) = @values;
    } 
    if ( $type == 2 ) {
	@values = hexString($resultval);
	my ( $UTPax, $BTPax, $MTPax, $TBecon, $TACK, $TRTS, $TCTS, $URPax, $BRPax, $MRPax, @Rest) = @values;
	$retval = $UTPax + $BTPax + $MTPax;	
    }
    if ( $type == 3 ) {
	@values = hexString($resultval);
	my ( $UTPax, $BTPax, $MTPax, $TBecon, $TACK, $TRTS, $TCTS, $URPax, $BRPax, $MRPax, @Rest) = @values;
	$retval = $URPax + $BRPax + $MRPax;	
    }
    if ($type == 4 ){
	$retval = $resultval;
    }
    return $retval;
}



# For the case of the Hex-String, the string needs to be broken into
# the octets, and they are read in reverse. 
sub hexString() {
    my (@vals,$dList,@Rest,$length,$i);
    ($dList,@Rest) = @_;
    $length = length($dList);

# Sanitizing by removing the 0x character first. 
    $dList = substr($dList,2,$length);
    $length = $length - 2;
# Quick and dirty extraction of values.
    $i=0;
    while ($i<$length) {
	my $val = "";
	my $k = 6;
	do {
	    my $Temp = substr($dList,$i+$k,2);
	    $val = $val.$Temp;
	    $k = $k - 2;
	} while ($k >-1);
	$i = $i+8;
	push @vals, hex($val);
    }
    return @vals;
}

