WHEW. i tihnk i have networking sorted out. man. untested, though.

This commit is contained in:
brent s 2017-04-23 03:11:27 -04:00
parent 02fa916a06
commit 20b5850a94
2 changed files with 100 additions and 9 deletions

View File

@ -180,6 +180,8 @@
<xs:attribute name="device" type="iface" use="required" /> <xs:attribute name="device" type="iface" use="required" />
<xs:attribute name="address" type="netaddress" use="required" /> <xs:attribute name="address" type="netaddress" use="required" />
<xs:attribute name="netproto" type="netproto" use="required" /> <xs:attribute name="netproto" type="netproto" use="required" />
<xs:attribute name="gateway" type="netaddress" />
<xs:attribute name="resolvers" type="xs:string" />
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>
</xs:sequence> </xs:sequence>

View File

@ -19,7 +19,10 @@ except ImportError:
import shlex import shlex
import os import os
import re import re
import socket
import subprocess import subprocess
import ipaddress
import copy
import pprint import pprint
import urllib.request as urlrequest import urllib.request as urlrequest
import urllib.parse as urlparse import urllib.parse as urlparse
@ -163,11 +166,29 @@ class aif(object):
iface = i.attrib['device'] iface = i.attrib['device']
proto = i.attrib['netproto'] proto = i.attrib['netproto']
address = i.attrib['address'] address = i.attrib['address']
if 'gateway' in i.attrib.keys():
gateway = i.attrib['gateway']
else:
gateway = False
if 'resolvers' in i.attrib.keys():
resolvers = i.attrib['resolvers']
else:
resolvers = False
if iface not in aifdict['network']['ifaces'].keys(): if iface not in aifdict['network']['ifaces'].keys():
aifdict['network']['ifaces'][iface] = {} aifdict['network']['ifaces'][iface] = {}
if proto not in aifdict['network']['ifaces'][iface].keys(): if proto not in aifdict['network']['ifaces'][iface].keys():
aifdict['network']['ifaces'][iface][proto] = [] aifdict['network']['ifaces'][iface][proto] = {}
aifdict['network']['ifaces'][iface][proto].append(address) if 'gw' not in aifdict['network']['ifaces'][iface][proto].keys():
aifdict['network']['ifaces'][iface][proto]['gw'] = gateway
aifdict['network']['ifaces'][iface][proto]['addresses'] = []
aifdict['network']['ifaces'][iface][proto]['addresses'].append(address)
aifdict['network']['ifaces'][iface]['resolvers'] = []
if resolvers:
for ip in filter(None, re.split('[,\s]+', resolvers)):
if ip not in aifdict['network']['ifaces'][iface]['resolvers']:
aifdict['network']['ifaces'][iface]['resolvers'].append(ip)
else:
aifdict['network']['ifaces'][iface][proto]['resolvers'] = False
# Set up the users dicts # Set up the users dicts
aifdict['users']['root']['password'] = xmlobj.find('system/users').attrib['rootpass'] aifdict['users']['root']['password'] = xmlobj.find('system/users').attrib['rootpass']
for i in xmlobj.findall('system/users'): for i in xmlobj.findall('system/users'):
@ -309,8 +330,8 @@ class archInstall(object):
stripped = val.replace('%', '') stripped = val.replace('%', '')
modifier = re.sub('[0-9]+%', '', val) modifier = re.sub('[0-9]+%', '', val)
percent = re.sub('(-|\+)*', '', stripped) percent = re.sub('(-|\+)*', '', stripped)
decimal = float(percent) / 100 decimal = float(percent) / float(100)
newval = int(int(disksize['max']) * decimal) newval = int(float(disksize['max']) * decimal)
if s == 'start': if s == 'start':
newval = newval + int(disksize['start']) newval = newval + int(disksize['start'])
self.disk[d]['parts'][str(p)][s] = modifier + str(newval) self.disk[d]['parts'][str(p)][s] = modifier + str(newval)
@ -337,8 +358,6 @@ class archInstall(object):
if y == '%PART%': if y == '%PART%':
mkformat[x] = d + str(p) mkformat[x] = d + str(p)
cmds.append(mkformat) cmds.append(mkformat)
import pprint
pprint.pprint(cmds)
with open(os.devnull, 'w') as DEVNULL: with open(os.devnull, 'w') as DEVNULL:
for p in cmds: for p in cmds:
subprocess.call(p, stdout = DEVNULL, stderr = subprocess.STDOUT) subprocess.call(p, stdout = DEVNULL, stderr = subprocess.STDOUT)
@ -471,10 +490,80 @@ class archInstall(object):
f.write(self.network['hostname'] + '\n') f.write(self.network['hostname'] + '\n')
with open('{0}/etc/hosts'.format(self.system['chrootpath']), 'a') as f: with open('{0}/etc/hosts'.format(self.system['chrootpath']), 'a') as f:
f.write('127.0.0.1\t{0}\t{1}\n'.format(self.network['hostname'], (self.network['hostname']).split('.')[0])) f.write('127.0.0.1\t{0}\t{1}\n'.format(self.network['hostname'], (self.network['hostname']).split('.')[0]))
# SET UP NETWORKING HERE #
# Set up networking. # Set up networking.
ifaces = []
########################## # Ideally we'd find a better way to do... all of this. Patches welcome. TODO.
if 'auto' in self.network['ifaces'].keys():
# Get the default route interface.
for line in subprocess.check_output(['ip', '-oneline', 'route', 'show']).decode('utf-8').splitlines():
line = line.split()
if line[0] == 'default':
autoiface = line[4]
break
ifaces = list(self.network['ifaces'].keys())
ifaces.sort()
if autoiface in ifaces:
ifaces.remove(autoiface)
for iface in ifaces:
resolvers = False
if 'resolvers' in self.network['ifaces'][iface].keys():
resolvers = self.network['ifaces'][iface]['resolvers']
print(resolvers)
if iface == 'auto':
ifacedev = autoiface
iftype = 'dhcp'
else:
ifacedev = iface
iftype = 'static'
netprofile = 'Description=\'A basic {0} ethernet connection ({1})\'\nInterface={1}\nConnection=ethernet\n'.format(iftype, ifacedev)
if 'ipv4' in self.network['ifaces'][iface].keys():
if self.network['ifaces'][iface]['ipv4']:
netprofile += 'IP={0}\n'.format(iftype)
if 'ipv6' in self.network['ifaces'][iface].keys():
if self.network['ifaces'][iface]['ipv6']:
netprofile += 'IP6={0}\n'.format(iftype) # TODO: change this to stateless if iftype='dhcp' instead?
for proto in ('ipv4', 'ipv6'):
addrs = []
if proto in self.network['ifaces'][iface].keys():
if proto == 'ipv4':
addr = 'Address'
gwstring = 'Gateway'
elif proto == 'ipv6':
addr = 'Address6'
gwstring = 'Gateway6'
gw = self.network['ifaces'][iface][proto]['gw']
for ip in self.network['ifaces'][iface][proto]['addresses']:
if ip == 'auto':
continue
else:
try:
ipver = ipaddress.ip_network(ip, strict = False)
addrs.append(ip)
except ValueError:
exit('{0} was specified but is NOT a valid IPv4/IPv6 address!'.format(ip))
if iftype == 'static':
# Static addresses
netprofile += '{0}=(\'{1}\')\n'.format(addr, ('\' \'').join(addrs))
# Gateway
if gw:
netprofile += '{0}={1}\n'.format(gwstring, gw)
# DNS resolvers
if resolvers:
netprofile += 'DNS=(\'{0}\')\n'.format('\' \''.join(resolvers))
filename = '{0}/etc/netctl/{1}'.format(self.system['chrootpath'], ifacedev)
# The good news is since it's a clean install, we only have to account for our own data, not pre-existing.
with open(filename, 'w') as f:
f.write(netprofile)
with open('{0}/etc/systemd/system/netctl@{1}.service'.format(self.system['chrootpath'], ifacedev)) as f:
f.write(('.include /usr/lib/systemd/system/netctl@.service\n\n[Unit]\n' +
'Description=A basic {0} ethernet connection\n' +
'BindsTo=sys-subsystem-net-devices-{1}.device\n' +
'After=sys-subsystem-net-devices-{1}.device\n').format(iftype, ifacedev))
os.symlink('/etc/systemd/system/netctl@{0}.service'.format(ifacedev),
'{0}/etc/systemd/system/multi-user.target.wants/netctl@{1}.service'.format(self.system['chrootpath'], ifacedev))
os.symlink('/usr/lib/systemd/system/netctl.service',
'{0}/etc/systemd/system/multi-user.target.wants/netctl.service'.format(self.system['chrootpath']))
# Base configuration- initcpio, etc.
chrootcmds.append(['mkinitcpio', '-p', 'linux']) chrootcmds.append(['mkinitcpio', '-p', 'linux'])
with open(os.devnull, 'w') as DEVNULL: with open(os.devnull, 'w') as DEVNULL:
for c in hostscript: for c in hostscript: