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

251 Zeilen
8.0 KiB
Python

#!/usr/bin/python3
import pathlib
2024-03-11 19:41:12 +00:00
from typing import List, Optional, Union
2024-02-11 13:35:00 +00:00
try:
2024-02-11 13:39:52 +00:00
from ansible_module.module_utils.generic import SYSTEMD_NETWORK_CONFIG, Types, modspec, systemdbool
from ansible_module.module_utils.module import SystemdUnitModule
2024-02-11 13:35:00 +00:00
except ImportError:
2024-02-11 19:59:50 +00:00
from ansible_collections.sebastian.base.plugins.module_utils.generic import SYSTEMD_NETWORK_CONFIG, Types, modspec, systemdbool
from ansible_collections.sebastian.base.plugins.module_utils.module import SystemdUnitModule
2023-04-15 22:10:13 +00:00
2023-04-23 08:32:42 +00:00
class Module(SystemdUnitModule): # type: ignore
"""Sets up the systemd network unit"""
2023-04-20 20:09:58 +00:00
name = "network"
2023-04-23 08:32:42 +00:00
module_spec = modspec(
argument_spec=dict(
mac=Types.str(help="The MAC-Address of the device. An ! before the value matches anything but this value."),
device=Types.str(help="The name of the network device. An ! before the value matches anything but this value."),
virtualization=Types.str(help="The virtualization type. An ! before the value matches anything but this value."),
2023-04-15 10:37:03 +00:00
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(
2023-04-23 08:32:42 +00:00
help="if the Domainqueries should require DNSSEC or not.\nIf its missing, domains that have DNSSEC enabled will be validated, all others it will be assumed to be okay."
2023-04-20 20:09:58 +00:00
),
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",
),
2023-11-23 18:08:51 +00:00
masquerade=Types.str(
help="how the packets are modified to look like the come from the computer itself.",
choices=("true", "false", "both", "ipv4", "ipv6", "no"),
2023-11-23 18:08:51 +00:00
),
),
required_if=(("defaultdns", True, ("dns",), False),),
required_one_of=(("mac", "device", "virtualization"),),
)
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 = self._unit(
self.match(),
self.network(),
self.addresses(),
self.routes(),
)
return self.__unit
def match(self) -> Optional[str]:
matches = self.map_param(
mac="MACAddress",
device="Name",
virtualization="Virtualization",
)
if len(matches) == 0:
return None
return "[Match]\n" + "".join(matches)
def network(self) -> Optional[str]:
options = []
if self.get("description", None) is None:
options.append("Description={}".format(self.get("description")))
server: str
for server in self.get("dns", []):
options.append(f"DNS={server}")
options.append("DNSDefaultRoute={}".format(self.get("defaultdns", False)))
if self.get("domain", False):
options.append("Domains={}".format(" ".join(self.get("domain"))))
2023-04-21 18:49:07 +00:00
options.append("DNSOverTLS={}".format(systemdbool(self.get("dot", "opportunistic"))))
options.append("DNSSEC={}".format(systemdbool(self.get("dnssec", "allow-downgrade"))))
if self.get("masquerade", None) is not None:
masquerade: str = self.get("masquerade")
2023-11-23 18:08:51 +00:00
if masquerade == "true":
masquerade = "both"
elif masquerade == "false":
masquerade = "no"
options.append(f"IPMasquerade={masquerade}")
if len(options) == 0:
return None
return "[Network]\n" + "".join(options)
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) -> Optional[str]:
output = []
routes: list[str] = self.get("route", [])
for gw in routes:
output.append(f"[Route]\nGateway={gw}\nGatewayOnLink=yes\nQuickAck=yes\n")
if len(output) == 0:
return None
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:
2023-04-21 15:32:28 +00:00
- An description for programs that access systemd
2023-04-15 10:37:03 +00:00
required: false
type: str
device:
description:
- The name of the network device. An ! before the value matches anything but this
value.
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-23 08:32:42 +00:00
description:
- 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.
required: false
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. An ! before the value matches anything but this
value.
2023-04-15 10:37:03 +00:00
required: false
type: str
2023-11-23 18:08:51 +00:00
masquerade:
choices:
- 'true'
- 'false'
- both
- ipv4
- ipv6
- 'no'
2023-11-23 18:08:51 +00:00
description:
- how the packets are modified to look like the come from the computer itself.
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
virtualization:
description:
- The virtualization type. An ! before the value matches anything but this value.
required: false
type: str
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()()