• Home (current)
  • वर्तमान निदेशक => /usr/bin/
  • सूचना एवं अपलोड
    Info Server
Indian Cyber Force
Folders रचयन्तु सञ्चिकां रचयन्तु RansomWeb लॉगआउट
Current File : //usr/bin/snmp-bridge-mib
#!/usr/bin/perl
#
# Copyright (c) IBM Corp. 2009, 2010, All Rights Reserved
#
# Author(s):	Vasileios Pappas <vpappas@us.ibm.com>
#		Jens Osterkamp <jens@linux.vnet.ibm.com>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to
# deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.

use NetSNMP::OID (':all');
use NetSNMP::ASN (':all');
use NetSNMP::agent (':all');

sub STP_PROP_VALUE() { 0x01}
sub STP_PROP_FILE() { 0x02}
sub STP_PROP_DEC() { 0x04}
sub STP_PROP_HEX() { 0x08}

sub FDB_STATUS_OTHER { 1 }
sub FDB_STATUS_INVALID { 2 }
sub FDB_STATUS_LEARNED { 3 }
sub FDB_STATUS_SELF { 4 }
sub FDB_STATUS_MGMT { 5 }

my %oid_value;
my %oid_type;
my %oid_next;
my (%indexes, %interfaces, %macs, %ages, %locals, %vlans, %tagged);
my $oid;

$subagent=0;
my $netdir="/sys/class/net/";
my $targetbridge;

$cache_timout=60;
$last_populated=0;

my $regoid = ".1.3.6.1.2.1.17";
# are we running embedded ? If not, register as subagent
if (!$agent) {
    $agent = new NetSNMP::agent('Name' => 'dot1qbridge',
				'AgentX' => 1);
    $subagent = 1;
    if ( $#ARGV != 0) {
	usage($0);
	exit();
    }
    $targetbridge = $ARGV[0];
} else {
    if (!defined($bridge)) {
	usage($0);
	exit();
    }
    $targetbridge = $bridge;
}

$agent->register("dot1qbridge", ".1.3.6.1.2.1.17", \&request_handler) or die "registration of handler failed !\n";

if ($subagent) {
	# register handler for graceful shutdown
	$SIG{'INT'} = \&shutdown;
	$SIG{'QUIT'} = \&shutdown;
	$running = 1;

	while($running) {
		$agent->agent_check_and_process(1);
	}

	$agent->shutdown();
}

sub usage {
	my $name = shift;
	if ($subagent) {
		print $name."\n\n";
		print "usage: \t$name <bridge>	start snmp bridge module".
			" for bridge <bridge>\n\n";
		print "arguments:	bridge		name of the Linux bridge".
			" which you want to provide info via snmp for.\n\n";
	} else {
		print 'usage in snmpd.conf: perl $bridge="br0"; perl do <path to $name>\n';
	}
	print "number of arguments given $#ARGV\n\n";
}

sub request_handler {
	my ($handler, $registration_info, $request_info, $requests)=@_;
	my $request;

	populate_mib($targetbridge);

	for($request = $requests; $request; $request = $request->next()) {
		if($request_info->getMode() == MODE_GET) {
			mode_get($request);
		} elsif($request_info->getMode() == MODE_GETNEXT) {
			mode_get_next($request);
		} else {
			print STDERR "mode not implemented.\n";
		}
	}
}

sub mode_get{
	my ($request)=@_;
	my $oid=$request->getOID();

	$SNMP::use_numeric = 1;
	my $noid=SNMP::translateObj($oid);

	reply($request, $noid) if (exists $oid_value{$noid});
}

sub find_next{
	my ($noid) = @_;
	my $nextoid = $oid_next{$noid};
	if(!defined($nextoid) || !defined($oid_value{$nextoid})) {
		# find the lowest OID whis is higher than $noid
		$prev = ".1.3.6.1.2.1.18";
		$prev_oid = new NetSNMP::OID($prev);
		$noid_oid = new NetSNMP::OID($noid);
		#print "looking for next of $noid\n";
		for my $candidate (keys %oid_value) {
			#print "evaluating $candidate\n";
			$candidate_oid = new NetSNMP::OID($candidate);
			if ($noid_oid < $candidate_oid && $prev_oid > $candidate_oid) {
				#print "found candidate $candidate\n";
				$prev = $candidate;
				$prev_oid = $candidate_oid;
			}
		}
		if ($prev eq ".1.3.6.1.2.1.18") {
			return; # no OID higher than $noid found
		}
		$nextoid = $prev;
	}
	return $nextoid;
}

sub mode_get_next{
	my ($request)=@_;
	my $oid=$request->getOID();
	$SNMP::use_numeric = 1;
	my $noid=SNMP::translateObj($oid);
	my $nextoid = find_next($noid);
	#print "found $nextoid\n";
	if(defined($nextoid)) {
		my $type = $oid_type{$nextoid};
		my $value = $oid_value{$nextoid};
		if (defined($type) and defined($value)) {
			reply($request,	$nextoid);
		}
	}
}

sub reply{
	my ($request, $oid)=@_;

	my $type=$oid_type{$oid};
	my $value=$oid_value{$oid};

	$request->setOID(new NetSNMP::OID($oid));
	$request->setValue($type, $value);
}

# Populated MIB OID
#
## dot1dBasePort:	1.3.6.1.2.1.17.1.4.1.1.<dot1dBasePort>
#			INTEGER32
#
# dot1dBasePortIfIndex:	1.3.6.1.2.1.17.1.4.1.2.<dot1dBasePort>
#			INTEGER32
#
# dot1dStp*:		1.3.6.1.2.1.17.2.<1-14>
#			INTEGER, OCTET STRING
#
# dot1dTpFdbAddress:	1.3.6.1.2.1.17.4.3.1.1.<dot1dTpFdbAddress>
#			OCTET STRING (SIZE (6))
#
# dot1dTpFdbPort:	1.3.6.1.2.1.17.4.3.1.2.<dot1dTpFdbAddress>
#			INTEGER32
#
# dot1dTpFdbStatus:	1.3.6.1.2.1.17.4.3.1.3.<dot1dTpFdbAddress>
#			INTEGER
#			1 : other
#			2 : invalid
#			3 : learned
#			4 : self
#			5 : mgmt
#

sub populate_mib {
	my $now;
	my $bridge = shift;
	my $seconds_passed;
	$ports=0;
	$oid="";

        $now=time();
	$seconds_passed=$now-$last_populated;
        return if($seconds_passed <= $cache_timout);
        $last_populated=$now;

	%oid_value=();
	%oid_type=();
	%oid_next=();
	%indexes=();
	%interfaces=();
	%macs=();
	%ages=();
	%locals=();
	%vlans=();
	%tagged=();

	# first populated oid
	$oid_next{".1.3.6.1.2.1.17"}=".1.3.6.1.2.1.17.1.1";

	createbaseinfo($bridge);

	readindexes($bridge);
	readforwards($bridge);
	readvlans($bridge);

	createports($bridge);

	stpproperties($bridge);

	stpportproperties($bridge);

	dot1dTpproperties();

	my $prevoid = $oid;
	my $curroid = createmacs($bridge);
	$oid_next{$prevoid} = $curroid;

	portproperties($bridge);


	dot1qbase($bridge);

	dot1qfdb($bridge);

	dot1qcurrentvlans($bridge);

	return 0;
}

sub findbridges()
{
	my @bridges;

	opendir(DIR, $netdir) or die "unable to open $netdir !\n";

	while(my $br=readdir(DIR)){
		next if $br eq ".";
		next if $br eq "..";
		next unless -d $netdir.$br."/bridge";
		push @bridges, $br;
	}

	close(DIR);

	return @bridges;
}

sub createbaseinfo()
{
	my $bridge = shift;

	$oid=".1.3.6.1.2.1.17.1.1";
	$oid_value{$oid}=mac2hex(readfile($netdir.$bridge."/address", 0));
	$oid_type{$oid}=ASN_OCTET_STR;
	$oid_next{$oid}=".1.3.6.1.2.1.17.1.2";

	opendir(DIR, $netdir.$bridge."/brif/") or die "Could not open ".$netdir.$bridge."brif !\n";

	foreach $entry (readdir(DIR)) {
		next if $entry eq ".";
		next if $entry eq "..";
		# only count non-vlan interfaces
		next if $entry =~ /\.[0-9]*/;
		$ports++;
	}

	closedir(DIR);

	$oid=".1.3.6.1.2.1.17.1.2";
	$oid_value{$oid}=$ports;
	$oid_type{$oid}=ASN_INTEGER;
	$oid_next{$oid}=".1.3.6.1.2.1.17.1.3";

	$oid=".1.3.6.1.2.1.17.1.3";
	$oid_value{$oid}="2";	# transparent only
	$oid_type{$oid}=ASN_INTEGER;
	$oid_next{$oid}=".1.3.6.1.2.1.17.1.4.1.1.1";

}

sub createmacs()
{
	my $bridge = shift;
        my $start_oid = $oid = ".1.3.6.1.2.1.17.4.3.1";

	foreach my $mac (sort {$a cmp $b} keys %macs) {
		my $mac_oid=mac2oid($mac);
		unless(defined($first_mac_oid)){
			$first_mac_oid=$mac_oid;
			$oid_next{$oid.".1"}=$oid.".1".$mac_oid;
			$oid_next{$oid.".2"}=$oid.".2".$mac_oid;
			$oid_next{$oid.".3"}=$oid.".3".$mac_oid;
		}
		my $port=$macs{$mac}{$bridge};
		my $baseport=$baseports{$bridge}{$port};
		my $status=$locals{$mac}{$bridge};
		my $age=$ages{$mac}{$bridge};

		$oid_value{$oid.".1".$mac_oid}=mac2hex($mac);
		$oid_type{$oid.".1".$mac_oid}=ASN_OCTET_STR;
		if(defined($prv_mac_oid)){
			$oid_next{$oid.".1".$prv_mac_oid}=
				$oid.".1".$mac_oid;
		}

		$oid_value{$oid.".2".$mac_oid}=$baseport;
		$oid_type{$oid.".2".$mac_oid}=ASN_INTEGER;
		if(defined($prv_mac_oid)){
			$oid_next{$oid.".2".$prv_mac_oid}=
				$oid.".2".$mac_oid;
		}

		$oid_value{$oid.".3".$mac_oid}=$status;
		$oid_type{$oid.".3".$mac_oid}=ASN_INTEGER;
		if(defined($prv_mac_oid)){
			$oid_next{$oid.".3".$prv_mac_oid}=
				$oid.".3".$mac_oid;
		}

		$prv_mac_oid=$mac_oid;
	}

	if ($prv_mac_oid and $first_mac_oid) {
		$oid_next{$oid.".1".$prv_mac_oid}=$oid.".2".$first_mac_oid;
		$oid_next{$oid.".2".$prv_mac_oid}=$oid.".3".$first_mac_oid;
		$oid_next{$oid.".3".$prv_mac_oid}=".1.3.6.1.2.1.17.4.4.1.1.1";
	}

	undef $prv_mac_oid;
	undef $first_mac_oid;

	return $start_oid.".1".$first_mac_oid;
}

# TODO: is this sequence complete ?
sub createports()
{
	my $bridge = shift;
	my ($baseport, $prev_baseport, $first_baseport);
	$baseport=1;
	my $oid= '.1.3.6.1.2.1.17.1.4.1';

	foreach my $port (keys %{$interfaces{$bridge}}) {
		unless(defined($first_baseport)){
			$first_baseport=$baseport;
			$oid_next{$oid.".1"}=$oid.".1.".$baseport;
			$oid_next{$oid.".2"}=$oid.".2.".$baseport;
		}
		my $index=$indexes{$bridge}{$port};
		$baseports{$bridge}{$port}=$baseport;

		$oid_value{$oid.".1.".$baseport}=$baseport;
		$oid_type{$oid.".1.".$baseport}=ASN_INTEGER;
		if(defined($prv_baseport)){
			$oid_next{$oid.".1.".$prv_baseport}=
				$oid.".1.".$baseport;
		}

		$oid_value{$oid.".2.".$baseport}=$index;
		$oid_type{$oid.".2.".$baseport}=ASN_INTEGER;
		if(defined($prv_baseport)){
			$oid_next{$oid.".2.".$prv_baseport}=
				$oid.".2.".$baseport;
		}

		$prv_baseport=$baseport;
		$baseport++;
	}

	if ( $prv_baseport and $first_baseport ) {
		$oid_next{$oid.".1.".$prv_baseport}=$oid.".2.".$first_baseport;
		$oid_next{$oid.".2.".$prv_baseport}=".1.3.6.1.2.1.17.2.1";
	}

	undef $prv_baseport;
	undef $first_baseport;

}

sub stpproperties()
{
	my $bridge = shift;
	my $dir = $netdir.$bridge."/bridge/";

	@stpprops = ( { oid => ".1.3.6.1.2.1.17.2.1",
			flags => STP_PROP_VALUE,
			value => "3",
			type => ASN_INTEGER,
			nextoid => ".1.3.6.1.2.1.17.2.2" },
			{ oid => ".1.3.6.1.2.1.17.2.2",
			flags => STP_PROP_FILE | STP_PROP_DEC,
			value => $dir."priority",
			type => ASN_INTEGER,
			nextoid => ".1.3.6.1.2.1.17.2.3" },
			{ oid => ".1.3.6.1.2.1.17.2.3",
			flags => STP_PROP_FILE | STP_PROP_DEC,
			value => $dir."topology_change_timer",
			type => ASN_TIMETICKS,
			nextoid => ".1.3.6.1.2.1.17.2.4" },
			{ oid => ".1.3.6.1.2.1.17.2.4",
			flags => STP_PROP_FILE | STP_PROP_DEC,
			value => $dir."topology_change",
			type => ASN_COUNTER,
			nextoid => ".1.3.6.1.2.1.17.2.5" },
			{ oid => ".1.3.6.1.2.1.17.2.5",
			flags => STP_PROP_FILE | STP_PROP_DEC,
			value => $dir."root_id",
			type => ASN_OCTET_STR,
			nextoid => ".1.3.6.1.2.1.17.2.6" },
			{ oid => ".1.3.6.1.2.1.17.2.6",
			flags => STP_PROP_FILE | STP_PROP_DEC,
			value => $dir."root_path_cost",
			type => ASN_INTEGER,
			nextoid => ".1.3.6.1.2.1.17.2.7" },
			{ oid => ".1.3.6.1.2.1.17.2.7",
			flags => STP_PROP_FILE | STP_PROP_DEC,
			value => $dir."root_port",
			type => ASN_INTEGER,
			nextoid => ".1.3.6.1.2.1.17.2.8" },
			{ oid => ".1.3.6.1.2.1.17.2.8",
			flags => STP_PROP_FILE | STP_PROP_DEC,
			value => $dir."max_age",
			type => ASN_INTEGER,
			nextoid => ".1.3.6.1.2.1.17.2.9" },
			{ oid => ".1.3.6.1.2.1.17.2.9",
			flags => STP_PROP_FILE | STP_PROP_DEC,
			value => $dir."hello_time",
			type => ASN_INTEGER,
			nextoid => ".1.3.6.1.2.1.17.2.11" },
			# TODO ...17.2.10
			{ oid => ".1.3.6.1.2.1.17.2.11",
			flags => STP_PROP_FILE | STP_PROP_DEC,
			value => $dir."forward_delay",
			type => ASN_INTEGER,
			nextoid => ".1.3.6.1.2.1.17.2.12" },
			{ oid => ".1.3.6.1.2.1.17.2.12",
			flags => STP_PROP_FILE | STP_PROP_DEC,
			value => $dir."max_age",
			type => ASN_INTEGER,
			nextoid => ".1.3.6.1.2.1.17.2.13" },
			{ oid => ".1.3.6.1.2.1.17.2.13",
			flags => STP_PROP_FILE | STP_PROP_DEC,
			value => $dir."hello_time",
			type => ASN_INTEGER,
			nextoid => ".1.3.6.1.2.1.17.2.14" },
			{ oid => ".1.3.6.1.2.1.17.2.14",
			flags => STP_PROP_FILE | STP_PROP_DEC,
			value => $dir."forward_delay",
			type => ASN_INTEGER,
			nextoid => ".1.3.6.1.2.1.17.2.15.1.1.1" },
			);

	for ($i=0; $i <= $#stpprops; $i++) {
		my %props = %{$stpprops[$i]};
		$oid = $props{'oid'};
		if ( $props{'flags'} & STP_PROP_VALUE,) {
			$oid_value{$oid} = $props{'value'};
		}
		if ( $props{'flags'} & STP_PROP_FILE,) {
			$oid_value{$oid} =
			readfile($props{'value'},
			$props{'flags'});
		}
		$oid_type{$oid} = $props{'type'};
		$oid_next{$oid} = $props{'nextoid'};
	}
}

sub stpportproperties
{
	my $bridge = shift;
	my $brifdir = $netdir.$bridge."/brif/";
	my ($baseport, $first_baseport, $prev_baseport);

	$oid='.1.3.6.1.2.1.17.2.15.1';

	foreach my $port (keys %{$interfaces{$bridge}}) {
		$baseport = $baseports{$bridge}{$port};

		unless(defined($first_baseport)){
			$first_baseport=$baseport;
			$oid_next{$oid.".1"}=$oid.".1.".$baseport;
			$oid_next{$oid.".2"}=$oid.".2.".$baseport;
		}

		my $interface = $interfaces{$bridge}{$port};
		my $ifdir = $brifdir.$interface;

		# dot1dStpPort
		$oid_value{$oid.".1.".$baseport}=$baseport;
		$oid_type{$oid.".1.".$baseport}=ASN_INTEGER;
		if(defined($prev_baseport)){
			$oid_next{$oid.".1.".$prev_baseport}=
				$oid.".1.".$baseport;
		}

		# dot1dStpPortPriority
		$oid_value{$oid.".2.".$baseport}=readfile($ifdir."/priority", 0);
		$oid_type{$oid.".2.".$baseport}=ASN_INTEGER;
		if(defined($prev_baseport)){
			$oid_next{$oid.".2.".$prev_baseport}=
				$oid.".2.".$baseport;
		}

		# dot1dStpPortState
		my @translation = (1, 3, 4, 5, 2);
		my $state = readfile($ifdir."/state", 0);
		$oid_value{$oid.".3.".$baseport}=$translation[$state];
		$oid_type{$oid.".3.".$baseport}=ASN_INTEGER;
		if(defined($prev_baseport)){
			$oid_next{$oid.".3.".$prev_baseport}=
				$oid.".3.".$baseport;
		}

		# dot1dStpPortEnable
		@translation = (2, 1, 1, 1, 1);
		$oid_value{$oid.".4.".$baseport}=$translation[$state];
		$oid_type{$oid.".4.".$baseport}=ASN_INTEGER;
		if(defined($prev_baseport)){
			$oid_next{$oid.".4.".$prev_baseport}=
				$oid.".4.".$baseport;
		}

		# dot1dStpPortPathCost
		$oid_value{$oid.".5.".$baseport}=readfile($ifdir."/path_cost", 0);
		$oid_type{$oid.".5.".$baseport}=ASN_INTEGER;
		if(defined($prev_baseport)){
			$oid_next{$oid.".5.".$prev_baseport}=
				$oid.".5.".$baseport;
		}

		# dot1dStpPortDesignatedRoot
		$oid_value{$oid.".6.".$baseport}=readfile($ifdir."/designated_root", 0);
		$oid_type{$oid.".6.".$baseport}=ASN_OCTET_STR;
		if(defined($prev_baseport)){
			$oid_next{$oid.".6.".$prev_baseport}=
				$oid.".6.".$baseport;
		}

		# dot1dStpPortDesignatedCost
		$oid_value{$oid.".7.".$baseport}=readfile($ifdir."/designated_cost", 0);
		$oid_type{$oid.".7.".$baseport}=ASN_INTEGER;
		if(defined($prev_baseport)){
			$oid_next{$oid.".7.".$prev_baseport}=
				$oid.".7.".$baseport;
		}

		# dot1dStpPortDesignatedBridge
		$oid_value{$oid.".8.".$baseport}=readfile($ifdir."/designated_bridge", 0);
		$oid_type{$oid.".8.".$baseport}=ASN_OCTET_STR;
		if(defined($prev_baseport)){
			$oid_next{$oid.".8.".$prev_baseport}=
				$oid.".8.".$baseport;
		}

		# dot1dStpPortDesignatedPort
		$oid_value{$oid.".9.".$baseport}=readfile($ifdir."/designated_port", 0);
		$oid_type{$oid.".9.".$baseport}=ASN_OCTET_STR;
		if(defined($prev_baseport)){
			$oid_next{$oid.".9.".$prev_baseport}=
				$oid.".9.".$baseport;
		}

		# dot1dStpPortForwardTransitions (no value in bridge module)

		# dot1dStpPortPathCost32
		$oid_value{$oid.".11.".$baseport}=readfile($ifdir."/path_cost", 0);
		$oid_type{$oid.".11.".$baseport}=ASN_INTEGER;
		if(defined($prev_baseport)){
			$oid_next{$oid.".11.".$prev_baseport}=
				$oid.".11.".$baseport;
		}


		$prev_baseport=$baseport;
	}

	if ( $prev_baseport and $first_baseport ) {
		$oid_next{$oid.".1.".$prev_baseport}=$oid.".2.".$first_baseport;
		$oid_next{$oid.".2.".$prev_baseport}=$oid.".3.".$first_baseport;
		$oid_next{$oid.".3.".$prev_baseport}=$oid.".4.".$first_baseport;
		$oid_next{$oid.".4.".$prev_baseport}=$oid.".5.".$first_baseport;
		$oid_next{$oid.".5.".$prev_baseport}=$oid.".6.".$first_baseport;
		$oid_next{$oid.".6.".$prev_baseport}=$oid.".7.".$first_baseport;
		$oid_next{$oid.".7.".$prev_baseport}=$oid.".8.".$first_baseport;
		$oid_next{$oid.".8.".$prev_baseport}=$oid.".9.".$first_baseport;
		$oid_next{$oid.".9.".$prev_baseport}=$oid.".11.".$first_baseport;
		$oid_next{$oid.".11.".$prev_baseport}=".1.3.6.1.2.1.17.4.1";
	}

	$oid = $oid.".11.".$prev_baseport;

	undef $prev_baseport;
	undef $first_baseport;

}

sub dot1dTpproperties()
{
	@stpprops = ( { oid => ".1.3.6.1.2.1.17.4.1",
			flags => STP_PROP_VALUE,
			value => "0",
			type => ASN_COUNTER,
			nextoid => ".1.3.6.1.2.1.17.4.2" },
			{ oid => ".1.3.6.1.2.1.17.4.2",
			flags => STP_PROP_VALUE,
			value => "300",
			type => ASN_INTEGER,
			nextoid => ".1.3.6.1.2.1.17.4.3" },
			);

	for ($i=0; $i <= $#stpprops; $i++) {
		my %props = %{$stpprops[$i]};
		$oid = $props{'oid'};
		if ( $props{'flags'} & STP_PROP_VALUE,) {
			$oid_value{$oid} = $props{'value'};
		}
		if ( $props{'flags'} & STP_PROP_FILE,) {
			$oid_value{$oid} =
			readfile($props{'value'},
			$props{'flags'});
		}
		$oid_type{$oid} = $props{'type'};
		$oid_next{$oid} = $props{'nextoid'};
	}
}

sub portproperties
{
	my $bridge = shift;
	my ($baseport, $first_baseport, $prev_baseport);

	$oid='.1.3.6.1.2.1.17.4.4.1';

	foreach my $port (keys %{$interfaces{$bridge}}) {
		$baseport = $baseports{$bridge}{$port};

		unless(defined($first_baseport)){
			$first_baseport=$baseport;
			$oid_next{$oid.".1"}=$oid.".1.".$baseport;
			$oid_next{$oid.".2"}=$oid.".2.".$baseport;
		}

		my $interface = $interfaces{$bridge}{$port};
		my $ifdir = $netdir.$interface;

		# dot1dTpPort
		$oid_value{$oid.".1.".$baseport}=$baseport;
		$oid_type{$oid.".1.".$baseport}=ASN_INTEGER;
		if(defined($prev_baseport)){
			$oid_next{$oid.".1.".$prev_baseport}=
				$oid.".1.".$baseport;
		}

		# dot1dTpPortMaxInfo
		$oid_value{$oid.".2.".$baseport}=readfile($ifdir."/mtu", 0);
		$oid_type{$oid.".2.".$baseport}=ASN_INTEGER;
		if(defined($prev_baseport)){
			$oid_next{$oid.".2.".$prev_baseport}=
				$oid.".2.".$baseport;
		}

		# dot1dTpPortInFrames
		$oid_value{$oid.".3.".$baseport}=readfile($ifdir."/statistics/rx_packets", 0);
		$oid_type{$oid.".3.".$baseport}=ASN_COUNTER;
		if(defined($prev_baseport)){
			$oid_next{$oid.".3.".$prev_baseport}=
				$oid.".3.".$baseport;
		}

		# dot1dTpPortOutFrames
		$oid_value{$oid.".4.".$baseport}=readfile($ifdir."/statistics/tx_packets", 0);
		$oid_type{$oid.".4.".$baseport}=ASN_COUNTER;
		if(defined($prev_baseport)){
			$oid_next{$oid.".4.".$prev_baseport}=
				$oid.".4.".$baseport;
		}

		# dot1dTpPortInDiscards
		$oid_value{$oid.".5.".$baseport}=readfile($ifdir."/statistics/rx_dropped", 0);
		$oid_type{$oid.".5.".$baseport}=ASN_COUNTER;
		if(defined($prev_baseport)){
			$oid_next{$oid.".5.".$prev_baseport}=
				$oid.".5.".$baseport;
		}

		$prev_baseport=$baseport;
	}

	if ( $prev_baseport and $first_baseport ) {
		$oid_next{$oid.".1.".$prev_baseport}=$oid.".2.".$first_baseport;
		$oid_next{$oid.".2.".$prev_baseport}=$oid.".3.".$first_baseport;
		$oid_next{$oid.".3.".$prev_baseport}=$oid.".4.".$first_baseport;
		$oid_next{$oid.".4.".$prev_baseport}=$oid.".5.".$first_baseport;
		$oid_next{$oid.".5.".$prev_baseport}=".1.3.6.1.2.1.17.5.1";
	}

	$oid = $oid.".5.".$prev_baseport;

	undef $prev_baseport;
	undef $first_baseport;
}

sub dot1qbase()
{
	my $bridge = shift;

	my $oid=".1.3.6.1.2.1.17.7.1.1";
	$oid_next{".1.3.6.1.2.1.17.7"}=$oid.".1";
	$oid_next{".1.3.6.1.2.1.17.7.1"}=$oid.".1";

	$oid_value{$oid.".1"}=1;
	$oid_type{$oid.".1"}=ASN_INTEGER;
	$oid_next{$oid.".1"}=$oid.".2";

	$oid_value{$oid.".2"}=4094;
	$oid_type{$oid.".2"}=ASN_UNSIGNED;
	$oid_next{$oid.".2"}=$oid.".3";

	$oid_value{$oid.".3"}=4094;
	$oid_type{$oid.".3"}=ASN_UNSIGNED;
	$oid_next{$oid.".3"}=$oid.".4";

	$oid_value{$oid.".4"}=0; # filled in by currentvlans
	$oid_type{$oid.".4"}=ASN_UNSIGNED;
	$oid_next{$oid.".4"}=$oid.".5";

	$oid_value{$oid.".5"}=2;
	$oid_type{$oid.".5"}=ASN_INTEGER;
	$oid_next{$oid.".5"}=0;  # filled in by dot1qfdb

}

sub dot1qfdb()
{
	my $bridge = shift;

	my $oid=".1.3.6.1.2.1.17.7.1.2";
	foreach my $vlan (sort {$a<=>$b} keys %vlans){
		unless(defined($first_vlan)){
			$first_vlan=$vlan;
			$oid_next{".1.3.6.1.2.1.17.7.1.1.5"}=$oid.".1.1.".$vlan;
			$oid_next{$oid}=$oid.".1.1.".$vlan;
			$oid_next{$oid.".1"}=$oid.".1.1.".$vlan;
			$oid_next{$oid.".1.1"}=$oid.".1.1.".$vlan;
			$oid_next{$oid.".1.2"}=$oid.".1.2.".$vlan;
		}

		$oid_value{$oid.".1.1.".$vlan}=$vlan;
		$oid_type{$oid.".1.1.".$vlan}=ASN_UNSIGNED;
		if(defined($prv_vlan)){
			$oid_next{$oid.".1.1.".$prv_vlan}=$oid.".1.1.".$vlan;
		}

		$oid_value{$oid.".1.2.".$vlan}=0; # to be filled later
		$oid_type{$oid.".1.2.".$vlan}=ASN_COUNTER;
		if(defined($prv_vlan)){
			$oid_next{$oid.".1.2.".$prv_vlan}=$oid.".1.2.".$vlan;
		}

		$prv_vlan=$vlan;
	}
	if($prv_vlan and $first_vlan){
		$oid_next{$oid.".1.1.".$prv_vlan}=$oid.".1.2.".$first_vlan;
		$oid_next{$oid.".1.2.".$prv_vlan}=0; # to be filled later
	}

	my %macvlan=();
	my %vlanmac=();

	foreach my $vlan (sort {$a<=>$b} keys %vlans){
		my $count=0;
		foreach my $mac (sort {$a cmp $b} keys %macs) {
			my $vbridge=$bridge."_vlan".$vlan;
			next unless(defined($macs{$mac}{$vbridge}));
			$count++;
			my $mac_oid=mac2oid($mac);
			$macvlan{$vlan.$mac_oid}=$mac;
			$vlanmac{$vlan.$mac_oid}=$vlan;
		}
		$oid_value{$oid.".1.2.".$vlan}=$count;
	}

	foreach my $vmac_oid (sort {$a cmp $b} keys %vlanmac){
		my $mac=$macvlan{$vmac_oid};
		my $vlan=$vlanmac{$vmac_oid};

		#print "VMAC: $vmac_oid ($vlan:$mac)\n";
		unless(defined($first_vmac_oid)){
			$first_vmac_oid=$vmac_oid;
			$oid_next{$oid.".1.2.".$prv_vlan}=$oid.".2.1.".$vmac_oid;
			$oid_next{$oid.".2"}=$oid.".2.1.".$vmac_oid;
			$oid_next{$oid.".2.1"}=$oid.".2.1.".$vmac_oid;
			$oid_next{$oid.".2.2"}=$oid.".2.2.".$vmac_oid;
			$oid_next{$oid.".2.3"}=$oid.".2.3.".$vmac_oid;
		}

		my $port=$macs{$mac}{$bridge};
		my $baseport=$baseports{$bridge}{$port};
		my $status=$locals{$mac}{$bridge};
		my $age=$ages{$mac}{$bridge};

		print "VLAN $vlan: $mac -> $port:$baseport ($status, $age)\n"; 

		$oid_value{$oid.".2.1.".$vmac_oid}=mac2hex($mac);
		$oid_type{$oid.".2.1.".$vmac_oid}=ASN_OCTET_STR;
		if(defined($prv_vmac_oid)){
			$oid_next{$oid.".2.1.".$prv_vmac_oid}=$oid.".2.1.".$vmac_oid;
		}

		$oid_value{$oid.".2.2.".$vmac_oid}=$baseport;
		$oid_type{$oid.".2.2.".$vmac_oid}=ASN_INTEGER;
		if(defined($prv_vmac_oid)){
			$oid_next{$oid.".2.2.".$prv_vmac_oid}=$oid.".2.2.".$vmac_oid;
		}

		$oid_value{$oid.".2.3.".$vmac_oid}=$status;
		$oid_type{$oid.".2.3.".$vmac_oid}=ASN_INTEGER;
		if(defined($prv_vmac_oid)){
			$oid_next{$oid.".2.3.".$prv_vmac_oid}=$oid.".2.3.".$vmac_oid;
		}
		$prv_vmac_oid=$vmac_oid;
	}

	if ($prv_vmac_oid and $first_vmac_oid) {
		$oid_next{$oid.".2.1.".$prv_vmac_oid}=$oid.".2.2.".$first_vmac_oid;
		$oid_next{$oid.".2.2.".$prv_vmac_oid}=$oid.".2.3.".$first_vmac_oid;
		$oid_next{$oid.".2.3.".$prv_vmac_oid}=".1.3.6.1.2.1.17.7.1.4.1";
	}

	undef $first_vmac_oid;
	undef $prv_vmac_oid;

	undef $first_vlan;
	undef $prv_vlan;
}

sub dot1qcurrentvlans()
{
	my $bridge = shift;


	my $oid=".1.3.6.1.2.1.17.7.1.4.1";
	$oid_next{".1.3.6.1.2.1.17.7.1.4"}=$oid;

	$oid_value{$oid}=0;	# can't keep track of this info
	$oid_type{$oid}=ASN_COUNTER;

	my $count=0;
	$oid=".1.3.6.1.2.1.17.7.1.4.2";
	foreach my $vlan (sort {$a<=>$b} keys %vlans){
		$count++;
		my @allports=();
		my @untaggedports=();
		foreach my $port (keys %{$vlans{$vlan}}){
			$baseport=$baseports{$bridge}{$port};
			push @allports, $baseport;
			push @untaggedports, $baseport
				unless($tagged{$vlan}{$port});
		}
		#print "ADDING: vlan $vlan (@allports, @untaggedports)\n";
		unless(defined($first_vlan)){
			$first_vlan=$vlan;
			$oid_next{".1.3.6.1.2.1.17.7.1.4.1"}=$oid.".1.0.".$vlan;
			$oid_next{$oid}=$oid.".1.0.".$vlan;
			$oid_next{$oid.".1"}=$oid.".1.0.".$vlan;
			$oid_next{$oid.".2"}=$oid.".2.0.".$vlan;
			$oid_next{$oid.".3"}=$oid.".3.0.".$vlan;
			$oid_next{$oid.".4"}=$oid.".4.0.".$vlan;
			$oid_next{$oid.".5"}=$oid.".5.0.".$vlan;
			$oid_next{$oid.".6"}=$oid.".6.0.".$vlan;
			$oid_next{$oid.".7"}=$oid.".7.0.".$vlan;
		}

		$oid_value{$oid.".1.0.".$vlan}=0; # can't keep track of this
		$oid_type{$oid.".1.0.".$vlan}=ASN_TIMETICKS;
		if(defined($prv_vlan)){
			$oid_next{$oid.".1.0.".$prv_vlan}=$oid.".1.0.".$vlan;
		}

		$oid_value{$oid.".2.0.".$vlan}=$vlan;
		$oid_type{$oid.".2.0.".$vlan}=ASN_UNSIGNED;
		if(defined($prv_vlan)){
			$oid_next{$oid.".2.0.".$prv_vlan}=$oid.".2.0.".$vlan;
		}

		$oid_value{$oid.".3.0.".$vlan}=$vlan; 
		$oid_type{$oid.".3.0.".$vlan}=ASN_UNSIGNED;
		if(defined($prv_vlan)){
			$oid_next{$oid.".3.0.".$prv_vlan}=$oid.".3.0.".$vlan;
		}

		$oid_value{$oid.".4.0.".$vlan}=getportlist(@allports);
		$oid_type{$oid.".4.0.".$vlan}=ASN_OCTET_STR;
		if(defined($prv_vlan)){
			$oid_next{$oid.".4.0.".$prv_vlan}=$oid.".4.0.".$vlan;
		}

		$oid_value{$oid.".5.0.".$vlan}=getportlist(@untaggedports);
		$oid_type{$oid.".5.0.".$vlan}=ASN_OCTET_STR;
		if(defined($prv_vlan)){
			$oid_next{$oid.".5.0.".$prv_vlan}=$oid.".5.0.".$vlan;
		}

		$oid_value{$oid.".6.0.".$vlan}=1;
		$oid_type{$oid.".6.0.".$vlan}=ASN_INTEGER;
		if(defined($prv_vlan)){
			$oid_next{$oid.".6.0.".$prv_vlan}=$oid.".6.0.".$vlan;
		}

		$oid_value{$oid.".7.0.".$vlan}=0;
		$oid_type{$oid.".7.0.".$vlan}=ASN_TIMETICKS;
		if(defined($prv_vlan)){
			$oid_next{$oid.".7.0.".$prv_vlan}=$oid.".7.0.".$vlan;
		}
		$prv_vlan=$vlan;
	}

	$oid_value{".1.3.6.1.2.1.17.7.1.1.4"}=$count;
	if($prv_vlan and $first_vlan){
		$oid_next{$oid.".1.0.".$prv_vlan}=$oid.".2.0.".$first_vlan;
		$oid_next{$oid.".2.0.".$prv_vlan}=$oid.".3.0.".$first_vlan;
		$oid_next{$oid.".3.0.".$prv_vlan}=$oid.".4.0.".$first_vlan;
		$oid_next{$oid.".4.0.".$prv_vlan}=$oid.".5.0.".$first_vlan;
		$oid_next{$oid.".5.0.".$prv_vlan}=$oid.".6.0.".$first_vlan;
		$oid_next{$oid.".6.0.".$prv_vlan}=$oid.".7.0.".$first_vlan;
		$oid_next{$oid.".7.0.".$prv_vlan}=".1.3.6.1.2.1.17.7.1.4.3";
	}

	undef $prv_vlan;
	undef $first_vlan;

}

sub readforwards()
{
	my $bridge = shift;
	my $fdb=$netdir.$bridge."/brforward";

	open(FWD, $fdb) or return -1;
	while(sysread(FWD, $data, 20)){
		my $mac;
		my ($b1,$b2,$b3,$b4,$b5,$b6,$port,$local,$age,$hi)=
		unpack("C6 C C L C x3", $data);
		$mac=sprintf("%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
					$b1,$b2,$b3,$b4,$b5,$b6);
		$age=$age/100;
		$macs{$mac}{$bridge}=$port;
		$ages{$mac}{$bridge}=$age;
		$locals{$mac}{$bridge}=FDB_STATUS_LEARNED;
		next if ($local);
		$macs{$mac}{$bridge}=$bridge;
		$locals{$mac}{$bridge}=FDB_STATUS_SELF;
	}
	close(FWD);
}

sub readindexes()
{
	my $bridge = shift;

	my $brifdir=$netdir.$bridge."/brif/";

	opendir(DIR, $brifdir) or return -1;
	my @interfaces = readdir(DIR);
	next if ($#interfaces lt 2);
	foreach my $if (@interfaces) {
		next if $if eq ".";
		next if  $if eq "..";

		my $port=hex(readfile($brifdir.$if."/port_no", 0));
		my $index=readfile($netdir.$if."/ifindex", 0);

		$indexes{$bridge}{$port}=$index;
		$interfaces{$bridge}{$port}=$if;
	}

	$indexes{$bridge}{$bridge}=readfile($netdir.$bridge."/ifindex", 0);

	close(DIR);
}

sub readvlans()
{
	my $bridge = shift;
	my $brifdir = $netdir.$bridge."/brif/";
	my %ifs;

	opendir(DIR, $brifdir) or return -1;
	my @interfaces = readdir(DIR);
	return if ($#interfaces < 2);
	foreach my $if (@interfaces) {
		next if $if eq ".";
		next if  $if eq "..";
		$ifs{$if}=1;
	}
	close(DIR);

	opendir(DIR, $netdir) or return -1;
	@interfaces = readdir(DIR);
	return 0 if ($#interfaces < 2);
	foreach my $if (@interfaces) {
		next if $if eq ".";
		next if  $if eq "..";
		next unless($if=~/^(.*)\.(\d+)$/);
		my $pif=$1;
		my $vlan=$2;
		next unless(defined($ifs{$pif}));
		tracevlan($vlan, $if, $bridge);
	}
	close(DIR);
}

sub tracevlan{
	my ($vlan, $interface, $bridge)=@_;

	my $brifdir=$netdir.$interface."/brport/bridge/brif/";

	opendir(DIR, $brifdir) or return -1;
	my @interfaces = readdir(DIR);
	return if ($#interfaces < 2);
	foreach my $if (@interfaces) {
		next if $if eq ".";
		next if  $if eq "..";
		my $port;
		my $index;
		if($if=~/^(.*)\.(\d+)$/){
			my $pif=$1;
			$brifdir=$netdir.$pif."/brport/bridge/brif/";
			$port=hex(readfile($brifdir.$pif."/port_no", 0));
			$index=readfile($netdir.$pif."/ifindex", 0);
			#$indexes{$bridge}{$port}=$index;
			#$interfaces{$bridge}{$port}=$if;
			$tagged{$vlan}{$port}=1;
		}else{
			my $brid=readfile($netdir.$if."/brport/bridge/ifindex",	0);
			$brifdir=$netdir.$if."/brport/bridge/brif/";
			$port=hex(readfile($brifdir.$if."/port_no", 0));
			$port=$brid*1000+$port; #create a unique port number
			$index=readfile($netdir.$if."/ifindex", 0);
			$indexes{$bridge}{$port}=$index;
			$interfaces{$bridge}{$port}=$if;
			$tagged{$vlan}{$port}=0;
		}
		$vlans{$vlan}{$port}=1;
		#print "VLAN: $vlan -> $if ($port <-> $index)\n";
	}
	close(DIR);

	my $brid=readfile($netdir.$interface."/brport/bridge/ifindex", 0);
	my $fdb=$netdir.$interface."/brport/bridge/brforward";

	my $vbridge=$bridge."_vlan".$vlan;
	open(FWD, $fdb) or return -1;
	while(sysread(FWD, $data, 20)){
		my $mac;
		my ($b1,$b2,$b3,$b4,$b5,$b6,$port,$local,$age,$hi)=
		unpack("C6 C C L C x3", $data);
		 $mac=sprintf("%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
					$b1,$b2,$b3,$b4,$b5,$b6);
		 $port=$brid*1000+$port unless(defined($indexes{$bridge}{$port}));  #create a unique port number
		 $age=$age/100;
		 #$macs{$mac}{$bridge}=$port;
		 $macs{$mac}{$vbridge}=$port;
		 #$ages{$mac}{$bridge}=$age;
		 $ages{$mac}{$vbridge}=$age;
		 #$locals{$mac}{$bridge}=FDB_STATUS_LEARNED;
		 $locals{$mac}{$vbridge}=FDB_STATUS_LEARNED;
		 next if ($local);
		 #$macs{$mac}{$bridge}=$bridge;
		 $macs{$mac}{$vbridge}=$bridge;
		 #$locals{$mac}{$bridge}=FDB_STATUS_SELF;
		 $locals{$mac}{$vbridge}=FDB_STATUS_SELF;
	}
	close(FWD);
}

sub readfile()
{
	my $file = shift;
	my $flags = shift;

	open(FILE, $file) or print "Could not open file $file !\n";
	my $value=<FILE>;
	chomp $value;
	close(FILE);

	if ($flags & STP_PROP_HEX) {
		return hex($value);
	}

	return $value;
}

sub getportlist{
	my @ports=@_;
	my $portlist="";

	@ports=sort {$a <=> $b} @ports;
	my $last=1;
	foreach my $port (@ports){
		for(my $i=$last; $i<$port; $i++){
			$portlist=$portlist."0";
		}
		$portlist=$portlist."1";
		$last=$port+1;
	}
	return pack('B*',$portlist); 
}

sub mac2oid{
	my ($mac)=@_;
	my @octets=split(/:/,$mac);

	$mac="";
	foreach my $octet (@octets){
		$mac=$mac.".".hex($octet);
	}
	return $mac;
}

sub mac2hex{
        my ($mac)=@_;
	my @decimals;
	my @octets=split(/:/,$mac);

	foreach my $octet (@octets){
		push @decimals, hex($octet);
	}
	return pack("CCCCCC", @decimals);
}

sub shutdown {
	$running = 0;
}
curly – Verilere bak
Menu
  • Top 10

Verilere bak

Follow us
  • facebook
  • twitter
Search
Login
Create
Menu

Verilere bak

Login

You are here:

  1. Home
  2. Tag Archives: curly

curly

Latest stories

Can You Watch These 27 Examples of Food Porn Without Getting Hungry?

  • facebook
  • twitter

Arşivler

Kategoriler

Disclaimer

This demo site is only for demonstration purposes. All images are copyrighted to their respective owners. All content cited is derived from their respective sources.

© 2017 bring the pixel. Remember to change this

  • Home
  • Contact us
Back to Top
Close
  • Top 10
  • Home
  • Animals
  • Funny
  • WOW
  • WTF
  • Features
  • facebook
  • twitter
Create

Log In

Sign In

Forgot password?

Forgot password?

Enter your account data and we will send you a link to reset your password.

Back to Login

Your password reset link appears to be invalid or expired.

Log in

Privacy Policy

Accept

Add to Collection

  • Public collection title

  • Private collection title

No Collections

Here you'll find all collections you've created before.

Hey Friend!
Before You Go…

Get the best viral stories straight into your inbox before everyone else!

Don't worry, we don't spam

Close

Newsletter

Don’t miss out on new posts!

Don't worry, we don't spam

Close