Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

User error info and version check #2169

Merged
merged 5 commits into from
Oct 15, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
71 changes: 52 additions & 19 deletions archinstall/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
"""Arch Linux installer - guided, templates etc."""
import importlib
import os
import time
import traceback
from argparse import ArgumentParser, Namespace
from pathlib import Path
from typing import TYPE_CHECKING, Any, Dict, Union
Expand All @@ -21,6 +23,7 @@
from .lib.hardware import SysInfo, GfxDriver
from .lib.installer import Installer, accessibility_tools_in_use
from .lib.output import FormattedOutput, log, error, debug, warn, info
from .lib.pacman import Pacman
from .lib.storage import storage
from .lib.global_menu import GlobalMenu
from .lib.boot import Boot
Expand All @@ -34,15 +37,13 @@
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 +58,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 +81,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 +107,32 @@ 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 +160,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,12 +278,25 @@ def plugin(f, *args, **kwargs):
plugins[f.__name__] = f


def run_as_a_module():
def _check_new_version():
info("Checking version...")
Pacman.run("-Sy")
upgrade = Pacman.run("-Qu archinstall").decode()

if upgrade:
text = f'New version available: {upgrade}'
info(text)
time.sleep(3)


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
In any case we will be attempting to load the provided script to be run from the scripts/ folder
"""
_check_new_version()

script = arguments.get('script', None)

if script is None:
Expand All @@ -289,3 +305,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)