Compare commits

..

10 commits

Author SHA1 Message Date
askiiart
a030f9147a
switch default to btrfs, switch to consistent units, fix wasted space on EFI systems 2024-10-01 11:54:01 -05:00
Rudra Saraswat
29cfb63d20 feat: fix FDE on UEFI systems 2024-06-08 19:34:48 +00:00
Rudra Saraswat
296d8886c5 feat: pass UUID as kernel param 2024-06-08 17:02:04 +00:00
Rudra Saraswat
c7c6375657 feat: fix typo 2024-06-08 08:35:30 +00:00
Rudra Saraswat
f863382d07 feat: add null check for input 2024-06-08 07:21:30 +00:00
Rudra Saraswat
0ad9676196 feat: add encryption and akshara hooks 2024-06-08 06:31:18 +00:00
Rudra Saraswat
f413571bce feat: implement encryption for automatic partitioning 2024-06-08 05:08:17 +00:00
Rudra Saraswat
844a3f851b fix: locales 2024-02-18 13:19:41 +05:30
Rudra Saraswat
8add221ca0 feat: remove jade-gui-postinst 2024-02-18 11:24:20 +05:30
Rudra Saraswat
93f41feaa0 feat: add default locales 2024-02-14 20:00:19 +05:30

View file

@ -10,6 +10,7 @@
import os import os
import sys import sys
import json import json
import yaml
import signal import signal
import subprocess import subprocess
@ -31,12 +32,19 @@ def preexec():
signal.signal(signal.SIGQUIT, signal.SIG_IGN) signal.signal(signal.SIGQUIT, signal.SIG_IGN)
def exec(cmd): def exec(cmd, input=None):
if testing: if testing:
print(' '.join(cmd)) if input != None:
print(' '.join(cmd), '<--', input)
else:
print(' '.join(cmd))
else: else:
subprocess.call(cmd, shell=False, stdout=sys.stdout, if input != None:
stderr=sys.stderr, preexec_fn=preexec) subprocess.run(cmd, shell=False, stdout=sys.stdout,
stderr=sys.stderr, preexec_fn=preexec, input=input.encode()).returncode
else:
subprocess.run(cmd, shell=False, stdout=sys.stdout,
stderr=sys.stderr, preexec_fn=preexec).returncode
def exec_chroot(cmd): def exec_chroot(cmd):
@ -107,10 +115,7 @@ def format_and_mount(config, mountpoint, filesystem, blockdevice):
if mountpoint == 'System': if mountpoint == 'System':
mountpoint = '/mnt/' mountpoint = '/mnt/'
elif mountpoint == 'Boot': elif mountpoint == 'Boot':
if efi: mountpoint = '/mnt/boot/'
mountpoint = '/mnt/boot/efi/'
else:
mountpoint = '/mnt/boot/'
elif mountpoint == 'User': elif mountpoint == 'User':
mountpoint = '/mnt/home/' mountpoint = '/mnt/home/'
else: else:
@ -133,60 +138,67 @@ def inst_partition(config):
mode = config['partition']['mode'] mode = config['partition']['mode']
efi = config['partition']['efi'] efi = config['partition']['efi']
partitions = config['partition']['partitions'] partitions = config['partition']['partitions']
password = config['partition']['password']
# Delete partition table
exec(['dd', 'if=/dev/zero', f'of={device}', 'bs=512', 'count=1'])
exec(['sync'])
if mode == 'Auto': if mode == 'Auto':
# Delete partition table
exec(['wipefs', '-a', device])
exec(['sync'])
if efi: if efi:
# Create GPT label # Create GPT label
exec(['parted', '-s', device, 'mklabel', 'gpt']) exec(['parted', '-s', device, 'mklabel', 'gpt'])
# Create EFI partition # Create EFI partition
exec(['parted', '-s', device, 'mkpart', 'fat32', '0', '500']) exec(['parted', '-s', device, 'mkpart', 'fat32', '0%', '512MiB'])
else: else:
# Create msdos label # Create msdos label
exec(['parted', '-s', device, 'mklabel', 'msdos']) exec(['parted', '-s', device, 'mklabel', 'msdos'])
# Create boot partition # Create boot partition
exec(['parted', '-s', device, 'mkpart', exec(['parted', '-s', device, 'mkpart',
'primary', 'ext4', '1MIB', '600MIB']) 'primary', 'ext4', '0%', '512MiB'])
# Create root partition # Create root partition
exec(['parted', '-s', device, 'mkpart', exec(['parted', '-s', device, 'mkpart',
'primary', 'ext4', '700MB', '100%']) 'primary', 'btrfs', '513MiB', '100%'])
global orig_main_partition
if 'nvme' in device or 'mmcblk' in device: if 'nvme' in device or 'mmcblk' in device:
# Format EFI/boot partition # Format EFI/boot partition
if efi: if efi:
exec(['mkfs.vfat', '-F32', f'{device}p1']) exec(['mkfs.vfat', '-F32', f'{device}p1'])
else: else:
exec(['mkfs.ext4', f'{device}p1']) exec(['mkfs.ext4', '-F', f'{device}p1'])
root_partition = f'{device}p2'
orig_main_partition = root_partition
if password != '':
exec(['cryptsetup', '-q', 'luksFormat', root_partition], input=f'{password}\n')
exec(['cryptsetup', 'open', root_partition, 'new_root', '-'], input=f'{password}\n')
root_partition = '/dev/mapper/new_root'
# Format root partition # Format root partition
exec(['mkfs.ext4', f'{device}p2']) exec(['mkfs.btrfs', '-F', root_partition])
# Mount partitions # Mount partitions
mount(f'{device}p2', '/mnt') mount(root_partition, '/mnt')
if efi: mkdir('/mnt/boot')
mkdir('/mnt/boot/efi') mount(f'{device}p1', '/mnt/boot')
mount(f'{device}p1', '/mnt/boot/efi')
else:
mkdir('/mnt/boot')
mount(f'{device}p1', '/mnt/boot')
else: else:
# Format EFI/boot partition # Format EFI/boot partition
if efi: if efi:
exec(['mkfs.vfat', '-F32', f'{device}1']) exec(['mkfs.vfat', '-F32', f'{device}1'])
else: else:
exec(['mkfs.ext4', f'{device}1']) exec(['mkfs.ext4', '-F', f'{device}1'])
root_partition = f'{device}2'
orig_main_partition = root_partition
if password != '':
exec(['cryptsetup', '-q', 'luksFormat', root_partition], input=f'{password}\n')
exec(['cryptsetup', 'open', root_partition, 'new_root', '-'], input=f'{password}\n')
root_partition = '/dev/mapper/new_root'
# Format root partition # Format root partition
exec(['mkfs.ext4', f'{device}2']) exec(['mkfs.btrfs', '-F', root_partition])
# Mount partitions # Mount partitions
mount(f'{device}2', '/mnt') mount(root_partition, '/mnt')
if efi: mkdir('/mnt/boot')
mkdir('/mnt/boot/efi') mount(f'{device}1', '/mnt/boot')
mount(f'{device}1', '/mnt/boot/efi')
else:
mkdir('/mnt/boot')
mount(f'{device}1', '/mnt/boot')
else: else:
partitions.sort(key=lambda x: len(x[1])) partitions.sort(key=lambda x: len(x[1]))
for p in partitions: for p in partitions:
@ -199,7 +211,7 @@ def inst_partition(config):
print( print(
"Invalid manual partitioning configuration. There must be a 'System' partition.") "Invalid manual partitioning configuration. There must be a 'System' partition.")
sys.exit(1) sys.exit(1)
if '/mnt/boot/' not in mountpoints and '/mnt/boot/efi/' not in mountpoints: if '/mnt/boot/' not in mountpoints:
print() print()
print( print(
"Invalid manual partitioning configuration. There must be a 'Boot' partition.") "Invalid manual partitioning configuration. There must be a 'Boot' partition.")
@ -238,33 +250,41 @@ def inst_setup_base(config):
# Refresh package lists, pacman-key --init # Refresh package lists, pacman-key --init
exec_chroot(['pacman-key', '--init']) exec_chroot(['pacman-key', '--init'])
exec_chroot(['pacman-key', '--populate', 'archlinux']) exec_chroot(['pacman-key', '--populate', 'archlinux'])
# Add akshara and encrypt hooks
exec_chroot(['bash', '-c', 'echo "MODULES=()" > /etc/mkinitcpio.conf'])
exec_chroot(['bash', '-c', 'echo "BINARIES=()" >> /etc/mkinitcpio.conf'])
exec_chroot(['bash', '-c', 'echo "FILES=()" >> /etc/mkinitcpio.conf'])
if config['partition']['password'] == '':
exec_chroot(['bash', '-c', 'echo "HOOKS=(base udev akshara autodetect keyboard keymap modconf block filesystems fsck)" >> /etc/mkinitcpio.conf'])
else:
exec_chroot(['bash', '-c', 'echo "HOOKS=(base udev akshara autodetect keyboard keymap consolefont modconf block encrypt filesystems fsck)" >> /etc/mkinitcpio.conf'])
# Install linux-zen # Install linux-zen
exec_chroot(['pacman', '-Sy', '--noconfirm', 'linux-zen', 'xorriso']) exec_chroot(['pacman', '-Sy', '--noconfirm', 'linux-zen', 'xorriso'])
# Remove jade-gui # Remove jade-gui
exec_chroot(['pacman', '-Rn', '--noconfirm', 'jade-gui']) exec_chroot(['pacman', '-Rn', '--noconfirm', 'jade-gui'])
# Install jade-gui-postinst
exec_chroot(['pacman', '-S', '--noconfirm', 'jade-gui-postinst'])
def inst_bootloader(config): def inst_bootloader(config):
# Install bootloader # Install bootloader
if 'NVIDIA' in subprocess.check_output(['lspci']).decode('utf-8'): if 'NVIDIA' in subprocess.check_output(['lspci']).decode('utf-8'):
exec_chroot(['pacman', '-S', '--noconfirm', 'nvidia-dkms'])
exec_chroot( exec_chroot(
['bash', '-c', 'echo -e \'\\nGRUB_CMDLINE_LINUX_DEFAULT="${GRUB_CMDLINE_LINUX_DEFAULT} vt.global_cursor_default=0 nvidia_drm.modeset=1 splash"\' >> /etc/default/grub']) ['bash', '-c', 'echo -e \'\\nGRUB_CMDLINE_LINUX_DEFAULT="${GRUB_CMDLINE_LINUX_DEFAULT} nvidia_drm.modeset=1 splash"\' >> /etc/default/grub'])
mkdir('/mnt/etc/udev/rules.d') mkdir('/mnt/etc/udev/rules.d')
exec_chroot(['ln', '-s', '/dev/null', exec_chroot(['ln', '-s', '/dev/null',
'/etc/udev/rules.d/61-gdm.rules']) '/etc/udev/rules.d/61-gdm.rules'])
else: else:
exec_chroot( exec_chroot(
['bash', '-c', 'echo -e \'\\nGRUB_CMDLINE_LINUX_DEFAULT="${GRUB_CMDLINE_LINUX_DEFAULT} vt.global_cursor_default=0 splash"\' >> /etc/default/grub']) ['bash', '-c', 'echo -e \'\\nGRUB_CMDLINE_LINUX_DEFAULT="${GRUB_CMDLINE_LINUX_DEFAULT} splash"\' >> /etc/default/grub'])
if config['partition']['mode'] == 'Auto': if config['partition']['mode'] == 'Auto':
if config['partition']['password'] != '':
exec_chroot(
['bash', '-c', 'echo -e \'\\nGRUB_CMDLINE_LINUX_DEFAULT="${GRUB_CMDLINE_LINUX_DEFAULT} cryptdevice=UUID=' + subprocess.check_output(['blkid', '-s', 'UUID', '-o', 'value', orig_main_partition]).decode('UTF-8').strip() + ':root root=/dev/mapper/root"\' >> /etc/default/grub'])
exec_chroot( exec_chroot(
['bash', '-c', 'echo -e \'\\nGRUB_TIMEOUT=0\' >> /etc/default/grub']) ['bash', '-c', 'echo -e \'\\nGRUB_TIMEOUT=3\' >> /etc/default/grub'])
if config['bootloader']['type'] == 'grub-efi': if config['bootloader']['type'] == 'grub-efi':
exec_chroot(['grub-install', '--target=x86_64-efi', f'--efi-directory={config["bootloader"]["location"]}', exec_chroot(['grub-install', '--target=x86_64-efi', f'--efi-directory=/boot',
'--bootloader-id=blend', '--removable']) '--bootloader-id=blend', '--removable'])
exec_chroot(['grub-install', '--target=x86_64-efi', f'--efi-directory={config["bootloader"]["location"]}', exec_chroot(['grub-install', '--target=x86_64-efi', f'--efi-directory=/boot',
'--bootloader-id=blend']) '--bootloader-id=blend'])
else: else:
exec_chroot(['grub-install', '--target=i386-pc', exec_chroot(['grub-install', '--target=i386-pc',
@ -322,6 +342,14 @@ def inst_users(config):
# Akshara # Akshara
def inst_akshara(config): def inst_akshara(config):
exec_chroot(
['rm', '-f', '/etc/locale.gen'])
for locale in ['en_US.UTF-8', 'de_DE.UTF-8', 'fr_FR.UTF-8', 'es_ES.UTF-8', 'zh_CN.UTF-8', 'ja_JP.UTF-8', 'ru_RU.UTF-8', 'ar_EG.UTF-8']:
exec_chroot(
['bash', '-c', f'echo "{locale} UTF-8" >> /etc/locale.gen'])
exec_chroot(
['locale-gen'])
system_config = { system_config = {
'repo': 'https://pkg-repo.blendos.co', 'repo': 'https://pkg-repo.blendos.co',
'impl': 'http://github.com/blend-os/tracks/raw/main', 'impl': 'http://github.com/blend-os/tracks/raw/main',
@ -340,7 +368,7 @@ def inst_akshara(config):
] ]
if testing == False: if testing == False:
with open('/system.yaml', 'w') as system_config_file: with open('/mnt/system.yaml', 'w') as system_config_file:
yaml.dump(system_config, system_config_file) yaml.dump(system_config, system_config_file)
else: else:
print(system_config) print(system_config)