1
0
Fork 0
ansible-systemd/plugins/modules/network.py

232 Zeilen
6.7 KiB
Python

#!/usr/bin/python3
import pathlib
from typing import List, Union
2023-04-15 22:10:13 +00:00
try:
2023-04-20 22:17:36 +00:00
from ansible_collections.sebastian.systemd.plugins.module_utils.generic import SYSTEMD_NETWORK_CONFIG, Types
from ansible_collections.sebastian.systemd.plugins.module_utils.module import SystemdUnitModule
2023-04-15 22:10:13 +00:00
except ImportError:
2023-04-20 20:09:58 +00:00
from plugins.module_utils.generic import SYSTEMD_NETWORK_CONFIG, Types
2023-04-15 22:10:13 +00:00
from plugins.module_utils.module import SystemdUnitModule
def boolconvert(b: Union[bool, str]) -> str:
if b is True:
return "yes"
elif b is False:
return "no"
return b
class Module(SystemdUnitModule):
"""Sets up the systemd network unit"""
2023-04-20 20:09:58 +00:00
name = "network"
module_spec = dict(
argument_spec=dict(
2023-04-15 10:37:03 +00:00
mac=Types.str(help="The MAC-Address of the device"),
device=Types.str(help="The name of the network device"),
name=Types.str(required=True, help="name of the unit"),
2023-04-20 22:17:36 +00:00
dot=Types.bool(help="if DNS-over-TLS should be required or disabled. If it is unset, it will used if the server supports it"),
2023-04-20 20:09:58 +00:00
dnssec=Types.bool(
"if the Domainqueries should require DNSSEC or not. If its missing, domains that have DNSSEC enabled will be validated, all others it will be assumed to be okay."
),
2023-04-15 10:37:03 +00:00
dns=Types.list(elements=str, help="List of DNS-Servers"),
2023-04-20 22:17:36 +00:00
domain=Types.list(elements=str, help="List of domains that are on this device"),
2023-04-20 20:09:58 +00:00
defaultdns=Types.bool(
help="If the DNS-Server(s) on this device should be used for all domains that are not set on other devices"
),
2023-04-20 22:17:36 +00:00
address=Types.list(elements=str, required=True, help="IP-Addresses of this networkdevice"),
2023-04-20 20:09:58 +00:00
route=Types.list(
elements=str,
help="Routes of networks that can be reached with this device",
),
),
required_if=(("defaultdns", True, ("dns",), False),),
required_one_of=(("mac", "device"),),
)
def prepare(self):
2023-04-20 22:17:36 +00:00
self.unitfile = SYSTEMD_NETWORK_CONFIG.joinpath(self.get("name")).with_suffix(".network")
self.__unit = None
def unit(self) -> str:
if self.__unit is None:
self.__unit = "\n".join(
(
self.match(),
self.network(),
self.addresses(),
self.routes(),
)
)
return self.__unit
def match(self) -> str:
matches = []
if self.get("mac", False):
matches.append("MACAddress={}\n".format(self.get("mac")))
if self.get("device", False):
matches.append("Name={}\n".format(self.get("device")))
return "[Match]\n" + "".join(matches)
def network(self) -> str:
output = "[Network]\n"
options = []
try:
options.append("Description={}".format(self.get("description")))
except KeyError:
pass
try:
for server in self.get("dns", []):
options.append(f"DNS={server}")
options.append("DNSDefaultRoute={}".format(self.get("defaultdns", False)))
except KeyError:
pass
try:
domain = self.get("domain")
self.set("domainlog", str(domain))
options.append("Domains={}".format(" ".join(domain)))
2023-04-20 22:17:36 +00:00
options.append("DNSOverTLS={}".format(boolconvert(self.get("dot", "opportunistic"))))
options.append("DNSSEC={}".format(boolconvert(self.get("dnssec", "allow-downgrade"))))
except KeyError:
pass
output += "\n".join(options)
return output
def addresses(self) -> str:
output = []
for address in self.get("address"):
output.append(f"[Address]\nAddress={address}\n")
return "\n".join(output)
def routes(self) -> str:
output = []
routes = self.get("route", [])
self.set("routes", routes)
for gw in routes:
output.append(f"[Route]\nGateway={gw}\nGatewayOnLink=yes\nQuickAck=yes\n")
self.set("routes", output)
return "\n".join(output)
DOCUMENTATION = """---
description:
- Sets up the systemd network unit
2023-04-20 20:09:58 +00:00
module: network
options:
address:
2023-04-15 10:37:03 +00:00
description:
- IP-Addresses of this networkdevice
elements: str
required: true
type: list
2023-04-20 22:19:35 +00:00
after:
default: []
description:
- list of units that this unit wants to be started after this unit
elements: str
required: false
type: list
before:
default: []
description:
- list of units that this unit needs to be started before this unit.
elements: str
required: false
type: list
defaultdns:
2023-04-15 10:37:03 +00:00
description:
- If the DNS-Server(s) on this device should be used for all domains that are
not set on other devices
required: false
type: bool
description:
2023-04-15 10:37:03 +00:00
description:
- An optional description
required: false
type: str
device:
description:
- The name of the network device
required: false
type: str
dns:
default: []
2023-04-15 10:37:03 +00:00
description:
- List of DNS-Servers
elements: str
required: false
type: list
dnssec:
2023-04-15 10:37:03 +00:00
required: true
type: bool
2023-04-20 22:19:35 +00:00
documentation:
default: []
description:
- Paths where documentation can be found
elements: str
required: false
type: list
domain:
default: []
2023-04-15 10:37:03 +00:00
description:
- List of domains that are on this device
elements: str
required: false
type: list
dot:
2023-04-15 10:37:03 +00:00
description:
- if DNS-over-TLS should be required or disabled. If it is unset, it will used
if the server supports it
required: false
type: bool
2023-04-15 10:37:03 +00:00
mac:
description:
- The MAC-Address of the device
required: false
type: str
name:
2023-04-15 10:37:03 +00:00
description:
- name of the unit
required: true
type: str
2023-04-20 22:19:35 +00:00
partof:
default: []
description:
- list of units that this unit is part of.
- If the restart this unit does it too, but if this restarts it does not affect
the other units.
elements: str
required: false
type: list
requires:
default: []
description:
- list of units that this unit requires. If it fails or can't be started this
unit fails. without before/after this is started at the same time
elements: str
required: false
type: list
route:
default: []
2023-04-15 10:37:03 +00:00
description:
- Routes of networks that can be reached with this device
elements: str
required: false
type: list
2023-04-20 22:19:35 +00:00
wants:
default: []
description:
- list of units that this unit wants. If it fails or can't be started it does
not affect this unit
elements: str
required: false
type: list
short_description: Sets up the systemd network unit
"""
if __name__ == "__main__":
Module()()