Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archinstall/__init__.py10
-rw-r--r--archinstall/lib/disk.py43
-rw-r--r--archinstall/lib/general.py10
-rw-r--r--archinstall/lib/installer.py37
-rw-r--r--archinstall/lib/luks.py3
-rw-r--r--archinstall/lib/mirrors.py8
-rw-r--r--archinstall/lib/networking.py7
-rw-r--r--archinstall/lib/output.py10
-rw-r--r--archinstall/lib/profiles.py10
-rw-r--r--archinstall/lib/storage.py2
-rw-r--r--archinstall/lib/user_interaction.py35
-rw-r--r--docs/archinstall/general.rst2
-rw-r--r--docs/conf.py5
-rw-r--r--examples/guided.py12
-rw-r--r--profiles/applications/awesome.py12
-rw-r--r--profiles/awesome.py7
-rw-r--r--profiles/budgie.py7
-rw-r--r--profiles/deepin.py8
-rw-r--r--profiles/desktop.py4
-rw-r--r--profiles/enlightenment.py7
-rw-r--r--profiles/gnome.py6
-rw-r--r--profiles/i3.py14
-rw-r--r--profiles/kde.py10
-rw-r--r--profiles/server.py12
-rw-r--r--profiles/sway.py4
-rw-r--r--profiles/xorg.py9
26 files changed, 183 insertions, 111 deletions
diff --git a/archinstall/__init__.py b/archinstall/__init__.py
index f1d8341e..18c83a31 100644
--- a/archinstall/__init__.py
+++ b/archinstall/__init__.py
@@ -17,9 +17,9 @@ from .lib.user_interaction import *
__version__ = "2.2.0.dev1"
-## Basic version of arg.parse() supporting:
-## --key=value
-## --boolean
+# Basic version of arg.parse() supporting:
+# --key=value
+# --boolean
arguments = {}
positionals = []
for arg in sys.argv[1:]:
@@ -33,8 +33,8 @@ for arg in sys.argv[1:]:
positionals.append(arg)
-# TODO: Learn the dark arts of argparse...
-# (I summon thee dark spawn of cPython)
+# TODO: Learn the dark arts of argparse... (I summon thee dark spawn of cPython)
+
def run_as_a_module():
"""
diff --git a/archinstall/lib/disk.py b/archinstall/lib/disk.py
index c099cca1..410bb481 100644
--- a/archinstall/lib/disk.py
+++ b/archinstall/lib/disk.py
@@ -2,6 +2,7 @@ import glob
import pathlib
import re
from collections import OrderedDict
+from typing import Optional
from .general import *
from .hardware import hasUEFI
@@ -17,7 +18,8 @@ MBR = 0b00000010
# libc = ctypes.CDLL(ctypes.util.find_library('c'), use_errno=True)
# libc.mount.argtypes = (ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_ulong, ctypes.c_char_p)
-class BlockDevice():
+
+class BlockDevice:
def __init__(self, path, info=None):
if not info:
# If we don't give any information, we need to auto-fill it.
@@ -76,7 +78,8 @@ class BlockDevice():
if self.info['type'] == 'loop':
for drive in json.loads(b''.join(sys_command(['losetup', '--json'], hide_from_log=True)).decode('UTF_8'))['loopdevices']:
- if not drive['name'] == self.path: continue
+ if not drive['name'] == self.path:
+ continue
return drive['back-file']
elif self.info['type'] == 'disk':
@@ -91,8 +94,8 @@ class BlockDevice():
else:
log(f"Unknown blockdevice type for {self.path}: {self.info['type']}", level=logging.DEBUG)
- # if not stat.S_ISBLK(os.stat(full_path).st_mode):
- # raise DiskError(f'Selected disk "{full_path}" is not a block device.')
+ # if not stat.S_ISBLK(os.stat(full_path).st_mode):
+ # raise DiskError(f'Selected disk "{full_path}" is not a block device.')
@property
def partitions(self):
@@ -153,7 +156,7 @@ class BlockDevice():
self.part_cache = OrderedDict()
-class Partition():
+class Partition:
def __init__(self, path: str, block_device: BlockDevice, part_id=None, size=-1, filesystem=None, mountpoint=None, encrypted=False, autodetect_filesystem=True):
if not part_id:
part_id = os.path.basename(path)
@@ -177,11 +180,11 @@ class Partition():
if self.mountpoint != mount_information.get('target', None) and mountpoint:
raise DiskError(f"{self} was given a mountpoint but the actual mountpoint differs: {mount_information.get('target', None)}")
- if (target := mount_information.get('target', None)):
+ if target := mount_information.get('target', None):
self.mountpoint = target
if not self.filesystem and autodetect_filesystem:
- if (fstype := mount_information.get('fstype', get_filesystem_type(path))):
+ if fstype := mount_information.get('fstype', get_filesystem_type(path)):
self.filesystem = fstype
if self.filesystem == 'crypto_LUKS':
@@ -234,9 +237,9 @@ class Partition():
@property
def real_device(self):
for blockdevice in json.loads(b''.join(sys_command('lsblk -J')).decode('UTF-8'))['blockdevices']:
- if (parent := self.find_parent_of(blockdevice, os.path.basename(self.path))):
+ if parent := self.find_parent_of(blockdevice, os.path.basename(self.path)):
return f"/dev/{parent}"
- # raise DiskError(f'Could not find appropriate parent for encrypted partition {self}')
+ # raise DiskError(f'Could not find appropriate parent for encrypted partition {self}')
return self.path
def detect_inner_filesystem(self, password):
@@ -351,9 +354,9 @@ class Partition():
self.filesystem = 'f2fs'
elif filesystem == 'crypto_LUKS':
- # from .luks import luks2
- # encrypted_partition = luks2(self, None, None)
- # encrypted_partition.format(path)
+ # from .luks import luks2
+ # encrypted_partition = luks2(self, None, None)
+ # encrypted_partition.format(path)
self.filesystem = 'crypto_LUKS'
else:
@@ -371,14 +374,15 @@ class Partition():
return parent
elif 'children' in data:
for child in data['children']:
- if (parent := self.find_parent_of(child, name, parent=data['name'])):
+ if parent := self.find_parent_of(child, name, parent=data['name']):
return parent
def mount(self, target, fs=None, options=''):
if not self.mountpoint:
log(f'Mounting {self} to {target}', level=logging.INFO)
if not fs:
- if not self.filesystem: raise DiskError(f'Need to format (or define) the filesystem on {self} before mounting.')
+ if not self.filesystem:
+ raise DiskError(f'Need to format (or define) the filesystem on {self} before mounting.')
fs = self.filesystem
pathlib.Path(target).mkdir(parents=True, exist_ok=True)
@@ -403,7 +407,7 @@ class Partition():
# Without to much research, it seams that low error codes are errors.
# And above 8k is indicators such as "/dev/x not mounted.".
# So anything in between 0 and 8k are errors (?).
- if exit_code > 0 and exit_code < 8000:
+ if 0 < exit_code < 8000:
raise err
self.mountpoint = None
@@ -416,8 +420,8 @@ class Partition():
"""
The support for a filesystem (this partition) is tested by calling
partition.format() with a path set to '/dev/null' which returns two exceptions:
- 1. SysCallError saying that /dev/null is not formattable - but the filesystem is supported
- 2. UnknownFilesystemFormat that indicates that we don't support the given filesystem type
+ 1. SysCallError saying that /dev/null is not formattable - but the filesystem is supported
+ 2. UnknownFilesystemFormat that indicates that we don't support the given filesystem type
"""
try:
self.format(self.filesystem, '/dev/null', log_formatting=False, allow_formatting=True)
@@ -428,7 +432,7 @@ class Partition():
return True
-class Filesystem():
+class Filesystem:
# TODO:
# When instance of a HDD is selected, check all usages and gracefully unmount them
# as well as close any crypto handles.
@@ -569,7 +573,8 @@ def all_disks(*args, **kwargs):
drives = OrderedDict()
# for drive in json.loads(sys_command(f'losetup --json', *args, **lkwargs, hide_from_log=True)).decode('UTF_8')['loopdevices']:
for drive in json.loads(b''.join(sys_command('lsblk --json -l -n -o path,size,type,mountpoint,label,pkname,model', *args, **kwargs, hide_from_log=True)).decode('UTF_8'))['blockdevices']:
- if not kwargs['partitions'] and drive['type'] == 'part': continue
+ if not kwargs['partitions'] and drive['type'] == 'part':
+ continue
drives[drive['path']] = BlockDevice(drive['path'], drive)
return drives
diff --git a/archinstall/lib/general.py b/archinstall/lib/general.py
index b65e2593..7296b943 100644
--- a/archinstall/lib/general.py
+++ b/archinstall/lib/general.py
@@ -89,7 +89,9 @@ class sys_command:
Stolen from archinstall_gui
"""
- def __init__(self, cmd, callback=None, start_callback=None, peak_output=False, environment_vars={}, *args, **kwargs):
+ def __init__(self, cmd, callback=None, start_callback=None, peak_output=False, environment_vars=None, *args, **kwargs):
+ if environment_vars is None:
+ environment_vars = {}
kwargs.setdefault("worker_id", gen_uid())
kwargs.setdefault("emulate", False)
kwargs.setdefault("suppress_errors", False)
@@ -170,7 +172,7 @@ class sys_command:
'ended': self.ended,
'started_pprint': '{}-{}-{} {}:{}:{}'.format(*time.localtime(self.started)),
'ended_pprint': '{}-{}-{} {}:{}:{}'.format(*time.localtime(self.ended)) if self.ended else None,
- 'exit_code': self.exit_code
+ 'exit_code': self.exit_code,
}
def peak(self, output: Union[str, bytes]) -> bool:
@@ -256,7 +258,7 @@ class sys_command:
original = trigger
trigger = bytes(original, 'UTF-8')
self.kwargs['events'][trigger] = self.kwargs['events'][original]
- del (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')
@@ -269,7 +271,7 @@ class sys_command:
last_trigger_pos = trigger_pos
os.write(child_fd, self.kwargs['events'][trigger])
- del (self.kwargs['events'][trigger])
+ del self.kwargs['events'][trigger]
broke = True
break
diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py
index bac19007..9ddb8825 100644
--- a/archinstall/lib/installer.py
+++ b/archinstall/lib/installer.py
@@ -9,7 +9,7 @@ from .user_interaction import *
__packages__ = ["base", "base-devel", "linux-firmware", "linux", "linux-lts", "linux-zen", "linux-hardened"]
-class Installer():
+class Installer:
"""
`Installer()` is the wrapper for most basic installation steps.
It also wraps :py:func:`~archinstall.Installer.pacstrap` among other things.
@@ -34,7 +34,11 @@ class Installer():
"""
- def __init__(self, target, *, base_packages=__packages__[:3], kernels=['linux']):
+ def __init__(self, target, *, base_packages=None, kernels=None):
+ if base_packages is None:
+ base_packages = __packages__[:3]
+ if kernels is None:
+ kernels = ['linux']
self.target = target
self.init_time = time.strftime('%Y-%m-%d_%H-%M-%S')
self.milliseconds = int(str(time.time()).split('.')[1])
@@ -107,7 +111,7 @@ class Installer():
# Copy over the install log (if there is one) to the install medium if
# at least the base has been strapped in, otherwise we won't have a filesystem/structure to copy to.
if self.helper_flags.get('base-strapped', False) is True:
- if (filename := storage.get('LOG_FILE', None)):
+ if filename := storage.get('LOG_FILE', None):
absolute_logfile = os.path.join(storage.get('LOG_PATH', './'), filename)
if not os.path.isdir(f"{self.target}/{os.path.dirname(absolute_logfile)}"):
@@ -127,7 +131,8 @@ class Installer():
return [step for step, flag in self.helper_flags.items() if flag is False]
def pacstrap(self, *packages, **kwargs):
- if type(packages[0]) in (list, tuple): packages = packages[0]
+ if type(packages[0]) in (list, tuple):
+ packages = packages[0]
self.log(f'Installing packages: {packages}', level=logging.INFO)
if (sync_mirrors := sys_command('/usr/bin/pacman -Syy')).exit_code == 0:
@@ -158,7 +163,8 @@ class Installer():
fh.write(hostname + '\n')
def set_locale(self, locale, encoding='UTF-8', *args, **kwargs):
- if not len(locale): return True
+ if not len(locale):
+ return True
with open(f'{self.target}/etc/locale.gen', 'a') as fh:
fh.write(f'{locale}.{encoding} {encoding}\n')
@@ -168,8 +174,10 @@ class Installer():
return True if sys_command(f'/usr/bin/arch-chroot {self.target} locale-gen').exit_code == 0 else False
def set_timezone(self, zone, *args, **kwargs):
- if not zone: return True
- if not len(zone): return True # Redundant
+ if not zone:
+ return True
+ if not len(zone):
+ return True # Redundant
if (pathlib.Path("/usr") / "share" / "zoneinfo" / zone).exists():
(pathlib.Path(self.target) / "etc" / "localtime").unlink(missing_ok=True)
@@ -227,7 +235,7 @@ class Installer():
def copy_ISO_network_config(self, enable_services=False):
# Copy (if any) iwd password and config files
if os.path.isdir('/var/lib/iwd/'):
- if (psk_files := glob.glob('/var/lib/iwd/*.psk')):
+ if psk_files := glob.glob('/var/lib/iwd/*.psk'):
if not os.path.isdir(f"{self.target}/var/lib/iwd"):
os.makedirs(f"{self.target}/var/lib/iwd")
@@ -253,7 +261,7 @@ class Installer():
shutil.copy2(psk, f"{self.target}/var/lib/iwd/{os.path.basename(psk)}")
# Copy (if any) systemd-networkd config files
- if (netconfigurations := glob.glob('/etc/systemd/network/*')):
+ if netconfigurations := glob.glob('/etc/systemd/network/*'):
if not os.path.isdir(f"{self.target}/etc/systemd/network/"):
os.makedirs(f"{self.target}/etc/systemd/network/")
@@ -263,6 +271,7 @@ class Installer():
if enable_services:
# If we haven't installed the base yet (function called pre-maturely)
if self.helper_flags.get('base', False) is False:
+
def post_install_enable_networkd_resolved(*args, **kwargs):
self.enable_service('systemd-networkd', 'systemd-resolved')
@@ -332,9 +341,7 @@ class Installer():
self.helper_flags['base-strapped'] = True
with open(f"{self.target}/etc/fstab", "a") as fstab:
- fstab.write(
- "\ntmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0\n"
- ) # Redundant \n at the start? who knows?
+ fstab.write("\ntmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0\n") # Redundant \n at the start? who knows?
## TODO: Support locale and timezone
# os.remove(f'{self.target}/etc/localtime')
@@ -423,7 +430,7 @@ class Installer():
## blkid doesn't trigger on loopback devices really well,
## so we'll use the old manual method until we get that sorted out.
- if (real_device := self.detect_encryption(root_partition)):
+ if real_device := self.detect_encryption(root_partition):
# TODO: We need to detect if the encrypted device is a whole disk encryption,
# or simply a partition encryption. Right now we assume it's a partition (and we always have)
log(f"Identifying root partition by PART-UUID on {real_device}: '{real_device.uuid}'.", level=logging.DEBUG)
@@ -473,7 +480,9 @@ class Installer():
sudoers.write(f'{"%" if group else ""}{entity} ALL=(ALL) ALL\n')
return True
- def user_create(self, user: str, password=None, groups=[], sudo=False):
+ def user_create(self, user: str, password=None, groups=None, sudo=False):
+ if groups is None:
+ groups = []
self.log(f'Creating user {user}', level=logging.INFO)
o = b''.join(sys_command(f'/usr/bin/arch-chroot {self.target} useradd -m -G wheel {user}'))
if password:
diff --git a/archinstall/lib/luks.py b/archinstall/lib/luks.py
index e6e1c897..1cb6777f 100644
--- a/archinstall/lib/luks.py
+++ b/archinstall/lib/luks.py
@@ -5,7 +5,7 @@ from .general import *
from .output import log
-class luks2():
+class luks2:
def __init__(self, partition, mountpoint, password, key_file=None, auto_unmount=False, *args, **kwargs):
self.password = password
self.partition = partition
@@ -120,6 +120,7 @@ class luks2():
:type mountpoint: str
"""
from .disk import get_filesystem_type
+
if '/' in mountpoint:
os.path.basename(mountpoint) # TODO: Raise exception instead?
diff --git a/archinstall/lib/mirrors.py b/archinstall/lib/mirrors.py
index e2630710..55ec5a98 100644
--- a/archinstall/lib/mirrors.py
+++ b/archinstall/lib/mirrors.py
@@ -15,9 +15,9 @@ def filter_mirrors_by_region(regions, destination='/etc/pacman.d/mirrorlist', tm
region_list = []
for region in regions.split(','):
region_list.append(f'country={region}')
- o = b''.join(sys_command((f"/usr/bin/wget 'https://archlinux.org/mirrorlist/?{'&'.join(region_list)}&protocol=https&ip_version=4&ip_version=6&use_mirror_status=on' -O {tmp_dir}/mirrorlist")))
- o = b''.join(sys_command((f"/usr/bin/sed -i 's/#Server/Server/' {tmp_dir}/mirrorlist")))
- o = b''.join(sys_command((f"/usr/bin/mv {tmp_dir}/mirrorlist {destination}")))
+ o = b''.join(sys_command(f"/usr/bin/wget 'https://archlinux.org/mirrorlist/?{'&'.join(region_list)}&protocol=https&ip_version=4&ip_version=6&use_mirror_status=on' -O {tmp_dir}/mirrorlist"))
+ o = b''.join(sys_command(f"/usr/bin/sed -i 's/#Server/Server/' {tmp_dir}/mirrorlist"))
+ o = b''.join(sys_command(f"/usr/bin/mv {tmp_dir}/mirrorlist {destination}"))
return True
@@ -71,7 +71,7 @@ def use_mirrors(regions: dict, destination='/etc/pacman.d/mirrorlist'):
def re_rank_mirrors(top=10, *positionals, **kwargs):
- if sys_command((f'/usr/bin/rankmirrors -n {top} /etc/pacman.d/mirrorlist > /etc/pacman.d/mirrorlist')).exit_code == 0:
+ if sys_command(f'/usr/bin/rankmirrors -n {top} /etc/pacman.d/mirrorlist > /etc/pacman.d/mirrorlist').exit_code == 0:
return True
return False
diff --git a/archinstall/lib/networking.py b/archinstall/lib/networking.py
index 3e5ed4e7..1a5c403f 100644
--- a/archinstall/lib/networking.py
+++ b/archinstall/lib/networking.py
@@ -55,9 +55,9 @@ def wireless_scan(interface):
sys_command(f"iwctl station {interface} scan")
- if not '_WIFI' in storage:
+ if '_WIFI' not in storage:
storage['_WIFI'] = {}
- if not interface in storage['_WIFI']:
+ if interface not in storage['_WIFI']:
storage['_WIFI'][interface] = {}
storage['_WIFI'][interface]['scanning'] = True
@@ -66,8 +66,9 @@ def wireless_scan(interface):
# TODO: Full WiFi experience might get evolved in the future, pausing for now 2021-01-25
def get_wireless_networks(interface):
# TODO: Make this oneliner pritter to check if the interface is scanning or not.
- if not '_WIFI' in storage or interface not in storage['_WIFI'] or storage['_WIFI'][interface].get('scanning', False) is False:
+ if '_WIFI' not in storage or interface not in storage['_WIFI'] or storage['_WIFI'][interface].get('scanning', False) is False:
import time
+
wireless_scan(interface)
time.sleep(5)
diff --git a/archinstall/lib/output.py b/archinstall/lib/output.py
index cce9e88c..f69571c0 100644
--- a/archinstall/lib/output.py
+++ b/archinstall/lib/output.py
@@ -83,11 +83,11 @@ def stylize_output(text: str, *opts, **kwargs):
color_names = ('black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white')
foreground = {color_names[x]: '3%s' % x for x in range(8)}
background = {color_names[x]: '4%s' % x for x in range(8)}
- RESET = '0'
+ reset = '0'
code_list = []
if text == '' and len(opts) == 1 and opts[0] == 'reset':
- return '\x1b[%sm' % RESET
+ return '\x1b[%sm' % reset
for k, v in kwargs.items():
if k == 'fg':
code_list.append(foreground[v])
@@ -97,7 +97,7 @@ def stylize_output(text: str, *opts, **kwargs):
if o in opt_dict:
code_list.append(opt_dict[o])
if 'noreset' not in opts:
- text = '%s\x1b[%sm' % (text or '', RESET)
+ text = '%s\x1b[%sm' % (text or '', reset)
return '%s%s' % (('\x1b[%sm' % ';'.join(code_list)), text or '')
@@ -112,7 +112,7 @@ def log(*args, **kwargs):
# If a logfile is defined in storage,
# we use that one to output everything
- if (filename := storage.get('LOG_FILE', None)):
+ if filename := storage.get('LOG_FILE', None):
absolute_logfile = os.path.join(storage.get('LOG_PATH', './'), filename)
try:
@@ -155,7 +155,7 @@ def log(*args, **kwargs):
log("Deprecated level detected in log message, please use new logging.<level> instead for the following log message:", fg="red", level=logging.ERROR, force=True)
kwargs['level'] = logging.DEBUG
- if kwargs['level'] > storage.get('LOG_LEVEL', logging.INFO) and not 'force' in kwargs:
+ if kwargs['level'] > storage.get('LOG_LEVEL', logging.INFO) and 'force' not in kwargs:
# Level on log message was Debug, but output level is set to Info.
# In that case, we'll drop it.
return None
diff --git a/archinstall/lib/profiles.py b/archinstall/lib/profiles.py
index 2f97231c..871e6223 100644
--- a/archinstall/lib/profiles.py
+++ b/archinstall/lib/profiles.py
@@ -14,7 +14,7 @@ from .storage import storage
def grab_url_data(path):
- safe_path = path[:path.find(':') + 1] + ''.join([item if item in ('/', '?', '=', '&') else urllib.parse.quote(item) for item in multisplit(path[path.find(':') + 1:], ('/', '?', '=', '&'))])
+ safe_path = path[: path.find(':') + 1] + ''.join([item if item in ('/', '?', '=', '&') else urllib.parse.quote(item) for item in multisplit(path[path.find(':') + 1:], ('/', '?', '=', '&'))])
ssl_context = ssl.create_default_context()
ssl_context.check_hostname = False
ssl_context.verify_mode = ssl.CERT_NONE
@@ -75,7 +75,7 @@ def list_profiles(filter_irrelevant_macs=True, subpath='', filter_top_level_prof
if filter_top_level_profiles:
for profile in list(cache.keys()):
if Profile(None, profile).is_top_level_profile() is False:
- del (cache[profile])
+ del cache[profile]
return cache
@@ -154,7 +154,7 @@ class Script:
return self
def execute(self):
- if not self.namespace in sys.modules or self.spec is None:
+ if self.namespace not in sys.modules or self.spec is None:
self.load_instructions()
self.spec.loader.exec_module(sys.modules[self.namespace])
@@ -163,8 +163,10 @@ class Script:
class Profile(Script):
- def __init__(self, installer, path, args={}):
+ def __init__(self, installer, path, args=None):
super(Profile, self).__init__(path, installer)
+ if args is None:
+ args = {}
def __dump__(self, *args, **kwargs):
return {'path': self.path}
diff --git a/archinstall/lib/storage.py b/archinstall/lib/storage.py
index 53d5e938..42214572 100644
--- a/archinstall/lib/storage.py
+++ b/archinstall/lib/storage.py
@@ -18,5 +18,5 @@ storage = {
'PROFILE_DB': None, # Used in cases when listing profiles is desired, not mandatory for direct profile grabing.
'LOG_PATH': '/var/log/archinstall',
'LOG_FILE': 'install.log',
- 'MOUNT_POINT': '/mnt'
+ 'MOUNT_POINT': '/mnt',
}
diff --git a/archinstall/lib/user_interaction.py b/archinstall/lib/user_interaction.py
index 69689479..d490aeec 100644
--- a/archinstall/lib/user_interaction.py
+++ b/archinstall/lib/user_interaction.py
@@ -23,6 +23,7 @@ from .profiles import Profile
# TODO: Some inconsistencies between the selection processes.
# Some return the keys from the options, some the values?
+
def get_terminal_height():
return shutil.get_terminal_size().lines
@@ -84,7 +85,7 @@ def do_countdown():
def get_password(prompt="Enter a password: "):
- while (passwd := getpass.getpass(prompt)):
+ while passwd := getpass.getpass(prompt):
passwd_verification = getpass.getpass(prompt='And one more time for verification: ')
if passwd != passwd_verification:
log(' * Passwords did not match * ', fg='red')
@@ -104,7 +105,7 @@ def print_large_list(options, padding=5, margin_bottom=0, separator=': '):
max_num_of_columns = get_terminal_width() // longest_line
max_options_in_cells = max_num_of_columns * (get_terminal_height() - margin_bottom)
- if (len(options) > max_options_in_cells):
+ if len(options) > max_options_in_cells:
for index, option in enumerate(options):
print(f"{index}: {option}")
return 1, index
@@ -214,8 +215,10 @@ class MiniCurses:
self._cursor_x += len(text)
def clear(self, x, y):
- if x < 0: x = 0
- if y < 0: y = 0
+ if x < 0:
+ x = 0
+ if y < 0:
+ y = 0
# import time
# sys.stdout.write(f"Clearing from: {x, y}")
@@ -243,7 +246,7 @@ class MiniCurses:
return True
# Move back to the current known position (BACKSPACE doesn't updated x-pos)
sys.stdout.flush()
- sys.stdout.write("\033[%dG" % (self._cursor_x))
+ sys.stdout.write("\033[%dG" % self._cursor_x)
sys.stdout.flush()
# Write a blank space
@@ -253,7 +256,7 @@ class MiniCurses:
# And move back again
sys.stdout.flush()
- sys.stdout.write("\033[%dG" % (self._cursor_x))
+ sys.stdout.write("\033[%dG" % self._cursor_x)
sys.stdout.flush()
self._cursor_x -= 1
@@ -360,7 +363,7 @@ def ask_for_a_timezone():
def ask_for_bootloader() -> str:
bootloader = "systemd-bootctl"
- if hasUEFI() == False:
+ if not hasUEFI():
bootloader = "grub-install"
else:
bootloader_choice = input("Would you like to use GRUB as a bootloader instead of systemd-boot? [y/N] ").lower()
@@ -401,8 +404,7 @@ def ask_to_configure_network():
for index, mode in enumerate(modes):
print(f"{index}: {mode}")
- mode = generic_select(['DHCP', 'IP'], f"Select which mode to configure for {nic} or leave blank for DHCP: ",
- options_output=False)
+ mode = generic_select(['DHCP', 'IP'], f"Select which mode to configure for {nic} or leave blank for DHCP: ", options_output=False)
if mode == 'IP':
while 1:
ip = input(f"Enter the IP and subnet for {nic} (example: 192.168.0.5/24): ").strip()
@@ -450,11 +452,10 @@ def ask_for_disk_layout():
options = {
'keep-existing': 'Keep existing partition layout and select which ones to use where',
'format-all': 'Format entire drive and setup a basic partition scheme',
- 'abort': 'Abort the installation'
+ 'abort': 'Abort the installation',
}
- value = generic_select(options, "Found partitions on the selected drive, (select by number) what you want to do: ",
- allow_empty_input=False, sort=True)
+ value = generic_select(options, "Found partitions on the selected drive, (select by number) what you want to do: ", allow_empty_input=False, sort=True)
return next((key for key, val in options.items() if val == value), None)
@@ -466,8 +467,7 @@ def ask_for_main_filesystem_format():
'f2fs': 'f2fs'
}
- value = generic_select(options, "Select which filesystem your main partition should use (by number or name): ",
- allow_empty_input=False)
+ value = generic_select(options, "Select which filesystem your main partition should use (by number or name): ", allow_empty_input=False)
return next((key for key, val in options.items() if val == value), None)
@@ -584,8 +584,7 @@ def select_profile(options):
print(' -- They might make it easier to install things like desktop environments. --')
print(' -- (Leave blank and hit enter to skip this step and continue) --')
- selected_profile = generic_select(profiles, 'Enter a pre-programmed profile name if you want to install one: ',
- options_output=False)
+ selected_profile = generic_select(profiles, 'Enter a pre-programmed profile name if you want to install one: ', options_output=False)
if selected_profile:
return Profile(None, selected_profile)
else:
@@ -675,9 +674,7 @@ def select_mirror_regions(mirrors, show_top_mirrors=True):
print_large_list(regions, margin_bottom=4)
print(' -- You can skip this step by leaving the option blank --')
- selected_mirror = generic_select(regions,
- 'Select one of the above regions to download packages from (by number or full name): ',
- options_output=False)
+ selected_mirror = generic_select(regions, 'Select one of the above regions to download packages from (by number or full name): ', options_output=False)
if not selected_mirror:
# Returning back empty options which can be both used to
# do "if x:" logic as well as do `x.get('mirror', {}).get('sub', None)` chaining
diff --git a/docs/archinstall/general.rst b/docs/archinstall/general.rst
index 7319d244..79406ea3 100644
--- a/docs/archinstall/general.rst
+++ b/docs/archinstall/general.rst
@@ -1,7 +1,7 @@
.. _archinstall.helpers:
.. warning::
- All these helper functions are mostly, if not all, related to outside-installation-instructions. Meaning the calls will affect your current running system - and not touch your installed system.
+ All these helper functions are mostly, if not all, related to outside-installation-instructions. Meaning the calls will affect your current running system - and not touch your installed system.
Profile related helpers
=======================
diff --git a/docs/conf.py b/docs/conf.py
index 9d23f979..88a55e02 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -123,8 +123,5 @@ man_pages = [("index", "archinstall", u"archinstall Documentation", [u"Anton Hvo
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
- (
- "index", "archinstall", u"archinstall Documentation",
- u"Anton Hvornum", "archinstall", "Simple and minimal HTTP server."
- ),
+ ("index", "archinstall", u"archinstall Documentation", u"Anton Hvornum", "archinstall", "Simple and minimal HTTP server."),
]
diff --git a/examples/guided.py b/examples/guided.py
index 0ddca5a2..e9873ef0 100644
--- a/examples/guided.py
+++ b/examples/guided.py
@@ -84,8 +84,7 @@ def ask_user_questions():
# Select a partition
# If we provide keys as options, it's better to convert them to list and sort before passing
mountpoints_list = sorted(list(partition_mountpoints.keys()))
- partition = archinstall.generic_select(mountpoints_list,
- "Select a partition by number that you want to set a mount-point for (leave blank when done): ")
+ partition = archinstall.generic_select(mountpoints_list, "Select a partition by number that you want to set a mount-point for (leave blank when done): ")
if not partition:
if set(mountpoints_set) & {'/', '/boot'} == {'/', '/boot'}:
break
@@ -105,7 +104,7 @@ def ask_user_questions():
if not old_password:
old_password = input(f'Enter the old encryption password for {partition}: ')
- if (autodetected_filesystem := partition.detect_inner_filesystem(old_password)):
+ if autodetected_filesystem := partition.detect_inner_filesystem(old_password):
new_filesystem = autodetected_filesystem
else:
archinstall.log("Could not auto-detect the filesystem inside the encrypted volume.", fg='red')
@@ -322,7 +321,7 @@ def perform_installation(mountpoint):
installation.set_hostname(archinstall.arguments['hostname'])
if archinstall.arguments['mirror-region'].get("mirrors", None) is not None:
installation.set_mirrors(archinstall.arguments['mirror-region']) # Set the mirrors in the installation medium
- if archinstall.arguments["bootloader"] == "grub-install" and hasUEFI() == True:
+ if archinstall.arguments["bootloader"] == "grub-install" and hasUEFI():
installation.add_additional_packages("grub")
installation.set_keyboard_language(archinstall.arguments['keyboard-language'])
installation.add_bootloader(archinstall.arguments["bootloader"])
@@ -373,10 +372,7 @@ def perform_installation(mountpoint):
if archinstall.arguments['profile'] and archinstall.arguments['profile'].has_post_install():
with archinstall.arguments['profile'].load_instructions(namespace=f"{archinstall.arguments['profile'].namespace}.py") as imported:
if not imported._post_install():
- archinstall.log(
- ' * Profile\'s post configuration requirements was not fulfilled.',
- fg='red'
- )
+ archinstall.log(' * Profile\'s post configuration requirements was not fulfilled.', fg='red')
exit(1)
installation.log("For post-installation tips, see https://wiki.archlinux.org/index.php/Installation_guide#Post-installation", fg="yellow")
diff --git a/profiles/applications/awesome.py b/profiles/applications/awesome.py
index d5a8e793..33526fd7 100644
--- a/profiles/applications/awesome.py
+++ b/profiles/applications/awesome.py
@@ -1,6 +1,16 @@
import archinstall
-__packages__ = ["awesome", "xorg-xrandr", "xterm", "feh", "slock", "terminus-font", "gnu-free-fonts", "ttf-liberation", "xsel"]
+__packages__ = [
+ "awesome",
+ "xorg-xrandr",
+ "xterm",
+ "feh",
+ "slock",
+ "terminus-font",
+ "gnu-free-fonts",
+ "ttf-liberation",
+ "xsel",
+]
archinstall.storage['installation_session'].install_profile('xorg')
diff --git a/profiles/awesome.py b/profiles/awesome.py
index aa4702a6..0c1b20ea 100644
--- a/profiles/awesome.py
+++ b/profiles/awesome.py
@@ -6,7 +6,12 @@ is_top_level_profile = False
# New way of defining packages for a profile, which is iterable and can be used out side
# of the profile to get a list of "what packages will be installed".
-__packages__ = ['nemo', 'gpicview', 'main', 'alacritty']
+__packages__ = [
+ "nemo",
+ "gpicview",
+ "main",
+ "alacritty",
+]
def _prep_function(*args, **kwargs):
diff --git a/profiles/budgie.py b/profiles/budgie.py
index abaf87b0..3e4a85df 100644
--- a/profiles/budgie.py
+++ b/profiles/budgie.py
@@ -5,7 +5,12 @@ import archinstall
is_top_level_profile = False
# "It is recommended also to install the gnome group, which contains applications required for the standard GNOME experience." - Arch Wiki
-__packages__ = ["budgie-desktop", "lightdm", "lightdm-gtk-greeter", "gnome"]
+__packages__ = [
+ "budgie-desktop",
+ "gnome",
+ "lightdm",
+ "lightdm-gtk-greeter",
+]
def _prep_function(*args, **kwargs):
diff --git a/profiles/deepin.py b/profiles/deepin.py
index ebe730e2..5bc18285 100644
--- a/profiles/deepin.py
+++ b/profiles/deepin.py
@@ -4,7 +4,13 @@ import archinstall
is_top_level_profile = False
-__packages__ = ["deepin", "deepin-terminal", "deepin-editor", "lightdm", "lightdm-gtk-greeter"]
+__packages__ = [
+ "deepin",
+ "deepin-terminal",
+ "deepin-editor",
+ "lightdm",
+ "lightdm-gtk-greeter",
+]
def _prep_function(*args, **kwargs):
diff --git a/profiles/desktop.py b/profiles/desktop.py
index 67514a97..30bb9a6a 100644
--- a/profiles/desktop.py
+++ b/profiles/desktop.py
@@ -43,9 +43,7 @@ def _prep_function(*args, **kwargs):
'enlightenment',
]
- desktop = archinstall.generic_select(
- supported_desktops, 'Select your desired desktop environment: ', allow_empty_input=False, sort=True
- )
+ desktop = archinstall.generic_select(supported_desktops, 'Select your desired desktop environment: ', allow_empty_input=False, sort=True)
# Temporarily store the selected desktop profile
# in a session-safe location, since this module will get reloaded
diff --git a/profiles/enlightenment.py b/profiles/enlightenment.py
index cfb97836..3850fed0 100644
--- a/profiles/enlightenment.py
+++ b/profiles/enlightenment.py
@@ -4,7 +4,12 @@ import archinstall
is_top_level_profile = False
-__packages__ = ["enlightenment", "terminology", "lightdm", "lightdm-gtk-greeter"]
+__packages__ = [
+ "enlightenment",
+ "terminology",
+ "lightdm",
+ "lightdm-gtk-greeter",
+]
def _prep_function(*args, **kwargs):
diff --git a/profiles/gnome.py b/profiles/gnome.py
index 7bf5b7fd..1b3bf327 100644
--- a/profiles/gnome.py
+++ b/profiles/gnome.py
@@ -5,7 +5,11 @@ import archinstall
is_top_level_profile = False
# Note: GDM should be part of the gnome group, but adding it here for clarity
-__packages__ = ["gnome", "gnome-tweaks", "gdm"]
+__packages__ = [
+ "gnome",
+ "gnome-tweaks",
+ "gdm",
+]
def _prep_function(*args, **kwargs):
diff --git a/profiles/i3.py b/profiles/i3.py
index 418749c0..b26745a1 100644
--- a/profiles/i3.py
+++ b/profiles/i3.py
@@ -6,7 +6,15 @@ is_top_level_profile = False
# New way of defining packages for a profile, which is iterable and can be used out side
# of the profile to get a list of "what packages will be installed".
-__packages__ = ['i3lock', 'i3status', 'i3blocks', 'xterm', 'lightdm-gtk-greeter', 'lightdm', 'dmenu']
+__packages__ = [
+ 'i3lock',
+ 'i3status',
+ 'i3blocks',
+ 'xterm',
+ 'lightdm-gtk-greeter',
+ 'lightdm',
+ 'dmenu',
+]
def _prep_function(*args, **kwargs):
@@ -18,9 +26,7 @@ def _prep_function(*args, **kwargs):
"""
supported_configurations = ['i3-wm', 'i3-gaps']
- desktop = archinstall.generic_select(
- supported_configurations, 'Select your desired configuration: ', allow_empty_input=False, sort=True
- )
+ desktop = archinstall.generic_select(supported_configurations, 'Select your desired configuration: ', allow_empty_input=False, sort=True)
# Temporarily store the selected desktop profile
# in a session-safe location, since this module will get reloaded
diff --git a/profiles/kde.py b/profiles/kde.py
index 451704b9..c58f4f45 100644
--- a/profiles/kde.py
+++ b/profiles/kde.py
@@ -4,7 +4,15 @@ import archinstall
is_top_level_profile = False
-__packages__ = ["plasma-meta", "konsole", "kate", "dolphin", "sddm", "plasma-wayland-session", "egl-wayland"]
+__packages__ = [
+ "plasma-meta",
+ "konsole",
+ "kate",
+ "dolphin",
+ "sddm",
+ "plasma-wayland-session",
+ "egl-wayland",
+]
# TODO: Remove hard dependency of bash (due to .bash_profile)
diff --git a/profiles/server.py b/profiles/server.py
index 355be9f5..704c8efe 100644
--- a/profiles/server.py
+++ b/profiles/server.py
@@ -6,7 +6,17 @@ import archinstall
is_top_level_profile = True
-available_servers = ["cockpit", "docker", "httpd", "lighttpd", "mariadb", "nginx", "postgresql", "sshd", "tomcat"]
+available_servers = [
+ "cockpit",
+ "docker",
+ "httpd",
+ "lighttpd",
+ "mariadb",
+ "nginx",
+ "postgresql",
+ "sshd",
+ "tomcat",
+]
def _prep_function(*args, **kwargs):
diff --git a/profiles/sway.py b/profiles/sway.py
index 686fe868..9afc047d 100644
--- a/profiles/sway.py
+++ b/profiles/sway.py
@@ -35,9 +35,7 @@ def _prep_function(*args, **kwargs):
# or through conventional import sway
if __name__ == "sway":
if "nvidia" in _gfx_driver_packages:
- choice = input(
- "The proprietary Nvidia driver is not supported by Sway. It is likely that you will run into issues. Continue anyways? [y/N] "
- )
+ choice = input("The proprietary Nvidia driver is not supported by Sway. It is likely that you will run into issues. Continue anyways? [y/N] ")
if choice.lower() in ("n", ""):
raise archinstall.lib.exceptions.HardwareIncompatibilityError("Sway does not support the proprietary nvidia drivers.")
diff --git a/profiles/xorg.py b/profiles/xorg.py
index e18a4f03..b8fb2cbb 100644
--- a/profiles/xorg.py
+++ b/profiles/xorg.py
@@ -4,7 +4,14 @@ import archinstall
is_top_level_profile = True
-__packages__ = ['dkms', 'xorg-server', 'xorg-xinit', 'nvidia-dkms', 'xorg-server', *archinstall.lib.hardware.__packages__]
+__packages__ = [
+ 'dkms',
+ 'xorg-server',
+ 'xorg-xinit',
+ 'nvidia-dkms',
+ 'xorg-server',
+ *archinstall.lib.hardware.__packages__,
+]
def _prep_function(*args, **kwargs):