[OpenWrt-Devel] odhcpd: allow specifying lease trigger mode

Message ID mailman.6910.1530045246.25356.openwrt-devel@lists.openwrt.org
State New
Delegated to: Hans Dedecker
Headers show
Series
  • [OpenWrt-Devel] odhcpd: allow specifying lease trigger mode
Related show

Commit Message

Michał Kępień via openwrt-devel June 26, 2018, 8:34 p.m.
The sender domain has a DMARC Reject/Quarantine policy which disallows
sending mailing list messages using the original "From" header.

To mitigate this problem, the original message has been wrapped
automatically by the mailing list software.
odhcpd only calls the lease trigger script when a lease with an
associated hostname is changed.  Enabling the lease trigger script to
also be called when a lease without an associated hostname is changed
allows for greater flexibility.

Add a new global odhcpd configuration parameter, "leasetrigger_mode",
with a default value of 0 which retains current behavior.  Setting the
parameter to 1 causes the lease trigger script to instead be called
every time any lease is changed, no matter whether it is associated with
a hostname or not.

Signed-off-by: Michał Kępień <lede@kempniu.pl>
---
The configuration parameter added by this patch could obviously be a
boolean, but it occurred to me that if the flexibility of the lease
trigger script is further improved in the future [1], more lease trigger
modes may be added (e.g. upon every single DHCP event, even if one does
not cause any lease to be modified).

[1] see e.g. https://bugs.openwrt.org/index.php?do=details&task_id=401

 README          | 18 ++++++++++--------
 src/config.c    | 10 ++++++++--
 src/dhcpv6-ia.c |  6 ++++++
 src/odhcpd.h    |  1 +
 4 files changed, 25 insertions(+), 10 deletions(-)

Comments

Hans Dedecker July 13, 2018, 10:54 a.m. | #1
On Tue, Jun 26, 2018 at 10:34 PM Michał Kępień via openwrt-devel
<openwrt-devel@lists.openwrt.org> wrote:
>
> The sender domain has a DMARC Reject/Quarantine policy which disallows
> sending mailing list messages using the original "From" header.
>
> To mitigate this problem, the original message has been wrapped
> automatically by the mailing list software.
>
>
> ---------- Forwarded message ----------
> From: "Michał Kępień" <lede@kempniu.pl>
> To: openwrt-devel@lists.openwrt.org
> Cc:
> Bcc:
> Date: Tue, 26 Jun 2018 22:33:40 +0200
> Subject: [PATCH] odhcpd: allow specifying lease trigger mode
> odhcpd only calls the lease trigger script when a lease with an
> associated hostname is changed.  Enabling the lease trigger script to
> also be called when a lease without an associated hostname is changed
> allows for greater flexibility.
>
> Add a new global odhcpd configuration parameter, "leasetrigger_mode",
> with a default value of 0 which retains current behavior.  Setting the
> parameter to 1 causes the lease trigger script to instead be called
> every time any lease is changed, no matter whether it is associated with
> a hostname or not.
Hi,

What usecase do you want to cover by calling the lease script every time ?

Hans
>
> Signed-off-by: Michał Kępień <lede@kempniu.pl>
> ---
> The configuration parameter added by this patch could obviously be a
> boolean, but it occurred to me that if the flexibility of the lease
> trigger script is further improved in the future [1], more lease trigger
> modes may be added (e.g. upon every single DHCP event, even if one does
> not cause any lease to be modified).
>
> [1] see e.g. https://bugs.openwrt.org/index.php?do=details&task_id=401
>
>  README          | 18 ++++++++++--------
>  src/config.c    | 10 ++++++++--
>  src/dhcpv6-ia.c |  6 ++++++
>  src/odhcpd.h    |  1 +
>  4 files changed, 25 insertions(+), 10 deletions(-)
>
> diff --git a/README b/README
> index 0c562e6..a43f2e7 100644
> --- a/README
> +++ b/README
> @@ -57,14 +57,16 @@ and may also receive information from ubus
>
>  Section of type odhcpd
>
> -Option         Type    Default                 Description
> -legacy         bool    0                       Enable DHCPv4 if start but
> -                                               no dhcpv4 option set
> -maindhcp       bool    0                       Use odhcpd as the main DHCPv4
> -                                               service
> -leasefile      string                          DHCP/v6 lease/hostfile
> -leasetrigger   string                          Lease trigger script
> -loglevel       integer 6                       Syslog level priority (0-7)
> +Option                 Type    Default                 Description
> +legacy                 bool    0                       Enable DHCPv4 if start but
> +                                                       no dhcpv4 option set
> +maindhcp               bool    0                       Use odhcpd as the main DHCPv4
> +                                                       service
> +leasefile              string                          DHCP/v6 lease/hostfile
> +leasetrigger           string                          Lease trigger script
> +leasetrigger_mode      integer 0                       Lease trigger mode
> +                       0: lease with hostname changed, 1: any lease changed
> +loglevel               integer 6                       Syslog level priority (0-7)
>
>
>  Sections of type dhcp (configure DHCP / DHCPv6 / RA / NDP service)
> diff --git a/src/config.c b/src/config.c
> index 118349a..78488b7 100644
> --- a/src/config.c
> +++ b/src/config.c
> @@ -20,8 +20,8 @@ static int reload_pipe[2];
>  struct list_head leases = LIST_HEAD_INIT(leases);
>  struct list_head interfaces = LIST_HEAD_INIT(interfaces);
>  struct config config = {.legacy = false, .main_dhcpv4 = false,
> -                       .dhcp_cb = NULL, .dhcp_statefile = NULL,
> -                       .log_level = LOG_INFO};
> +                       .dhcp_cb = NULL, .dhcp_cb_mode = 0,
> +                       .dhcp_statefile = NULL, .log_level = LOG_INFO};
>
>  enum {
>         IFACE_ATTR_INTERFACE,
> @@ -149,6 +149,7 @@ enum {
>         ODHCPD_ATTR_MAINDHCP,
>         ODHCPD_ATTR_LEASEFILE,
>         ODHCPD_ATTR_LEASETRIGGER,
> +       ODHCPD_ATTR_LEASETRIGGER_MODE,
>         ODHCPD_ATTR_LOGLEVEL,
>         ODHCPD_ATTR_MAX
>  };
> @@ -158,6 +159,7 @@ static const struct blobmsg_policy odhcpd_attrs[LEASE_ATTR_MAX] = {
>         [ODHCPD_ATTR_MAINDHCP] = { .name = "maindhcp", .type = BLOBMSG_TYPE_BOOL },
>         [ODHCPD_ATTR_LEASEFILE] = { .name = "leasefile", .type = BLOBMSG_TYPE_STRING },
>         [ODHCPD_ATTR_LEASETRIGGER] = { .name = "leasetrigger", .type = BLOBMSG_TYPE_STRING },
> +       [ODHCPD_ATTR_LEASETRIGGER_MODE] = { .name = "leasetrigger_mode", .type = BLOBMSG_TYPE_INT32 },
>         [ODHCPD_ATTR_LOGLEVEL] = { .name = "loglevel", .type = BLOBMSG_TYPE_INT32 },
>  };
>
> @@ -290,6 +292,10 @@ static void set_config(struct uci_section *s)
>                 config.dhcp_cb = strdup(blobmsg_get_string(c));
>         }
>
> +       if ((c = tb[ODHCPD_ATTR_LEASETRIGGER_MODE])) {
> +               config.dhcp_cb_mode = blobmsg_get_u32(c);
> +       }
> +
>         if ((c = tb[ODHCPD_ATTR_LOGLEVEL])) {
>                 int log_level = (blobmsg_get_u32(c) & LOG_PRIMASK);
>
> diff --git a/src/dhcpv6-ia.c b/src/dhcpv6-ia.c
> index 4ee6dd2..e51be79 100644
> --- a/src/dhcpv6-ia.c
> +++ b/src/dhcpv6-ia.c
> @@ -408,6 +408,9 @@ void dhcpv6_write_statefile(void)
>
>                                         ctxt.buf[ctxt.buf_idx - 1] = '\n';
>                                         fwrite(ctxt.buf, 1, ctxt.buf_idx, ctxt.fp);
> +                                       if (config.dhcp_cb_mode > 0) {
> +                                               md5_hash(ctxt.buf, ctxt.buf_idx, &ctxt.md5);
> +                                       }
>                                 }
>                         }
>
> @@ -453,6 +456,9 @@ void dhcpv6_write_statefile(void)
>                                                                         "%s/32 ", ipbuf);
>                                         ctxt.buf[ctxt.buf_idx - 1] = '\n';
>                                         fwrite(ctxt.buf, 1, ctxt.buf_idx, ctxt.fp);
> +                                       if (config.dhcp_cb_mode > 0) {
> +                                               md5_hash(ctxt.buf, ctxt.buf_idx, &ctxt.md5);
> +                                       }
>                                 }
>                         }
>                 }
> diff --git a/src/odhcpd.h b/src/odhcpd.h
> index 91fdcbf..0f23667 100644
> --- a/src/odhcpd.h
> +++ b/src/odhcpd.h
> @@ -138,6 +138,7 @@ struct config {
>         bool legacy;
>         bool main_dhcpv4;
>         char *dhcp_cb;
> +       int dhcp_cb_mode;
>         char *dhcp_statefile;
>         int log_level;
>  } config;
> --
> 2.18.0
>
>
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel@lists.openwrt.org
> https://lists.openwrt.org/listinfo/openwrt-devel
Michał Kępień via openwrt-devel July 15, 2018, 6:20 p.m. | #2
The sender domain has a DMARC Reject/Quarantine policy which disallows
sending mailing list messages using the original "From" header.

To mitigate this problem, the original message has been wrapped
automatically by the mailing list software.
Hi,

> What usecase do you want to cover by calling the lease script every time ?

I want to assign a FQDN to every device which gets an IP address from
odhcpd.  My lease script updates DNS records, generating MAC-based names
for devices which do not provide hostnames in their DHCP requests.  The
missing piece of the puzzle is thus a way of triggering the lease script
when an IP address is leased to a host which did not provide a hostname
in its DHCP request (and when such a lease is deleted).  The only way I
can think of to achieve that without patching odhcpd is to resort to
some sort of polling, but it feels a bit clumsy to me since an arbitrary
amount of time may pass between two DHCP events and I am trying to make
the relevant DNS zone match the lease database as closely as possible at
any given time.

Patch

diff --git a/README b/README
index 0c562e6..a43f2e7 100644
--- a/README
+++ b/README
@@ -57,14 +57,16 @@  and may also receive information from ubus
 
 Section of type odhcpd
 
-Option		Type	Default			Description
-legacy		bool	0			Enable DHCPv4 if start but
-						no dhcpv4 option set
-maindhcp	bool	0			Use odhcpd as the main DHCPv4
-						service
-leasefile	string				DHCP/v6 lease/hostfile
-leasetrigger	string				Lease trigger script
-loglevel	integer 6			Syslog level priority (0-7)
+Option			Type	Default			Description
+legacy			bool	0			Enable DHCPv4 if start but
+							no dhcpv4 option set
+maindhcp		bool	0			Use odhcpd as the main DHCPv4
+							service
+leasefile		string				DHCP/v6 lease/hostfile
+leasetrigger		string				Lease trigger script
+leasetrigger_mode	integer	0			Lease trigger mode
+			0: lease with hostname changed, 1: any lease changed
+loglevel		integer 6			Syslog level priority (0-7)
 
 
 Sections of type dhcp (configure DHCP / DHCPv6 / RA / NDP service)
diff --git a/src/config.c b/src/config.c
index 118349a..78488b7 100644
--- a/src/config.c
+++ b/src/config.c
@@ -20,8 +20,8 @@  static int reload_pipe[2];
 struct list_head leases = LIST_HEAD_INIT(leases);
 struct list_head interfaces = LIST_HEAD_INIT(interfaces);
 struct config config = {.legacy = false, .main_dhcpv4 = false,
-			.dhcp_cb = NULL, .dhcp_statefile = NULL,
-			.log_level = LOG_INFO};
+			.dhcp_cb = NULL, .dhcp_cb_mode = 0,
+			.dhcp_statefile = NULL, .log_level = LOG_INFO};
 
 enum {
 	IFACE_ATTR_INTERFACE,
@@ -149,6 +149,7 @@  enum {
 	ODHCPD_ATTR_MAINDHCP,
 	ODHCPD_ATTR_LEASEFILE,
 	ODHCPD_ATTR_LEASETRIGGER,
+	ODHCPD_ATTR_LEASETRIGGER_MODE,
 	ODHCPD_ATTR_LOGLEVEL,
 	ODHCPD_ATTR_MAX
 };
@@ -158,6 +159,7 @@  static const struct blobmsg_policy odhcpd_attrs[LEASE_ATTR_MAX] = {
 	[ODHCPD_ATTR_MAINDHCP] = { .name = "maindhcp", .type = BLOBMSG_TYPE_BOOL },
 	[ODHCPD_ATTR_LEASEFILE] = { .name = "leasefile", .type = BLOBMSG_TYPE_STRING },
 	[ODHCPD_ATTR_LEASETRIGGER] = { .name = "leasetrigger", .type = BLOBMSG_TYPE_STRING },
+	[ODHCPD_ATTR_LEASETRIGGER_MODE] = { .name = "leasetrigger_mode", .type = BLOBMSG_TYPE_INT32 },
 	[ODHCPD_ATTR_LOGLEVEL] = { .name = "loglevel", .type = BLOBMSG_TYPE_INT32 },
 };
 
@@ -290,6 +292,10 @@  static void set_config(struct uci_section *s)
 		config.dhcp_cb = strdup(blobmsg_get_string(c));
 	}
 
+	if ((c = tb[ODHCPD_ATTR_LEASETRIGGER_MODE])) {
+		config.dhcp_cb_mode = blobmsg_get_u32(c);
+	}
+
 	if ((c = tb[ODHCPD_ATTR_LOGLEVEL])) {
 		int log_level = (blobmsg_get_u32(c) & LOG_PRIMASK);
 
diff --git a/src/dhcpv6-ia.c b/src/dhcpv6-ia.c
index 4ee6dd2..e51be79 100644
--- a/src/dhcpv6-ia.c
+++ b/src/dhcpv6-ia.c
@@ -408,6 +408,9 @@  void dhcpv6_write_statefile(void)
 
 					ctxt.buf[ctxt.buf_idx - 1] = '\n';
 					fwrite(ctxt.buf, 1, ctxt.buf_idx, ctxt.fp);
+					if (config.dhcp_cb_mode > 0) {
+						md5_hash(ctxt.buf, ctxt.buf_idx, &ctxt.md5);
+					}
 				}
 			}
 
@@ -453,6 +456,9 @@  void dhcpv6_write_statefile(void)
 									"%s/32 ", ipbuf);
 					ctxt.buf[ctxt.buf_idx - 1] = '\n';
 					fwrite(ctxt.buf, 1, ctxt.buf_idx, ctxt.fp);
+					if (config.dhcp_cb_mode > 0) {
+						md5_hash(ctxt.buf, ctxt.buf_idx, &ctxt.md5);
+					}
 				}
 			}
 		}
diff --git a/src/odhcpd.h b/src/odhcpd.h
index 91fdcbf..0f23667 100644
--- a/src/odhcpd.h
+++ b/src/odhcpd.h
@@ -138,6 +138,7 @@  struct config {
 	bool legacy;
 	bool main_dhcpv4;
 	char *dhcp_cb;
+	int dhcp_cb_mode;
 	char *dhcp_statefile;
 	int log_level;
 } config;