2023-04-14 22:58:51 +00:00
#!/usr/bin/python3
import pathlib
from typing import List , Union
2023-04-15 22:10:13 +00:00
try :
2023-04-23 08:32:42 +00:00
from ansible_collections . sebastian . systemd . plugins . module_utils . generic import SYSTEMD_NETWORK_CONFIG , Types , modspec , systemdbool
from ansible_collections . sebastian . systemd . plugins . module_utils . module import SystemdUnitModule
2023-04-15 22:10:13 +00:00
except ImportError :
2023-04-23 08:32:42 +00:00
from plugins . module_utils . generic import SYSTEMD_NETWORK_CONFIG , Types , modspec , systemdbool
2023-04-15 22:10:13 +00:00
from plugins . module_utils . module import SystemdUnitModule
2023-04-14 22:58:51 +00:00
2023-04-23 08:32:42 +00:00
class Module ( SystemdUnitModule ) : # type: ignore
2023-04-14 22:58:51 +00:00
""" 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 (
2023-04-14 22:58:51 +00:00
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 (
2023-04-23 08:32:42 +00:00
help = " if the Domainqueries should require DNSSEC or not. \n If 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-04-14 22:58:51 +00:00
) ,
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 " )
2023-04-14 22:58:51 +00:00
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-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 " ) ) ) )
2023-04-14 22:58:51 +00:00
except KeyError :
pass
output + = " \n " . join ( options )
return output
def addresses ( self ) - > str :
output = [ ]
for address in self . get ( " address " ) :
output . append ( f " [Address] \n Address= { 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] \n Gateway= { gw } \n GatewayOnLink=yes \n QuickAck=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
2023-04-14 22:58:51 +00:00
options :
address :
2023-04-15 10:37:03 +00:00
description :
- IP - Addresses of this networkdevice
2023-04-14 22:58:51 +00:00
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
2023-04-14 22:58:51 +00:00
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
2023-04-14 22:58:51 +00:00
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
2023-04-14 22:58:51 +00:00
required : false
type : str
dns :
default : [ ]
2023-04-15 10:37:03 +00:00
description :
- List of DNS - Servers
2023-04-14 22:58:51 +00:00
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
2023-04-14 22:58:51 +00:00
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
2023-04-14 22:58:51 +00:00
domain :
default : [ ]
2023-04-15 10:37:03 +00:00
description :
- List of domains that are on this device
2023-04-14 22:58:51 +00:00
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
2023-04-14 22:58:51 +00:00
required : false
type : bool
2023-04-15 10:37:03 +00:00
mac :
description :
- The MAC - Address of the device
required : false
type : str
2023-04-14 22:58:51 +00:00
name :
2023-04-15 10:37:03 +00:00
description :
- name of the unit
2023-04-14 22:58:51 +00:00
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
2023-04-14 22:58:51 +00:00
route :
default : [ ]
2023-04-15 10:37:03 +00:00
description :
- Routes of networks that can be reached with this device
2023-04-14 22:58:51 +00:00
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
2023-04-14 22:58:51 +00:00
short_description : Sets up the systemd network unit
"""
if __name__ == " __main__ " :
Module ( ) ( )