diff options
| author | Christian Breunig <christian@breunig.cc> | 2024-03-16 09:46:53 +0100 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-16 09:46:53 +0100 | 
| commit | aea9bfb803c8943d289e939c9ec8185ffcc0985d (patch) | |
| tree | a38c0270b953c61ff02da477b159d172cfce611e | |
| parent | 828e94d7cb67caf5a3b0e9c275ba067998874c5e (diff) | |
| parent | 25b611f504521181f85cb4460bfdfd702c377b5e (diff) | |
| download | vyos-1x-aea9bfb803c8943d289e939c9ec8185ffcc0985d.tar.gz vyos-1x-aea9bfb803c8943d289e939c9ec8185ffcc0985d.zip | |
Merge pull request #3132 from sever-sever/T6121
T6121: Extend service config-sync to new sections
| -rw-r--r-- | interface-definitions/service_config-sync.xml.in | 394 | ||||
| -rwxr-xr-x | src/helpers/vyos_config_sync.py | 26 | 
2 files changed, 390 insertions, 30 deletions
| diff --git a/interface-definitions/service_config-sync.xml.in b/interface-definitions/service_config-sync.xml.in index 9955acfee..9e9dcdb69 100644 --- a/interface-definitions/service_config-sync.xml.in +++ b/interface-definitions/service_config-sync.xml.in @@ -73,30 +73,382 @@                </constraint>              </properties>            </leafNode> -          <leafNode name="section"> +          <node name="section">              <properties>                <help>Section for synchronization</help> -              <completionHelp> -                <list>nat nat66 firewall</list> -              </completionHelp> -              <valueHelp> -                <format>nat</format> -                <description>NAT</description> -              </valueHelp> -              <valueHelp> -                <format>nat66</format> -                <description>NAT66</description> -              </valueHelp> -              <valueHelp> -                <format>firewall</format> -                <description>firewall</description> -              </valueHelp> -              <constraint> -                <regex>(nat|nat66|firewall)</regex> -              </constraint> -              <multi/>              </properties> -          </leafNode> +            <children> +              <leafNode name="firewall"> +                <properties> +                  <help>Firewall</help> +                  <valueless/> +                </properties> +              </leafNode> +              <node name="interfaces"> +                <properties> +                  <help>Interfaces</help> +                </properties> +                <children> +                  <leafNode name="bonding"> +                    <properties> +                      <help>Bonding interface</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="bridge"> +                    <properties> +                      <help>Bridge interface</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="dummy"> +                    <properties> +                      <help>Dummy interface</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="ethernet"> +                    <properties> +                      <help>Ethernet interface</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="geneve"> +                    <properties> +                      <help>GENEVE interface</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="input"> +                    <properties> +                      <help>Input interface</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="l2tpv3"> +                    <properties> +                      <help>L2TPv3 interface</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="loopback"> +                    <properties> +                      <help>Loopback interface</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="macsec"> +                    <properties> +                      <help>MACsec interface</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="openvpn"> +                    <properties> +                      <help>OpenVPN interface</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="pppoe"> +                    <properties> +                      <help>PPPoE interface</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="pseudo-ethernet"> +                    <properties> +                      <help>Pseudo-Ethernet interface</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="sstpc"> +                    <properties> +                      <help>SSTP client interface</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="tunnel"> +                    <properties> +                      <help>Tunnel interface</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="virtual-ethernet"> +                    <properties> +                      <help>Virtual Ethernet interface</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="vti"> +                    <properties> +                      <help>Virtual tunnel interface</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="vxlan"> +                    <properties> +                      <help>VXLAN interface</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="wireguard"> +                    <properties> +                      <help>Wireguard interface</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="wireless"> +                    <properties> +                      <help>Wireless interface</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="wwan"> +                    <properties> +                      <help>WWAN interface</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                </children> +              </node> +              <leafNode name="nat"> +                <properties> +                  <help>NAT</help> +                  <valueless/> +                </properties> +              </leafNode> +              <leafNode name="nat66"> +                <properties> +                  <help>NAT66</help> +                  <valueless/> +                </properties> +              </leafNode> +              <leafNode name="pki"> +                <properties> +                  <help>Public key infrastructure (PKI)</help> +                  <valueless/> +                </properties> +              </leafNode> +              <leafNode name="policy"> +                <properties> +                  <help>Routing policy</help> +                  <valueless/> +                </properties> +              </leafNode> +              <node name="protocols"> +                <properties> +                  <help>Routing protocols</help> +                </properties> +                <children> +                  <leafNode name="babel"> +                    <properties> +                      <help>Babel Routing Protocol</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="bfd"> +                    <properties> +                      <help>Bidirectional Forwarding Detection (BFD)</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="bgp"> +                    <properties> +                      <help>Border Gateway Protocol (BGP)</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="failover"> +                    <properties> +                      <help>Failover route</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="igmp-proxy"> +                    <properties> +                      <help>Internet Group Management Protocol (IGMP) proxy</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="isis"> +                    <properties> +                      <help>Intermediate System to Intermediate System (IS-IS)</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="mpls"> +                    <properties> +                      <help>Multiprotocol Label Switching (MPLS)</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="nhrp"> +                    <properties> +                      <help>Next Hop Resolution Protocol (NHRP) parameters</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="ospf"> +                    <properties> +                      <help>Open Shortest Path First (OSPF)</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="ospfv3"> +                    <properties> +                      <help>Open Shortest Path First (OSPF) for IPv6</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="pim"> +                    <properties> +                      <help>Protocol Independent Multicast (PIM) and IGMP</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="pim6"> +                    <properties> +                      <help>Protocol Independent Multicast for IPv6 (PIMv6) and MLD</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="rip"> +                    <properties> +                      <help>Routing Information Protocol (RIP) parameters</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="ripng"> +                    <properties> +                      <help>Routing Information Protocol (RIPng) parameters</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="rpki"> +                    <properties> +                      <help>Resource Public Key Infrastructure (RPKI)</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="segment-routing"> +                    <properties> +                      <help>Segment Routing</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="static"> +                    <properties> +                      <help>Static Routing</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                </children> +              </node> +              <node name="service"> +                <properties> +                  <help>System services</help> +                </properties> +                <children> +                  <leafNode name="console-server"> +                    <properties> +                      <help>Serial Console Server</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="dhcp-relay"> +                    <properties> +                      <help>Host Configuration Protocol (DHCP) relay agent</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="dhcp-server"> +                    <properties> +                      <help>Dynamic Host Configuration Protocol (DHCP) for DHCP server</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="dhcpv6-relay"> +                    <properties> +                      <help>DHCPv6 Relay Agent parameters</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="dhcpv6-server"> +                    <properties> +                      <help>DHCP for IPv6 (DHCPv6) server</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="dns"> +                    <properties> +                      <help>Domain Name System (DNS) related services</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="lldp"> +                    <properties> +                      <help>LLDP settings</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="mdns"> +                    <properties> +                      <help>Multicast DNS (mDNS) parameters</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="monitoring"> +                    <properties> +                      <help>Monitoring services</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="ndp-proxy"> +                    <properties> +                      <help>Neighbor Discovery Protocol (NDP) Proxy</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="ntp"> +                    <properties> +                      <help>Network Time Protocol (NTP) configuration</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="snmp"> +                    <properties> +                      <help>Simple Network Management Protocol (SNMP)</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="tftp-server"> +                    <properties> +                      <help>Trivial File Transfer Protocol (TFTP) server</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                  <leafNode name="webproxy"> +                    <properties> +                      <help>Webproxy service settings</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                </children> +              </node> +              <leafNode name="vpn"> +                <properties> +                  <help>Virtual Private Network (VPN)</help> +                  <valueless/> +                </properties> +              </leafNode> +              <leafNode name="vrf"> +                <properties> +                  <help>Virtual Routing and Forwarding</help> +                  <valueless/> +                </properties> +              </leafNode> +            </children> +          </node>          </children>        </node>      </children> diff --git a/src/helpers/vyos_config_sync.py b/src/helpers/vyos_config_sync.py index 7cfa8fe88..572fea61f 100755 --- a/src/helpers/vyos_config_sync.py +++ b/src/helpers/vyos_config_sync.py @@ -1,6 +1,6 @@  #!/usr/bin/env python3  # -# Copyright (C) 2023 VyOS maintainers and contributors +# Copyright (C) 2023-2024 VyOS maintainers and contributors  #  # This program is free software; you can redistribute it and/or modify  # it under the terms of the GNU General Public License version 2 or later as @@ -60,6 +60,7 @@ def post_request(url: str,      return response +  def retrieve_config(section: str = None) -> Optional[Dict[str, Any]]:      """Retrieves the configuration from the local server. @@ -71,8 +72,6 @@ def retrieve_config(section: str = None) -> Optional[Dict[str, Any]]:      """      if section is None:          section = [] -    else: -        section = section.split()      conf = Config()      config = conf.get_config_dict(section, get_first_key=True) @@ -101,8 +100,6 @@ def set_remote_config(      if path is None:          path = [] -    else: -        path = path.split()      headers = {'Content-Type': 'application/json'}      # Disable the InsecureRequestWarning @@ -127,17 +124,16 @@ def set_remote_config(  def is_section_revised(section: str) -> bool:      from vyos.config_mgmt import is_node_revised -    return is_node_revised([section]) +    return is_node_revised(section)  def config_sync(secondary_address: str,                  secondary_key: str, -                sections: List[str], +                sections: List[list],                  mode: str):      """Retrieve a config section from primary router in JSON format and send it to         secondary router      """ -    # Config sync only if sections changed      if not any(map(is_section_revised, sections)):          return @@ -188,5 +184,17 @@ if __name__ == '__main__':              "Missing required configuration data for config synchronization.")          exit(0) +    # Generate list_sections of sections/subsections +    # [ +    #   ['interfaces', 'pseudo-ethernet'], ['interfaces', 'virtual-ethernet'], ['nat'], ['nat66'] +    # ] +    list_sections = [] +    for section, subsections in sections.items(): +        if subsections: +            for subsection in subsections: +                list_sections.append([section, subsection]) +        else: +            list_sections.append([section]) +      config_sync(secondary_address, secondary_key, -                sections, mode) +                list_sections, mode) | 
