【问题标题】:KEA dhcp Mysql BackendKEA dhcp Mysql 后端
【发布时间】:2015-12-12 02:44:12
【问题描述】:

我对 MySQL 后端上的新 ISC DHCP、KEA 有疑问。 我想在我的数据库中存储租约,它可以工作,但没有存储一些信息。

我在我的数据库中获得了这种条目:

+------------+--------+-----------+----------------+---------------------+-----------+----------+----------+----------+                
| address    | hwaddr | client_id | valid_lifetime | expire              | subnet_id | fqdn_fwd | fqdn_rev | hostname |              
+------------+--------+-----------+----------------+---------------------+-----------+----------+----------+----------+
| 3232236052 | '°     | NULL      |           4000 | 2015-07-22 08:54:32 |         1 |        0 |        0 |          │                 
+------------+--------+-----------+----------------+---------------------+-----------+----------+----------+----------+   

地址字段是十进制的IP地址,我检查了,它是好的。 我没有找到如何将 IP 地址更改为 IPv4 格式以及如何在 KEA 文档的 hwaddr 字段中存储 mac 地址。

如果有人知道该怎么做,我将不胜感激!

谢谢!

【问题讨论】:

    标签: mysql dhcp


    【解决方案1】:

    根据 KEA 文档,hwaddr 字段为 VARBINARY。您应该能够看到值 IP 地址和 hwaddr 使用:

    SELECT INET_NTOA(address), HEX(hwaddr), lease4.* FROM lease4;
    

    【讨论】:

    • 它有效,我可以看到我的 IP 地址和 hwaddr !谢谢 !但是我想在我的数据库中保存这些值,您是否有想法强制 KEA 将这些数据直接存储为这些格式?甚至有可能吗?你能分享一下你找到数据类型的链接吗?再次感谢您!
    • @MaxGeneGrim,你可以在 Kea 包中找到dhcpdb_create.mysql 脚本。不知道如何更改信息在数据库中的存储方式。
    【解决方案2】:

    我同样需要创建 KEA 主机预留并将 MAC 和 IP 地址填充为常规字符串,同时仍让 KEA 使用的字段在 INSERT 或 UPDATE 时自动更新。

    我最终做的是创建两个新字段来保存这些字符串值('hosts.dhcp_identifier_str' 和 'hosts.ipv4_address_str'):

    ALTER TABLE `hosts` ADD `dhcp_identifier_str` VARCHAR(12) NOT NULL AFTER `dhcp_identifier`;
    ALTER TABLE `hosts` ADD `ipv4_address_str` VARCHAR(15) NULL DEFAULT NULL AFTER `ipv4_address`;
    

    然后,我使用 BEFORE INSERT/UPDATE MySQL 触发器使 KEA 使用的相应字段('hosts.dhcp_identifier' 和 'hosts.ipv4_address')保持最新:

    DELIMITER //
    DROP TRIGGER IF EXISTS `host_BINS`//
    CREATE TRIGGER `host_BINS` BEFORE INSERT ON `hosts`
     FOR EACH ROW BEGIN
    
    IF (NEW.dhcp_identifier = '' AND NEW.dhcp_identifier_str != '') THEN
              SET NEW.dhcp_identifier = UNHEX(UPPER(NEW.dhcp_identifier_str));
    ELSEIF (NEW.dhcp_identifier_str = '' AND NEW.dhcp_identifier != '') THEN
              SET NEW.dhcp_identifier_str = LOWER(HEX(NEW.dhcp_identifier));
    END IF;
    
    IF (NEW.ipv4_address IS NULL AND NEW.ipv4_address_str IS NOT NULL) THEN
              SET NEW.ipv4_address = INET_ATON(NEW.ipv4_address_str);
    ELSEIF (NEW.ipv4_address_str IS NULL AND NEW.ipv4_address IS NOT NULL) THEN
              SET NEW.ipv4_address_str = CAST(INET_NTOA(NEW.ipv4_address) AS CHAR);
    END IF;
    END
    //
    
    DROP TRIGGER IF EXISTS `host_BUPD`//
    CREATE TRIGGER `host_BUPD` BEFORE UPDATE ON `hosts`
     FOR EACH ROW BEGIN
    
    IF (NEW.dhcp_identifier_str != '' AND OLD.dhcp_identifier != UNHEX(UPPER(NEW.dhcp_identifier_str))) THEN
              SET NEW.dhcp_identifier = UNHEX(UPPER(NEW.dhcp_identifier_str));
    ELSEIF (NEW.dhcp_identifier != '' AND OLD.dhcp_identifier_str != LOWER(HEX(NEW.dhcp_identifier))) THEN
              SET NEW.dhcp_identifier_str = LOWER(HEX(NEW.dhcp_identifier));
    END IF;
    
    IF (NEW.ipv4_address_str IS NOT NULL AND OLD.ipv4_address != INET_ATON(NEW.ipv4_address_str)) THEN
              SET NEW.ipv4_address = INET_ATON(NEW.ipv4_address_str);
    ELSEIF (NEW.ipv4_address IS NOT NULL AND OLD.ipv4_address_str != CAST(INET_NTOA(NEW.ipv4_address) AS CHAR)) THEN
              SET NEW.ipv4_address_str = CAST(INET_NTOA(NEW.ipv4_address) AS CHAR);
    END IF;
    END
    //
    

    无论您使用 dhcp_identifier/ipv4_address 还是 dhcp_identifier_str/ipv4_address_str 对插入/更新条目,这都有效。

    我确定您可以对“lease4”表使用相同的触发器。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2021-01-14
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多