Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/archinstall/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'archinstall/__init__.py')
-rw-r--r--archinstall/__init__.py70
1 files changed, 50 insertions, 20 deletions
diff --git a/archinstall/__init__.py b/archinstall/__init__.py
index 7edeaa80..44852d4c 100644
--- a/archinstall/__init__.py
+++ b/archinstall/__init__.py
@@ -1,5 +1,6 @@
"""Arch Linux installer - guided, templates etc."""
-from argparse import ArgumentParser
+import typing
+from argparse import ArgumentParser, Namespace
from .lib.disk import *
from .lib.exceptions import *
@@ -40,7 +41,7 @@ from .lib.menu.selection_menu import (
Selector,
GeneralMenu
)
-from .lib.translation import Translation, DeferredTranslation
+from .lib.translationhandler import TranslationHandler, DeferredTranslation
from .lib.plugins import plugins, load_plugin # This initiates the plugin loading ceremony
from .lib.configuration import *
from .lib.udev import udevadm_info
@@ -50,7 +51,7 @@ from .lib.hsm import (
)
parser = ArgumentParser()
-__version__ = "2.5.0"
+__version__ = "2.5.1"
storage['__version__'] = __version__
# add the custome _ as a builtin, it can now be used anywhere in the
@@ -58,10 +59,6 @@ storage['__version__'] = __version__
DeferredTranslation.install()
-def set_unicode_font():
- SysCommand('setfont UniCyr_8x16')
-
-
def define_arguments():
"""
Define which explicit arguments do we allow.
@@ -70,6 +67,7 @@ def define_arguments():
Remember that the property/entry name python assigns to the parameters is the first string defined as argument and
dashes inside it '-' are changed to '_'
"""
+ parser.add_argument("-v", "--version", action="version", version="%(prog)s " + __version__)
parser.add_argument("--config", nargs="?", help="JSON configuration file or URL")
parser.add_argument("--creds", nargs="?", help="JSON credentials configuration file")
parser.add_argument("--disk_layouts","--disk_layout","--disk-layouts","--disk-layout",nargs="?",
@@ -81,6 +79,8 @@ def define_arguments():
parser.add_argument("--script", default="guided", nargs="?", help="Script to run for installation", type=str)
parser.add_argument("--mount-point","--mount_point", nargs="?", type=str, help="Define an alternate mount point for installation")
parser.add_argument("--debug", action="store_true", default=False, help="Adds debug info into the log")
+ parser.add_argument("--offline", action="store_true", default=False, help="Disabled online upstream services such as package search and key-ring auto update.")
+ parser.add_argument("--no-pkg-lookups", action="store_true", default=False, help="Disabled package validation specifically prior to starting installation.")
parser.add_argument("--plugin", nargs="?", type=str)
def parse_unspecified_argument_list(unknowns :list, multiple :bool = False, error :bool = False) -> dict:
@@ -91,7 +91,7 @@ def parse_unspecified_argument_list(unknowns :list, multiple :bool = False, erro
--argument=value
--argument = value
--argument (boolean as default)
- the optional paramters to the function alter a bit its behaviour:
+ the optional parameters to the function alter a bit its behaviour:
* multiple allows multivalued arguments, each value separated by whitespace. They're returned as a list
* error. If set any non correctly specified argument-value pair to raise an exception. Else, simply notifies the existence of a problem and continues processing.
@@ -104,7 +104,7 @@ def parse_unspecified_argument_list(unknowns :list, multiple :bool = False, erro
key = None
last_key = None
while tmp_list:
- element = tmp_list.pop(0) # retreive an element of the list
+ element = tmp_list.pop(0) # retrieve an element of the list
if element.startswith('--'): # is an argument ?
if '=' in element: # uses the arg=value syntax ?
key, value = [x.strip() for x in element[2:].split('=', 1)]
@@ -133,6 +133,24 @@ def parse_unspecified_argument_list(unknowns :list, multiple :bool = False, erro
print(f" We ignore the entry {element} as it isn't related to any argument")
return config
+def cleanup_empty_args(args :typing.Union[Namespace, dict]) -> dict:
+ """
+ Takes arguments (dictionary or argparse Namespace) and removes any
+ None values. This ensures clean mergers during dict.update(args)
+ """
+ if type(args) == Namespace:
+ args = vars(args)
+
+ clean_args = {}
+ for key, val in args.items():
+ if type(val) == dict:
+ val = cleanup_empty_args(val)
+
+ if val is not None:
+ clean_args[key] = val
+
+ return clean_args
+
def get_arguments() -> Dict[str, Any]:
""" The handling of parameters from the command line
Is done on following steps:
@@ -160,55 +178,70 @@ def get_arguments() -> Dict[str, Any]:
exit(1)
# load the parameters. first the known, then the unknowns
- config.update(vars(args))
+ args = cleanup_empty_args(args)
+ config.update(args)
config.update(parse_unspecified_argument_list(unknowns))
# amend the parameters (check internal consistency)
# Installation can't be silent if config is not passed
- if args.config is not None :
- config["silent"] = args.silent
- else:
+ if args.get('config') is None:
config["silent"] = False
+ else:
+ config["silent"] = args.get('silent')
# avoiding a compatibility issue
if 'dry-run' in config:
del config['dry-run']
+
return config
def load_config():
- from .lib.models import NetworkConfiguration
"""
refine and set some arguments. Formerly at the scripts
"""
+ from .lib.models import NetworkConfiguration
+
+ if (archinstall_lang := arguments.get('archinstall-language', None)) is not None:
+ arguments['archinstall-language'] = TranslationHandler().get_language_by_name(archinstall_lang)
+
if arguments.get('harddrives', None) is not None:
if type(arguments['harddrives']) is str:
arguments['harddrives'] = arguments['harddrives'].split(',')
arguments['harddrives'] = [BlockDevice(BlockDev) for BlockDev in arguments['harddrives']]
# Temporarily disabling keep_partitions if config file is loaded
# Temporary workaround to make Desktop Environments work
+
if arguments.get('profile', None) is not None:
if type(arguments.get('profile', None)) is dict:
arguments['profile'] = Profile(None, arguments.get('profile', None)['path'])
else:
arguments['profile'] = Profile(None, arguments.get('profile', None))
+
storage['_desktop_profile'] = arguments.get('desktop-environment', None)
+
if arguments.get('mirror-region', None) is not None:
if type(arguments.get('mirror-region', None)) is dict:
arguments['mirror-region'] = arguments.get('mirror-region', None)
else:
selected_region = arguments.get('mirror-region', None)
arguments['mirror-region'] = {selected_region: list_mirrors()[selected_region]}
+
if arguments.get('sys-language', None) is not None:
arguments['sys-language'] = arguments.get('sys-language', 'en_US')
+
if arguments.get('sys-encoding', None) is not None:
arguments['sys-encoding'] = arguments.get('sys-encoding', 'utf-8')
+
if arguments.get('gfx_driver', None) is not None:
storage['gfx_driver_packages'] = AVAILABLE_GFX_DRIVERS.get(arguments.get('gfx_driver', None), None)
+
if arguments.get('servers', None) is not None:
storage['_selected_servers'] = arguments.get('servers', None)
+
if arguments.get('nic', None) is not None:
handler = NetworkConfigurationHandler()
handler.parse_arguments(arguments.get('nic'))
arguments['nic'] = handler.configuration
+
if arguments.get('!users', None) is not None or arguments.get('!superusers', None) is not None:
users = arguments.get('!users', None)
superusers = arguments.get('!superusers', None)
@@ -227,8 +260,6 @@ def post_process_arguments(arguments):
load_plugin(arguments['plugin'])
if arguments.get('disk_layouts', None) is not None:
- # if 'disk_layouts' not in storage:
- # storage['disk_layouts'] = {}
layout_storage = {}
if not json_stream_to_structure('--disk_layouts',arguments['disk_layouts'],layout_storage):
exit(1)
@@ -237,18 +268,17 @@ def post_process_arguments(arguments):
arguments['harddrives'] = [disk for disk in layout_storage]
# backward compatibility. Change partition.format for partition.wipe
for disk in layout_storage:
- for i,partition in enumerate(layout_storage[disk].get('partitions',[])):
+ for i, partition in enumerate(layout_storage[disk].get('partitions',[])):
if 'format' in partition:
partition['wipe'] = partition['format']
del partition['format']
+ elif 'btrfs' in partition:
+ partition['btrfs']['subvolumes'] = Subvolume.parse_arguments(partition['btrfs']['subvolumes'])
arguments['disk_layouts'] = layout_storage
load_config()
-# to ensure that cyrillic characters work in the installer
-# set_unicode_font()
-
define_arguments()
arguments = get_arguments()
post_process_arguments(arguments)