/* * Copyright 2010 NCHOVY * * 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.sonar.metabase; import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.Collection; import javax.persistence.EntityManager; import javax.persistence.NoResultException; import org.apache.felix.ipojo.annotations.Component; import org.apache.felix.ipojo.annotations.Provides; import org.apache.felix.ipojo.annotations.Requires; import org.krakenapps.jpa.ThreadLocalEntityManagerService; import org.krakenapps.jpa.handler.JpaConfig; import org.krakenapps.jpa.handler.Transactional; import org.krakenapps.pcap.decoder.ethernet.MacAddress; import org.krakenapps.sonar.Metabase; import org.krakenapps.sonar.metabase.model.Application; import org.krakenapps.sonar.metabase.model.Environment; import org.krakenapps.sonar.metabase.model.AttackLog; import org.krakenapps.sonar.metabase.model.IpEndPoint; import org.krakenapps.sonar.metabase.model.Vendor; @Component(name = "sonar-metabase") @Provides @JpaConfig(factory = "sonar") public class PersistentMetabase implements Metabase { @Requires private ThreadLocalEntityManagerService entityManagerService; @SuppressWarnings("unchecked") @Transactional @Override public Collection<IpEndPoint> getIpEndPoints() { EntityManager em = entityManagerService.getEntityManager(); return em.createQuery("FROM IpEndPoint").getResultList(); } @Transactional @Override public IpEndPoint getIpEndPoint(MacAddress mac) { EntityManager em = entityManagerService.getEntityManager(); try { IpEndPoint old = (IpEndPoint) em.createQuery("FROM IpEndPoint ep WHERE ep.mac = ?").setParameter(1, mac.toString()).getSingleResult(); return old; } catch (NoResultException e) { return null; } } @Transactional @Override public IpEndPoint updateIpEndPoint(MacAddress mac, InetAddress ip) { EntityManager em = entityManagerService.getEntityManager(); try { IpEndPoint old = (IpEndPoint) em.createQuery("FROM IpEndPoint ep WHERE ep.mac = ?").setParameter(1, mac.toString()).getSingleResult(); old.setIp(ip); em.merge(old); return old; } catch (NoResultException e) { IpEndPoint ep = new IpEndPoint(mac); ep.setIp(ip); em.persist(ep); return ep; } } @Transactional @Override public IpEndPoint updateIpEndpoint(MacAddress mac, Environment environment) { EntityManager em = entityManagerService.getEntityManager(); try { IpEndPoint old = (IpEndPoint) em.createQuery("FROM IpEndPoint ep WHERE ep.mac = ?").setParameter(1, mac.toString()).getSingleResult(); old.setEnvironment(environment); em.merge(old); return old; } catch (NoResultException e) { IpEndPoint ep = new IpEndPoint(mac); ep.setEnvironment(environment); em.persist(ep); return ep; } } @SuppressWarnings("unchecked") @Transactional @Override public void clearIpEndpoints() { EntityManager em = entityManagerService.getEntityManager(); Collection<IpEndPoint> endpoints = em.createQuery("FROM IpEndPoint").getResultList(); for (IpEndPoint ep : endpoints) em.remove(ep); } @SuppressWarnings("unchecked") @Transactional @Override public Collection<Vendor> getVendors() { EntityManager em = entityManagerService.getEntityManager(); return em.createQuery("FROM Vendor").getResultList(); } @Transactional @Override public Vendor getVendor(String name) { EntityManager em = entityManagerService.getEntityManager(); try { Vendor old = (Vendor) em.createQuery("FROM Vendor v WHERE v.name = ?").setParameter(1, name).getSingleResult(); return old; } catch (NoResultException e) { return null; } } @Transactional @Override public Vendor updateVendor(String name) { EntityManager em = entityManagerService.getEntityManager(); try { Vendor old = (Vendor) em.createQuery("FROM Vendor v WHERE v.name = ?").setParameter(1, name).getSingleResult(); return old; } catch (NoResultException e) { Vendor vendor = new Vendor(name); em.persist(vendor); return vendor; } } @SuppressWarnings("unchecked") @Transactional @Override public void clearVendors() { EntityManager em = entityManagerService.getEntityManager(); Collection<Vendor> vendors = em.createQuery("FROM Vendor").getResultList(); for (Vendor vendor : vendors) em.remove(vendor); } @SuppressWarnings("unchecked") @Transactional @Override public Collection<Environment> getEnvironments() { EntityManager em = entityManagerService.getEntityManager(); return em.createQuery("FROM Environment").getResultList(); } @Override public Environment getEnvironment(Vendor vendor, String family, String description) { EntityManager em = entityManagerService.getEntityManager(); try { Environment old = (Environment) em.createQuery( "FROM Environment e WHERE e.vendor = ? AND e.family = ? AND e.description = ?") .setParameter(1, vendor) .setParameter(2, family) .setParameter(3, description).getSingleResult(); return old; } catch (NoResultException e) { return null; } } @Transactional @Override public Environment updateEnvironment(Vendor vendor, String family, String description) { EntityManager em = entityManagerService.getEntityManager(); try { Environment old = (Environment) em.createQuery( "FROM Environment e WHERE e.vendor = ? AND e.family = ? AND e.description = ?") .setParameter(1, vendor) .setParameter(2, family) .setParameter(3, description).getSingleResult(); return old; } catch (NoResultException e) { Environment environment = new Environment(vendor, family, description); em.persist(environment); return environment; } } @SuppressWarnings("unchecked") @Transactional @Override public void clearEnvironments() { EntityManager em = entityManagerService.getEntityManager(); Collection<Environment> environments = em.createQuery("FROM Environment").getResultList(); for (Environment env : environments) em.remove(env); } @SuppressWarnings("unchecked") @Transactional @Override public void clearApplications() { EntityManager em = entityManagerService.getEntityManager(); Collection<Application> apps = em.createQuery("FROM Application").getResultList(); for (Application app : apps) em.remove(app); } @Override public Application getApplication(Vendor vendor, String name) { EntityManager em = entityManagerService.getEntityManager(); try { Application old = (Application) em.createQuery( "FROM Application a WHERE a.vendor = ? AND a.name = ?") .setParameter(1, vendor) .setParameter(2, name).getSingleResult(); return old; } catch (NoResultException e) { return null; } } @SuppressWarnings("unchecked") @Transactional @Override public Collection<Application> getApplications() { EntityManager em = entityManagerService.getEntityManager(); return em.createQuery("FROM Application").getResultList(); } @Transactional @Override public void alert(AttackLog log) { EntityManager em = entityManagerService.getEntityManager(); em.persist(log); } @Transactional @Override public void clearIdsLog() { EntityManager em = entityManagerService.getEntityManager(); em.createQuery("DELETE FROM IdsLog").executeUpdate(); } @Transactional @Override public Application updateApplication(Vendor vendor, String name, String version, IpEndPoint endpoint) { EntityManager em = entityManagerService.getEntityManager(); try { Application old = (Application) em.createQuery( "FROM Application a WHERE a.vendor = ? AND a.name = ?") .setParameter(1, vendor) .setParameter(2, name).getSingleResult(); old.setVersion(version); boolean found = false; for (IpEndPoint ip : old.getEndpoints()) { if (ip.getId() == endpoint.getId()) { found = true; break; } } if (!found) { old.AddEndpoint(endpoint); } return old; } catch (NoResultException e) { Application application = new Application(vendor, name, version, endpoint); em.persist(application); return application; } } @Transactional @Override public IpEndPoint updateIpEndPoint(InetSocketAddress localAddress) { EntityManager em = entityManagerService.getEntityManager(); try { IpEndPoint old = (IpEndPoint) em.createQuery("FROM IpEndPoint ep WHERE ep.ip = ?").setParameter(1, localAddress.toString()).getSingleResult(); em.merge(old); return old; } catch (NoResultException e) { IpEndPoint ep = new IpEndPoint(localAddress); em.persist(ep); return ep; } } }