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

    Посмотрел я на не слишком объемный блог 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.

    Продолжение следует…
    • +7
    • 16,8k
    • 7
    Поделиться публикацией

    Комментарии 7

      +2
      Как-то всё тут не так: не соблюдены стандарты именования (snmpt, c_target)

      Код, видимо, не рабочий: зачем делать listen() на каждый send()?

      Зачем нужен поток, который ничего не делает?
        0
        Подразумевается, что это часть чего-то большое. Это что-то большое запускает тред, который «как-бы мониторит сеть». Это я предполагаю.
        На самом деле, я сам не оч понял, что это было.
        +2
        Меня щас злостно заминусуют, потому что я критикую программиста в день программиста, хотя я и сам программист, но я всеравно напишу.

        Вы пишите:
        Такой порядок в стандартных библиотеках хочешь-нехочешь заставляют разработчиков так-же писать «правильный» код.

        А класс с маленькой буквы…
        public class snmpt extends Thread{

        А зачем extends Thread, когда рекомендуется делать implements Runnable? Объясните, пожалуйста.

        Если честно, я немного не понимаю, о чем статья. То, что вы пишите, это не Java и SNMP, а примитивный пример использования платной для коммерческого использования библиотеки snmp4j. Т.е. «Пример использования библиотеки SNMP4J»

        Я лично не вижу, чему здесь радоваться. Ну да, под Жабу пишут много библиотек, но что здесь особенного?
        Получился какой-то копи-паст примитивного кода.

        Если бы вы рассказали, как вам это помогло в проекте, зачем вы это использовали, насколько удобнее пользоваться либой по сравнению с написанием собственного кода, это было бы кул и респект.
        А так — копипаст и комменты, объясняющие очевидные вещи жабистам, кроме того эти же комменты можно найти в JavaDoc, а тем кто с жабой не знаком, те вообще ничего не поймут.

        Или я не понял вашей мысли?
          0
          В джаваедоках, кстати, намного более полные и, что самое важное, работающие примеры:

          www.snmp4j.org/doc/org/snmp4j/Snmp.html
            0
            Со многими замеч согласен. Пример тестовый, как вы заметили, поэтому не оформлял. Сейчас, собственно, заполняю его логикой.
            Библиотека SNMP4J.jar свободная. Велосипед изобретать — не тру, поэтому что-то самому писать даже в голову не приходило. Хотелось показать, что даже сложные вещи на яве выглядят просто. Например, я сам разобрался с абсолютно незнакомым протоколом и собрал тестовый примет за полдня.
            Не пинайте сильно
              0
              Да никто и не пинает :)
              Вы по-лучше объясните, что хотите сказать, больше жизненности хочется!

            0
            Народ, пример — рабочий.
            За основу взят как-раз пример из доки. Запостил, т.к. возникла такая необходимость — работать с SNMP (не часто такая потребность возникает). Библиотека выбрана, как самая распространенная.

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое