Skip to content

Commit

Permalink
Add user information for error
Browse files Browse the repository at this point in the history
  • Loading branch information
svartkanin committed Oct 14, 2023
1 parent 3c2ed1c commit c599f7b
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 20 deletions.
58 changes: 38 additions & 20 deletions archinstall/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""Arch Linux installer - guided, templates etc."""
import importlib
import os
import traceback
from argparse import ArgumentParser, Namespace
from pathlib import Path
from typing import TYPE_CHECKING, Any, Dict, Union
Expand Down Expand Up @@ -34,15 +35,12 @@
run_custom_user_commands, json_stream_to_structure, secret
)


if TYPE_CHECKING:
_: Any


__version__ = "2.6.3"
storage['__version__'] = __version__


# add the custom _ as a builtin, it can now be used anywhere in the
# project to mark strings as translatable with _('translate me')
DeferredTranslation.install()
Expand All @@ -57,12 +55,10 @@
# For support reasons, we'll log the disk layout pre installation to match against post-installation layout
debug(f"Disk states before installing: {disk.disk_layouts()}")


if os.getuid() != 0:
print(_("Archinstall requires root privileges to run. See --help for more."))
exit(1)


parser = ArgumentParser()


Expand All @@ -82,14 +78,17 @@ def define_arguments():
parser.add_argument("--dry-run", "--dry_run", action="store_true",
help="Generates a configuration file and then exits instead of performing an installation")
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("--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("--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, err :bool = False) -> dict:
def parse_unspecified_argument_list(unknowns: list, multiple: bool = False, err: bool = False) -> dict:
"""We accept arguments not defined to the parser. (arguments "ad hoc").
Internally argparse return to us a list of words so we have to parse its contents, manually.
We accept following individual syntax for each argument
Expand All @@ -105,32 +104,33 @@ def parse_unspecified_argument_list(unknowns :list, multiple :bool = False, err
argument value value ...
which isn't am error if multiple is specified
"""
tmp_list = unknowns[:] # wastes a few bytes, but avoids any collateral effect of the destructive nature of the pop method()
tmp_list = unknowns[
:] # wastes a few bytes, but avoids any collateral effect of the destructive nature of the pop method()
config = {}
key = None
last_key = None
while tmp_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 ?
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)]
config[key] = value
last_key = key # for multiple handling
key = None # we have the kwy value pair we need
last_key = key # for multiple handling
key = None # we have the kwy value pair we need
else:
key = element[2:]
config[key] = True # every argument starts its lifecycle as boolean
config[key] = True # every argument starts its lifecycle as boolean
else:
if element == '=':
continue
if key:
config[key] = element
last_key = key # multiple
last_key = key # multiple
key = None
else:
if multiple and last_key:
if isinstance(config[last_key],str):
config[last_key] = [config[last_key],element]
if isinstance(config[last_key], str):
config[last_key] = [config[last_key], element]
else:
config[last_key].append(element)
elif err:
Expand Down Expand Up @@ -158,6 +158,7 @@ def cleanup_empty_args(args: Union[Namespace, Dict]) -> Dict:

return clean_args


def get_arguments() -> Dict[str, Any]:
""" The handling of parameters from the command line
Is done on following steps:
Expand Down Expand Up @@ -275,7 +276,7 @@ def plugin(f, *args, **kwargs):
plugins[f.__name__] = f


def run_as_a_module():
def main():
"""
This can either be run as the compiled and installed application: python setup.py install
OR straight as a module: python -m archinstall
Expand All @@ -289,3 +290,20 @@ def run_as_a_module():
mod_name = f'archinstall.scripts.{script}'
# by loading the module we'll automatically run the script
importlib.import_module(mod_name)


def run_as_a_module():
try:
main()
except Exception as e:
err = ''.join(traceback.format_exception(e))
error(err)

text = (
'Archinstall experienced the above error. If you think this is a bug, please report it to\n'
'https://github.com/archlinux/archinstall and include the log file "/var/log/archinstall/install.log".\n\n'
'Hint: To extract the log from a live ISO \ncurl -F\'file=@/var/log/archinstall/install.log\' https://0x0.st\n'
)

warn(text)
exit(1)
1 change: 1 addition & 0 deletions archinstall/lib/global_menu.py
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,7 @@ def _disk_encryption(self, preset: Optional[disk.DiskEncryption]) -> Optional[di

def _locale_selection(self, preset: LocaleConfiguration) -> LocaleConfiguration:
data_store: Dict[str, Any] = {}
raise ValueError('not good')
locale_config = LocaleMenu(data_store, preset).run()
return locale_config

Expand Down

0 comments on commit c599f7b

Please sign in to comment.