/*
* 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.impl;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import org.krakenapps.api.DefaultScript;
import org.krakenapps.api.ScriptArgument;
import org.krakenapps.api.ScriptUsage;
import org.krakenapps.ipmanager.ArpScanner;
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.AuditLog;
import org.krakenapps.ipmanager.model.DeniedMac;
import org.krakenapps.ipmanager.model.DetectedMac;
import org.krakenapps.ipmanager.model.HostEntry;
import org.krakenapps.ipmanager.model.HostNic;
import org.krakenapps.ipmanager.model.IpEntry;
import org.krakenapps.ipmanager.model.IpEventLog;
import org.krakenapps.jpa.JpaService;
import org.krakenapps.lookup.mac.MacLookupService;
import org.krakenapps.lookup.mac.Vendor;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class IpManagerScript extends DefaultScript {
private final String JPA_FACTORY_NAME = "ipm";
private Logger logger = LoggerFactory.getLogger(IpManagerScript.class);
private BundleContext bc;
private JpaService jpa;
private IpManager ipManager;
private ArpScanner arpScanner;
private MacLookupService macLookup;
public IpManagerScript(BundleContext bc, JpaService jpa, MacLookupService macLookup) {
this.bc = bc;
this.jpa = jpa;
this.macLookup = macLookup;
loadService();
}
public void load(String[] args) {
try {
String host = readLine("Database Host", "localhost", false);
String databaseName = readLine("Database Name", "kraken", false);
String user = readLine("Database User", "kraken", false);
String password = readLine("Database Password", null, true);
Properties props = new Properties();
props.put("hibernate.connection.url", "jdbc:mysql://" + host + "/" + databaseName
+ "??useUnicode=true&characterEncoding=utf8");
props.put("hibernate.connection.username", user);
props.put("hibernate.connection.password", password);
jpa.registerEntityManagerFactory(JPA_FACTORY_NAME, props, bc.getBundle().getBundleId());
loadService();
context.println("ipm loaded");
} catch (Exception e) {
context.println(e.getMessage());
logger.error("cannot load jpa model", e.getMessage());
}
}
public void install(String[] args) {
EntityManagerFactory emf = jpa.getEntityManagerFactory(JPA_FACTORY_NAME);
if (emf == null) {
context.println("run load first");
return;
}
EntityManager em = emf.createEntityManager();
if (em.createQuery("FROM Agent").getResultList().size() == 0) {
Agent agent = new Agent();
agent.setOrgId(1);
agent.setAreaId(1);
agent.setName("local");
agent.setGuid("local");
try {
agent.setIp(InetAddress.getLocalHost().getHostAddress());
agent.setNetmask("");
} catch (UnknownHostException e) {
}
agent.setPreventNewIp(true);
agent.setPreventNewMac(true);
agent.setProtectMode(true);
agent.setProtectAll(true);
agent.setCreateDateTime(new Date());
em.getTransaction().begin();
em.persist(agent);
em.getTransaction().commit();
}
context.println("default agent is intalled");
}
public void unload(String[] args) {
jpa.unregisterEntityManagerFactory(JPA_FACTORY_NAME);
context.println("ipm unloaded");
}
private String readLine(String label, String def, boolean isPassword) throws InterruptedException {
context.print(label);
if (def != null)
context.print("(default: " + def + ")");
context.print("? ");
String line = null;
if (isPassword)
line = context.readPassword();
else
line = context.readLine();
if (line != null && line.isEmpty())
return def;
return line;
}
private void loadService() {
this.ipManager = getService(IpManager.class);
this.arpScanner = getService(ArpScanner.class);
}
@SuppressWarnings("unchecked")
private <T> T getService(Class<T> cls) {
ServiceReference ref = bc.getServiceReference(cls.getName());
if (ref == null)
return null;
return (T) bc.getService(ref);
}
@ScriptUsage(description = "list all agents", arguments = { @ScriptArgument(type = "int", name = "org id", description = "organization id") })
public void agents(String[] args) {
if (ipManager == null) {
context.println("run load first");
return;
}
int orgId = Integer.valueOf(args[0]);
List<Agent> agents = ipManager.getAgents(orgId);
context.println("Agents");
context.println("--------");
for (Agent agent : agents)
context.println(agent);
}
@ScriptUsage(description = "list all hosts", arguments = { @ScriptArgument(type = "int", name = "org id", description = "organization id") })
public void hosts(String[] args) {
if (ipManager == null) {
context.println("run load first");
return;
}
int orgId = Integer.valueOf(args[0]);
List<HostEntry> hosts = ipManager.getHosts(orgId);
context.println("Hosts");
context.println("-------");
for (HostEntry host : hosts)
context.println(host);
}
@ScriptUsage(description = "list all ip entries", arguments = { @ScriptArgument(type = "int", name = "org id", description = "organization id") })
public void iplist(String[] args) {
if (ipManager == null) {
context.println("run load first");
return;
}
int orgId = Integer.valueOf(args[0]);
List<IpEntry> ipEntries = ipManager.getIpEntries(new IpQueryCondition(orgId));
Collections.sort(ipEntries, new Comparator<IpEntry>() {
@Override
public int compare(IpEntry o1, IpEntry o2) {
String[] t1 = o1.getIp().split("\\.");
String[] t2 = o2.getIp().split("\\.");
for (int i = 0; i < 4; i++) {
if (!t1[i].equals(t2[i]))
return (Integer.parseInt(t1[i]) - Integer.parseInt(t2[i]));
}
return 0;
}
});
context.println("IP Entries");
context.println("------------");
for (IpEntry ip : ipEntries) {
Vendor vendor = macLookup.findByMac(ip.getCurrentMac());
String line = ip.toString();
if (vendor != null)
line += ", vendor=" + vendor.getName();
context.println(line);
}
}
@ScriptUsage(description = "get/set arp timeout", arguments = { @ScriptArgument(type = "int", name = "timeout", description = "arp timeout", optional = true) })
public void arptimeout(String[] args) {
if (ipManager == null) {
context.println("run load first");
return;
}
if (args.length == 0) {
int timeout = arpScanner.getTimeout();
context.println(timeout + "msec");
} else if (args.length == 1) {
int timeout = Integer.valueOf(args[0]);
arpScanner.setTimeout(timeout);
context.println("set");
}
}
public void arpscan(String[] args) {
if (ipManager == null) {
context.println("run load first");
return;
}
arpScanner.run();
context.println("arp scan completed");
}
@ScriptUsage(description = "list all logs", arguments = {
@ScriptArgument(type = "int", name = "org id", description = "organization id "),
@ScriptArgument(type = "int", name = "page", description = "page number"),
@ScriptArgument(type = "int", name = "page size", description = "page size") })
public void logs(String[] args) {
if (ipManager == null) {
context.println("run load first");
return;
}
int orgId = Integer.valueOf(args[0]);
int page = Integer.valueOf(args[1]);
int pageSize = Integer.valueOf(args[2]);
LogQueryCondition condition = new LogQueryCondition(orgId, page, pageSize);
List<IpEventLog> logs = ipManager.getLogs(condition);
context.println("IP Event Logs");
context.println("--------------");
for (IpEventLog log : logs)
context.println(log);
}
@SuppressWarnings("unchecked")
public void purge(String[] args) {
context.print("really? ");
try {
String ans = context.readLine();
if (ans.equalsIgnoreCase("y") || ans.equalsIgnoreCase("yes")) {
EntityManagerFactory emf = jpa.getEntityManagerFactory(JPA_FACTORY_NAME);
if (emf == null) {
context.println("run load first");
return;
}
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
List<AllowedMac> allowedMacs = em.createQuery("FROM AllowedMac").getResultList();
for (AllowedMac am : allowedMacs)
em.remove(am);
List<AuditLog> auditLogs = em.createQuery("FROM AuditLog").getResultList();
for (AuditLog al : auditLogs)
em.remove(al);
List<DeniedMac> deniedMacs = em.createQuery("FROM DeniedMac").getResultList();
for (DeniedMac dm : deniedMacs)
em.remove(dm);
List<DetectedMac> detectedMacs = em.createQuery("FROM DetectedMac").getResultList();
for (DetectedMac dm : detectedMacs)
em.remove(dm);
List<HostEntry> hostEntries = em.createQuery("FROM HostEntry").getResultList();
for (HostEntry he : hostEntries)
em.remove(he);
List<HostNic> hostNics = em.createQuery("FROM HostNic").getResultList();
for (HostNic hn : hostNics)
em.remove(hn);
// List<IpAllocationRequest> ipAllocationRequests =
// em.createQuery("FROM IpAllocationRequest")
// .getResultList();
// for (IpAllocationRequest iar : ipAllocationRequests)
// em.remove(iar);
List<IpEntry> ipEntries = em.createQuery("FROM IpEntry").getResultList();
for (IpEntry ie : ipEntries)
em.remove(ie);
List<IpEventLog> ipEventLogs = em.createQuery("FROM IpEventLog").getResultList();
for (IpEventLog iel : ipEventLogs)
em.remove(iel);
em.getTransaction().commit();
return;
}
} catch (InterruptedException e) {
}
context.println("cancel");
}
}