Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archinstall.py93
1 files changed, 62 insertions, 31 deletions
diff --git a/archinstall.py b/archinstall.py
index 8437575c..64c1a164 100644
--- a/archinstall.py
+++ b/archinstall.py
@@ -29,17 +29,6 @@ commandlog = []
worker_history = oDict()
instructions = oDict()
args = {}
-positionals = []
-for arg in sys.argv[1:]:
- if '--' == arg[:2]:
- if '=' in arg:
- key, val = [x.strip() for x in arg[2:].split('=')]
- else:
- key, val = arg[2:], True
- args[key] = val
- else:
- positionals.append(arg)
-
import logging
from systemd.journal import JournalHandler
@@ -305,6 +294,10 @@ class sys_command():#Thread):
poller = epoll()
poller.register(child_fd, EPOLLIN | EPOLLHUP)
+ if 'events' in self.kwargs and 'debug' in self.kwargs:
+ print(f'[D] Using triggers for command: {self.cmd}')
+ print(json.dumps(self.kwargs['events']))
+
alive = True
last_trigger_pos = 0
while alive and not self.kwargs['emulate']:
@@ -317,16 +310,26 @@ class sys_command():#Thread):
break
if 'debug' in self.kwargs and self.kwargs['debug'] and len(output):
+ print(self.cmd[0], 'gave:', output.decode('UTF-8'))
log(self.cmd[0],'gave:', output.decode('UTF-8'), origin='spawn', level=4)
lower = output.lower()
broke = False
if 'events' in self.kwargs:
for trigger in list(self.kwargs['events']):
+ if type(trigger) != bytes:
+ original = trigger
+ trigger = bytes(original, 'UTF-8')
+ self.kwargs['events'][trigger] = self.kwargs['events'][original]
+ del(self.kwargs['events'][original])
+ if type(self.kwargs['events'][trigger]) != bytes:
+ self.kwargs['events'][trigger] = bytes(self.kwargs['events'][trigger], 'UTF-8')
+
if trigger.lower() in self.trace_log[last_trigger_pos:].lower():
trigger_pos = self.trace_log[last_trigger_pos:].lower().find(trigger.lower())
if 'debug' in self.kwargs and self.kwargs['debug']:
+ print(f"Writing to subprocess {self.cmd[0]}: {self.kwargs['events'][trigger].decode('UTF-8')}")
log(f"Writing to subprocess {self.cmd[0]}: {self.kwargs['events'][trigger].decode('UTF-8')}", origin='spawn', level=5)
last_trigger_pos = trigger_pos
@@ -587,6 +590,9 @@ def merge_in_includes(instructions, *positionals, **kwargs):
## Update arguments if we found any
for key, val in instructions['args'].items():
args[key] = val
+ if 'user_args' in kwargs:
+ for key, val in kwargs['user_args'].items():
+ args[key] = val
return instructions
@@ -841,6 +847,9 @@ def load_automatic_instructions(*positionals, **kwargs):
## Update arguments if we found any
for key, val in instructions['args'].items():
args[key] = val
+ if 'user_args' in kwargs:
+ for key, val in kwargs['user_args'].items():
+ args[key] = val
else:
print('[N] No gateway - No net deploy')
@@ -1092,7 +1101,7 @@ def run_post_install_steps(*positionals, **kwargs):
o = simple_command("cd /mnt; mount -t proc /proc proc")
o = simple_command("cd /mnt; mount --make-rslave --rbind /sys sys")
o = simple_command("cd /mnt; mount --make-rslave --rbind /dev dev")
- o = simple_command('chroot /mnt /bin/bash -c "{c}"'.format(c=command), events=opts)
+ o = simple_command('chroot /mnt /bin/bash -c "{c}"'.format(c=command), opts=opts)
o = simple_command("cd /mnt; umount -R dev")
o = simple_command("cd /mnt; umount -R sys")
o = simple_command("cd /mnt; umount -R proc")
@@ -1114,11 +1123,15 @@ def run_post_install_steps(*positionals, **kwargs):
## "<hostname> login" followed by "Passwodd" in case it's been set in a previous step.. usually this shouldn't be nessecary
## since we set the password as the last step. And then the command itself which will be executed by looking for:
## [root@<hostname> ~]#
- o = b''.join(sys_command('/usr/bin/systemd-nspawn -D /mnt -b --machine temporary', events={
- bytes(f'login:', 'UTF-8') : b'root\n',
- #b'Password:' : bytes(args['password']+'\n', 'UTF-8'),
- bytes(f'[root@{args["hostname"]} ~]#', 'UTF-8') : bytes(command+'\n', 'UTF-8'),
- }, **opts))
+ defaults = {
+ 'login:' : 'root\n',
+ 'Password:' : args['password']+'\n',
+ '[root@{args["hostname"]} ~]#' : command+'\n',
+ }
+ if not 'events' in opts: opts['events'] = {}
+ events = {**defaults, **opts['events']}
+ del(opts['events'])
+ o = b''.join(sys_command('/usr/bin/systemd-nspawn -D /mnt -b --machine temporary', events=events, **opts))
## Not needed anymore: And cleanup after out selves.. Don't want to leave any residue..
# os.remove('/mnt/etc/systemd/system/console-getty.service.d/override.conf')
@@ -1129,17 +1142,29 @@ def run_post_install_steps(*positionals, **kwargs):
#print(o)
if __name__ == '__main__':
- update_git() # Breaks and restarts the script if an update was found.
- update_drive_list()
-
## Setup some defaults
# (in case no command-line parameters or netdeploy-params were given)
args = setup_args_defaults(args)
+ user_args = {}
+ positionals = []
+ for arg in sys.argv[1:]:
+ if '--' == arg[:2]:
+ if '=' in arg:
+ key, val = [x.strip() for x in arg[2:].split('=')]
+ else:
+ key, val = arg[2:], True
+ args[key] = val
+ user_args[key] = val
+ else:
+ positionals.append(arg)
+
+ update_git() # Breaks and restarts the script if an update was found.
+ update_drive_list()
## == If we got networking,
# Try fetching instructions for this box unless a specific profile was given, and execute them.
if args['profile'] is None and not args['minimal']:
- instructions = load_automatic_instructions()
+ instructions = load_automatic_instructions(user_args=user_args)
elif args['profile'] and not args['minimal']:
instructions = get_instructions(args['profile'])
@@ -1160,7 +1185,7 @@ if __name__ == '__main__':
first = False
# TODO: Might not need to return anything here, passed by reference?
- instructions = merge_in_includes(instructions)
+ instructions = merge_in_includes(instructions, user_args=user_args)
cleanup_args()
## If no drive was found in args, select one.
@@ -1217,7 +1242,9 @@ if __name__ == '__main__':
close_disks()
print(f'[N] Setting up {args["drive"]}.')
- format_disk('drive', start='start', end='size')
+ if not format_disk('drive', start='start', end='size', debug=True):
+ print(f'[E] Coult not format drive {args["drive"]}')
+ exit(1)
refresh_partition_list('drive')
print(f'[N] Partitions: {len(args["partitions"])} (Boot: {list(args["partitions"].keys())[0]})')
@@ -1270,6 +1297,8 @@ if __name__ == '__main__':
update_git(pre_conf['git-branch'])
del(pre_conf['git-branch'])
+ rerun = args['ignore-rerun']
+
## Prerequisit steps needs to NOT be executed in arch-chroot.
## Mainly because there's no root structure to chroot into.
## But partly because some configurations need to be done against the live CD.
@@ -1327,6 +1356,16 @@ if __name__ == '__main__':
add_AUR_support()
print('[N] AUR support added. use "yay -Syy --noconfirm <package>" to deploy in POST.')
+ ## == Passwords
+ # o = sys_command('arch-chroot /mnt usermod --password {} root'.format(args['password']))
+ # o = sys_command("arch-chroot /mnt sh -c 'echo {pin} | passwd --stdin root'".format(pin='"{pin}"'.format(**args, pin=args['password'])), echo=True)
+ o = simple_command("/usr/bin/arch-chroot /mnt sh -c \"echo 'root:{pin}' | chpasswd\"".format(**args, pin=args['password']))
+ print(o)
+ time.sleep(5)
+ if 'user' in args:
+ o = ('/usr/bin/arch-chroot /mnt useradd -m -G wheel {user}'.format(**args))
+ o = ("/usr/bin/arch-chroot /mnt sh -c \"echo '{user}:{pin}' | chpasswd\"".format(**args, pin=args['password']))
+
print('[N] Running post installation steps.')
run_post_install_steps()
time.sleep(2)
@@ -1339,14 +1378,6 @@ if __name__ == '__main__':
if args['phone-home']:
phone_home(args['phone-home'])
- ## == Passwords
- # o = sys_command('arch-chroot /mnt usermod --password {} root'.format(args['password']))
- # o = sys_command("arch-chroot /mnt sh -c 'echo {pin} | passwd --stdin root'".format(pin='"{pin}"'.format(**args, pin=args['password'])), echo=True)
- o = simple_command("/usr/bin/arch-chroot /mnt sh -c \"echo 'root:{pin}' | chpasswd\"".format(**args, pin=args['password']))
- if 'user' in args:
- o = ('/usr/bin/arch-chroot /mnt useradd -m -G wheel {user}'.format(**args))
- o = ("/usr/bin/arch-chroot /mnt sh -c \"echo '{user}:{pin}' | chpasswd\"".format(**args, pin=args['password']))
-
if args['post'] == 'reboot':
o = simple_command('/usr/bin/umount -R /mnt')
o = simple_command('/usr/bin/reboot now')