Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/archinstall
diff options
context:
space:
mode:
Diffstat (limited to 'archinstall')
-rw-r--r--archinstall/__init__.py60
-rw-r--r--archinstall/lib/disk.py2
-rw-r--r--archinstall/lib/general.py3
-rw-r--r--archinstall/lib/networking.py4
-rw-r--r--archinstall/lib/systemd.py9
5 files changed, 51 insertions, 27 deletions
diff --git a/archinstall/__init__.py b/archinstall/__init__.py
index 075b6f50..276d122f 100644
--- a/archinstall/__init__.py
+++ b/archinstall/__init__.py
@@ -1,4 +1,6 @@
"""Arch Linux installer - guided, templates etc."""
+from argparse import ArgumentParser, FileType
+
from .lib.disk import *
from .lib.exceptions import *
from .lib.general import *
@@ -16,22 +18,46 @@ from .lib.storage import *
from .lib.systemd import *
from .lib.user_interaction import *
+parser = ArgumentParser()
+
__version__ = "2.2.0.dev1"
-# Basic version of arg.parse() supporting:
-# --key=value
-# --boolean
-arguments = {}
-positionals = []
-for arg in sys.argv[1:]:
- if '--' == arg[:2]:
- if '=' in arg:
- key, val = [x.strip() for x in arg[2:].split('=', 1)]
- else:
- key, val = arg[2:], True
- arguments[key] = val
- else:
- positionals.append(arg)
+
+def initialize_arguments():
+ config = {}
+ parser.add_argument("--config", nargs="?", help="json config file", type=FileType("r", encoding="UTF-8"))
+ parser.add_argument("--silent", action="store_true",
+ help="Warning!!! No prompts, ignored if config is not passed")
+ parser.add_argument("--script", default="guided", nargs="?", help="Script to run for installation", type=str)
+ parser.add_argument("--vars",
+ metavar="KEY=VALUE",
+ nargs='?',
+ help="Set a number of key-value pairs "
+ "(do not put spaces before or after the = sign). "
+ "If a value contains spaces, you should define "
+ "it with double quotes: "
+ 'foo="this is a sentence". Note that '
+ "values are always treated as strings.")
+ args = parser.parse_args()
+ if args.config is not None:
+ try:
+ config = json.load(args.config)
+ except Exception as e:
+ print(e)
+ # Installation can't be silent if config is not passed
+ config["silent"] = args.silent
+ if args.vars is not None:
+ try:
+ for var in args.vars.split(' '):
+ key, val = var.split("=")
+ config[key] = val
+ except Exception as e:
+ print(e)
+ config["script"] = args.script
+ return config
+
+
+arguments = initialize_arguments()
# TODO: Learn the dark arts of argparse... (I summon thee dark spawn of cPython)
@@ -46,12 +72,8 @@ def run_as_a_module():
# Add another path for finding profiles, so that list_profiles() in Script() can find guided.py, unattended.py etc.
storage['PROFILE_PATH'].append(os.path.abspath(f'{os.path.dirname(__file__)}/examples'))
-
- if len(sys.argv) == 1:
- sys.argv.append('guided')
-
try:
- script = Script(sys.argv[1])
+ script = Script(arguments.get('script', None))
except ProfileNotFound as err:
print(f"Couldn't find file: {err}")
sys.exit(1)
diff --git a/archinstall/lib/disk.py b/archinstall/lib/disk.py
index 44f2742b..8f67111a 100644
--- a/archinstall/lib/disk.py
+++ b/archinstall/lib/disk.py
@@ -266,7 +266,7 @@ class Partition:
files = len(glob.glob(f"{temporary_mountpoint}/*"))
iterations = 0
- while SysCommand(f"/usr/bin/umount -R {temporary_mountpoint}").exit_code != 0 and (iterations := iterations+1) < 10:
+ while SysCommand(f"/usr/bin/umount -R {temporary_mountpoint}").exit_code != 0 and (iterations := iterations + 1) < 10:
time.sleep(1)
temporary_path.rmdir()
diff --git a/archinstall/lib/general.py b/archinstall/lib/general.py
index 65c83484..cec3891a 100644
--- a/archinstall/lib/general.py
+++ b/archinstall/lib/general.py
@@ -360,7 +360,8 @@ def prerequisite_check():
def reboot():
o = b''.join(SysCommand("/usr/bin/reboot"))
-def pid_exists(pid :int):
+
+def pid_exists(pid: int):
try:
return any(subprocess.check_output(['/usr/bin/ps', '--no-headers', '-o', 'pid', '-p', str(pid)]).strip())
except subprocess.CalledProcessError:
diff --git a/archinstall/lib/networking.py b/archinstall/lib/networking.py
index fdeefb84..eb11a47e 100644
--- a/archinstall/lib/networking.py
+++ b/archinstall/lib/networking.py
@@ -1,14 +1,14 @@
import fcntl
-import os
import logging
+import os
import socket
import struct
from collections import OrderedDict
from .exceptions import *
from .general import SysCommand
-from .storage import storage
from .output import log
+from .storage import storage
def get_hw_addr(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
diff --git a/archinstall/lib/systemd.py b/archinstall/lib/systemd.py
index e64ff7e0..383f1f17 100644
--- a/archinstall/lib/systemd.py
+++ b/archinstall/lib/systemd.py
@@ -5,6 +5,7 @@ from .installer import Installer
from .output import log
from .storage import storage
+
class Ini:
def __init__(self, *args, **kwargs):
"""
@@ -103,7 +104,7 @@ class Boot:
return self.session.is_alive()
- def SysCommand(self, cmd :list, *args, **kwargs):
+ def SysCommand(self, cmd: list, *args, **kwargs):
if cmd[0][0] != '/' and cmd[0][:2] != './':
# This check is also done in SysCommand & SysCommandWorker.
# However, that check is done for `machinectl` and not for our chroot command.
@@ -113,8 +114,8 @@ class Boot:
return SysCommand(["machinectl", "shell", self.container_name, *cmd], *args, **kwargs)
- def SysCommandWorker(self, cmd :list, *args, **kwargs):
+ def SysCommandWorker(self, cmd: list, *args, **kwargs):
if cmd[0][0] != '/' and cmd[0][:2] != './':
cmd[0] = locate_binary(cmd[0])
-
- return SysCommandWorker(["machinectl", "shell", self.container_name, *cmd], *args, **kwargs) \ No newline at end of file
+
+ return SysCommandWorker(["machinectl", "shell", self.container_name, *cmd], *args, **kwargs)