Посмотрел я на не слишком объемный блог JAVA и решил, что нужно поднимать его рейтинг. К тому же многие хабрики жалуются, что «хабр уже не тот». Возникла идея написать серию статей, продвигающих идею, что JAVA — это легко! Работаю я в среде интеграторов (берем готовые «жирные» системы, связываем в единый комплекс и продаем), и частенько возникает ситуация, когда что-то невозможно решить средствами интегрируемых систем. Тогда коллеги напрявляют прожектор в ночное небо и я иду им на помощь :). Поэтому частенько приходится использовать java в разных аспектах. Начнем с работы с SNMP. Протокол SNMP используется для управления сетью.
Просто в восторге от логичности JAVA и ее функциональности!
Использован паттерн «слушатель», поэтому наш код практически идентичен коду при работе с событиями в GUI. И это одно из величайших достоинств этого языка — четкое следование определенным паттернам во всех своих аспектах. Все разложено по полочкам и готово к использованию. Такой порядок в стандартных библиотеках хочешь-нехочешь заставляют разработчиков так-же писать «правильный» код. Поэтому большинство фреймворков тоже реализованы в виде лаконичного расширения функций и принципов JavaEE.
Продолжение следует…
/*
Задача:
Поймать 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.
Продолжение следует…