Parcourir la source

FD3-790 invalidation of host lease. action migration updated. spanish translations updated.

Guillermo Espinoza il y a 6 ans
Parent
commit
58c1d2fc09

+ 82 - 0
src/HostBundle/EventListener/HostStatusChangeSubscriber.php

@@ -0,0 +1,82 @@
+<?php
+
+namespace HostBundle\EventListener;
+
+use Doctrine\Common\EventSubscriber;
+use Doctrine\ORM\Event\LifecycleEventArgs;
+use HostBundle\Entity\Host;
+use KeaBundle\Services\LeaseService;
+
+class HostStatusChangeSubscriber implements EventSubscriber
+{
+
+    /**
+     * @var ContainerInterface
+     */
+    private $serviceContainer;
+        
+    
+    /**
+     * @param ContainerInterface $serviceContainer
+     */
+    public function __construct($serviceContainer)
+    {
+        $this->serviceContainer = $serviceContainer;
+    }
+
+    /**
+     * @return array
+     */
+    public function getSubscribedEvents()
+    {
+        return array(
+            'postUpdate',
+            'preRemove',
+        );
+    }
+
+    /**
+     * @param LifecycleEventArgs $args
+     */
+    public function postUpdate(LifecycleEventArgs $args)
+    {
+        $this->execute($args);
+    }
+
+    /**
+     * @param LifecycleEventArgs $args
+     */
+    public function preRemove(LifecycleEventArgs $args)
+    {
+        $this->execute($args);
+    }
+
+    /**
+     * @param LifecycleEventArgs $args
+     * @param boolean $remove
+     */
+    public function execute(LifecycleEventArgs $args)
+    {
+        $flashbag = $this->serviceContainer->get('session')->getFlashBag();
+        $translator = $this->serviceContainer->get('translator');
+        try {
+            // checking if the entity is a Host and the status has changed
+            $em = $args->getEntityManager();
+            $uow = $em->getUnitOfWork();
+            $uow->computeChangeSets();
+            $entity = $args->getEntity();
+            $changeset = $uow->getEntityChangeSet($entity);
+            if ($entity instanceof Host && isset($changeset['state'])) {
+                $leaseService = $this->serviceContainer->get('kea.lease.service');
+                // invalidating the host lease
+                $lease4 = $leaseService->invalidate($entity->getMac());
+                $flashbag->add("success", $translator->trans('host.lease.invalidate.ok', ['%hwaddr%' => $entity->getMac()], 'KeaBundle'));
+            }
+        } catch (\Exception $ex) {
+            $flashbag->add("error", $ex->getMessage());
+        } catch (\Throwable $ex) {
+            $flashbag->add("error", $ex->getMessage());
+        }
+    }
+
+}

+ 6 - 0
src/HostBundle/Resources/config/services.yml

@@ -45,3 +45,9 @@ services:
     dhcp.dhcp_options.service:
         class: HostBundle\Services\DHCPOptionsService
         arguments: [ "@doctrine.orm.entity_manager", "@validator" ]
+
+    dhcp.host_status_change.subscriber:
+        class: HostBundle\EventListener\HostStatusChangeSubscriber
+        arguments: [ "@service_container" ]
+        tags:
+            - { name: doctrine.event_subscriber, connection: default }

+ 13 - 0
src/KeaBundle/Repository/Lease4Repository.php

@@ -18,4 +18,17 @@ class Lease4Repository extends \Doctrine\ORM\EntityRepository
         }, $leases);
     }
 
+    /**
+     * @param string $hwaddr
+     * 
+     * @return array
+     */
+    public function getByHwaddr($hwaddr)
+    {
+        $qb = $this->createQueryBuilder('Lease4')
+            ->where('Lease4.hwaddr = :hwaddr')->setParameter('hwaddr', hex2bin($hwaddr));
+        
+        return $qb->getQuery()->getOneOrNullResult();
+    }
+
 }

+ 4 - 0
src/KeaBundle/Resources/config/services.yml

@@ -35,3 +35,7 @@ services:
        arguments: [ '@pool_ipv4_service' ]
        tags:
            - { name: twig.extension }
+
+    kea.lease.service:
+        class: KeaBundle\Services\LeaseService
+        arguments: [ "@doctrine.orm.entity_manager", "@translator" ]

+ 3 - 1
src/KeaBundle/Resources/translations/KeaBundle.es.yml

@@ -83,4 +83,6 @@ kea_packet_list: Ver paquetes
 Filter: Filtro
 Packets: Paquetes
 kea_packet_list_help: Por defecto se muestran los últimos 100 paquetes de KEA
-insert a number upper to 100: Ingrese un número mayor a 100
+insert a number upper to 100: Ingrese un número mayor a 100
+host.lease.invalidate.ok: Se invalidó el lease para el hwaddr "%hwaddr%"
+Lease4 with hwaddr "%hwaddr%" not found!: Lease con hwaddr "%hwaddr%" no encontrado!

+ 60 - 0
src/KeaBundle/Services/LeaseService.php

@@ -0,0 +1,60 @@
+<?php
+
+namespace KeaBundle\Services;
+
+use Doctrine\ORM\EntityManager;
+use Doctrine\ORM\EntityRepository;
+
+class LeaseService
+{
+
+    /**
+     * @var EntityManager
+     */
+    private $em;
+
+    /**
+     * @var EntityRepository
+     */
+    private $lease4Repository;
+
+    /**
+     * @var Translator
+     */
+    private $translator;
+
+
+    /**
+     * @param EntityManager $em
+     */
+    public function __construct(EntityManager $em, $translator)
+    {
+        $this->em = $em;
+        $this->lease4Repository = $em->getRepository('KeaBundle:Lease4');
+        $this->translator = $translator;
+    }
+
+    /**
+     * Invalidate a lease setting a hwaddr with value ffffffffffff
+     * and an expire datetime to 15 minutes from now
+     * 
+     * @param string $hwaddr
+     * 
+     * @return Lease4
+     */
+    public function invalidate($hwaddr)
+    {
+        $lease4 = $this->lease4Repository->getByHwaddr($hwaddr);
+        if ($lease4) {
+            $lease4->setHwaddr(hex2bin('ffffffffffff'));
+            $expire = date('Y-m-d H:i:s', strtotime("+15 minutes"));
+            $lease4->setExpire(new \DateTime($expire));
+            
+            $this->em->flush($lease4);
+
+            return $lease4;
+        } else {
+            throw new \Exception($this->translator->trans("Lease4 with hwaddr \"%hwaddr%\" not found!", ['%hwaddr%' => $hwaddr], 'KeaBundle'));
+        }
+    }
+}