From 63f75ddbd948852f911239d672021bd5473bb16d Mon Sep 17 00:00:00 2001
From: Nicolas Fort <nicolasfort1988@gmail.com>
Date: Thu, 13 Jul 2023 11:01:34 +0000
Subject: T5059: relay: add disable options for dhcp-relay and dhcpv6-relay.
 Also add validor for dhcpv6-relay which was missing.

---
 interface-definitions/dhcp-relay.xml.in   | 1 +
 interface-definitions/dhcpv6-relay.xml.in | 1 +
 src/conf_mode/dhcp_relay.py               | 6 +++---
 src/conf_mode/dhcpv6_relay.py             | 9 +++++----
 4 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/interface-definitions/dhcp-relay.xml.in b/interface-definitions/dhcp-relay.xml.in
index 2a2597dd5..42715c9bb 100644
--- a/interface-definitions/dhcp-relay.xml.in
+++ b/interface-definitions/dhcp-relay.xml.in
@@ -9,6 +9,7 @@
           <priority>910</priority>
         </properties>
         <children>
+          #include <include/generic-disable-node.xml.i>
           #include <include/generic-interface-multi-broadcast.xml.i>
           <leafNode name="listen-interface">
             <properties>
diff --git a/interface-definitions/dhcpv6-relay.xml.in b/interface-definitions/dhcpv6-relay.xml.in
index 947adef75..a80317609 100644
--- a/interface-definitions/dhcpv6-relay.xml.in
+++ b/interface-definitions/dhcpv6-relay.xml.in
@@ -9,6 +9,7 @@
           <priority>900</priority>
         </properties>
         <children>
+          #include <include/generic-disable-node.xml.i>
           <tagNode name="listen-interface">
             <properties>
               <help>Interface for DHCPv6 Relay Agent to listen for requests</help>
diff --git a/src/conf_mode/dhcp_relay.py b/src/conf_mode/dhcp_relay.py
index 7e702a446..7322cc571 100755
--- a/src/conf_mode/dhcp_relay.py
+++ b/src/conf_mode/dhcp_relay.py
@@ -51,7 +51,7 @@ def get_config(config=None):
 
 def verify(relay):
     # bail out early - looks like removal from running config
-    if not relay:
+    if not relay or 'disable' in relay:
         return None
 
     if 'lo' in (dict_search('interface', relay) or []):
@@ -78,7 +78,7 @@ def verify(relay):
 
 def generate(relay):
     # bail out early - looks like removal from running config
-    if not relay:
+    if not relay or 'disable' in relay:
         return None
 
     render(config_file, 'dhcp-relay/dhcrelay.conf.j2', relay)
@@ -87,7 +87,7 @@ def generate(relay):
 def apply(relay):
     # bail out early - looks like removal from running config
     service_name = 'isc-dhcp-relay.service'
-    if not relay:
+    if not relay or 'disable' in relay:
         call(f'systemctl stop {service_name}')
         if os.path.exists(config_file):
             os.unlink(config_file)
diff --git a/src/conf_mode/dhcpv6_relay.py b/src/conf_mode/dhcpv6_relay.py
index c1bd51f62..9d6597455 100755
--- a/src/conf_mode/dhcpv6_relay.py
+++ b/src/conf_mode/dhcpv6_relay.py
@@ -22,6 +22,7 @@ from vyos.config import Config
 from vyos.configdict import dict_merge
 from vyos.ifconfig import Interface
 from vyos.template import render
+from vyos.template import is_ipv6
 from vyos.util import call
 from vyos.util import dict_search
 from vyos.validate import is_ipv6_link_local
@@ -51,7 +52,7 @@ def get_config(config=None):
 
 def verify(relay):
     # bail out early - looks like removal from running config
-    if not relay:
+    if not relay or 'disable' in relay:
         return None
 
     if 'upstream_interface' not in relay:
@@ -69,7 +70,7 @@ def verify(relay):
     for interface in relay['listen_interface']:
         has_global = False
         for addr in Interface(interface).get_addr():
-            if not is_ipv6_link_local(addr):
+            if is_ipv6(addr) and not is_ipv6_link_local(addr):
                 has_global = True
         if not has_global:
             raise ConfigError(f'Interface {interface} does not have global '\
@@ -79,7 +80,7 @@ def verify(relay):
 
 def generate(relay):
     # bail out early - looks like removal from running config
-    if not relay:
+    if not relay or 'disable' in relay:
         return None
 
     render(config_file, 'dhcp-relay/dhcrelay6.conf.j2', relay)
@@ -88,7 +89,7 @@ def generate(relay):
 def apply(relay):
     # bail out early - looks like removal from running config
     service_name = 'isc-dhcp-relay6.service'
-    if not relay:
+    if not relay or 'disable' in relay:
         # DHCPv6 relay support is removed in the commit
         call(f'systemctl stop {service_name}')
         if os.path.exists(config_file):
-- 
cgit v1.2.3