|
Packit Service |
b23acc |
#!/usr/bin/env python
|
|
Packit Service |
b23acc |
# SPDX-License-Identifier: LGPL-2.1+
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
from __future__ import print_function
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
import os
|
|
Packit Service |
b23acc |
import sys
|
|
Packit Service |
b23acc |
import collections
|
|
Packit Service |
b23acc |
import xml.etree.ElementTree as ET
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
###############################################################################
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
_setting_name_order = [
|
|
Packit Service |
b23acc |
"connection",
|
|
Packit Service |
b23acc |
"6lowpan",
|
|
Packit Service |
b23acc |
"802-1x",
|
|
Packit Service |
b23acc |
"adsl",
|
|
Packit Service |
b23acc |
"bluetooth",
|
|
Packit Service |
b23acc |
"bond",
|
|
Packit Service |
b23acc |
"bridge",
|
|
Packit Service |
b23acc |
"bridge-port",
|
|
Packit Service |
b23acc |
"cdma",
|
|
Packit Service |
b23acc |
"dcb",
|
|
Packit Service |
b23acc |
"dummy",
|
|
Packit Service |
b23acc |
"ethtool",
|
|
Packit Service |
b23acc |
"generic",
|
|
Packit Service |
b23acc |
"gsm",
|
|
Packit Service |
b23acc |
"infiniband",
|
|
Packit Service |
b23acc |
"ipv4",
|
|
Packit Service |
b23acc |
"ipv6",
|
|
Packit Service |
b23acc |
"ip-tunnel",
|
|
Packit Service |
b23acc |
"macsec",
|
|
Packit Service |
b23acc |
"macvlan",
|
|
Packit Service |
b23acc |
"match",
|
|
Packit Service |
b23acc |
"802-11-olpc-mesh",
|
|
Packit Service |
b23acc |
"ovs-bridge",
|
|
Packit Service |
b23acc |
"ovs-dpdk",
|
|
Packit Service |
b23acc |
"ovs-interface",
|
|
Packit Service |
b23acc |
"ovs-patch",
|
|
Packit Service |
b23acc |
"ovs-port",
|
|
Packit Service |
b23acc |
"ppp",
|
|
Packit Service |
b23acc |
"pppoe",
|
|
Packit Service |
b23acc |
"proxy",
|
|
Packit Service |
b23acc |
"serial",
|
|
Packit Service |
b23acc |
"sriov",
|
|
Packit Service |
b23acc |
"tc",
|
|
Packit Service |
b23acc |
"team",
|
|
Packit Service |
b23acc |
"team-port",
|
|
Packit Service |
b23acc |
"tun",
|
|
Packit Service |
b23acc |
"user",
|
|
Packit Service |
b23acc |
"vlan",
|
|
Packit Service |
b23acc |
"vpn",
|
|
Packit Service |
b23acc |
"vrf",
|
|
Packit Service |
b23acc |
"vxlan",
|
|
Packit Service |
b23acc |
"wifi-p2p",
|
|
Packit Service |
b23acc |
"wimax",
|
|
Packit Service |
b23acc |
"802-3-ethernet",
|
|
Packit Service |
b23acc |
"wireguard",
|
|
Packit Service |
b23acc |
"802-11-wireless",
|
|
Packit Service |
b23acc |
"802-11-wireless-security",
|
|
Packit Service |
b23acc |
"wpan",
|
|
Packit Service |
b23acc |
]
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
def _setting_name_order_idx(name):
|
|
Packit Service |
b23acc |
try:
|
|
Packit Service |
b23acc |
return _setting_name_order.index(name)
|
|
Packit Service |
b23acc |
except ValueError:
|
|
Packit Service |
b23acc |
return len(_setting_name_order)
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
def key_fcn_setting_name(n1):
|
|
Packit Service |
b23acc |
return (_setting_name_order_idx(n1), n1)
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
def iter_keys_of_dicts(dicts, key=None):
|
|
Packit Service |
b23acc |
keys = set([k for d in dicts for k in d.keys()])
|
|
Packit Service |
b23acc |
return sorted(keys, key=key)
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
def node_to_dict(node, tag, key_attr):
|
|
Packit Service |
b23acc |
dictionary = collections.OrderedDict()
|
|
Packit Service |
b23acc |
if node is not None:
|
|
Packit Service |
b23acc |
for n in node.iter(tag):
|
|
Packit Service |
b23acc |
k = n.get(key_attr)
|
|
Packit Service |
b23acc |
assert k is not None
|
|
Packit Service |
b23acc |
dictionary[k] = n
|
|
Packit Service |
b23acc |
return dictionary
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
def node_get_attr(nodes, name):
|
|
Packit Service |
b23acc |
for n in nodes:
|
|
Packit Service |
b23acc |
if n is None:
|
|
Packit Service |
b23acc |
continue
|
|
Packit Service |
b23acc |
x = n.get(name, None)
|
|
Packit Service |
b23acc |
if x:
|
|
Packit Service |
b23acc |
return x
|
|
Packit Service |
b23acc |
return None
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
def node_set_attr(dst_node, name, nodes):
|
|
Packit Service |
b23acc |
x = node_get_attr(nodes, name)
|
|
Packit Service |
b23acc |
if x:
|
|
Packit Service |
b23acc |
dst_node.set(name, x)
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
###############################################################################
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
gl_only_from_first = False
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
argv = list(sys.argv[1:])
|
|
Packit Service |
b23acc |
while True:
|
|
Packit Service |
b23acc |
if argv[0] == "--only-from-first":
|
|
Packit Service |
b23acc |
gl_only_from_first = True
|
|
Packit Service |
b23acc |
del argv[0]
|
|
Packit Service |
b23acc |
continue
|
|
Packit Service |
b23acc |
break
|
|
Packit Service |
b23acc |
if len(argv) < 2:
|
|
Packit Service |
b23acc |
print("%s [--only-from-first] [OUT_FILE] [SETTING_XML [...]]" % (sys.argv[0]))
|
|
Packit Service |
b23acc |
exit(1)
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
gl_output_xml_file = argv[0]
|
|
Packit Service |
b23acc |
gl_input_files = list(argv[1:])
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
###############################################################################
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
xml_roots = list([ET.parse(f).getroot() for f in gl_input_files])
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
assert all([root.tag == "nm-setting-docs" for root in xml_roots])
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
settings_roots = list([node_to_dict(root, "setting", "name") for root in xml_roots])
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
root_node = ET.Element("nm-setting-docs")
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
for setting_name in iter_keys_of_dicts(settings_roots, key_fcn_setting_name):
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
settings = list([d.get(setting_name) for d in settings_roots])
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if gl_only_from_first and settings[0] is None:
|
|
Packit Service |
b23acc |
continue
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
properties = list([node_to_dict(s, "property", "name") for s in settings])
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if gl_only_from_first and not properties[0]:
|
|
Packit Service |
b23acc |
continue
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
setting_node = ET.SubElement(root_node, "setting")
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
setting_node.set("name", setting_name)
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
node_set_attr(setting_node, "description", settings)
|
|
Packit Service |
b23acc |
node_set_attr(setting_node, "name_upper", settings)
|
|
Packit Service |
b23acc |
node_set_attr(setting_node, "alias", settings)
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
for property_name in iter_keys_of_dicts(properties):
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
properties_attrs = list([p.get(property_name) for p in properties])
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if gl_only_from_first and properties_attrs[0] is None:
|
|
Packit Service |
b23acc |
continue
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
property_node = ET.SubElement(setting_node, "property")
|
|
Packit Service |
b23acc |
property_node.set("name", property_name)
|
|
Packit Service |
b23acc |
property_node.set("name_upper", property_name.upper().replace("-", "_"))
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
x = node_get_attr(properties_attrs, "format")
|
|
Packit Service |
b23acc |
if x:
|
|
Packit Service |
b23acc |
property_node.set("type", x)
|
|
Packit Service |
b23acc |
else:
|
|
Packit Service |
b23acc |
node_set_attr(property_node, "type", properties_attrs)
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
node_set_attr(property_node, "default", properties_attrs)
|
|
Packit Service |
b23acc |
node_set_attr(property_node, "description", properties_attrs)
|
|
Packit Service |
b23acc |
node_set_attr(property_node, "alias", properties_attrs)
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
ET.ElementTree(root_node).write(gl_output_xml_file)
|