better documentation
This commit is contained in:
42
README.md
42
README.md
@ -2,6 +2,44 @@
|
|||||||
|
|
||||||
The APU is a Linux box to be used as a control box at LIN sample environment
|
The APU is a Linux box to be used as a control box at LIN sample environment
|
||||||
|
|
||||||
servercfg/(hostname).cfg contain the configuration for all boxes
|
servercfg/ contains the configuration files for all boxes
|
||||||
|
|
||||||
|
to_system/ contains the files to be installed in the system
|
||||||
|
|
||||||
|
## config files
|
||||||
|
|
||||||
|
filename: servercfg/(hostname)_(hexdigits).cfg
|
||||||
|
|
||||||
|
* (hostname) the hostname to be given on startup
|
||||||
|
* (hexdigits) the last six digits of one of the ethernet adresses of the interfaces on the APU
|
||||||
|
|
||||||
|
content of the config files:
|
||||||
|
|
||||||
|
[NETWORK]
|
||||||
|
|
||||||
|
```
|
||||||
|
# leftmost socket next to the console:
|
||||||
|
enp1s0=wan # the uplink, DHCP enabled, in netwoork n.x.y.z for 0 <= n < 192
|
||||||
|
enp1s0=wan,192.168.1.0/24 # the uplink, DHCP enabled, may be in addition in local network 192.168.1.x
|
||||||
|
# several networks might be specified, with comma separation
|
||||||
|
# must not contain addresses defined on other interfaces!
|
||||||
|
enp2s0=192.168.3.5 # the ip address of the device to be connected (DHCP or static),
|
||||||
|
# must be odd (the value one lower is used for the APU address in this interface)
|
||||||
|
enp3s0=off # disabled
|
||||||
|
enp4s0=192.168.3.1/24 # our ip address, the static address of the connected device must
|
||||||
|
# be within 1-254 and not match our own
|
||||||
|
# rightmost socket, next to the usb plugs
|
||||||
|
|
||||||
|
[ROUTER]
|
||||||
|
3000=/dev/ttyUSB0 # routing 3000 to the internal serial port /dev/ttyUSB0
|
||||||
|
5900=192.168.2.33 # routing VNC (local port 5900 to port 5900 on 192.168.2.33
|
||||||
|
8080=192.168.127.254:80 # routing 8080 to port 80 of 192.168.127.254
|
||||||
|
|
||||||
|
[FRAPPY]
|
||||||
|
cfg=uniax # the cfg file for the frappy server
|
||||||
|
port=5000 # the port for the frappy server
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
to_system contains the files to be installed in the system
|
|
||||||
|
108
install.py
108
install.py
@ -5,9 +5,12 @@
|
|||||||
- set host name / network settings from aputools/servercfg file
|
- set host name / network settings from aputools/servercfg file
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if bytes == str:
|
||||||
|
raise NotImplementedError('python2 not supported')
|
||||||
import os
|
import os
|
||||||
import filecmp
|
import filecmp
|
||||||
import shutil
|
import shutil
|
||||||
|
import time
|
||||||
from glob import glob
|
from glob import glob
|
||||||
from ipaddress import IPv4Interface
|
from ipaddress import IPv4Interface
|
||||||
from configparser import ConfigParser
|
from configparser import ConfigParser
|
||||||
@ -17,15 +20,20 @@ os.chdir('/root/aputools/to_system')
|
|||||||
|
|
||||||
DEL = '__to_delete__'
|
DEL = '__to_delete__'
|
||||||
CFGPATH = '/root/aputools/servercfg/%s_%6.6x.cfg'
|
CFGPATH = '/root/aputools/servercfg/%s_%6.6x.cfg'
|
||||||
|
|
||||||
|
COMMENT = "; please refer to README.md for help"
|
||||||
|
|
||||||
TEMPLATE_CFG = """[NETWORK]
|
TEMPLATE_CFG = """[NETWORK]
|
||||||
|
%s
|
||||||
enp1s0=192.168.127.1/24
|
enp1s0=192.168.127.1/24
|
||||||
enp2s0=192.168.2.1/24
|
enp2s0=192.168.2.1/24
|
||||||
enp3s0=192.168.3.1/24
|
enp3s0=192.168.3.1/24
|
||||||
enp4s0=dhcp
|
enp4s0=dhcp
|
||||||
|
|
||||||
[ROUTER]
|
[ROUTER]
|
||||||
|
%s
|
||||||
3001=192.168.127.254:3001
|
3001=192.168.127.254:3001
|
||||||
"""
|
""" % (COMMENT, COMMENT)
|
||||||
|
|
||||||
DHCP_HEADER = """
|
DHCP_HEADER = """
|
||||||
default-lease-time 600;
|
default-lease-time 600;
|
||||||
@ -33,14 +41,6 @@ max-lease-time 7200;
|
|||||||
authoritative;
|
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'):
|
||||||
content += '\n'
|
content += '\n'
|
||||||
@ -60,7 +60,7 @@ def write_when_new(filename, content, doit):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def create_if(name, cfg, mac):
|
def create_if(name, cfg, mac, dhcp_server_cfg):
|
||||||
result = dict(
|
result = dict(
|
||||||
TYPE='Ethernet',
|
TYPE='Ethernet',
|
||||||
NAME=name,
|
NAME=name,
|
||||||
@ -73,47 +73,28 @@ def create_if(name, cfg, mac):
|
|||||||
IPV6INIT='no')
|
IPV6INIT='no')
|
||||||
if cfg == 'off':
|
if cfg == 'off':
|
||||||
result['ONBOOT']='no'
|
result['ONBOOT']='no'
|
||||||
elif cfg == 'dhcp':
|
elif cfg.startswith('wan') or cfg == 'dhcp':
|
||||||
result['BOOTPROTO']='dhcp'
|
result['BOOTPROTO']='dhcp'
|
||||||
|
# default: all <= 192.0.0.0
|
||||||
|
# others have to be added explicitly
|
||||||
|
dhcp_server_cfg.append((('0.0.0.0','128.0.0.0'), []))
|
||||||
|
dhcp_server_cfg.append((('128.0.0.0','192.0.0.0'), []))
|
||||||
|
for nw in cfg.split(',')[1:]:
|
||||||
|
nw = IPv4Interface(cfg).network
|
||||||
|
dhcp_server_cfg.append((nw.with_netmask.split('/'), []))
|
||||||
else:
|
else:
|
||||||
error = None
|
cfgip = IPv4Interface(cfg)
|
||||||
cfgdict = {'own': cfg, 'prefix': '', 'other': ''}
|
network = cfgip.network
|
||||||
if ':' in cfg:
|
if network.prefixlen == 32:
|
||||||
for cfgitem in cfg.split(','):
|
otherip = IPv4Interface('%s/31' % cfgip.ip)
|
||||||
k, _, v = cfgitem.partition(':')
|
network = otherip.network
|
||||||
k = k.strip()
|
cfgip = network.network_address + (1 - int(otherip) % 2)
|
||||||
if k not in cfgdict:
|
dhcp_server_cfg.append((network.with_netmask, [(str(otherip.ip), str(otherip.ip))]))
|
||||||
error = 'bad formed'
|
result['IPADDR'] = str(cfgip)
|
||||||
cfgdict[k] = v.strip()
|
else: # subnet with multiple adresses -> static adresses only. dhcp range not yet implemented
|
||||||
ownip, _, prefix = cfgdict['own'].partition('/')
|
result['IPADDR'] = str(cfgip.ip)
|
||||||
prefix = cfgdict['prefix'] or prefix
|
result['NETMASK'] = network.netmask
|
||||||
if prefix:
|
result['PREFIX'] = str(network.prefixlen)
|
||||||
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'):
|
|
||||||
prefix = 8
|
|
||||||
elif interface < IPv4Interface('192.0.0.0'):
|
|
||||||
prefix = 16
|
|
||||||
else:
|
|
||||||
prefix = 24
|
|
||||||
interface = IPv4Interface('%s/%d' % (ownip, prefix))
|
|
||||||
result['IPADDR'], result['NETMASK'] = interface.with_netmask.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
|
||||||
|
|
||||||
|
|
||||||
@ -230,23 +211,40 @@ def network(doit):
|
|||||||
try:
|
try:
|
||||||
parser.read(cfgfile)
|
parser.read(cfgfile)
|
||||||
network = dict(parser['NETWORK'])
|
network = dict(parser['NETWORK'])
|
||||||
|
dhcp_server_cfg = []
|
||||||
for ifname in IFNAMES:
|
for ifname in IFNAMES:
|
||||||
content = create_if(ifname, network.get(ifname, 'off'), netaddr_dict[ifname])
|
content = create_if(ifname, network.pop(ifname, 'off'), netaddr_dict[ifname], dhcp_server_cfg)
|
||||||
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:
|
if dh:
|
||||||
content = DHCP_HEADER + '\n'.join([DHCP_ITEM % d for d in dh])
|
content = [DHCP_HEADER]
|
||||||
|
for subnet, rangelist in dhcp_server_cfg:
|
||||||
|
dh.append('subnet %s netmask %s {\n' % subnet)
|
||||||
|
dh.append(' option netmask %s;\n' % subnet[1])
|
||||||
|
for rng in rangelist:
|
||||||
|
dh.append(' range %s %s;\n' % rng)
|
||||||
|
dh.append('}\n')
|
||||||
|
content = ''.join(content)
|
||||||
todo = write_when_new('/etc/dhcp/dhcpd.conf', content, doit)
|
todo = write_when_new('/etc/dhcp/dhcpd.conf', content, doit)
|
||||||
if todo:
|
if todo:
|
||||||
print('change ', ifname)
|
print('change ', ifname)
|
||||||
show.dirty = True
|
show.dirty = True
|
||||||
|
content = []
|
||||||
|
dirty = False
|
||||||
|
for section in parser.sections():
|
||||||
|
if COMMENT not in parser[section]:
|
||||||
|
dirty = True
|
||||||
|
content.append('[%s]' % section)
|
||||||
|
content.append(COMMENT)
|
||||||
|
for key, value in parser[section].items():
|
||||||
|
content.append('%s=%s' % (key, value))
|
||||||
|
content.append('')
|
||||||
|
if dirty:
|
||||||
|
with open(cfgfile, 'w') as f:
|
||||||
|
f.write('\n'.join(content))
|
||||||
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
|
raise
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
[NETWORK]
|
[NETWORK]
|
||||||
|
; please refer to README.md for help
|
||||||
enp1s0=dhcp
|
enp1s0=dhcp
|
||||||
enp2s0=own:192.168.2.2,prefix:24,other:192.168.2.15
|
enp2s0=192.168.2.15
|
||||||
enp3s0=192.168.2.3/24
|
enp3s0=192.168.3.3/24
|
||||||
enp4s0=192.168.127.4/24
|
enp4s0=192.168.127.4/24
|
||||||
|
|
||||||
[ROUTER]
|
[ROUTER]
|
||||||
|
; please refer to README.md for help
|
||||||
3000=/dev/ttyUSB0
|
3000=/dev/ttyUSB0
|
||||||
5900=192.168.2.33
|
5900=192.168.2.33
|
||||||
8080=192.168.127.254:80
|
8080=192.168.127.254:80
|
||||||
|
Reference in New Issue
Block a user