Open main menu

OpenVZ Virtuozzo Containers Wiki β

Net-SNMP subagent

Revision as of 17:33, 6 March 2009 by Kir (talk | contribs) (+source tag, License)

Here is snmp subagent to export UBC via SNMP protocol.

Author - n1ckname. License: GNU GPL v2.


/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";