Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/archinstall/__main__.py
diff options
context:
space:
mode:
authorAnton Hvornum <anton.feeds+github@gmail.com>2020-11-02 20:28:19 +0100
committerGitHub <noreply@github.com>2020-11-02 20:28:19 +0100
commit887d5ded07e4cac1f5ade27317feeeb85edd0a3e (patch)
tree6f19997ddb9f9e8fe0032f42b517a48c5b604e75 /archinstall/__main__.py
parent57eef46f953574799e01b389e9f665f058bbd42d (diff)
parent77f69f844beb3c5d8f4a37aa7ede2c7762cba418 (diff)
Merge pull request #58 from demostanis/master
Shell script calling python & support for specifying remote profiles and full paths
Diffstat (limited to 'archinstall/__main__.py')
-rw-r--r--archinstall/__main__.py59
1 files changed, 40 insertions, 19 deletions
diff --git a/archinstall/__main__.py b/archinstall/__main__.py
index 48d8a5ce..63f87d24 100644
--- a/archinstall/__main__.py
+++ b/archinstall/__main__.py
@@ -1,12 +1,18 @@
-import archinstall, sys, os, glob
-import importlib.util
+from urllib.parse import urlparse
+import archinstall
+import sys
+import os
+import glob
+import urllib.request
# TODO: Learn the dark arts of argparse...
-# (I summon thee dark spawn of cPython)
+# (I summon thee dark spawn of cPython)
+
class ProfileNotFound(BaseException):
pass
+
def find_examples():
"""
Used to locate the examples, bundled with the module or executable.
@@ -19,32 +25,47 @@ def find_examples():
return {os.path.basename(path): path for path in glob.glob(f'{examples}/*.py')}
+
+def find(url):
+ parsed_url = urlparse(url)
+ if not parsed_url.scheme:
+ examples = find_examples()
+ if f"{url}.py" in examples:
+ return open(examples[f"{url}.py"]).read()
+ try:
+ return open(url, 'r').read()
+ except FileNotFoundError:
+ return ProfileNotFound(f"File {url} does not exist")
+ elif parsed_url.scheme in ('https', 'http'):
+ return urllib.request.urlopen(url).read().decode('utf-8')
+ else:
+ return ProfileNotFound(f"Cannot handle scheme {parsed_url.scheme}")
+
+
def run_as_a_module():
"""
Since we're running this as a 'python -m archinstall' module OR
a nuitka3 compiled version of the project.
This function and the file __main__ acts as a entry point.
"""
- if len(sys.argv) == 1: sys.argv.append('guided')
- profile = sys.argv[1]
- library = find_examples()
+ if len(sys.argv) == 1:
+ sys.argv.append('guided')
- if f'{profile}.py' not in library:
- raise ProfileNotFound(f'Could not locate {profile}.py among the example files.')
+ try:
+ profile = find(sys.argv[1])
+ except ProfileNotFound as err:
+ print(f"Couldn't find file: {err}")
+ sys.exit(1)
- # Swap the working dir, otherwise certain relative lookups won't work within archinstall.
- # Mainly to avoid https://github.com/Torxed/archinstall/issues/59
os.chdir(os.path.abspath(os.path.dirname(__file__)))
-
- # Import and execute the chosen `<profile>.py`:
- spec = importlib.util.spec_from_file_location(
- library[f"{profile}.py"],
- library[f"{profile}.py"]
- )
- imported_path = importlib.util.module_from_spec(spec)
- spec.loader.exec_module(imported_path)
- sys.modules[library[f'{profile}.py']] = imported_path
+ try:
+ exec(profile) # Is this is very safe?
+ except Exception as err:
+ print(f"Failed to run profile... {err}")
+ sys.exit(1) # Should prompt for another profile path instead
+
+
if __name__ == '__main__':
run_as_a_module()