1"""
2Utilities for managing Debian preseed
3
4.. versionadded:: 2015.8.0
5"""
6
7import shlex
8
9import salt.utils.files
10import salt.utils.stringutils
11import salt.utils.yaml
12
13
14def mksls(src, dst=None):
15    """
16    Convert a preseed file to an SLS file
17    """
18    ps_opts = {}
19    with salt.utils.files.fopen(src, "r") as fh_:
20        for line in fh_:
21            line = salt.utils.stringutils.to_unicode(line)
22            if line.startswith("#"):
23                continue
24            if not line.strip():
25                continue
26
27            comps = shlex.split(line)
28            if comps[0] not in ps_opts.keys():
29                ps_opts[comps[0]] = {}
30            cmds = comps[1].split("/")
31
32            pointer = ps_opts[comps[0]]
33            for cmd in cmds:
34                pointer = pointer.setdefault(cmd, {})
35
36            pointer["type"] = comps[2]
37            if len(comps) > 3:
38                pointer["argument"] = comps[3]
39
40    sls = {}
41
42    # Set language
43    # ( This looks like it maps to something else )
44    sls[ps_opts["d-i"]["languagechooser"]["language-name-fb"]["argument"]] = {
45        "locale": ["system"]
46    }
47
48    # Set keyboard
49    # ( This looks like it maps to something else )
50    sls[ps_opts["d-i"]["kbd-chooser"]["method"]["argument"]] = {"keyboard": ["system"]}
51
52    # Set timezone
53    timezone = ps_opts["d-i"]["time"]["zone"]["argument"]
54    sls[timezone] = {"timezone": ["system"]}
55    if ps_opts["d-i"]["tzconfig"]["gmt"]["argument"] == "true":
56        sls[timezone]["timezone"].append("utc")
57
58    # Set network
59    if "netcfg" in ps_opts["d-i"].keys():
60        iface = ps_opts["d-i"]["netcfg"]["choose_interface"]["argument"]
61        sls[iface] = {}
62        sls[iface]["enabled"] = True
63        if ps_opts["d-i"]["netcfg"]["confirm_static"] == "true":
64            sls[iface]["proto"] = "static"
65        elif ps_opts["d-i"]["netcfg"]["disable_dhcp"] == "false":
66            sls[iface]["proto"] = "dhcp"
67        sls[iface]["netmask"] = ps_opts["d-i"]["netcfg"]["get_netmask"]["argument"]
68        sls[iface]["domain"] = ps_opts["d-i"]["netcfg"]["get_domain"]["argument"]
69        sls[iface]["gateway"] = ps_opts["d-i"]["netcfg"]["get_gateway"]["argument"]
70        sls[iface]["hostname"] = ps_opts["d-i"]["netcfg"]["get_hostname"]["argument"]
71        sls[iface]["ipaddress"] = ps_opts["d-i"]["netcfg"]["get_ipaddress"]["argument"]
72        sls[iface]["nameservers"] = ps_opts["d-i"]["netcfg"]["get_nameservers"][
73            "argument"
74        ]
75
76    if dst is not None:
77        with salt.utils.files.fopen(dst, "w") as fh_:
78            salt.utils.yaml.safe_dump(sls, fh_, default_flow_style=False)
79    else:
80        return salt.utils.yaml.safe_dump(sls, default_flow_style=False)
81