Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Отчего SNMP это не дюже легко?

Anna | 4.06.2014 | нет комментариев
Меньше месяца назад, на Прогре была опубликована статья, рассказывающая о том, как применять знаменитую библиотеку, для работы с SNMP из Java-приложения. Поддерживая, в целом, начинание автора, я хочу остановиться на тех трудностях, которые могут появиться в настоящем плане, использующем SNMP.

Читаем документацию

Для начала я хотел бы остановиться на том, что мне не вовсе ясно, отчего из каждого разнообразия SNMP-запросов автор остановился на TRAP-ах? Посмотрим, что пишет по этому поводу RFC 1157:

The strategy implicit in the SNMP is that the monitoring of network state at any significant level of detail is accomplished primarily by polling for appropriate information on the part of the monitoring center(s). A limited number of unsolicited messages (traps) guide the timing and focus of the polling. Limiting the number of unsolicited messages is consistent with the goal of simplicity and
minimizing the amount of traffic generated by the network management function.

Для тех, у кого трудности с английским языком, имеется русский перевод:

Тактика SNMP заключается в том, что мониторинг состояния сети с любым важным ярусом детализации выполняется основным образом путем опроса из центра мониторинга. Ограниченное число незапрашиваемых сообщений (trap — прерывание) обеспечивает синхронизацию и активизирует опросы. Лимитация числа незапрашиваемых сообщений согласуется с задачами обеспечения простоты и минимизации трафика, создаваемого системой сетевого управления.

Из этих цитат, абсолютно ясно, что запросы с типами TRAP и INFORM это не особенно Зачастую применяемая часть SNMP. Статью для начинающих было бы больше целесообразно иллюстрировать примерами применения значительно больше ходовых GET-запросов.

Вообще я настойчиво рекомендую ознакомиться со всеми RFC, связанными с SNMP перед началом работы. Некоторые аспекты SNMP не очевидны и имеет толк получить о них представление из первоисточника. Начать ознакомление с материалом дозволено с wiki.

Первые шаги

Помимо непременного ознакомления с документацией, значимо понимать, для чего мы все это делаем. В практике телекома, особенно Зачастую встречаются следующие задачи:

  1. Опрос оборудования по SNMP (аккаунтинг, мониторинг)
  2. Управление оборудованием по SNMP (активизация)

Задачи, связанные с опросом оборудования сводятся к образованию GET (и как будет показано дальше GETNEXT) запросов. Управление оборудованием сводится к отсылке SET-запросов, изменяющих состояние соответствующих переменных на оборудовании (скажем, таким образом, дозволено отключить какой либо интерфейс).

Задача SNMP-мониторинга выдается на всеобщем фоне требованием того, что опрашиваемого оборудования много либо дюже много. Представим, что именно эту задачу нам и предстоит решать.

Начнем писать код. В тестовом примере мы обратимся по SNMP к собственному хосту и прочитаем значение переменной, заданной OID-ом 1.3.6.1.2.1.1.3.0 и содержащей значение uptime-а хоста:

Одиночный GET-запрос

package com.amfitel.m2000.ae.tests.snmp;

import java.io.IOException;

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;

public class Test {

	private final static String SNMP_COMMUNITY = "public";
	private final static int    SNMP_RETRIES   = 3;
	private final static long   SNMP_TIMEOUT   = 1000L;

	private Snmp snmp = null;
	private TransportMapping transport = null;

	private void test() throws IOException {
		Target t = getTarget("udp:127.0.0.1/161");
		String r = send(t, "1.3.6.1.2.1.1.3.0");
		System.out.println(r);
	}

	private String send(Target target, String oid) throws IOException {
		PDU pdu = new PDU();
		pdu.add(new VariableBinding(new OID(oid)));
		pdu.setType(PDU.GET);
		ResponseEvent event = snmp.send(pdu, target, null);
		if (event != null) {
			return event.getResponse().get(0).toString();
		} else {
			return "Timeout exceeded";
		}
	}

	private Target getTarget(String address) {
		Address targetAddress = GenericAddress.parse(address);
		CommunityTarget target = new CommunityTarget();
		target.setCommunity(new OctetString(SNMP_COMMUNITY));
		target.setAddress(targetAddress);
		target.setRetries(SNMP_RETRIES);
		target.setTimeout(SNMP_TIMEOUT);
		target.setVersion(SnmpConstants.version1);
		return target;
	}

	private void start() throws IOException {
		transport = new DefaultUdpTransportMapping();
		snmp = new Snmp(transport);
		transport.listen();
	}

	private void stop() throws IOException {
		try {
			if (transport != null) {
				transport.close();
				transport = null;
			}
		} finally {
			if (snmp != null) {
				snmp.close();
				snmp = null;
			}
		}
	}

	public static void main(String[] args) {
		Test t = new Test();
		try {
			try {
				t.start();
				t.test();
			} finally {
				t.stop();
			}
		} catch (IOException e) {
			System.out.println(e.toString());
		}
	}
}

Заранее удостоверясь, что служба SNMP на нашем хосте работает и запустив код на выполнение, получим желанное значение uptime-а (времени безостановочной работы хоста с момента последней загрузки):

1.3.6.1.2.1.1.3.0 = 2:28:55.06

Применяя это значение, дозволено осуществлять мониторинг. Если мы обнаруживаем, что значением уменьшилось — значит хост поспел перезагрузиться с момента очередного опроса. Если хост не ответил в течение заданного таймаута (позже нескольких механически сделанных попыток) это, скорее каждого, обозначает, что хост не работает. Все легко?

Подсчитали — прослезились

Не вовсе. Припоминаем о том, что нам предстоит исполнять много запросов. Давайте промеряем, сколько запросов мы можем исполнить в секунду? Внесем малое исправление в код:

	private void test() throws IOException {
		Target t = getTarget("udp:127.0.0.1/161");
		Long timestamp = System.currentTimeMillis();
		for (int i = 0; i < 1000; i  ) {
			send(t, "1.3.6.1.2.1.1.3.0");
		}
		System.out.println(1000000L /(System.currentTimeMillis() - timestamp));
	}

И запустим его на выполнение:

2463

Примерно две с половиной тысячи запросов в секунду! Хорошо?

Не будем спешить. Мы отправляем запросы на Loopback интерфейс, а он работает несколько стремительней локальной сети. Посмотрим, сколько запросов в секунду мы поспеем исполнить к иному хосту в нашей сети:

182

Не дотягиваем даже до двухсот. Вообще говоря, допустимо, этого будет довольно. Все зависит от задачи. Но мы проводили измерения при условии, что опрашиваемый хост доступен. Что будет если хост не ответит?

Будет несколько попыток доступа (в нашем коде мы задали 3) поделенных таймаутом (1000 мсек). Это обозначает, что за секунду мы не поспеем исполнить ни одного запроса. От того что не отвечающий хост является не такой уж огромный редкостью, это может стать огромный загвоздкой в настоящем плане.

Идем на рекорд

Что с этим дозволено сделать? Если бы мы имели дело с каким либо синхронным протоколом (скажем telnet), специального выбора бы у нас не было. Для того, Дабы увеличить продуктивность, нам пришлось бы единовременно исполнять много потоков. Но SNMP асинхронен по своей природе! Не нужно насильно втискивать его в синхронные рамки.

Как перейти к асинхронному варианту? В нашем случае, достаточно легко:

Асинхронные запросы

package com.amfitel.m2000.ae.tests.snmp;

import java.io.IOException;

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.event.ResponseListener;
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;

public class Test implements ResponseListener {

	private final static String SNMP_COMMUNITY = "public";
	private final static int    SNMP_RETRIES   = 3;
	private final static long   SNMP_TIMEOUT   = 1000L;

	private Snmp snmp = null;
	private TransportMapping transport = null;

	public void onResponse(ResponseEvent event) {
		PDU response = event.getResponse();
		if (response != null) {
			System.out.println(response.get(0).toString());
			return;
		}
	}

	private void test() throws IOException {
		Target t = getTarget("udp:192.168.131.253/161");
		Long timestamp = System.currentTimeMillis();
		for (int i = 0; i < 1000; i  ) {
			send(t, "1.3.6.1.2.1.1.3.0");
		}
		System.out.println(1000000L /(System.currentTimeMillis() - timestamp));
	}

	private void send(Target target, String oid) throws IOException {
		PDU pdu = new PDU();
		pdu.add(new VariableBinding(new OID(oid)));
		pdu.setType(PDU.GET);
		snmp.send(pdu, target, null, this);
	}

	private Target getTarget(String address) {
		Address targetAddress = GenericAddress.parse(address);
		CommunityTarget target = new CommunityTarget();
		target.setCommunity(new OctetString(SNMP_COMMUNITY));
		target.setAddress(targetAddress);
		target.setRetries(SNMP_RETRIES);
		target.setTimeout(SNMP_TIMEOUT);
		target.setVersion(SnmpConstants.version1);
		return target;
	}

	private void start() throws IOException {
		transport = new DefaultUdpTransportMapping();
		snmp = new Snmp(transport);
		transport.listen();
	}

	private void stop() throws IOException {
		try {
			if (transport != null) {
				transport.close();
				transport = null;
			}
		} finally {
			if (snmp != null) {
				snmp.close();
				snmp = null;
			}
		}
	}

	public static void main(String[] args) {
		Test t = new Test();
		try {
			try {
				t.start();
				t.test();
			} finally {
				t.stop();
			}
		} catch (IOException e) {
			System.out.println(e.toString());
		}
	}
}
7142

Запросы все равно что проваливаются в бездонную бочку! Разумеется, результаты будут приходить с задержкой, но приходить они будут тоже достаточно стремительно. Но как мы узнаем, что хост не ответил?

Дюже легко, по истечении заданного числа попыток и таймаутов, SNMP4J вернет нам event, response в котором будет равен null:

Поправленный вариант

package com.amfitel.m2000.ae.tests.snmp;

import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

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.event.ResponseListener;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.Integer32;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;

public class Test implements ResponseListener {

	private final static String SNMP_COMMUNITY = "public";
	private final static int    SNMP_RETRIES   = 3;
	private final static long   SNMP_TIMEOUT   = 1000L;

	private Snmp snmp = null;
	private TransportMapping transport = null;

	private Set<Integer32> requests = new HashSet<Integer32>();
	private Long firstTimestamp = null; 
	private long lastTimestamp; 

	public void onResponse(ResponseEvent event) {
		Integer32 requestId = event.getRequest().getRequestID();
		PDU response = event.getResponse();
		if (response != null) {
			lastTimestamp = System.currentTimeMillis();
			if (firstTimestamp == null) {
				firstTimestamp = lastTimestamp;
			}
			return;
		} else {
			synchronized (requests) {
				if (requests.contains(requestId)) {
					System.out.println("Timeout exceeded");
				}
			}
		}
		synchronized (requests) {
			requests.remove(requestId);
		}
	}

	private void test() throws IOException {
		Target t = getTarget("udp:192.168.131.253/161");
		Long timestamp = System.currentTimeMillis();
		for (int i = 0; i < 1000; i  ) {
			send(t, "1.3.6.1.2.1.1.3.0");
		}
		System.out.println(1000000L /(System.currentTimeMillis() - timestamp));
		while (!requests.isEmpty()) {
			try {
				Thread.sleep(1000L);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		if (firstTimestamp != null) {
			System.out.println(1000000L /(lastTimestamp - firstTimestamp));
		}
	}

	private void send(Target target, String oid) throws IOException {
		PDU pdu = new PDU();
		pdu.add(new VariableBinding(new OID(oid)));
		pdu.setType(PDU.GET);
		snmp.send(pdu, target, null, this);
		synchronized (requests) {
			requests.add(pdu.getRequestID());
		}
	}

	private Target getTarget(String address) {
		Address targetAddress = GenericAddress.parse(address);
		CommunityTarget target = new CommunityTarget();
		target.setCommunity(new OctetString(SNMP_COMMUNITY));
		target.setAddress(targetAddress);
		target.setRetries(SNMP_RETRIES);
		target.setTimeout(SNMP_TIMEOUT);
		target.setVersion(SnmpConstants.version1);
		return target;
	}

	private void start() throws IOException {
		transport = new DefaultUdpTransportMapping();
		snmp = new Snmp(transport);
		transport.listen();
	}

	private void stop() throws IOException {
		try {
			if (transport != null) {
				transport.close();
				transport = null;
			}
		} finally {
			if (snmp != null) {
				snmp.close();
				snmp = null;
			}
		}
	}

	public static void main(String[] args) {
		Test t = new Test();
		try {
			try {
				t.start();
				t.test();
			} finally {
				t.stop();
			}
		} catch (IOException e) {
			System.out.println(e.toString());
		}
	}
}

Проанализируем итог выполнения:

9174
283

Мы поспеваем сформировать 9174 запросов в секунду, а опрашиваемое устройство поспевает обрабатывать запросы со скоростью 283 запроса в секунду. На огромную часть запросов оно ответить не поспевает (соответственно в логе остаются сообщения «Timeout exceeded»). Разумеется, это не будет загвоздкой когда мы начнем опрашивать огромное число устройств с умным промежутком между запросами.

Идем дальше

Мpermark!}

Запустив данный код на выполнение, мы получим дальнейший response:

RESPONSE[requestID=1170688508, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.2.1.1.3.0 = 4:50:53.72; 1.3.6.1.2.1.2.2.1.1.1 = 1; 1.3.6.1.2.1.2.2.1.2.1 = 4d:53:20:54:43:50:20:4c:6f:6f:70:62:61:63:6b:20:69:6e:74:65:72:66:61:63:65:00]]

Мы получили значение uptime-а, индекс первого интерфейса и его имя, закодированное строкой октетов в шестнадцатеричном представлении. Дабы получить следующие строки, мы обязаны исполнять последовательные запросы, передавая ранее полученные OID-ы.

С учетом необходимости поддержки вероятности асинхронной обработки, это может стать нетривиальной (но абсолютно решаемой) задачей. К счастью, во 2-ой версии SNMP были добавлены bulk-запросы, автоматизирующие приобретение табличных данных и минимизирующие число отсылаемых при этом запросов. Внесем нужные метаморфозы в код:

BULK-запрос

package com.amfitel.m2000.ae.tests.snmp;

import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

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.event.ResponseListener;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.Integer32;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;

public class Test implements ResponseListener {

	private final static String SNMP_COMMUNITY = "public";
	private final static int    SNMP_RETRIES   = 3;
	private final static long   SNMP_TIMEOUT   = 1000L;
	private final static int    BULK_SIZE      = 50;

	private Snmp snmp = null;
	private TransportMapping transport = null;

	private Set<Integer32> requests = new HashSet<Integer32>();

	public void onResponse(ResponseEvent event) {
		Integer32 requestId = event.getRequest().getRequestID();
		PDU response = event.getResponse();
		if (response != null) {
			System.out.println(response.toString());
			return;
		} else {
			synchronized (requests) {
				if (requests.contains(requestId)) {
					System.out.println("Timeout exceeded");
				}
			}
		}
		synchronized (requests) {
			requests.remove(requestId);
		}
	}

	private void test() throws IOException {
		Target t = getTarget("udp:127.0.0.1/161");
		send(t, new String[] {"1.3.6.1.2.1.1.3", "1.3.6.1.2.1.2.2.1.1", "1.3.6.1.2.1.2.2.1.2"});
	}

	private void send(Target target, String[] oids) throws IOException {
		PDU pdu = new PDU();
		for (String oid: oids) {
			pdu.add(new VariableBinding(new OID(oid)));
		}
		pdu.setType(PDU.GETBULK);
		pdu.setMaxRepetitions(BULK_SIZE);
		pdu.setNonRepeaters(1);
		ResponseEvent event = snmp.send(pdu, target, null);
		synchronized (requests) {
			requests.add(pdu.getRequestID());
		}
		onResponse(event);
	}

	private Target getTarget(String address) {
		Address targetAddress = GenericAddress.parse(address);
		CommunityTarget target = new CommunityTarget();
		target.setCommunity(new OctetString(SNMP_COMMUNITY));
		target.setAddress(targetAddress);
		target.setRetries(SNMP_RETRIES);
		target.setTimeout(SNMP_TIMEOUT);
		target.setVersion(SnmpConstants.version2c);
		return target;
	}

	private void start() throws IOException {
		transport = new DefaultUdpTransportMapping();
		snmp = new Snmp(transport);
		transport.listen();
	}

	private void stop() throws IOException {
		try {
			if (transport != null) {
				transport.close();
				transport = null;
			}
		} finally {
			if (snmp != null) {
				snmp.close();
				snmp = null;
			}
		}
	}

	public static void main(String[] args) {
		Test t = new Test();
		try {
			try {
				t.start();
				t.test();
			} finally {
				t.stop();
			}
		} catch (IOException e) {
			System.out.println(e.toString());
		}
	}
}

Исполнив данный запрос, мы получаем все строки таблицы одним запросом:

Много данных

RESPONSE[requestID=1801703572, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.2.1.1.3.0 = 4:58:44.56; 1.3.6.1.2.1.2.2.1.1.1 = 1; 1.3.6.1.2.1.2.2.1.2.1 = 4d:53:20:54:43:50:20:4c:6f:6f:70:62:61:63:6b:20:69:6e:74:65:72:66:61:63:65:00; 1.3.6.1.2.1.2.2.1.1.2 = 2; 1.3.6.1.2.1.2.2.1.2.2 = 56:4d:77:61:72:65:20:56:69:72:74:75:61:6c:20:45:74:68:65:72:6e:65:74:20:41:64:61:70:74:65:72:20:66:6f:72:20:56:4d:6e:65:74:38:00; 1.3.6.1.2.1.2.2.1.1.3 = 3; 1.3.6.1.2.1.2.2.1.2.3 = 56:4d:77:61:72:65:20:56:69:72:74:75:61:6c:20:45:74:68:65:72:6e:65:74:20:41:64:61:70:74:65:72:20:66:6f:72:20:56:4d:6e:65:74:31:00; 1.3.6.1.2.1.2.2.1.1.65541 = 65541; 1.3.6.1.2.1.2.2.1.2.65541 = 52:65:61:6c:74:65:6b:20:52:54:4c:38:31:36:38:2f:38:31:31:31:20:50:43:49:2d:45:20:47:69:67:61:62:69:74:20:45:74:68:65:72:6e:65:74:20:4e:49:43:20:2d:20:44:65:74:65:72:6d:69:6e:69:73:74:69:63:20:4e:65:74:77:6f:72:6b:20:45:6e:68:61:6e:63:65:72:20:4d:69:6e:69:70:6f:72:74:00; 1.3.6.1.2.1.2.2.1.1.65542 = 65542; 1.3.6.1.2.1.2.2.1.2.65542 = 4e:6f:72:74:65:6c:20:49:50:53:45:43:53:48:4d:20:41:64:61:70:74:65:72:20:2d:20:44:65:74:65:72:6d:69:6e:69:73:74:69:63:20:4e:65:74:77:6f:72:6b:20:45:6e:68:61:6e:63:65:72:20:4d:69:6e:69:70:6f:72:74:00; 1.3.6.1.2.1.2.2.1.1.65543 = 65543; 1.3.6.1.2.1.2.2.1.2.65543 = 4e:6f:72:74:65:6c:20:56:50:4e:20:41:64:61:70:74:65:72:20:2d:20:44:65:74:65:72:6d:69:6e:69:73:74:69:63:20:4e:65:74:77:6f:72:6b:20:45:6e:68:61:6e:63:65:72:20:4d:69:6e:69:70:6f:72:74:00; 1.3.6.1.2.1.2.2.1.2.1 = 4d:53:20:54:43:50:20:4c:6f:6f:70:62:61:63:6b:20:69:6e:74:65:72:66:61:63:65:00; 1.3.6.1.2.1.2.2.1.3.1 = 24; 1.3.6.1.2.1.2.2.1.2.2 = 56:4d:77:61:72:65:20:56:69:72:74:75:61:6c:20:45:74:68:65:72:6e:65:74:20:41:64:61:70:74:65:72:20:66:6f:72:20:56:4d:6e:65:74:38:00; 1.3.6.1.2.1.2.2.1.3.2 = 6; 1.3.6.1.2.1.2.2.1.2.3 = 56:4d:77:61:72:65:20:56:69:72:74:75:61:6c:20:45:74:68:65:72:6e:65:74:20:41:64:61:70:74:65:72:20:66:6f:72:20:56:4d:6e:65:74:31:00; 1.3.6.1.2.1.2.2.1.3.3 = 6; 1.3.6.1.2.1.2.2.1.2.65541 = 52:65:61:6c:74:65:6b:20:52:54:4c:38:31:36:38:2f:38:31:31:31:20:50:43:49:2d:45:20:47:69:67:61:62:69:74:20:45:74:68:65:72:6e:65:74:20:4e:49:43:20:2d:20:44:65:74:65:72:6d:69:6e:69:73:74:69:63:20:4e:65:74:77:6f:72:6b:20:45:6e:68:61:6e:63:65:72:20:4d:69:6e:69:70:6f:72:74:00; 1.3.6.1.2.1.2.2.1.3.65541 = 6; 1.3.6.1.2.1.2.2.1.2.65542 = 4e:6f:72:74:65:6c:20:49:50:53:45:43:53:48:4d:20:41:64:61:70:74:65:72:20:2d:20:44:65:74:65:72:6d:69:6e:69:73:74:69:63:20:4e:65:74:77:6f:72:6b:20:45:6e:68:61:6e:63:65:72:20:4d:69:6e:69:70:6f:72:74:00; 1.3.6.1.2.1.2.2.1.3.65542 = 6; 1.3.6.1.2.1.2.2.1.2.65543 = 4e:6f:72:74:65:6c:20:56:50:4e:20:41:64:61:70:74:65:72:20:2d:20:44:65:74:65:72:6d:69:6e:69:73:74:69:63:20:4e:65:74:77:6f:72:6b:20:45:6e:68:61:6e:63:65:72:20:4d:69:6e:69:70:6f:72:74:00; 1.3.6.1.2.1.2.2.1.3.65543 = 6; 1.3.6.1.2.1.2.2.1.3.1 = 24; 1.3.6.1.2.1.2.2.1.4.1 = 1520; 1.3.6.1.2.1.2.2.1.3.2 = 6; 1.3.6.1.2.1.2.2.1.4.2 = 1500; 1.3.6.1.2.1.2.2.1.3.3 = 6; 1.3.6.1.2.1.2.2.1.4.3 = 1500; 1.3.6.1.2.1.2.2.1.3.65541 = 6; 1.3.6.1.2.1.2.2.1.4.65541 = 1500; 1.3.6.1.2.1.2.2.1.3.65542 = 6; 1.3.6.1.2.1.2.2.1.4.65542 = 1402; 1.3.6.1.2.1.2.2.1.3.65543 = 6; 1.3.6.1.2.1.2.2.1.4.65543 = 1376; 1.3.6.1.2.1.2.2.1.4.1 = 1520; 1.3.6.1.2.1.2.2.1.5.1 = 10000000; 1.3.6.1.2.1.2.2.1.4.2 = 1500; 1.3.6.1.2.1.2.2.1.5.2 = 100000000; 1.3.6.1.2.1.2.2.1.4.3 = 1500; 1.3.6.1.2.1.2.2.1.5.3 = 100000000; 1.3.6.1.2.1.2.2.1.4.65541 = 1500; 1.3.6.1.2.1.2.2.1.5.65541 = 100000000; 1.3.6.1.2.1.2.2.1.4.65542 = 1402; 1.3.6.1.2.1.2.2.1.5.65542 = 10000000; 1.3.6.1.2.1.2.2.1.4.65543 = 1376; 1.3.6.1.2.1.2.2.1.5.65543 = 10000000; 1.3.6.1.2.1.2.2.1.5.1 = 10000000; 1.3.6.1.2.1.2.2.1.6.1 = ; 1.3.6.1.2.1.2.2.1.5.2 = 100000000; 1.3.6.1.2.1.2.2.1.6.2 = 00:50:56:c0:00:08; 1.3.6.1.2.1.2.2.1.5.3 = 100000000; 1.3.6.1.2.1.2.2.1.6.3 = 00:50:56:c0:00:01; 1.3.6.1.2.1.2.2.1.5.65541 = 100000000; 1.3.6.1.2.1.2.2.1.6.65541 = 00:18:f3:08:06:13; 1.3.6.1.2.1.2.2.1.5.65542 = 10000000; 1.3.6.1.2.1.2.2.1.6.65542 = 44:45:53:54:42:00; 1.3.6.1.2.1.2.2.1.5.65543 = 10000000; 1.3.6.1.2.1.2.2.1.6.65543 = 00:ff:97:65:06:be; 1.3.6.1.2.1.2.2.1.6.1 = ; 1.3.6.1.2.1.2.2.1.7.1 = 1; 1.3.6.1.2.1.2.2.1.6.2 = 00:50:56:c0:00:08; 1.3.6.1.2.1.2.2.1.7.2 = 1; 1.3.6.1.2.1.2.2.1.6.3 = 00:50:56:c0:00:01; 1.3.6.1.2.1.2.2.1.7.3 = 1; 1.3.6.1.2.1.2.2.1.6.65541 = 00:18:f3:08:06:13; 1.3.6.1.2.1.2.2.1.7.65541 = 1; 1.3.6.1.2.1.2.2.1.6.65542 = 44:45:53:54:42:00; 1.3.6.1.2.1.2.2.1.7.65542 = 1; 1.3.6.1.2.1.2.2.1.6.65543 = 00:ff:97:65:06:be; 1.3.6.1.2.1.2.2.1.7.65543 = 1; 1.3.6.1.2.1.2.2.1.7.1 = 1; 1.3.6.1.2.1.2.2.1.8.1 = 1; 1.3.6.1.2.1.2.2.1.7.2 = 1; 1.3.6.1.2.1.2.2.1.8.2 = 1; 1.3.6.1.2.1.2.2.1.7.3 = 1; 1.3.6.1.2.1.2.2.1.8.3 = 1; 1.3.6.1.2.1.2.2.1.7.65541 = 1; 1.3.6.1.2.1.2.2.1.8.65541 = 1; 1.3.6.1.2.1.2.2.1.7.65542 = 1; 1.3.6.1.2.1.2.2.1.8.65542 = 1; 1.3.6.1.2.1.2.2.1.7.65543 = 1; 1.3.6.1.2.1.2.2.1.8.65543 = 2; 1.3.6.1.2.1.2.2.1.8.1 = 1; 1.3.6.1.2.1.2.2.1.9.1 = 0:00:00.00; 1.3.6.1.2.1.2.2.1.8.2 = 1; 1.3.6.1.2.1.2.2.1.9.2 = 0:00:00.00; 1.3.6.1.2.1.2.2.1.8.3 = 1; 1.3.6.1.2.1.2.2.1.9.3 = 0:00:00.00; 1.3.6.1.2.1.2.2.1.8.65541 = 1; 1.3.6.1.2.1.2.2.1.9.65541 = 0:00:00.00; 1.3.6.1.2.1.2.2.1.8.65542 = 1; 1.3.6.1.2.1.2.2.1.9.65542 = 0:00:00.00; 1.3.6.1.2.1.2.2.1.8.65543 = 2; 1.3.6.1.2.1.2.2.1.9.65543 = 0:00:00.00; 1.3.6.1.2.1.2.2.1.9.1 = 0:00:00.00; 1.3.6.1.2.1.2.2.1.10.1 = 3542209; 1.3.6.1.2.1.2.2.1.9.2 = 0:00:00.00; 1.3.6.1.2.1.2.2.1.10.2 = 40700]]

Разумеется, если таблица содержит больше затребованных 50-ти строк, опять (как и для 1-ой версии SNMP) понадобится формировать запросы для приобретения последующих строк, передавая в них OID-ыполученные для последней строки.

О чем я не рассказал?

В этой статье я не рассказал о многом. Я не рассказал о том, как изменять значения некоторых (не всех) переменных SET-запросами. Я не рассказал о том, что такое TRAP-ы и для чего они необходимы. Я ни сказал ни слова о том, как разрабатывать SNMP-агенты. И я ни одним словом не обмолвился о 3-ей версии SNMP и привнесенных ей изменениях.

Но даже того о чем я сказал абсолютно довольно, Дабы осознать, что SNMP — это не легко.

При серьезном подходе к вопросу.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB