1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
from __future__ import annotations
from dataclasses import dataclass
from enum import Enum
from typing import List, Optional, Dict
from ... import log
class NicType(str, Enum):
ISO = "iso"
NM = "nm"
MANUAL = "manual"
@dataclass
class NetworkConfiguration:
type: NicType
iface: str = None
ip: str = None
dhcp: bool = True
gateway: str = None
dns: List[str] = None
def __str__(self):
if self.is_iso():
return "Copy ISO configuration"
elif self.is_network_manager():
return "Use NetworkManager"
elif self.is_manual():
if self.dhcp:
return f'iface={self.iface}, dhcp=auto'
else:
return f'iface={self.iface}, ip={self.ip}, dhcp=staticIp, gateway={self.gateway}, dns={self.dns}'
else:
return 'Unknown type'
# for json serialization when calling json.dumps(...) on this class
def json(self):
return self.__dict__
@classmethod
def parse_arguments(cls, config: Dict[str, str]) -> Optional["NetworkConfiguration"]:
nic_type = config.get('type', None)
if not nic_type:
return None
try:
type = NicType(nic_type)
except ValueError:
options = [e.value for e in NicType]
log(_('Unknown nic type: {}. Possible values are {}').format(nic_type, options), fg='red')
exit(1)
if type == NicType.MANUAL:
if config.get('dhcp', False) or not any([config.get(v) for v in ['ip', 'gateway', 'dns']]):
return NetworkConfiguration(type, iface=config.get('iface', ''))
ip = config.get('ip', '')
if not ip:
log('Manual nic configuration with no auto DHCP requires an IP address', fg='red')
exit(1)
return NetworkConfiguration(
type,
iface=config.get('iface', ''),
ip=ip,
gateway=config.get('gateway', ''),
dns=config.get('dns', []),
dhcp=False
)
else:
return NetworkConfiguration(type)
def is_iso(self) -> bool:
return self.type == NicType.ISO
def is_network_manager(self) -> bool:
return self.type == NicType.NM
def is_manual(self) -> bool:
return self.type == NicType.MANUAL
def config_installer(self, installation: 'Installer'):
# If user selected to copy the current ISO network configuration
# Perform a copy of the config
if self.is_iso():
installation.copy_iso_network_config(enable_services=True) # Sources the ISO network configuration to the install medium.
elif self.is_network_manager():
installation.add_additional_packages("networkmanager")
installation.enable_service('NetworkManager.service')
# Otherwise, if a interface was selected, configure that interface
elif self.is_manual():
installation.configure_nic(self)
installation.enable_service('systemd-networkd')
installation.enable_service('systemd-resolved')
|