Pull to refresh

Java — это просто! Java и SNMP

Reading time 3 min
Views 20K
Посмотрел я на не слишком объемный блог JAVA и решил, что нужно поднимать его рейтинг. К тому же многие хабрики жалуются, что «хабр уже не тот». Возникла идея написать серию статей, продвигающих идею, что JAVA — это легко! Работаю я в среде интеграторов (берем готовые «жирные» системы, связываем в единый комплекс и продаем), и частенько возникает ситуация, когда что-то невозможно решить средствами интегрируемых систем. Тогда коллеги напрявляют прожектор в ночное небо и я иду им на помощь :). Поэтому частенько приходится использовать java в разных аспектах. Начнем с работы с SNMP. Протокол SNMP используется для управления сетью.

/*
Задача:
Поймать SNMP трап из сети и в зависимости от содержимого - запустить некоторую систему.
Решение:
Для решения используем библиотеку snmp4j и следующий код:
*/
import java.io.IOException; import org.snmp4j.CommandResponder; import org.snmp4j.CommandResponderEvent; import org.snmp4j.CommunityTarget; import org.snmp4j.PDU; import org.snmp4j.Snmp; import org.snmp4j.TransportMapping; import org.snmp4j.mp.SnmpConstants; import org.snmp4j.smi.Address; import org.snmp4j.smi.GenericAddress; import org.snmp4j.smi.OctetString; import org.snmp4j.smi.VariableBinding; import org.snmp4j.transport.DefaultUdpTransportMapping; public class snmpt extends Thread{
/*Создаем поток, который будет слушать нужный порт.*/
        private Snmp snmp = null;
	private Address targetAddress = GenericAddress.parse("udp:127.0.0.1/162");
	private TransportMapping transport = null;	
	
/*В конструкторе устанавливаем слушателя SNMP протокола. При получении трапа просто сообщаем об этом в консоль.*/
        public snmpt() throws Exception{
        transport = new DefaultUdpTransportMapping();
	    snmp = new Snmp(transport);
	
		CommandResponder trapPrinter = new CommandResponder() {
			public synchronized void processPdu(CommandResponderEvent e){
				PDU command = e.getPDU();
				/*Здесь могли бы быть ваши действия (т.1234567890).
                                  Внутри класса PDU реализован полный функционал для анализа SNMP трапа.*/
                                 if (command != null) {
					System.out.println("Получен трап: " +command.toString());
				}
			}
		};
		snmp.addNotificationListener(targetAddress, trapPrinter);
	}        
        
/*Метод для посылки трапов. Посылаем пустой трап по адресу targetAddress.*/
	public void send(){
		// setting up target
		CommunityTarget c_target = new CommunityTarget();
		c_target.setCommunity(new OctetString("public"));
		c_target.setAddress(targetAddress);
		c_target.setRetries(2);
		c_target.setTimeout(1500);
		c_target.setVersion( SnmpConstants.version2c);	

		PDU pdu = new PDU();
		pdu.setType(PDU.INFORM);
		pdu.add(new VariableBinding(SnmpConstants.snmpTrapEnterprise));
		pdu.add(new VariableBinding(SnmpConstants.snmpTrapAddress));

		try {
			snmp.send(pdu, c_target, transport);
		} catch (IOException ex2) {
			ex2.printStackTrace();
		}
	}	
	
/*Создаем поток, запускаем, посылаем тестовый трап.*/
	public static void main(String[] args) throws Exception{
		snmpt s = new snmpt();
		s.start();
                s.send();
		System.out.println(0);
         }        
        
/*Сам поток спит. От него лишь требуется держать в памяти наш обработчик trapPrinter*/
	public void run() {
		while(true)
		try{
			this.sleep(1000000);			
		}catch (Exception e) {
			e.printStackTrace();
		}			
	}
}

Просто в восторге от логичности JAVA и ее функциональности!
Использован паттерн «слушатель», поэтому наш код практически идентичен коду при работе с событиями в GUI. И это одно из величайших достоинств этого языка — четкое следование определенным паттернам во всех своих аспектах. Все разложено по полочкам и готово к использованию. Такой порядок в стандартных библиотеках хочешь-нехочешь заставляют разработчиков так-же писать «правильный» код. Поэтому большинство фреймворков тоже реализованы в виде лаконичного расширения функций и принципов JavaEE.

Продолжение следует…
Tags:
Hubs:
+7
Comments 7
Comments Comments 7

Articles