Added support for .py profiles. Added a simple 'desktop.py' for now that is just a mock to make sure it's working.
This commit is contained in:
parent
a695607326
commit
3ed8db5ef0
|
|
@ -1,4 +1,5 @@
|
||||||
import os, urllib.request, urllib.parse, ssl, json
|
import os, urllib.request, urllib.parse, ssl, json
|
||||||
|
import importlib.util, sys
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
from .general import multisplit, sys_command, log
|
from .general import multisplit, sys_command, log
|
||||||
from .exceptions import *
|
from .exceptions import *
|
||||||
|
|
@ -13,49 +14,19 @@ def grab_url_data(path):
|
||||||
response = urllib.request.urlopen(safe_path, context=ssl_context)
|
response = urllib.request.urlopen(safe_path, context=ssl_context)
|
||||||
return response.read()
|
return response.read()
|
||||||
|
|
||||||
def get_application_instructions(target):
|
class Imported():
|
||||||
instructions = {}
|
def __init__(self, spec, imported):
|
||||||
|
self.spec = spec
|
||||||
|
self.imported = imported
|
||||||
|
|
||||||
for path in ['./', './profiles', '/etc/archinstall', '/etc/archinstall/profiles']:
|
def __enter__(self, *args, **kwargs):
|
||||||
if os.path.isfile(f'{path}/applications/{target}.json'):
|
self.spec.loader.exec_module(self.imported)
|
||||||
return os.path.abspath(f'{path}/{self.name}.json')
|
return self
|
||||||
|
|
||||||
try:
|
def __exit__(self, *args, **kwargs):
|
||||||
if (cache := grab_url_data(f'{UPSTREAM_URL}/{self.name}.json')):
|
# TODO: https://stackoverflow.com/questions/28157929/how-to-safely-handle-an-exception-inside-a-context-manager
|
||||||
self._cache = cache
|
if len(args) >= 2 and args[1]:
|
||||||
return f'{UPSTREAM_URL}/{self.name}.json'
|
raise args[1]
|
||||||
except urllib.error.HTTPError:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
if (cache := grab_url_data(f'{UPSTREAM_URL}/applications/{self.name}.json')):
|
|
||||||
self._cache = cache
|
|
||||||
return f'{UPSTREAM_URL}/applications/{self.name}.json'
|
|
||||||
except urllib.error.HTTPError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
try:
|
|
||||||
instructions = grab_url_data(f'{UPSTREAM_URL}/applications/{target}.json').decode('UTF-8')
|
|
||||||
log('[N] Found application instructions for: {}'.format(target))
|
|
||||||
except urllib.error.HTTPError:
|
|
||||||
log('[N] Could not find remote instructions. yrying local instructions under ./profiles/applications')
|
|
||||||
local_path = './profiles/applications' if os.path.isfile('./archinstall.py') else './archinstall/profiles/applications' # Dangerous assumption
|
|
||||||
if os.path.isfile(f'{local_path}/{target}.json'):
|
|
||||||
with open(f'{local_path}/{target}.json', 'r') as fh:
|
|
||||||
instructions = fh.read()
|
|
||||||
|
|
||||||
log('[N] Found local application instructions for: {}'.format(target))
|
|
||||||
else:
|
|
||||||
log('[N] No instructions found for: {}'.format(target))
|
|
||||||
return instructions
|
|
||||||
|
|
||||||
try:
|
|
||||||
instructions = json.loads(instructions, object_pairs_hook=oDict)
|
|
||||||
except:
|
|
||||||
log('[E] JSON syntax error in {}'.format('{}/applications/{}.json'.format(args['profiles-path'], target)))
|
|
||||||
traceback.print_exc()
|
|
||||||
exit(1)
|
|
||||||
|
|
||||||
return instructions
|
|
||||||
|
|
||||||
class Profile():
|
class Profile():
|
||||||
def __init__(self, installer, name, args={}):
|
def __init__(self, installer, name, args={}):
|
||||||
|
|
@ -69,10 +40,18 @@ class Profile():
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def path(self, *args, **kwargs):
|
def path(self, *args, **kwargs):
|
||||||
for path in ['./', './profiles', '/etc/archinstall', '/etc/archinstall/profiles']:
|
for path in ['./profiles', '/etc/archinstall', '/etc/archinstall/profiles', os.path.abspath(f'{os.path.dirname(__file__)}/../profiles')]: # Step out of /lib
|
||||||
if os.path.isfile(f'{path}/{self.name}.json'):
|
if os.path.isfile(f'{path}/{self.name}.json'):
|
||||||
return os.path.abspath(f'{path}/{self.name}.json')
|
return os.path.abspath(f'{path}/{self.name}.json')
|
||||||
|
elif os.path.isfile(f'{path}/{self.name}.py'):
|
||||||
|
return os.path.abspath(f'{path}/{self.name}.py')
|
||||||
|
|
||||||
|
try:
|
||||||
|
if (cache := grab_url_data(f'{UPSTREAM_URL}/{self.name}.py')):
|
||||||
|
self._cache = cache
|
||||||
|
return f'{UPSTREAM_URL}/{self.name}.py'
|
||||||
|
except urllib.error.HTTPError:
|
||||||
|
pass
|
||||||
try:
|
try:
|
||||||
if (cache := grab_url_data(f'{UPSTREAM_URL}/{self.name}.json')):
|
if (cache := grab_url_data(f'{UPSTREAM_URL}/{self.name}.json')):
|
||||||
self._cache = cache
|
self._cache = cache
|
||||||
|
|
@ -88,9 +67,17 @@ class Profile():
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def py_exec_mock(self):
|
||||||
|
spec.loader.exec_module(imported)
|
||||||
|
|
||||||
def load_instructions(self):
|
def load_instructions(self):
|
||||||
if (absolute_path := self.path):
|
if (absolute_path := self.path):
|
||||||
if absolute_path[:4] == 'http':
|
if os.path.splitext(absolute_path)[1] == '.py':
|
||||||
|
spec = importlib.util.spec_from_file_location(absolute_path, absolute_path)
|
||||||
|
imported = importlib.util.module_from_spec(spec)
|
||||||
|
sys.modules[os.path.basename(absolute_path)] = imported
|
||||||
|
return Imported(spec, imported)
|
||||||
|
elif absolute_path[:4] == 'http':
|
||||||
return json.loads(self._cache)
|
return json.loads(self._cache)
|
||||||
|
|
||||||
with open(absolute_path, 'r') as fh:
|
with open(absolute_path, 'r') as fh:
|
||||||
|
|
@ -100,6 +87,10 @@ class Profile():
|
||||||
|
|
||||||
def install(self):
|
def install(self):
|
||||||
instructions = self.load_instructions()
|
instructions = self.load_instructions()
|
||||||
|
if type(instructions) == Imported:
|
||||||
|
with instructions as runtime:
|
||||||
|
log(f'Profile {self.name} finished successfully.')
|
||||||
|
else:
|
||||||
if 'args' in instructions:
|
if 'args' in instructions:
|
||||||
self.args = instructions['args']
|
self.args = instructions['args']
|
||||||
if 'post' in instructions:
|
if 'post' in instructions:
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
import archinstall
|
||||||
|
print('Installing desktop using:', archinstall)
|
||||||
Loading…
Reference in New Issue