first version of dhcp settings

create /etc/dhcp/dhcpd.conf in install.py

+ new cfg file for apuslave3
This commit is contained in:
2021-11-26 15:42:42 +01:00
parent aa0d39d18c
commit 4ce7c3a9d3
2 changed files with 65 additions and 7 deletions

View File

@ -27,6 +27,19 @@ enp4s0=dhcp
3001=192.168.127.254:3001 3001=192.168.127.254:3001
""" """
DHCP_HEADER = """
default-lease-time 600;
max-lease-time 7200;
authoritative;
"""
DHCP_ITEM = """
subnet %s netmask %s {
option routers %s;
option subnet-mask %s;
range %s %s;
}
"""
def write_when_new(filename, content, doit): def write_when_new(filename, content, doit):
if not content.endswith('\n'): if not content.endswith('\n'):
@ -38,6 +51,12 @@ def write_when_new(filename, content, doit):
if doit: if doit:
with open(filename, 'w') as fil: with open(filename, 'w') as fil:
fil.write(content) fil.write(content)
else:
print('===')
print(old)
print('---')
print(content)
print('===')
return True return True
@ -57,17 +76,44 @@ def create_if(name, cfg, mac):
elif cfg == 'dhcp': elif cfg == 'dhcp':
result['BOOTPROTO']='dhcp' result['BOOTPROTO']='dhcp'
else: else:
interface = IPv4Interface(cfg) error = None
if '/' not in cfg: cfgdict = {'own': cfg, 'prefix': '', 'other': ''}
if ':' in cfg:
for cfgitem in cfg.split(','):
k, _, v = cfgitem.partition(':')
k = k.strip()
if k not in cfgdict:
error = 'bad formed'
cfgdict[k] = v.strip()
ownip, _, prefix = cfgdict['own'].partition('/')
prefix = cfgdict['prefix'] or prefix
if prefix:
try:
prefix = int(prefix)
if not 16 <= prefix < 32:
error = 'illegal prefix in'
except ValueError:
error = 'illegal prefix in'
if error:
print('Allowed forms:\n')
print('%s=n.n.n.n/24' % name)
print('%s=prefix:24,own:n.n.n.n,other:m.m.m.m\n' % name)
raise ValueError('%s network config: %s=%s' % (error, name, cfg))
if not prefix:
interface = IPv4Interface(ownip)
if interface < IPv4Interface('128.0.0.0'): if interface < IPv4Interface('128.0.0.0'):
cfg += '/8' prefix = 8
elif interface < IPv4Interface('192.0.0.0'): elif interface < IPv4Interface('192.0.0.0'):
cfg += '/16' prefix = 16
else: else:
cfg += '/24' prefix = 24
interface = IPv4Interface(cfg) interface = IPv4Interface('%s/%d' % (ownip, prefix))
result['IPADDR'], result['NETMASK'] = interface.with_netmask.split('/') result['IPADDR'], result['NETMASK'] = interface.with_netmask.split('/')
_, result['PREFIX'] = interface.with_prefixlen.split('/') _, result['PREFIX'] = interface.with_prefixlen.split('/')
other = cfgdict['other']
if other:
adrs = cfgdict['other'].split('-')
result['dhcprange'] = (adrs[0], adrs[-1])
return result return result
@ -180,18 +226,30 @@ def network(doit):
return False return False
ifname = '' ifname = ''
parser = ConfigParser() parser = ConfigParser()
dh = []
try: try:
parser.read(cfgfile) parser.read(cfgfile)
network = dict(parser['NETWORK']) network = dict(parser['NETWORK'])
for ifname in IFNAMES: for ifname in IFNAMES:
content = create_if(ifname, network.get(ifname, 'off'), netaddr_dict[ifname]) content = create_if(ifname, network.get(ifname, 'off'), netaddr_dict[ifname])
dhcprange = content.pop('dhcprange', None)
if dhcprange:
ip_mask = content['IPADDR'], content['NETMASK']
dh.append(ip_mask + ip_mask + dhcprange)
content = '\n'.join('%s=%s' % kv for kv in content.items()) content = '\n'.join('%s=%s' % kv for kv in content.items())
todo = write_when_new('/etc/sysconfig/network-scripts/ifcfg-%s' % ifname, content, doit) todo = write_when_new('/etc/sysconfig/network-scripts/ifcfg-%s' % ifname, content, doit)
if todo: if todo:
print('change ', ifname) print('change ', ifname)
show.dirty = True show.dirty = True
if dh:
content = DHCP_HEADER + '\n'.join([DHCP_ITEM % d for d in dh])
todo = write_when_new('/etc/dhcp/dhcpd.conf', content, doit)
if todo:
print('change ', ifname)
show.dirty = True
except Exception as e: except Exception as e:
print('ERROR: can not handle %s %s: %r' % (hostname, ifname, e)) print('ERROR: can not handle %s %s: %r' % (hostname, ifname, e))
raise
return False return False
return True return True

View File

@ -1,6 +1,6 @@
[NETWORK] [NETWORK]
enp1s0=dhcp enp1s0=dhcp
enp2s0=192.168.2.2/24 enp2s0=own:192.168.2.2,prefix:24,other:192.168.2.15
enp3s0=192.168.2.3/24 enp3s0=192.168.2.3/24
enp4s0=192.168.127.4/24 enp4s0=192.168.127.4/24