Net-SNMP subagent

From OpenVZ Virtuozzo Containers Wiki
Revision as of 17:28, 6 March 2009 by AlexKuklin (talk | contribs) (New page: Here is snmp subagent to export UBC via SNMP protocol. Author - n1ckname === /etc/snmp/snmpagent.pl === #!/usr/bin/perl $program = $0; use NetSNMP::OID (':all'); use Net...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Here is snmp subagent to export UBC via SNMP protocol.

Author - n1ckname


/etc/snmp/snmpagent.pl

 #!/usr/bin/perl 
 
 $program = $0;
 
 use NetSNMP::OID (':all');
 use NetSNMP::agent (':all');
 use NetSNMP::ASN (':all');
 use Data::Dumper;
 my $debug = 0;
 my @resName=qw(name vmguarpages tcpsndbuf othersockbuf physpages numfile numtcpsock numpty numsiginfo tcprcvbuf dcachesize numiptent numothersock privvmpages kmemsize numflock shmpages lockedpages dummy numproc oomguarpages dgramrcvbuf);
 my @catName=qw(held maxheld barrier limit failcnt);
 my %resIndex,%catIndex;
 @resIndex{@resName} = (0..$#resName);
 @catIndex{@catName} = (0..$#catName);
 
 sub handler { 
     my ($handler, $reg_info, $request_info, $requests) = @_; 
     open(UB,"<$source");
     while(<UB>){
         my %vmachine;
         if ( /\D*(\d+):[\s\t]+([a-z]+)[\t\s]+(\d+)[\t\s]+(\d+)[\t\s]+(\d+)[\t\s]+(\d+)[\t\s]+(\d+).*/ ){ 
 	    $vid=$1; 
 	    $beancounters{$vid}=\%vmachine ; 
             ${beancounters{$vid}{0}}="www";
 	    open(CONF,"</etc/vz/conf/$vid.conf");
 	    my $name=$vid;
 	    while(<CONF>) {
 		if(/NAME[\s\t]?=[\s\t]?["]?([^"]+)["]?/)  {
 		    $name=$1;
 		    last;
 		    #"
 		}
 	    }
 	    ${beancounters{$vid}{0}}=$name;
             $resource=$2 ;
             $held=$3 ;
             $maxheld=$4 ;
             $barrier=$5 ;
             $limit=$6 ;
             $failcnt=$7 ;
             ${beancounters{$vid}}{${resIndex{$resource}}}=[$held , $maxheld , $barrier , $limit ,$failcnt ];
 
 	}
         if ( /^[\W\d]+([a-z]+)[\t\s]+(\d+)[\t\s]+(\d+)[\t\s]+(\d+)[\t\s]+(\d+)[\t\s]+(\d+).*/ ) {
                 $resource=$1 ;
                 $held=$2 ;
                 $maxheld=$3 ;
                 $barrier=$4 ;
                 $limit=$5 ;
                 $failcnt=$6 ;
                 ${beancounters{$vid}}{${resIndex{$resource}}}=[$held , $maxheld , $barrier , $limit ,$failcnt ];
         }
     }
     close(UB);
 
     for ( my $request = $requests; $request; $request = $request->next() ) {
     
         my $reqOID = $request->getOID();
         my $reqMode = $request_info->getMode();
 	my $myOID = new NetSNMP::OID($OID);
 #1.3.6.1.4.1.2021.51.ctcount = 5
 #1.3.6.1.4.1.2021.51.ct.101.name = www
 #1.3.6.1.4.1.2021.51.ct.101.kmemsize.held = 458584
 #1.3.6.1.4.1.2021.51.ct.101.kmemsize.maxheld = 1490364
 #1.3.6.1.4.1.2021.51.ct.101.kmemsize.barrier = 11055923
 
 #		$request->setValue(ASN_INTEGER, scalar keys (%beancounters));
 
         if ($reqMode == MODE_GET) {
 	    print STDERR $reqOID." MODE_GET\n" if($debug);;
     	    if($reqOID == $myOID+".0"){
 		$request->setValue(ASN_INTEGER, scalar keys (%beancounters));
 	    } elsif($reqOID =~ /$myOID\.([0-9]+)[\.]?([0-9]+)?[\.]?([0-9]+)?[\.]?([0-9]+)?/) {
 
 		my $typeReq=$1;
 		my $vzidReq=$2;
 		my $resReq=$3;
 		my $catReq=$4;
 		my %vz;
 		
 
 		print STDERR "Type:$typeReq, VzID: $vzidReq, Res: $resReq/$resName[$resReq], Cat: $catReq/$catName[$catReq]\n" if($debug);;
 
 		if(!$vzidReq) {
 		    foreach $vzid (sort keys %beancounters) {
 			$vzidReq=$vzid;
 			last;
 		    }
 		}
 		if(!$vzidReq || !exists(${beancounters{$vzidReq}})) {
 		    $request->setError($request_info,SNMP_ERR_NOSUCHNAME);
 		    last;
 		}
 
 		%vz=%{${beancounters{$vzidReq}}};
 
 		if((!defined($resReq) or $resReq == 0) && defined(${vz{0}})) {
 		    $request->setValue(ASN_OCTET_STR, "".${vz{0}});
 		} elsif(!defined($catReq) && defined(${vz{$resReq}[0]})) {
 		    $request->setValue(ASN_INTEGER, ${vz{$resReq}[0]});
 
 		} elsif($catReq< $#catName && defined(${vz{$resReq}[$catReq]})) {
 		    if(9223372036854775807 == ${vz{$resReq}[$catReq+1]}) {
 			$request->setValue(ASN_INTEGER,-1);
 		    } else {
 			$request->setValue(ASN_INTEGER,${vz{$resReq}[$catReq+1]});
 		    }
 		} elsif($resReq<scalar keys %vz && defined(${vz{$resReq+1}[0]})) {
 		    if(9223372036854775807 == ${vz{$resReq}[$catReq+1]}) {
 			$request->setValue(ASN_INTEGER,-1);
 		    } else {
 			$request->setValue(ASN_INTEGER, ${vz{$resReq+1}[0]});
 		    }
 		} else  {
 		    my $finish=1;
 		    foreach $vzid (sort keys %beancounters) {
 			if($vzid > $vzidReq) {
 			    %vz=%{${beancounters{$vzid}}};
 			    $vzidReq=$vzid;
 			    $finish=0;
 			    last;
 			}
 		    }
 		    if(!$finish)  {
 			$request->setValue(ASN_INTEGER, "".${vz{0}});
 		    }
 		}
     		
 
 	    }
 
 	} elsif ($reqMode == MODE_GETNEXT) {
 	    print STDERR $reqOID." MODE_GETNEXT\n" if($debug);
     	    if($reqOID < $myOID+".0"){
     		$request->setOID($OID.".0");
 		$request->setValue(ASN_INTEGER, scalar keys (%beancounters));
 	    } elsif($reqOID =~ /$myOID\.([0-9]+)[\.]?([0-9]+)?[\.]?([0-9]+)?[\.]?([0-9]+)?$/) {
 		my $typeReq=$1;
 		my $vzidReq=$2;
 		my $resReq=$3;
 		my $catReq=$4;
 		my %vz;
 		
 		print STDERR "Type:$typeReq, VzID: $vzidReq, Res: $resReq/$resName[$resReq], Cat: $catReq/$catName[$catReq]\n" if($debug);;
 
 		if(!$vzidReq) {
 		    foreach $vzid (sort keys %beancounters) {
 			$vzidReq=$vzid;
 			last;
 		    }
 		}
 		if(!$vzidReq || !exists(${beancounters{$vzidReq}})) {
 		    $request->setError($request_info,SNMP_ERR_NOSUCHNAME);
 		    last;
 		}
 
 
 		%vz=%{${beancounters{$vzidReq}}};
 
 		if(!defined($resReq) && defined(${vz{0}})) {
     		    $request->setOID($myOID.".1.".$vzidReq.".0");
 		    $request->setValue(ASN_OCTET_STR, "".${vz{0}});
 		} elsif(!defined($catReq) && defined(${vz{$resReq}[0]})) {
     		    $request->setOID($myOID.".1.".$vzidReq.".".$resReq.".0");
 		    $request->setValue(ASN_INTEGER, ${vz{$resReq}[0]});
 		} elsif($catReq< $#catName && defined(${vz{$resReq}[$catReq]})) {
 		    $request->setOID($myOID.".1.".$vzidReq.".".$resReq.".".($catReq+1));
 		    if(9223372036854775807 == ${vz{$resReq}[$catReq+1]}) {
 			$request->setValue(ASN_INTEGER,-1);
 		    } else {
 			$request->setValue(ASN_INTEGER,${vz{$resReq}[$catReq+1]});
 		    }
 		} elsif($resReq<scalar keys %vz && defined(${vz{$resReq+1}[0]})) {
 		    $request->setOID($myOID.".1.".$vzidReq.".".($resReq+1).".0");
 		    if(9223372036854775807 == ${vz{$resReq}[$catReq+1]}) {
 			$request->setValue(ASN_INTEGER,-1);
 		    } else {
 			$request->setValue(ASN_INTEGER, ${vz{$resReq+1}[0]});
 		    }
 		} else  {
 		    my $finish=1;
 		    foreach $vzid (sort keys %beancounters) {
 			if($vzid > $vzidReq) {
 			    %vz=%{${beancounters{$vzid}}};
 			    $vzidReq=$vzid;
 			    $finish=0;
 			    last;
 			}
 		    }
 		    if(!$finish)  {
 			$request->setOID($myOID.".1.".$vzidReq.".0.0");
 			$request->setValue(ASN_OCTET_STR, ${vz{0}});
 		    }
 		}
 	    }
         }
     }
 } 
 
 {
         my $regoid = new NetSNMP::OID($OID); 
         $agent->register($program, $regoid, \&handler);
 }
 
 
 
 #eof // nick
 

/etc/snmp/snmpd.conf

 rouser my_username priv
 createUser my_username MD5 my_password DES
 perl $OID = '.1.3.6.1.4.1.2021.51'; 
 perl $debugging = '1';
 perl $verbose = '1';
 perl $source = '/proc/user_beancounters'; 
 perl do "/etc/snmp/snmpagent.pl";