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__.py72
1 files changed, 53 insertions, 19 deletions
diff --git a/archinstall/__init__.py b/archinstall/__init__.py
index 18c83a31..91e0cb12 100644
--- a/archinstall/__init__.py
+++ b/archinstall/__init__.py
@@ -1,4 +1,9 @@
"""Arch Linux installer - guided, templates etc."""
+import urllib.error
+import urllib.parse
+import urllib.request
+from argparse import ArgumentParser
+
from .lib.disk import *
from .lib.exceptions import *
from .lib.general import *
@@ -13,24 +18,57 @@ from .lib.packages import *
from .lib.profiles import *
from .lib.services import *
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 configuration file or URL")
+ 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:
+ # First, let's check if this is a URL scheme instead of a filename
+ parsed_url = urllib.parse.urlparse(args.config)
+
+ if not parsed_url.scheme: # The Profile was not a direct match on a remote URL, it must be a local file.
+ with open(args.config) as file:
+ config = json.load(file)
+ else: # Attempt to load the configuration from the URL.
+ with urllib.request.urlopen(args.config) as response:
+ config = json.loads(response.read())
+ 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)
@@ -45,12 +83,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)