Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/archinstall.py
diff options
context:
space:
mode:
authorLord Anton Hvornum <anton.feeds@gmail.com>2018-04-06 21:14:41 +0200
committerLord Anton Hvornum <anton.feeds@gmail.com>2018-04-06 21:14:41 +0200
commit02a1ebb50940832a63e8cd85be036138f5d48cd9 (patch)
treec299581ddb1d78dc30653d5dd67277c688d80fec /archinstall.py
parentc1f0e1b28913d5c6ac8ad363eb0eea9db3d6c5d4 (diff)
First baseline done
Diffstat (limited to 'archinstall.py')
-rw-r--r--archinstall.py84
1 files changed, 83 insertions, 1 deletions
diff --git a/archinstall.py b/archinstall.py
index 1b550773..1b60a85d 100644
--- a/archinstall.py
+++ b/archinstall.py
@@ -1,3 +1,85 @@
#!/usr/bin/python3
+import psutil, os, re, struct, sys
+from glob import glob
+from socket import inet_ntoa, AF_INET, AF_INET6
+from collections import OrderedDict as oDict
+from subprocess import Popen, STDOUT, PIPE
-print('Done')
+rootdir_pattern = re.compile('^.*?/devices')
+harddrives = oDict()
+
+print(sys.argv)
+
+def get_default_gateway_linux():
+ """Read the default gateway directly from /proc."""
+ with open("/proc/net/route") as fh:
+ for line in fh:
+ fields = line.strip().split()
+ if fields[1] != '00000000' or not int(fields[3], 16) & 2:
+ continue
+
+ return inet_ntoa(struct.pack("<L", int(fields[2], 16)))
+
+ #for nic, opts in psutil.net_if_addrs().items():
+ # for addr in opts:
+ # if addr.family in (AF_INET, AF_INET6) and addr.address:
+ # if addr.address in ('127.0.0.1', '::1'): continue
+ # print(addr)
+
+def update_git():
+ default_gw = get_default_gateway_linux()
+ if(default_gw):
+ handle = Popen('git pull', shell='True', stdout=PIPE, stderr=STDOUT)
+ output = b''
+ while handle.poll() is None:
+ output += handle.stdout.read()
+ output += handle.stdout.read()
+
+ if b'error:' in output:
+ print('[E] Could not update git source for some reason.')
+ return
+
+ # b'From github.com:Torxed/archinstall\n 339d687..80b97f3 master -> origin/master\nUpdating 339d687..80b97f3\nFast-forward\n README.md | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)\n'
+ tmp = re.findall(b'[0-9]+ file changed', output)
+ if len(tmp):
+ num_changes = int(tmp[0].split(b' ',1)[0])
+ if(num_changes):
+ ## Reboot the script (in same context)
+ os.execv('/usr/bin/python3', ['archinstall.py', 'archinstall.py'] + sys.argv[1:])
+
+def device_state(name):
+ # Based out of: https://askubuntu.com/questions/528690/how-to-get-list-of-all-non-removable-disk-device-names-ssd-hdd-and-sata-ide-onl/528709#528709
+ with open('/sys/block/{}/device/block/{}/removable'.format(name, name)) as f:
+ if f.read(1) == '1':
+ return
+
+ path = rootdir_pattern.sub('', os.readlink('/sys/block/{}'.format(name)))
+ hotplug_buses = ("usb", "ieee1394", "mmc", "pcmcia", "firewire")
+ for bus in hotplug_buses:
+ if os.path.exists('/sys/bus/{}'.format(bus)):
+ for device_bus in os.listdir('/sys/bus/{}/devices'.format(bus)):
+ device_link = rootdir_pattern.sub('', os.readlink('/sys/bus/{}/devices/{}'.format(bus, device_bus)))
+ if re.search(device_link, path):
+ return
+ return True
+
+def update_drive_list():
+ for path in glob('/sys/block/*/device'):
+ name = re.sub('.*/(.*?)/device', '\g<1>', path)
+ if device_state(name):
+ harddrives['/dev/{}'.format(name)] = psutil.disk_usage('/dev/{}'.format(name))
+
+if __name__ == '__main__':
+ update_git() # Breaks and restarts the script if an update was found.
+ update_drive_list()
+
+ first_drive = list(harddrives.keys())[0]
+ print(harddrives[first_drive])
+
+ #for part in psutil.disk_partitions():
+ # print(part)
+
+ ## Networking
+ #print(psutil.net_if_addrs())
+
+ print('Done')