/* * Copyright 2011 Future Systems * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.krakenapps.ipmanager.msgbus; import java.net.InetAddress; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.felix.ipojo.annotations.Component; import org.apache.felix.ipojo.annotations.Invalidate; import org.apache.felix.ipojo.annotations.Requires; import org.apache.felix.ipojo.annotations.Validate; import org.krakenapps.ipmanager.ArpScanner; import org.krakenapps.ipmanager.IpEventListener; import org.krakenapps.ipmanager.IpManager; import org.krakenapps.ipmanager.IpQueryCondition; import org.krakenapps.ipmanager.LogQueryCondition; import org.krakenapps.ipmanager.model.Agent; import org.krakenapps.ipmanager.model.AllowedMac; import org.krakenapps.ipmanager.model.DeniedMac; import org.krakenapps.ipmanager.model.HostEntry; import org.krakenapps.ipmanager.model.IpEntry; import org.krakenapps.ipmanager.model.IpEventLog; import org.krakenapps.ipmanager.model.IpEventLog.Type; import org.krakenapps.lookup.mac.MacLookupService; import org.krakenapps.lookup.mac.Vendor; import org.krakenapps.msgbus.Marshaler; import org.krakenapps.msgbus.PushApi; import org.krakenapps.msgbus.Request; import org.krakenapps.msgbus.Response; import org.krakenapps.msgbus.handler.MsgbusMethod; import org.krakenapps.msgbus.handler.MsgbusPlugin; import org.krakenapps.pcap.decoder.ethernet.MacAddress; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @MsgbusPlugin @Component(name = "ipm-msgbus-plugin") public class IpManagerPlugin implements IpEventListener { private final Logger logger = LoggerFactory.getLogger(IpManagerPlugin.class.getName()); @Requires private IpManager ipManager; @Requires private MacLookupService macLookup; @Requires private PushApi pushApi; @Requires private ArpScanner arpScanner; @Validate public void start() { ipManager.addListener(this); } @Invalidate public void stop() { if (ipManager != null) ipManager.removeListener(this); } @MsgbusMethod public void getAgents(Request req, Response resp) { List<Agent> agents = ipManager.getAgents(req.getOrgId()); resp.put("agents", Marshaler.marshal(agents)); } @MsgbusMethod public void getIpEntries(Request req, Response resp) { int orgId = req.getOrgId(); Integer agentId = req.getInteger("agent_id"); IpQueryCondition condition = new IpQueryCondition(orgId); condition.setAgentId(agentId); List<IpEntry> ipEntries = ipManager.getIpEntries(condition); List<Object> l = Marshaler.marshal(ipEntries); addMacVendors(l); resp.put("ip_entries", l); } private void addMacVendors(List<Object> l) { for (Object o : l) { @SuppressWarnings("unchecked") Map<String, Object> m = (Map<String, Object>) o; Vendor vendor = macLookup.findByMac((String) m.get("mac")); m.put("mac_vendor", marshalVendor(vendor)); } } private Map<String, Object> marshalVendor(Vendor vendor) { if (vendor == null) return null; Map<String, Object> m = new HashMap<String, Object>(); m.put("country", vendor.getCountry()); m.put("name", vendor.getName()); m.put("address", vendor.getAddress()); return m; } @MsgbusMethod public void getIpAllocationRequests(Request req, Response resp) { } @MsgbusMethod public void getIpAllocationRequest(Request req, Response resp) { } @MsgbusMethod public void createIpAllocationRequest(Request req, Response resp) { } @MsgbusMethod public void getIpEventLogs(Request req, Response resp) { int orgId = req.getOrgId(); Integer agentId = req.getInteger("agent_id"); int page = req.getInteger("page"); int pageSize = req.getInteger("page_size"); LogQueryCondition condition = new LogQueryCondition(orgId, page, pageSize); condition.setAgentId(agentId); if (req.has("type")) condition.setType(Type.valueOf(req.getString("type"))); if (req.has("ip_from") && req.has("ip_to")) condition.setIpRange(req.getString("ip_from"), req.getString("ip_to")); if (req.has("mac")) condition.setMac(req.getString("mac")); if (req.has("from")) condition.setFrom(req.getDate("from")); if (req.has("to")) condition.setTo(req.getDate("to")); List<IpEventLog> logs = ipManager.getLogs(condition); resp.put("logs", Marshaler.marshal(logs)); } @MsgbusMethod public void getAllowMacAddresses(Request req, Response resp) { int orgId = req.getOrgId(); int ipId = req.getInteger("ip_id"); List<AllowedMac> allowed = ipManager.getAllowMacAddresses(orgId, ipId); resp.put("allowed", Marshaler.marshal(allowed)); } @MsgbusMethod public void allowMacAddress(Request req, Response resp) { int orgId = req.getOrgId(); int ipId = req.getInteger("ip_id"); String mac = req.getString("mac"); Date from = req.getDate("from"); Date to = req.getDate("to"); int macId = ipManager.allowMacAddress(orgId, ipId, mac, from, to); resp.put("mac_id", macId); } @SuppressWarnings("unchecked") @MsgbusMethod public void disallowMacAddress(Request req, Response resp) { int orgId = req.getOrgId(); List<Integer> macIds = (List<Integer>) req.get("mac_id"); for (Integer macId : macIds) ipManager.disallowMacAddress(orgId, macId); } @MsgbusMethod public void deniedMacAddresses(Request req, Response resp) { int orgId = req.getOrgId(); int agentId = req.getInteger("agnet_id"); List<DeniedMac> denied = ipManager.getDenyMacAddresses(orgId, agentId); resp.put("denied", Marshaler.marshal(denied)); } @MsgbusMethod public void denyMacAddress(Request req, Response resp) { int orgId = req.getOrgId(); int agentId = req.getInteger("agent_id"); String mac = req.getString("mac"); Date from = req.getDate("from"); Date to = req.getDate("to"); ipManager.denyMacAddress(orgId, agentId, mac, from, to); } @SuppressWarnings("unchecked") @MsgbusMethod public void removeDenyMacAddress(Request req, Response resp) { int orgId = req.getOrgId(); List<Integer> macIds = (List<Integer>) req.get("mac_id"); for (Integer macId : macIds) ipManager.removeDenyMacAddress(orgId, macId); } @MsgbusMethod public void getQuarantinedHosts(Request req, Response resp) { } @MsgbusMethod public void getHosts(Request req, Response resp) { int orgId = req.getOrgId(); List<HostEntry> hosts = ipManager.getHosts(orgId); resp.put("hosts", Marshaler.marshal(hosts)); } @MsgbusMethod public void arpscan(Request req, Response resp) { arpScanner.run(); } @MsgbusMethod @Override public void onNewIpDetected(Agent agent, InetAddress ip, MacAddress mac) { push(Type.NewIpDetected, agent, ip, null, mac, null); } @Override public void onNewMacDetected(Agent agent, InetAddress ip, MacAddress mac) { push(Type.NewMacDetected, agent, ip, null, mac, null); } @Override public void onIpChanged(Agent agent, InetAddress ip1, InetAddress ip2, MacAddress mac) { push(Type.IpChanged, agent, ip1, ip2, mac, null); } @Override public void onMacChanged(Agent agent, InetAddress ip, MacAddress oldMac, MacAddress newMac) { push(Type.MacChanged, agent, ip, null, oldMac, newMac); } @Override public void onIpConflict(Agent agent, InetAddress ip, MacAddress originalMac, MacAddress conflictMac) { push(Type.IpConflict, agent, ip, null, originalMac, conflictMac); } private void push(Type type, Agent agent, InetAddress ip1, InetAddress ip2, MacAddress mac1, MacAddress mac2) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Map<String, Object> m = new HashMap<String, Object>(); // TODO: localized log message using push interceptor m.put("type", type.getCode()); m.put("ip1", ip1.getHostAddress()); m.put("ip2", ip2 == null ? null : ip2.getHostAddress()); m.put("mac1", mac1.toString()); m.put("mac2", mac2 == null ? null : mac2.toString()); m.put("date", dateFormat.format(new Date())); pushApi.push(agent.getOrgId(), "kraken-ipm-log", m); logger.info("kraken ipmanager: push message ip event [type={}, ip={}]", type, ip1.getHostAddress()); } }