瀏覽代碼

Merge branch 'master' of https://bitbucket.org/ikflowdat/dhcp into FD3-551

Maxi Schvindt 7 年之前
父節點
當前提交
526e2bee5f

+ 4 - 8
.drone.yml

@@ -1,11 +1,9 @@
 services:
-  database:
+  mysql:
     image: mysql:5.5
     environment:
       - MYSQL_ROOT_PASSWORD=
       - MYSQL_ALLOW_EMPTY_PASSWORD=yes
-      - MYSQL_USER=drone
-      - MYSQL_PASSWORD=drone
   amqp:
     image: rabbitmq:3-management
 pipeline:
@@ -27,18 +25,16 @@ pipeline:
       CLIENT: fd3
     commands:
       - command -v mysqladmin >/dev/null 2>&1 || { echo "I require mysqladmin but it's not installed.  Aborting." >&2; exit 1; }
-      - while ! mysqladmin ping -h 127.0.0.1 --silent; do :; done
+      - while ! mysqladmin ping -h mysql --silent; do :; done
 
-      - yes | mysqladmin -h 127.0.0.1 create fd3_dhcp
-      - yes | mysqladmin -h 127.0.0.1 create fd_session
+      - yes | mysqladmin -h mysql create fd3_dhcp
+      - yes | mysqladmin -h mysql create fd_session
 
       - echo 'client = Flowdat3-DHCP-Drone-Test' | tee /etc/flowdat.conf
       - echo 'date.timezone="America/Argentina/Buenos_Aires"' >> /etc/php/7.0/cli/php.ini
 
       - chmod 0400 keys/bitbucket.id_rsa
       - eval $(ssh-agent); ssh-add keys/bitbucket.id_rsa
-      - cp app/config/bundles/ik/device-bundle/parameters.yml.drone app/config/bundles/ik/device-bundle/parameters.yml
-      - cp app/config/bundles/ik/base-admin-bundle/parameters.yml.dist app/config/bundles/ik/base-admin-bundle/parameters.yml
       - composer install -n --no-progress
       - composer dump-autoload --optimize
       - chmod 0777 -R var/logs var/cache var/sessions

+ 14 - 0
app/DoctrineMigrations/src/host_type.yml

@@ -0,0 +1,14 @@
+insertorupdate:
+    host_type:
+        -
+          id: 1
+          name: "Cablemodem"
+          shortname: "cm"
+        -
+          id: 2
+          name: "CPE"
+          shortname: "cpe"
+        -
+          id: 3
+          name: "MTA"
+          shortname: "mta"

+ 2 - 2
app/config/parameters.yml.dist

@@ -2,7 +2,7 @@
 # Set parameters here that may be different on each deployment target of the app, e.g. development, staging, production.
 # http://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration
 parameters:
-    database_host: 127.0.0.1
+    database_host: mysql
     database_port: ~
     database_name: fd3_dhcp
     database_user: root
@@ -21,7 +21,7 @@ parameters:
     jms_serializer.camel_case_naming_strategy.class: JMS\Serializer\Naming\IdenticalPropertyNamingStrategy
 
     # amqp queue config
-    rabbit_mq.host:     127.0.0.1
+    rabbit_mq.host:     amqp
     rabbit_mq.port:     5672
     rabbit_mq.user:     'guest'
     rabbit_mq.password: 'guest'

+ 5 - 6
src/IPv4Bundle/Admin/HostAdmin.php

@@ -3,7 +3,7 @@
 namespace IPv4Bundle\Admin;
 
 use Base\AdminBundle\Admin\BaseAdmin;
-use IPv4Bundle\Entity\Host;
+use IPv4Bundle\Utils\HostStatus;
 use Sonata\AdminBundle\Datagrid\DatagridMapper;
 use Sonata\AdminBundle\Datagrid\ListMapper;
 use Sonata\AdminBundle\Form\FormMapper;
@@ -51,12 +51,11 @@ class HostAdmin extends BaseAdmin
             ->tab('Host')
             ->with('Host')
             ->add('mac')
-            ->add('hostType')
+            ->add('hostType', null, [
+                'required' => true,
+            ])
             ->add('state', ChoiceType::class, [
-                'choices' => [
-                    Host::STATE_ACTIVE => Host::STATE_ACTIVE,
-                    Host::STATE_SUSPENDED => Host::STATE_SUSPENDED,
-                ],
+                'choices' => HostStatus::getChoices(),
                 'translation_domain' => 'IPv4Bundle',
             ])
         ->end()

+ 11 - 0
src/IPv4Bundle/Admin/SubNetAdmin.php

@@ -7,6 +7,8 @@ use Sonata\AdminBundle\Datagrid\DatagridMapper;
 use Sonata\AdminBundle\Datagrid\ListMapper;
 use Sonata\AdminBundle\Form\FormMapper;
 use Sonata\AdminBundle\Show\ShowMapper;
+use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
+use IPv4Bundle\Utils\HostStatus;
 
 class SubNetAdmin extends BaseAdmin
 {
@@ -17,6 +19,8 @@ class SubNetAdmin extends BaseAdmin
     {
         $datagridMapper
             ->add('address')
+            ->add('allowedHostType')
+            ->add('status')
         ;
     }
 
@@ -29,6 +33,7 @@ class SubNetAdmin extends BaseAdmin
             ->add('address')
             ->add('options')
             ->add('allowedHostType')
+            ->add('status')
             ->add('netGroup')
             ->add('ipPool')
             ->add('_action', null, array(
@@ -51,6 +56,11 @@ class SubNetAdmin extends BaseAdmin
             ->with('')
                 ->add('address')
                 ->add('allowedHostType')
+                ->add('status', ChoiceType::class, [
+                    'required' => false,
+                    'choices' => HostStatus::getChoices(),
+                    'translation_domain' => 'IPv4Bundle',
+                ])
                 ->add('netGroup')
             ->end()
             ->end()
@@ -65,6 +75,7 @@ class SubNetAdmin extends BaseAdmin
         $showMapper
             ->add('address')
             ->add('allowedHostType')
+            ->add('status')
             ->add('netGroup')
             ->add('ipPool')
         ;

+ 7 - 6
src/IPv4Bundle/Entity/Host.php

@@ -4,8 +4,10 @@ namespace IPv4Bundle\Entity;
 
 use Doctrine\ORM\Mapping as ORM;
 use JMS\Serializer\Annotation as JMS;
-use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
 use IPv4Bundle\Traits\DHCPOptionTrait;
+use IPv4Bundle\Utils\HostStatus;
+use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
+use Symfony\Component\Validator\Constraints as Assert;
 use WorkflowBundle\Entity\Interfaces\WorkflowInterface;
 use WorkflowBundle\Entity\Traits\WorkflowTrait;
 
@@ -20,9 +22,6 @@ class Host implements WorkflowInterface
     use DHCPOptionTrait;
     use WorkflowTrait;
 
-    const STATE_ACTIVE = 'active';
-    const STATE_SUSPENDED = 'suspended';
-
     /**
      * @var bigint $id
      *
@@ -53,6 +52,8 @@ class Host implements WorkflowInterface
      * @ORM\JoinColumn(onDelete="CASCADE")
      *
      * @JMS\MaxDepth(1)
+     *
+     * @Assert\NotNull
      */
     protected $hostType;
 
@@ -61,7 +62,7 @@ class Host implements WorkflowInterface
      *
      * @ORM\Column(type="string", options={"default": "active"})
      */
-    protected $state = self::STATE_ACTIVE;
+    protected $state = HostStatus::STATE_ACTIVE;
 
     /**
      * @ORM\ManyToOne(targetEntity="\WorkflowBundle\Entity\Workflow", fetch="EXTRA_LAZY")
@@ -168,7 +169,7 @@ class Host implements WorkflowInterface
      *
      * @return Host
      */
-    public function setState($state = self::STATE_ACTIVE)
+    public function setState($state = HostStatus::STATE_ACTIVE)
     {
         $this->state = $state;
 

+ 26 - 0
src/IPv4Bundle/Entity/SubNet.php

@@ -88,6 +88,12 @@ class SubNet implements TenancyIdTraitInterface, WorkflowInterface
      */
     protected $currentState = null;
 
+    /**
+     * @ORM\Column(type="string", nullable=true)
+     */
+    protected $status = null;
+
+
     public function __construct()
     {
         $this->ipPool = new ArrayCollection;
@@ -247,6 +253,26 @@ class SubNet implements TenancyIdTraitInterface, WorkflowInterface
         }
     }
 
+    /**
+     * @param string $status
+     *
+     * @return SubNet
+     */
+    public function setStatus($status = null)
+    {
+        $this->status = $status;
+
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getStatus()
+    {
+        return $this->status;
+    }
+
     /**
     * @param ExecutionContextInterface $context
     */

+ 5 - 0
src/IPv4Bundle/Resources/translations/IPv4Bundle.es.yml

@@ -41,6 +41,7 @@ form:
     label_extra_data: Extra Data
     label_log_servers: Log Servers
     label_time_servers: Time Servers
+    label_status: Estado
 
 list:
     label_mac: Mac
@@ -60,6 +61,7 @@ list:
     label_ip_pool: IP Pool
     label_state: Estado
     label_extra_data: Extra Data
+    label_status: Estado
 
 show:
     label_mac: Mac
@@ -96,6 +98,7 @@ show:
     label_extra_data: Extra Data
     label_log_servers: Log Servers
     label_time_servers: Time Servers
+    label_status: Estado
 
 filter:
     label_mac: Mac
@@ -109,6 +112,8 @@ filter:
     label_options: Opciones
     label_state: Estado
     label_extra_data: Extra Data
+    label_allowed_host_type: Tipo de Host permitido
+    label_status: Estado
 
 breadcrumb:
     link_host_list: Listado Host

+ 16 - 0
src/IPv4Bundle/Utils/HostStatus.php

@@ -0,0 +1,16 @@
+<?php
+
+namespace IPv4Bundle\Utils;
+
+use DeviceBundle\Utils\ChoiceTrait;
+
+class HostStatus
+{
+
+    use ChoiceTrait;
+
+    const STATE_ACTIVE = 'active';
+    const STATE_SUSPENDED = 'suspended';
+    const STATE_NONE = 'none';
+
+}

+ 41 - 16
src/KeaBundle/Services/BaseKea.php

@@ -2,7 +2,7 @@
 
 namespace KeaBundle\Services;
 
-use IPv4Bundle\Entity\Host;
+use IPv4Bundle\Utils\HostStatus;
 use KeaBundle\Interfaces\KeaConfigInterface;
 
 class BaseKea implements KeaConfigInterface
@@ -18,6 +18,11 @@ class BaseKea implements KeaConfigInterface
     */
     private $hooks_libraries = [];
 
+    /**
+    * @var array
+    */
+    private $interfaces_config = [];
+
 
     /**
      * @param array $data
@@ -43,6 +48,7 @@ class BaseKea implements KeaConfigInterface
                         'lease-database' =>$this->leaseDatabaseConfig(),
                         'subnet4' => $this->subnet4,
                         'hooks-libraries' => $this->hooks_libraries,
+                        'interfaces-config' => $this->getInterfacesConfig(),
                     ],
                     'Logging' => $this->loggingConfig(),
             ))], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
@@ -60,10 +66,27 @@ class BaseKea implements KeaConfigInterface
                     'pool' => $pool->getFirstIp() . ' - ' . $pool->getLastIp(),
                 ];
             }
-            $this->subnet4[] = [
+
+            $hostType = $subnet->getAllowedHostType();
+            $client_class = '';
+            if ($hostType) {
+                $client_class = $hostType->getShortname();
+            }
+            if ($subnet->getStatus() != HostStatus::STATE_NONE && $subnet->getStatus() != '') {
+                if ($client_class != '') {
+                    $client_class .= '-';
+                }
+                $client_class .= $subnet->getStatus();
+            }
+
+            $subnetConf = [
                 'subnet' => $subnet->getAddress(),
                 'pools' => $pools,
             ];
+            if ($client_class != '') {
+                $subnetConf['client-class'] = $client_class;
+            }
+            $this->subnet4[] = $subnetConf;
         }
     }
 
@@ -96,22 +119,17 @@ class BaseKea implements KeaConfigInterface
 
         $remote_id_map = isset($dhcpModelParams['remote-id-map']) ? $dhcpModelParams['remote-id-map'] : null;
         if ($remote_id_map) {
-            $active = [];
-            $suspended = [];
+            $hostConfig = [];
             foreach ($hosts as $host) {
                 $mac = $host->getMac();
                 $state = $host->getState();
-                if ($state == Host::STATE_ACTIVE) {
-                    $active[] = $mac;
-                } elseif ($state == Host::STATE_SUSPENDED) {
-                    $suspended[] = $mac;
-                }
-            }
+                $shortname = $host->getHostType()->getShortname();
 
-            $hook['parameters']['remote-id-map'] = [
-                'active' => $active,
-                'suspended' => $suspended,
-            ];
+                $client_class = $state != HostStatus::STATE_NONE ? $state : $shortname;
+
+                $hostConfig[$client_class][] = $mac;
+            }
+            $hook['parameters']['remote-id-map'] = $hostConfig;
         }
 
         $this->hooks_libraries[] = $hook;
@@ -144,7 +162,7 @@ class BaseKea implements KeaConfigInterface
     /**
      * @return array
      */
-    private function controlSocketConfig() 
+    private function controlSocketConfig()
     {
         /* "control-socket": {"socket-name": "\/tmp\/kea-dhcp4-ctrl.sock","socket-type": "unix"} */
         return array(
@@ -156,14 +174,21 @@ class BaseKea implements KeaConfigInterface
     /**
      * @return array
      */
-    private function leaseDatabaseConfig() 
+    private function leaseDatabaseConfig()
     {
         /* "lease-database": {"lfc-interval": 3600,"type": "memfile"} */
         return array(
             'lfc-interval' => 3600,
             'type' => 'memfile'
         );
+    }
 
+    /**
+     * @return array
+     */
+    private function getInterfacesConfig()
+    {
+        return ['interfaces' => ['*']];
     }
 
 }