SNMP4J トラップ受信を Google guice で書いたので、今度は送信するもの。
PDU に Variable データは1個だけで任意のトラップ番号を送るもの。
import org.apache.log4j.Logger;
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.PDUv1;
import org.snmp4j.Snmp;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.Integer32;
import org.snmp4j.smi.IpAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import com.google.inject.Inject;
/**
* SNMP トラップ送信.
* コンストラクタで送信先のSNMP宛先 アドレスを指定する。
* 特別なアノテーションにより、SNMP宛先アドレスの、Google guice インジェクトを
* 次のように約束されている。
* @Inject public SnmpTrapSender(@SnmpIPaddress String sendIP)
* これにより、SnmpTrapSenderFactory で SnmpTrapSenderインスタンスを生成するか、
* new 演算子を使うかである。
*/
public final class SnmpTrapSender{
String sendIP;
/**
* コンストラクタ
* @param sendIP SNMP宛先アドレス
*/
@Inject
public SnmpTrapSender(@SnmpIPaddress String sendIP){
this.sendIP = sendIP;
}
/**
* トラップ送信.
* void send(targetIP,trapno,type,1); の呼び出しと同じ効果があります。
* @param targetIP ターゲットIP
* @param trapno 任意トラップ番号
* @param type org.snmp4j.PDUv1.LINKDOWN か、org.snmp4j.PDUv1.LINKUP を指定します。
*/
public void send(String targetIP,int trapno,int type){
this.send(targetIP,trapno,type,1);
}
/**
* トラップ送信.
* @param targetIP ターゲットIP
* @param trapno 任意トラップ番号
* @param type org.snmp4j.PDUv1.LINKDOWN か、org.snmp4j.PDUv1.LINKUP を指定します。
* @param retry UDP通信の為、この回数分送信します。
*/
public void send(String targetIP,int trapno,int type,int retry){
int loops = retry > 1 ? retry : 1;
for(int i=0;i < loops;i++){
Address targetAddress = GenericAddress.parse("udp:"+SnmpTrapSender2.this.sendIP+"/162");
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString("public"));
target.setAddress(targetAddress);
target.setVersion(SnmpConstants.version1);
PDUv1 pdu = new PDUv1();
pdu.setType(PDU.V1TRAP);
VariableBinding vb = new VariableBinding();
vb.setOid(new OID("1.3.6.1.2.1.2.2.1.1"));
vb.setVariable(new Integer32(trapno));
pdu.add(vb);
pdu.setEnterprise(new OID("1.3.6.1.2.1.11"));
pdu.setTimestamp(System.currentTimeMillis());
pdu.setAgentAddress(new IpAddress(targetIP));
pdu.setGenericTrap(type);
try{
DefaultUdpTransportMapping udpTransportMap = new DefaultUdpTransportMapping();
Snmp snmp = new Snmp(udpTransportMap);
snmp.send(pdu,target);
snmp.close();
this.logger.debug("## Trap send target = "+target.toString());
this.logger.debug("## Trap send PDUv1 = "+pdu.toString());
}catch(Exception e){
this.logger.error("## SnmpTrapSender._SendThread Exception : "+e.getMessage(),e);
}
}
}
}
----------------------------------------------------
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
/**
* SnmpTrapSender 生成ファクトリ
*/
public final class SnmpTrapSenderFactory{
private SnmpTrapSenderFactory(){}
/**
* SNMP受信しているIPを指定して作成する
*/
public static SnmpTrapSender create(final String ip){
Injector injector = Guice.createInjector(new AbstractModule(){
@Override
protected void configure(){
binder().bind(String.class).annotatedWith(SnmpIPaddress.class).toInstance(ip);
}
}
);
return injector.getInstance(SnmpTrapSender.class);
}
}
==============================================================
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.google.inject.BindingAnnotation;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.PARAMETER})
@BindingAnnotation
public @interface SnmpIPaddress{
}
--------------------------------------------------
実行は、、
SnmpTrapSender snmpsender = SnmpTrapSenderFactory.create("111.11.111.11");
snmpsender.send("222.22.222.22",201,PDUv1.LINKDOWN,3);