[SNMP4J] Ściąganie całego drzewa

0

Witam,

Obecnie jestem na etapie pisania programu klienta SNMP do pracy dyplomowej. W tym celu korzystam z biblioteki SNMP4J. Z opinii ludzi słyszałem, że jest to dobre narzędzie i sprawdza się w takich zadaniach. Problem polega jednak na tym, że potrzebuję ściągnąć całą gałąź statystyk. Mój kod pozwala jedynie na odczytanie końcowego elementu w drzewie MIB (końcowego "liścia" w całej gałęzi). Lepiej to wyjaśnię na przykładzie:

Moim zadaniem jest ściąganie statystyk ruchu przechodzącego przez router CISCO z uaktywnioną usługą NBAR. I tak np: jeżeli chcę sprawdzić jakie protokoły są monitorowane wywołuję w programie OID równe 1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.1 w wyniku czego otrzymuję nazwę protokołu - w tym przypadku ftp.

RESPONSE[requestID=393169313, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.1 = ftp]]

Chciałbym jednak by mój kod potrafił zareagować na "mniej szczegółowy" OID. Chcąc pobrać całe drzewo statystyk NBAR powinienem wpisać identyfikator równy 1.3.6.1.4.1.9.9.244.1.2.1.1 co odpowiada MIB - cnpdAllStatsEntry. Niestety program wtedy zwraca jedynie poniższy komunikat:

RESPONSE[requestID=1579941146, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.4.1.9.9.244.1.2.1.1 = noSuchObject]]

Wiem, że rozwiązanie pobierania całej gałęzi jest możliwe. Analizowałem inne przeglądarki OID i badałem nimi mój router. Wszystkie potrafiły po wpisaniu pierwszych cyfr OID pobrać całą gałąź z wpisami.

Pod spodem prezentuje kod omawianego wyżej programu:

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.Target;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.DefaultPDUFactory;
import org.snmp4j.util.TableEvent;
import org.snmp4j.util.TableUtils;


public class SnmpClient {
	private String address;

	private Snmp snmp;
	

	public SnmpClient(String address) {
		super();
		this.address = address;
		try {
			start();
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	public void stop() throws IOException {
		snmp.close();
	}

	private void start() throws IOException {
		TransportMapping transport = new DefaultUdpTransportMapping();
		snmp = new Snmp(transport);
		// Do not forget this line!
		System.out.println(transport.getListenAddress());
		transport.listen();
	}
	
	public void getAsString(OID oid) throws IOException {
		ResponseEvent event = get(new OID[]{oid});
		System.out.println(event.getResponse());
	}
	
	public ResponseEvent get(OID oids[]) throws IOException {
		PDU pdu = new PDU();
 	   for (OID oid : oids) {
 		   pdu.add(new VariableBinding(oid));
 	   }
 	   
 	   pdu.setType(PDU.GET);
 	   
	   ResponseEvent event = snmp.send(pdu, getTarget(), null);
	   if(event != null) {
		  return event;
	   }
	   throw new RuntimeException("GET timed out");	  
	}
	
	private Target getTarget() {
		Address targetAddress = GenericAddress.parse(address);
		CommunityTarget target = new CommunityTarget();
		target.setCommunity(new OctetString("public"));
		target.setAddress(targetAddress);
		target.setRetries(2);
		target.setTimeout(1500);
		target.setVersion(SnmpConstants.version2c);
		return target;
	}

	/**
	 * Normally this would return domain objects or something else than this...
	 */
	public List<List<String>> getTableAsStrings(OID[] oids) {
		TableUtils tUtils = new TableUtils(snmp, new DefaultPDUFactory());
		
		@SuppressWarnings("unchecked") 
			List<TableEvent> events = tUtils.getTable(getTarget(), oids, null, null);
		
		List<List<String>> list = new ArrayList<List<String>>();
		for (TableEvent event : events) {
			if(event.isError()) {
				throw new RuntimeException(event.getErrorMessage());
			}
			List<String> strList = new ArrayList<String>();
			list.add(strList);
			for(VariableBinding vb: event.getColumns()) {
				strList.add(vb.getVariable().toString());
			}
		}
		return list;
	}
}

oraz jego wywołanie:


public class SnmpTest {
	public static void main(String[] args) throws IOException {
		SnmpClient client = new SnmpClient("udp:192.168.1.100/161");
		client.getAsString(new OID("1.3.6.1.2.1.4.20.1.1.192.168.1.100"));
		client.getAsString(new OID("1.3.6.1.4.1.9.9.244.0"));
		client.getAsString(new OID("1.3.6.1.2.1.4.3.0"));
		client.getAsString(new OID("1.3.6.1.2.1.1.1.0"));
                //działający OID z końcową wartością w gałęzi 
		client.getAsString(new OID("1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.1"));
                //nie działający OID
		//client.getAsString(new OID("1.3.6.1.4.1.9.9.244.1.2.1.1"));
	}
}

W programie powyżej dopisałem też funkcję, której kod znalazłem w necie - getTableAsStrings. Nie rozumiem jednak dlaczego w argumencie przyjmuje tablice OID. Czy nie można podać jednego OID i pobierze korzeń z wszystkimi jego potomkami?

Proszę o pomoc. Mam nadzieję, że ktoś miał do czynienia z SNMP4J.

Pozdrawiam

0

Musisz wysłać geta na każdą wartość z osobna. W AdventNet można chyba zaimportować MIBa i libka sama sobie sparsuje co trzeba i wyśle odpowiednią liczbę get requestów. SNMP4J chyba nie ma obsługi MIB. Musisz sobie sam zrobić metodę która listuje wszystkie OIDy z danego drzewa.

Możliwe że same żądania SNMP GETNEXT wystarczą. http://net-snmp.sourceforge.net/docs/man/snmpwalk.html tu pisze:

NAME

snmpwalk - retrieve a subtree of management values using SNMP GETNEXT requests

0

Problem rozwiązany. Ustawiłem typ PDU na GETBULK i pobierał całe drzewo. Pojawił sięjednak inny problem. Napisałem poniższą funkcję zwracającą zagnieżdżania na podstawie rootOID.

@SuppressWarnings("unchecked")
	public static Vector<VariableBinding> walk(String address, OID oid) {
		Vector vbs = new Vector();
		PDU requestPDU = new PDU();
		requestPDU.add(new VariableBinding(oid));
		requestPDU.setType(PDU.GETBULK);
		requestPDU.setMaxRepetitions(100);
		
		Address targetAddress = GenericAddress.parse(address);
		CommunityTarget target = new CommunityTarget();
		target.setCommunity(new OctetString("public"));
		target.setAddress(targetAddress);
		target.setVersion(SnmpConstants.version2c);
		
		try {
			TransportMapping transport = new DefaultUdpTransportMapping();
			Snmp snmp = new Snmp(transport);
			transport.listen();

			ResponseEvent respEvt = snmp.send(requestPDU,target);
			PDU responsePDU = respEvt.getResponse();
				
			if (responsePDU != null) {
				vbs = responsePDU.getVariableBindings();
			}
			
			snmp.close();
		}  catch (IOException e) {
			e.printStackTrace();
		}
		
		return vbs;
	}

Wszystko było by fajnie gdyby nie fakt, że nie zwraca mi pełnej ilości rekordów :/ ustawiam maksymalną wartość zwracanych wpisów poprzez requestPDU.setMaxRepetitions(100); Kiedy ustawie 10, zwraca dokładnie 10 pierwszych. Wiem jednak, że OID, który aktualnie badam (1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.0) powinien zwrócić 81 wpisów. I kiedy w pętli GETem podaje kolejne wartości OID zwraca wszystkie rekordy. Tymczasem z niewyjaśnionych przyczyn powyższa funkcja zwraca dokładnie 48 rekordów.

1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.1 - ftp
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.2 - http
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.3 - egp
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.4 - gre
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.5 - icmp
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.6 - eigrp
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.7 - ipinip
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.8 - ipsec
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.9 - ospf
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.10 - bgp
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.11 - cuseeme
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.12 - dhcp
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.13 - dns
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.14 - finger
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.15 - gopher
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.16 - secure-http
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.17 - imap
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.18 - secure-imap
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.19 - irc
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.20 - secure-irc
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.21 - kerberos
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.22 - l2tp
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.23 - ldap
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.24 - secure-ldap
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.25 - sqlserver
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.26 - netbios
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.27 - nfs
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.28 - nntp
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.29 - secure-nntp
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.30 - notes
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.31 - ntp
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.32 - pcanywhere
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.33 - pop3
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.34 - secure-pop3
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.35 - pptp
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.36 - rip
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.37 - rsvp
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.38 - smtp
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.39 - snmp
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.40 - socks
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.41 - ssh
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.42 - syslog
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.43 - telnet
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.44 - secure-telnet
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.45 - secure-ftp
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.46 - xwindows
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.47 - printer
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.48 - novadigm

a powinno być tak:

1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.1 - ftp 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.2 - http 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.3 - egp 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.4 - gre 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.5 - icmp 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.6 - eigrp 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.7 - ipinip 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.8 - ipsec 
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.9 - ospf 
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.10 - bgp 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.11 - cuseeme 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.12 - dhcp 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.13 - dns 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.14 - finger 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.15 - gopher 
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.16 - secure-http 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.17 - imap 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.18 - secure-imap 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.19 - irc 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.20 - secure-irc 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.21 - kerberos 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.22 - l2tp 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.23 - ldap 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.24 - secure-ldap 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.25 - sqlserver 
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.26 - netbios 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.27 - nfs 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.28 - nntp 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.29 - secure-nntp 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.30 - notes 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.31 - ntp 
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.32 - pcanywhere 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.33 - pop3 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.34 - secure-pop3 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.35 - pptp 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.36 - rip 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.37 - rsvp 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.38 - smtp 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.39 - snmp 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.40 - socks 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.41 - ssh 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.42 - syslog 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.43 - telnet 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.44 - secure-telnet 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.45 - secure-ftp 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.46 - xwindows 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.47 - printer 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.48 - novadigm 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.49 - tftp 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.50 - exchange 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.51 - vdolive 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.52 - sqlnet 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.53 - rcmd 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.54 - netshow 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.55 - sunrpc 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.56 - streamwork 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.57 - citrix 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.58 - napster 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.59 - fasttrack 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.60 - gnutella 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.61 - kazaa2 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.62 - custom-01 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.63 - custom-02 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.64 - custom-03 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.65 - custom-04 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.66 - custom-05 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.67 - custom-06 
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.68 - custom-07 
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.69 - custom-08 
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.70 - custom-09 
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.71 - custom-10 
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.72 - rtsp 
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.73 - rtp 
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.74 - mgcp 
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.75 - skinny 
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.76 - h323 
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.77 - sip 
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.78 - rtcp 
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.79 - edonkey 	
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.80 - winmx 
1.3.6.1.4.1.9.9.244.1.2.1.1.2.2.81 - unknown

Czy ktoś spotkał się z takim problemem? Proszę o pomoc.

Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1