wip temporary push
This commit is contained in:
31
display.py
31
display.py
@ -5,6 +5,10 @@ import serial
|
||||
import socket
|
||||
import threading
|
||||
|
||||
# display tty device
|
||||
tty = '/dev/ttyS1'
|
||||
STARTUP_TEXT = '/root/aputools/startup_display.txt'
|
||||
|
||||
ESC = 0x1b
|
||||
ESCESC = bytes((ESC, ESC))
|
||||
|
||||
@ -57,8 +61,22 @@ class Display:
|
||||
def __init__(self, dev, timeout=0.5, daemon=False):
|
||||
self.event = threading.Event()
|
||||
self.term = serial.Serial(dev, baudrate=115200, timeout=timeout)
|
||||
if not daemon:
|
||||
self.storage = bytearray()
|
||||
self.storage = bytearray()
|
||||
if daemon:
|
||||
text = None
|
||||
try:
|
||||
with open(STARTUP_TEXT) as f:
|
||||
text = f.read()
|
||||
print('new startup text:')
|
||||
print(text)
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
if text:
|
||||
self.reset()
|
||||
self.show(*todo_text.split('\n')[0:3])
|
||||
self.set_startup()
|
||||
else:
|
||||
self.storage = None
|
||||
self.gethost(False)
|
||||
self.reset()
|
||||
if daemon:
|
||||
@ -98,14 +116,6 @@ class Display:
|
||||
self.storage = None
|
||||
self.send(SET_STARTUP, data)
|
||||
|
||||
def standard_startup(self):
|
||||
self.storage = bytearray()
|
||||
self.reset()
|
||||
with open('/sys/class/net/enp1s0/address') as f:
|
||||
netaddr = f.read().strip().lower()
|
||||
self.show('startup ...', netaddr)
|
||||
self.set_startup()
|
||||
|
||||
def version(self):
|
||||
self.term.write(bytes([ESC,ESC,1,0xf3]))
|
||||
reply = self.term.read(4)
|
||||
@ -253,7 +263,6 @@ class Display:
|
||||
self.send(0xf0, 0xcb, 0xef, 0x20, 0x18)
|
||||
|
||||
|
||||
tty = '/dev/ttyS1'
|
||||
daemon = False
|
||||
|
||||
for arg in sys.argv[1:]:
|
||||
|
105
install.py
105
install.py
@ -13,6 +13,7 @@ import os
|
||||
import filecmp
|
||||
import shutil
|
||||
import serial
|
||||
import types
|
||||
from subprocess import Popen, PIPE
|
||||
from glob import glob
|
||||
from ipaddress import IPv4Interface
|
||||
@ -24,6 +25,7 @@ os.chdir('/root/aputools/to_system')
|
||||
|
||||
DEL = '__to_delete__'
|
||||
CFGPATH = '/root/aputools/servercfg/%s_%6.6x.cfg'
|
||||
STARTUP_TEXT = '/root/aputools/startup_display.txt'
|
||||
|
||||
COMMENT = "; please refer to README.md for help"
|
||||
|
||||
@ -48,6 +50,9 @@ enp4s0=192.168.3.3
|
||||
|
||||
[DISPLAY]
|
||||
{COMMENT}
|
||||
line0=startup...
|
||||
line1=HOST
|
||||
line2=ADDR
|
||||
"""
|
||||
|
||||
DHCP_HEADER = """
|
||||
@ -97,6 +102,11 @@ pip_requirements = {
|
||||
}
|
||||
|
||||
|
||||
net_addr = {} # dict <if name> of <ethernet address>
|
||||
main_info = {} # info about WAN interface
|
||||
dhcp_server_cfg = [] # configuration for dhcp
|
||||
|
||||
|
||||
def frappy(cfg=None, port=None, requirements='', **kwds):
|
||||
if not cfg:
|
||||
return None
|
||||
@ -120,7 +130,37 @@ def router(**opts):
|
||||
return ROUTER_TEMPLATE
|
||||
|
||||
|
||||
def display_update(cfg):
|
||||
dirty = False
|
||||
lines = []
|
||||
for key in ['line0', 'line1', 'line2']:
|
||||
value = cfg.get(key, '')
|
||||
if value.startswith('HOST'):
|
||||
line = main_info.get('hostname', '')
|
||||
value = 'HOST: ' + line
|
||||
elif value.startswith('ADDR'):
|
||||
line = main_info.get('addr', '')
|
||||
value = 'ADDR: ' + line
|
||||
else:
|
||||
line = value
|
||||
lines.append(line)
|
||||
if cfg.get(key) != value:
|
||||
if doit:
|
||||
cfg[key] = value
|
||||
dirty = True
|
||||
if dirty:
|
||||
text = '\n'.join(lines)
|
||||
if doit:
|
||||
with open(STARTUP_TEXT, 'w') as f:
|
||||
f.write(text)
|
||||
else:
|
||||
print('new startup text:')
|
||||
print('\n'.join(lines))
|
||||
|
||||
|
||||
def display(**opts):
|
||||
if not opts:
|
||||
return None
|
||||
return DISPLAY_TEMPLATE
|
||||
|
||||
|
||||
@ -215,7 +255,7 @@ def write_when_new(filename, content, ignore_reduction=False):
|
||||
return content
|
||||
|
||||
|
||||
def create_if(name, cfg, mac, dhcp_server_cfg):
|
||||
def create_if(name, cfg):
|
||||
result = dict(
|
||||
TYPE='Ethernet',
|
||||
NAME=name,
|
||||
@ -229,6 +269,10 @@ def create_if(name, cfg, mac, dhcp_server_cfg):
|
||||
if cfg == 'off':
|
||||
result['ONBOOT'] = 'no'
|
||||
elif cfg.startswith('wan') or cfg == 'dhcp':
|
||||
if main_info.get('mainif', name) != name:
|
||||
raise ValueError('can not have more than one WAN/DHCP port')
|
||||
main_info['mainif'] = name
|
||||
main_info['addr'] = net_addr[name]
|
||||
result['BOOTPROTO'] = 'dhcp'
|
||||
# default: all <= 192.0.0.0
|
||||
# others have to be added explicitly
|
||||
@ -337,68 +381,72 @@ class Do:
|
||||
os.remove(join(self.syspath, file))
|
||||
|
||||
|
||||
netaddr_dict = {}
|
||||
for netif in os.scandir('/sys/class/net'):
|
||||
if netif.name != 'lo': # do not consider loopback interface
|
||||
with open(os.path.join(netif.path, 'address')) as f:
|
||||
netaddr_dict[netif.name] = netaddr = f.read().strip().lower()
|
||||
addr = f.read().strip().lower()
|
||||
net_addr[netif.name] = addr
|
||||
|
||||
sorted_if = sorted(net_addr)
|
||||
|
||||
apuid = int(''.join(net_addr[sorted_if[0]].split(':')[-3:]), 16) & 0xffffff
|
||||
|
||||
|
||||
def handle_config():
|
||||
cfgfile = None
|
||||
cfgfiles = []
|
||||
shortids = {}
|
||||
for netif, addr in netaddr_dict.items():
|
||||
shortid = int(''.join(addr.split(':')[-3:]), 16) & 0xffffff
|
||||
cfgfiles += glob(CFGPATH % ('*', shortid))
|
||||
shortids[netif] = shortid
|
||||
for file in glob(CFGPATH % ('*', apuid)):
|
||||
cfgfiles.append(file)
|
||||
with open('/etc/hostname') as f:
|
||||
hostname = f.read().strip()
|
||||
newhostname = hostname
|
||||
if not cfgfiles:
|
||||
disp = serial.Serial('/dev/ttyS1', baudrate=115200, timeout=1)
|
||||
disp.write(b'\x1b\x1b\x01\xf3')
|
||||
display_available = disp.read(8)[0:4] == b'\x1b\x1b\x05\xf3'
|
||||
ids = sorted(shortids)
|
||||
if display_available:
|
||||
# leftmost interface labelled 'eth0'
|
||||
apuid = shortids[ids[0]]
|
||||
wan_if = sorted_if[0]
|
||||
typ = 'controlbox'
|
||||
template = CONTROLBOX_TEMPLATE
|
||||
else:
|
||||
# rightmost interface
|
||||
apuid = shortid[idx[-1]]
|
||||
wan_id = sorted_if[-1]
|
||||
typ = 'bare apu'
|
||||
template = CONFIG_TEMPLATE
|
||||
print('no cfg file found for this', typ, f'with id {apuid:%6.6x} (hostname={hostname})')
|
||||
newname = input('enter host name: ')
|
||||
if not newname:
|
||||
newhostname = input('enter host name: ')
|
||||
if not newhostname:
|
||||
print('no hostname given')
|
||||
return False
|
||||
cfgfile = CFGPATH % (newname, apuid)
|
||||
cfgfile = CFGPATH % (newhostname, apuid)
|
||||
with open(cfgfile, 'w') as f:
|
||||
f.write(template)
|
||||
elif len(cfgfiles) > 1:
|
||||
print('ERROR: ambiguous cfg files: %s' % ', '.join(cfgfiles))
|
||||
else:
|
||||
cfgfile = cfgfiles[0]
|
||||
apuid = int(cfgfile.split('_')[-1].split('.')[0], 16)
|
||||
wan_if = None
|
||||
if cfgfile != CFGPATH % (hostname, apuid):
|
||||
if cfgfile:
|
||||
newhostname = basename(cfgfile).rpartition('_')[0]
|
||||
if doit:
|
||||
os.system('sh ../sethostname.sh')
|
||||
os.system('sh sethostname.sh')
|
||||
else:
|
||||
if cfgfile:
|
||||
print('replace host name %r by %r' % (hostname, basename(cfgfile).rpartition('_')[0]))
|
||||
print('replace host name %r by %r' % (hostname, newhostname))
|
||||
show.dirty = True
|
||||
main_info['hostname'] = newhostname
|
||||
if cfgfile is None:
|
||||
return False
|
||||
to_start = {}
|
||||
ifname = ''
|
||||
parser = ConfigParser()
|
||||
dhcp_server_cfg = []
|
||||
try:
|
||||
parser.read(cfgfile)
|
||||
network = dict(parser['NETWORK'])
|
||||
for ifname, addr in netaddr_dict.items():
|
||||
content = create_if(ifname, network.pop(ifname, 'off'), addr, dhcp_server_cfg)
|
||||
for ifname in net_addr:
|
||||
content = create_if(ifname, network.pop(ifname, 'off'))
|
||||
content = '\n'.join('%s=%s' % kv for kv in content.items())
|
||||
todo = write_when_new('/etc/sysconfig/network-scripts/ifcfg-%s' % ifname, content)
|
||||
if todo and more_info == 'NONE':
|
||||
@ -434,7 +482,10 @@ def handle_config():
|
||||
dirty = True
|
||||
content.append('[%s]' % section)
|
||||
content.append(COMMENT)
|
||||
for key, value in parser[section].items():
|
||||
section_dict = dict(parser[section].items())
|
||||
if section == 'DISPLAY':
|
||||
display_update(section_dict)
|
||||
for key, value in section_dict.items():
|
||||
content.append('%s=%s' % (key, value))
|
||||
content.append('')
|
||||
if dirty:
|
||||
@ -446,12 +497,12 @@ def handle_config():
|
||||
return False
|
||||
|
||||
reload_systemd = False
|
||||
for service, template_func in SERVICES.items():
|
||||
for service, service_func in SERVICES.items():
|
||||
section = service.upper()
|
||||
if parser.has_section(section):
|
||||
template = template_func(**dict(parser[section]))
|
||||
servicecfg = service_func(**dict(parser[section]))
|
||||
else:
|
||||
template = None
|
||||
servicecfg = None
|
||||
result = unix_cmd('systemctl show -p WantedBy -p ActiveState %s' % service, True)
|
||||
active = False
|
||||
enabled = False
|
||||
@ -460,7 +511,7 @@ def handle_config():
|
||||
enabled = True
|
||||
elif line.strip() == 'ActiveState=active':
|
||||
active = True
|
||||
if template is None:
|
||||
if servicecfg is None:
|
||||
if active:
|
||||
unix_cmd('systemctl stop %s' % service)
|
||||
show.dirty = True
|
||||
@ -472,10 +523,10 @@ def handle_config():
|
||||
to_start[service] = 'enable'
|
||||
elif not active:
|
||||
to_start[service] = 'restart'
|
||||
if write_when_new('/etc/systemd/system/%s.service' % service, template):
|
||||
if write_when_new('/etc/systemd/system/%s.service' % service, servicecfg):
|
||||
show.dirty = True
|
||||
reload_systemd = True
|
||||
if template and to_start.get('service') is None:
|
||||
if servicecfg and to_start.get('service') is None:
|
||||
to_start[service] = 'restart'
|
||||
|
||||
pip()
|
||||
|
@ -7,3 +7,6 @@ enp4s0=192.168.3.3
|
||||
|
||||
[DISPLAY]
|
||||
; please refer to README.md for help
|
||||
line0=startup...
|
||||
line1=HOST: linse-box1
|
||||
line2=ADDR: 00:0d:b9:5b:26:5c
|
||||
|
Reference in New Issue
Block a user