[group:dhcpmon] programs= {%- set add_preceding_comma = { 'flag': False } %} {% set monitor_instance = { 'flag': False } %} {% for vlan_name in vlan_list %} {% if VLAN and vlan_name in VLAN and VLAN[vlan_name]['dhcp_servers'] %} {% set _dummy = monitor_instance.update({'flag': True}) %} {%- endif %} {% if VLAN and vlan_name in VLAN and 'dhcpv6_servers' in VLAN[vlan_name] %} {% set _dummy = monitor_instance.update({'flag': True}) %} {% endif %} {% if monitor_instance.flag %} {% if add_preceding_comma.flag %},{% endif %} {% set _dummy = add_preceding_comma.update({'flag': True}) %} dhcpmon-{{ vlan_name }} {%- set _dummy = monitor_instance.update({'flag': False}) %} {%- endif %} {% endfor %} {# Create a program entry for each DHCP MONitor instance #} {% set relay_for_ipv4 = { 'flag': False } %} {% set relay_for_ipv6 = { 'flag': False } %} {% for vlan_name in vlan_list %} {# Check DHCPv4 agents #} {% if VLAN and vlan_name in VLAN and VLAN[vlan_name]['dhcp_servers'] %} {% for dhcp_server in VLAN[vlan_name]['dhcp_servers'] %} {% if dhcp_server | ipv4 %} {% set _dummy = relay_for_ipv4.update({'flag': True}) %} {% endif %} {% endfor %} {% endif %} {# Check DHCPv6 agents #} {% if VLAN and vlan_name in VLAN and 'dhcpv6_servers' in VLAN[vlan_name] %} {% for dhcpv6_server in VLAN[vlan_name]['dhcpv6_servers'] %} {% if dhcpv6_server | ipv6 %} {% set _dummy = relay_for_ipv6.update({'flag': True}) %} {% endif %} {% endfor %} {% endif %} {% if relay_for_ipv4.flag %} {% set _dummy = relay_for_ipv4.update({'flag': False}) %} {% if relay_for_ipv6.flag %} {% set _dummy = relay_for_ipv6.update({'flag': False}) %} [program:dhcpmon-{{ vlan_name }}] {# We treat this VLAN as a downstream interface (-id), as we only want to listen for requests #} command=/usr/sbin/dhcpmon -id {{ vlan_name }} {#- We treat all other interfaces as upstream interfaces (-iu), as we only want to listen for replies #} {% for (name, prefix) in VLAN_INTERFACE %} {% if prefix | ipv4 and name != vlan_name %} -iu {{ name }}{% endif -%} {% endfor %} {% for (name, prefix) in INTERFACE %} {% if prefix | ipv4 %} -iu {{ name }}{% endif -%} {% endfor %} {% for (name, prefix) in PORTCHANNEL_INTERFACE %} {% if prefix | ipv4 %} -iu {{ name }}{% endif -%} {% endfor %} {% if MGMT_INTERFACE %} {% for (name, prefix) in MGMT_INTERFACE %} {% if prefix | ipv4 %} -im {{ name }}{% endif -%} {% endfor %} {% endif %} {% if relay_for_ipv4.flag %} -4{% endif %} {% if relay_for_ipv6.flag %} -6{% endif %} priority=4 autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog {% set _dummy = relay_for_ipv4.update({'flag': False}) %} {% set _dummy = relay_for_ipv6.update({'flag': False}) %} {% endif %} {% endif %} {% endfor %}