// Home | Go Back // 
import com.ireasoning.protocol.Session;
import com.ireasoning.protocol.snmp.*;
import com.ireasoning.util.ParseArguments;
import java.io.IOException;
public class snmptrap extends snmp
{
    byte[] _engineID = "testengine".getBytes();
    long    _sysUpTime   = 0;
    String  _snmpTrapOID = ".1.3";
    String  _enterprise  = ".1.3";
    String  _ipAddress   = "";
    int     _generic     = 0;
    int     _specific    = 0;
    int     _trapVersion = 1;
    SnmpVarBindList _vblist = new SnmpVarBindList();
    public static void main(String[] args)
    {
        snmptrap s = new snmptrap();
        s.parseOptions(args, "snmptrap");
        s.sendTrap();
    }
    void sendTrap()
    {
        try
        {
            if(_isSnmpV3)
            {
                _trapVersion = 2;
            }
            if(_trapVersion == 1)
            {                SnmpV1Trap trap = new SnmpV1Trap(_enterprise);
                trap.setTimestamp(_sysUpTime);
                trap.setGeneric(_generic);
                trap.setSpecific(_specific);
                trap.addVarBinds(_vblist);
                if(_ipAddress != null && _ipAddress.length() > 0)
                {
                    trap.setIpAddress(_ipAddress);
                }
                SnmpTrapSender.sendTrap(trap, _host, _port, _community, createPacketSender());
            }
            else
            {                if(_isSnmpV3)
                {                    SnmpTrapSender.addV3Params(_user, _authProtocol, _authPassword, _privProtocol,
                            _privPassword, _engineID, _host, _port);
                }
                SnmpTrap trap = new SnmpTrap(_sysUpTime, new SnmpOID(_snmpTrapOID));
                trap.addVarBinds(_vblist);
                SnmpTrapSender.sendTrap(_host, _port, trap, true, _community, createPacketSender());
            }
        }
        catch(IOException e)
        {
            System.out.println(e);
            e.printStackTrace();
        }
        catch(SnmpEncodingException ee)
        {
            System.out.println( ee );
            ee.printStackTrace();
        }
    }
                
    
    protected void parseArgs()
    {
        String [] as = _parseArgs.getArguments();
        if(as.length > 0)
        {
            _host = as[0];
        }
        int start = 1;
        while(start < as.length)
        {
            String oid = as[start];
            String type = as[start + 1];
            String value = as[start + 2];
            SnmpDataType t = translate(type, value);
            SnmpVarBind vb = new SnmpVarBind(oid, t);
            _vblist.add(vb);
            start += 3;
        }
    }
    
    protected void usage(String programName, boolean allowMultipleOIDs)
    {
        System.out.println( "Usage: java " + programName +
                " [options...] <hostname> [<OID> <type> <value> ...]\n");
        System.out.println( "<OID>\tobject identifier");
        System.out.println( "<type>\tdata type of the value, one of i, u, t, a, o, s." +
                " i: INTEGER, u: unsigned INTEGER, t: TIMETICKS, " + 
                "a: IPADDRESS, o: OID, s: STRING");
        System.out.println( "<value>\tvalue of this object identifier");
    }
    protected void moreOptions()
    {
        System.out.println( "-e <e>\ttrap sender's engine ID");
        System.out.println( "-t <1|2>\ttrap version, possible values are 1 or 2");
        System.out.println( "-s <s>\tsysUpTime or timestamp");
        System.out.println( "-q <o>\tsnmpTrapOID");
        System.out.println( "-n <n>\tenterprise OID");
        System.out.println( "-g <g>\tSNMPv1 generic code");
        System.out.println( "-i <i>\tSNMPv1 enterprise specific code");
        System.out.println( "-f <f>\tSNMPv1 trap originator's IP address");
    }
    
    protected void printExample(String programName)
    {
        System.out.println( "java " + programName + 
                " -s 10333 -n .1.3.6.1.2.1.2.2.1.1 -g 2 localhost" ); 
        System.out.println( "java " + programName + 
                " -s 10333 -n .1.3.6.1.2.1.2.2.1.1 -g 6 -i 20 localhost" ); 
        System.out.println( "java " + programName + 
                " -t 2 -s 10333 -q .1.3.6.1.2.1.2.2.1.1 " + "localhost" );
        System.out.println( "java " + programName + 
                " -t 2 -s 10333 -q .1.3.6.1.2.1.2.2.1.7 " + "localhost 1.3.6.1.2.1.2.2.1.7.3 i 1" );
        System.out.println( "java " + programName + 
                " -v 3 -u newUser -A abc12345 -X abc12345 -s 10333 -q .1.3.6.1.2.1.2.2.1.1 " +
                "localhost" );
        System.out.println( "java " + programName + 
                " -v 3 -u newUser -A abc12345 -X abc12345 -e 12345  -s 10333 -q .1.3.6.1.2.1.2.2.1.1 " +
                "localhost" );
    }
    protected void parseOptions(String[] args, String program)
    {
        super.parseOptions(args, program);
        String engineID = _parseArgs.getOptionValue('e');
        if(engineID != null)
        {
            _engineID = snmp.getHexString(engineID);
        }
        _trapVersion = Integer.parseInt(_parseArgs.getOptionValue('t', "1"));
        _snmpTrapOID = _parseArgs.getOptionValue('q');
        _enterprise  = _parseArgs.getOptionValue('n');
        _generic = Integer.parseInt(_parseArgs.getOptionValue('g', "0"));
        _specific = Integer.parseInt(_parseArgs.getOptionValue('i', "0"));
        _sysUpTime   = Long.parseLong(_parseArgs.getOptionValue('s', "0"));
        _port = Integer.parseInt(_parseArgs.getOptionValue('p', "162"));
        _ipAddress = _parseArgs.getOptionValue('f');
    }
    protected void printMoreOptions()
    {
        System.out.println( "engine ID =\t\t" + _parseArgs.getOptionValue('e'));
        System.out.println( "trap version =\t\t" + _trapVersion);
        System.out.println( "sysUpTime =\t\t" + _sysUpTime);
        System.out.println( "snmpTrapOID =\t\t" + _snmpTrapOID);
        System.out.println( "enterpriseOID = \t" + _enterprise);
        System.out.println( "SNMPv1 generic =\t\t" + _generic);
        System.out.println( "SNMPv1 specific =\t\t" + _specific);
    }
    
    protected ParseArguments newParseArgumentsInstance(String[] args)
    {
        return new ParseArguments(args, "?ho", "uvaAXxcpmetsqngifk");
    }
    private PacketSender createPacketSender()
    {
        if(_transportLayer == Session.UDP)
        {
            return new UdpPacketSender();
        }
        else
        {
            return new TcpPacketSender();
        }
    }
}