package org.infosec.ismp.manager.winsensor.event; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.net.DatagramPacket; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Random; import org.infosec.ismp.manager.rmi.aim.model.AlertInfoBO; import org.infosec.ismp.manager.rmi.aim.service.AlertManager; import org.infosec.ismp.model.syslog.RawSyslog; import org.infosec.ismp.util.ThreadCategory; /** * @author guoxianwei * @date 2011-3-8 上午10:34:39 * */ public class EventConnection implements Runnable { private final DatagramPacket m_packet; private String m_logPrefix; private AlertManager m_alertManager; public EventConnection(AlertManager alertManager, final DatagramPacket packet) { m_packet = copyPacket(packet); m_alertManager = alertManager; } @Override public void run() { ThreadCategory.setPrefix(m_logPrefix); ThreadCategory log = ThreadCategory.getInstance(getClass()); AlertInfoBO alertInfoBO = make(m_packet); m_alertManager.addAlertInfo(alertInfoBO); if (alertInfoBO != null) // delay a random period of time try { Thread.sleep((new Random()).nextInt(100)); } catch (InterruptedException e) { log.debug("winsensor: Interruption " + e); } } private AlertInfoBO make(final DatagramPacket packet) { try { ObjectInputStream in = new ObjectInputStream( new ByteArrayInputStream(packet.getData())); AlertInfoBO alertInfoBO = (AlertInfoBO) in.readObject(); return alertInfoBO; } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } private DatagramPacket copyPacket(final DatagramPacket packet) { byte[] message = new byte[packet.getLength()]; System.arraycopy(packet.getData(), 0, message, 0, packet.getLength()); InetAddress addr = null; try { addr = InetAddress.getByAddress(packet.getAddress().getHostName(), packet.getAddress().getAddress()); System.out.println(addr.getHostAddress()); DatagramPacket retPacket = new DatagramPacket(message, packet .getOffset(), packet.getLength(), addr, packet.getPort()); return retPacket; } catch (UnknownHostException e) { ThreadCategory.getInstance(getClass()).warn( "unable to clone InetAddress object for " + packet.getAddress()); } return null; } }