我对 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地址,我查了一下,是好的。 我在 KEA 文档中没有找到如何将 IP 地址更改为 IPv4 格式以及如何将 mac 地址存储在 hwaddr 字段中。
如果有人知道如何做到这一点,我将非常感激!
谢谢!
根据 KEA 文档,
hwaddr
字段为 VARBINARY
。您应该能够使用以下命令查看 IP 地址和 hwaddr 值:
SELECT INET_NTOA(address), HEX(hwaddr), lease4.* FROM lease4;
我也有类似的需求,需要创建 KEA 主机预留并将 MAC 和 IP 地址填充为常规字符串,同时仍然让 KEA 使用的字段在插入或更新时自动更新。
我最终要做的是创建两个新字段来保存这些字符串值(“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”表使用相同的触发器。
希望有帮助。
这是一个有点晚的答案,但我正在使用 NodeJS 构建一个 GUI 来管理 MySQL 数据库,而不是使用 Postgres 的 Stork,并且我遇到了同样的问题。
仔细一看,它是IP地址和硬件地址的简单数字和二进制表示。
IP 地址是一个 4 字节的二进制地址。一个字节是 0 到 255 之间的数字,或者十六进制的 00 到 FF。例如,
192.168.10.1
表示第一个字节是 192,第二个字节是 168,第三个字节是 10,依此类推。然后我们转换为十六进制,并将它们全部读取为 4 字节整数。
192.168.10.1
C0.A8.0A.01
C0A80A01
3232238081
您可以使用
INET_NTOA(address)
将其恢复为字符串表示形式,但我更喜欢它作为数字。这样,在我的编码中更容易从子网进行跟踪
对于硬件地址来说,就容易多了。 Mac 地址是 6 字节二进制,并且因为一个字节十六进制总是 00 到 FF,所以 mac 地址将是二进制的 6 个字符。只需将其转换回十六进制:
HEX(hwaddr)
既然你知道它们是二进制形式和整数形式,如果你不想使用MySQL,你可以使用任何你想要执行位操作的语言。