Merge branch 'master' of github.com:Torxed/archinstall

This commit is contained in:
Anton Hvornum 2019-11-13 22:32:58 +00:00
commit f97fde0b3b
2 changed files with 83 additions and 12 deletions

View File

@ -75,7 +75,7 @@ except:
## FIXME: dependency checks (fdisk, lsblk etc) ## FIXME: dependency checks (fdisk, lsblk etc)
def sig_handler(signal, frame): def sig_handler(signal, frame):
print('Aborting further installation steps!') print('\nAborting further installation steps!')
print(' Here\'s a summary of the commandline:') print(' Here\'s a summary of the commandline:')
print(f' {sys.argv}') print(f' {sys.argv}')
@ -311,7 +311,7 @@ def get_drive_from_part_uuid(partuuid):
return None return None
def update_git(): def update_git(branch='master'):
default_gw = get_default_gateway_linux() default_gw = get_default_gateway_linux()
if(default_gw): if(default_gw):
print('[N] Checking for updates...') print('[N] Checking for updates...')
@ -328,12 +328,16 @@ def update_git():
return 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' # 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'
if output != b'Already up to date': if output != b'Already up to date' or branch != 'master':
#tmp = re.findall(b'[0-9]+ file changed', output) #tmp = re.findall(b'[0-9]+ file changed', output)
#print(tmp) #print(tmp)
#if len(tmp): #if len(tmp):
# num_changes = int(tmp[0].split(b' ',1)[0]) # num_changes = int(tmp[0].split(b' ',1)[0])
# if(num_changes): # if(num_changes):
if branch != 'master':
print(f'[N] Changing branch to {branch}')
output = simple_command(f'(cd /root/archinstall; git checkout {branch}; git pull)')
if not 'rebooted' in args: if not 'rebooted' in args:
## Reboot the script (in same context) ## Reboot the script (in same context)
@ -415,14 +419,22 @@ def grab_url_data(path):
def get_application_instructions(target): def get_application_instructions(target):
instructions = {} instructions = {}
try: try:
instructions = grab_url_data('{}/applications/{}.json'.format(args['profiles-path'], target)) instructions = grab_url_data('{}/applications/{}.json'.format(args['profiles-path'], target)).decode('UTF-8')
print('[N] Found application instructions for: {}'.format(target))
except urllib.error.HTTPError: except urllib.error.HTTPError:
print('[N] No instructions found for: {}'.format(target)) print('[N] No instructions found for: {}'.format(target))
return instructions print('[N] Trying local instructions under ./deployments/applications')
local_path = './deployments/applications' if os.path.isfile('./archinstall.py') else './archinstall/deployments/applications' # Dangerous assumption
if os.path.isfile(f'{local_path}/{target}.json'):
with open(f'{local_path}/{target}.json', 'r') as fh:
instructions = fh.read()
print('[N] Found local application instructions for: {}'.format(target))
else:
return instructions
print('[N] Found application instructions for: {}'.format(target))
try: try:
instructions = json.loads(instructions.decode('UTF-8'), object_pairs_hook=oDict) instructions = json.loads(instructions, object_pairs_hook=oDict)
except: except:
print('[E] JSON syntax error in {}'.format('{}/applications/{}.json'.format(args['profiles-path'], target))) print('[E] JSON syntax error in {}'.format('{}/applications/{}.json'.format(args['profiles-path'], target)))
traceback.print_exc() traceback.print_exc()
@ -433,14 +445,22 @@ def get_application_instructions(target):
def get_instructions(target): def get_instructions(target):
instructions = {} instructions = {}
try: try:
instructions = grab_url_data('{}/{}.json'.format(args['profiles-path'], target)) instructions = grab_url_data('{}/{}.json'.format(args['profiles-path'], target)).decode('UTF-8')
print('[N] Found net-deploy instructions called: {}'.format(target))
except urllib.error.HTTPError: except urllib.error.HTTPError:
print('[N] No instructions found called: {}'.format(target)) print('[N] No instructions found called: {}'.format(target))
return instructions print('[N] Trying local instructions under ./deployments')
local_path = './deployments' if os.path.isfile('./archinstall.py') else './archinstall/deployments' # Dangerous assumption
if os.path.isfile(f'{local_path}/{target}.json'):
with open(f'{local_path}/{target}.json', 'r') as fh:
instructions = fh.read()
print('[N] Found local instructions called: {}'.format(target))
else:
return instructions
print('[N] Found net-deploy instructions called: {}'.format(target))
try: try:
instructions = json.loads(instructions.decode('UTF-8'), object_pairs_hook=oDict) instructions = json.loads(instructions, object_pairs_hook=oDict)
except: except:
print('[E] JSON syntax error in {}'.format('{}/{}.json'.format(args['profiles-path'], target))) print('[E] JSON syntax error in {}'.format('{}/{}.json'.format(args['profiles-path'], target)))
traceback.print_exc() traceback.print_exc()
@ -488,6 +508,7 @@ if __name__ == '__main__':
if not 'profile' in args: args['profile'] = None if not 'profile' in args: args['profile'] = None
if not 'profiles-path' in args: args['profiles-path'] = profiles_path if not 'profiles-path' in args: args['profiles-path'] = profiles_path
if not 'rerun' in args: args['rerun'] = None if not 'rerun' in args: args['rerun'] = None
if not 'support-aur' in args: args['support-aur'] = True # Support adds yay (https://github.com/Jguer/yay) in installation steps.
if not 'ignore-rerun' in args: args['ignore-rerun'] = False if not 'ignore-rerun' in args: args['ignore-rerun'] = False
if not 'localtime' in args: args['localtime'] = 'Europe/Stockholm' if args['country'] == 'SE' else 'GMT+0' # TODO: Arbitrary for now if not 'localtime' in args: args['localtime'] = 'Europe/Stockholm' if args['country'] == 'SE' else 'GMT+0' # TODO: Arbitrary for now
if not 'drive' in args: if not 'drive' in args:
@ -703,6 +724,9 @@ if __name__ == '__main__':
elif 'prerequisits' in instructions: elif 'prerequisits' in instructions:
pre_conf = instructions['prerequisits'] pre_conf = instructions['prerequisits']
if 'git-branch' in pre_conf:
update_git(pre_conf['git-branch'])
## Prerequisit steps needs to NOT be executed in arch-chroot. ## Prerequisit steps needs to NOT be executed in arch-chroot.
## Mainly because there's no root structure to chroot into. ## Mainly because there's no root structure to chroot into.
## But partly because some configurations need to be done against the live CD. ## But partly because some configurations need to be done against the live CD.
@ -743,7 +767,7 @@ if __name__ == '__main__':
o = b''.join(sys_command('/usr/bin/pacman -Syy').exec()) o = b''.join(sys_command('/usr/bin/pacman -Syy').exec())
o = b''.join(sys_command('/usr/bin/pacstrap /mnt base base-devel linux linux-firmware btrfs-progs efibootmgr nano wpa_supplicant dialog {packages}'.format(**args)).exec()) o = b''.join(sys_command('/usr/bin/pacstrap /mnt base base-devel linux linux-firmware btrfs-progs efibootmgr nano wpa_supplicant dialog {packages}'.format(**args)).exec())
if not os.path.isdir('/mnt/etc'): if not os.path.isdir('/mnt/etc'): # TODO: This might not be the most long term stable thing to rely on...
print('[E] Failed to strap in packages', o) print('[E] Failed to strap in packages', o)
exit(1) exit(1)
@ -787,12 +811,26 @@ if __name__ == '__main__':
entry.write('initrd /initramfs-linux.img\n') entry.write('initrd /initramfs-linux.img\n')
entry.write('options cryptdevice=UUID={UUID}:luksdev root=/dev/mapper/luksdev rw intel_pstate=no_hwp\n'.format(UUID=UUID)) entry.write('options cryptdevice=UUID={UUID}:luksdev root=/dev/mapper/luksdev rw intel_pstate=no_hwp\n'.format(UUID=UUID))
if args['support-aur']:
o = b''.join(sys_command('/usr/bin/arch-chroot /mnt sh -c "useradd -m -G wheel aibuilder"').exec())
o = b''.join(sys_command("/usr/bin/sed -i 's/# %wheel ALL=(ALL) NO/%wheel ALL=(ALL) NO/' /mnt/etc/sudoers").exec())
o = b''.join(sys_command('/usr/bin/arch-chroot /mnt sh -c "git clone https://aur.archlinux.org/yay.git"').exec())
o = b''.join(sys_command('/usr/bin/arch-chroot /mnt sh -c "chown -R aibuilder.aibuilder yay"').exec())
o = b''.join(sys_command('/usr/bin/arch-chroot /mnt sh -c "su - aibuilder -c \"(cd /root/yay; makepkg -si --noconfirm)\" >/dev/null"').exec())
o = b''.join(sys_command('/usr/bin/arch-chroot /mnt sh -c "sed -i \'s/%wheel ALL=(ALL) NO/# %wheel ALL=(ALL) NO/\' /mnt/etc/sudoers"').exec())
o = b''.join(sys_command('/usr/bin/arch-chroot /mnt sh -c "userdel aibuilder"').exec())
o = b''.join(sys_command('/usr/bin/arch-chroot /mnt sh -c "rm -rf /home/aibuilder"').exec())
conf = {} conf = {}
if 'post' in instructions: if 'post' in instructions:
conf = instructions['post'] conf = instructions['post']
elif not 'args' in instructions and len(instructions): elif not 'args' in instructions and len(instructions):
conf = instructions conf = instructions
if 'git-branch' in conf:
update_git(pre_conf['git-branch'])
for title in conf: for title in conf:
if args['rerun'] and args['rerun'] != title and not rerun: if args['rerun'] and args['rerun'] != title and not rerun:
continue continue

View File

@ -0,0 +1,33 @@
{
"pre" : {
"git-branch" : "aur-support"
},
"args" : {
"password" : "<STDIN>",
"_keyboard_layout" : "sv-latin1",
"_editor" : "nano",
"_mediaplayer" : "lollypop gstreamer gst-plugins-good gnome-keyring",
"_filebrowser" : "nemo gpicview-gtk3",
"_webbrowser" : "chromium",
"_window_manager" : "awesome",
"_window_manager_dependencies" : "xorg-server xorg-xrandr xorg-xinit xterm",
"_window_manager_utilities" : "feh slock xscreensaver terminus-font-otb gnu-free-fonts ttf-liberation xsel",
"_virtulization" : "qemu ovmf",
"_utils" : "openssh sshfs git htop pkgfile scrot dhclient wget smbclient cifs-utils libu2f-host",
"_audio" : "pulseaudio pulseaudio-alsa pavucontrol",
"post" : "don't reboot"
},
"post" : {
"Install workstation packages": {
"pacman -Syy --noconfirm {_webbrowser} {_utils} {_mediaplayer} {_window_manager} {_window_manager_dependencies} {_window_manager_utilities} {_virtulization} {_filebrowser} {_editor}" : {"pass-args" : true}
},
"Setup virtulization" : {
"sh -c \"Description=\\\"Bridge for virtual machines\\\"\nInterface=br0\nConnection=bridge\nBindsToInterfaces=(eno1)\nIP=no\nExecUpPost=\\\"ip link set dev br0 address $(cat /sys/class/net/eno1/address); IP=dhcp; ip_set\\\"\nExecDownPre=\\\"IP=dhcp\\\"\n\n## Ignore (R)STP and immediately activate the bridge\nSkipForwardingDelay=yes\"" : null
},
"Setup loclization" : {
"sh -c \"echo 'setxkbmap se' >> /etc/X11/xinit/xinitrc\"" : null,
"sh -c \"echo 'KEYMAP={_keyboard_layout}\nFONT=lat9w-16' >> /etc/vconsole.conf\"" : {"pass-args" : true}
},
"Configure desktop environment" : "awesome"
}
}