diff --git a/usr/bin/lxcmgr b/usr/bin/lxcmgr index 98aa4ec..52e1d66 100755 --- a/usr/bin/lxcmgr +++ b/usr/bin/lxcmgr @@ -84,13 +84,11 @@ def list_updates(): else: print('No applications packages installed.') -def install_app(app): - pm = PkgMgr() - app = App(app) +def run_install_action(action, app): with ThreadPoolExecutor() as executor: - future = executor.submit(pm.install_app, app) + future = executor.submit(action, app) while not future.done(): - time.sleep(1) + time.sleep(0.25) print_install_status(app) # Get the result of the future and let it raise exception, if there was any data = future.result() @@ -108,16 +106,23 @@ def print_install_status(app): print('\x1b[KInstalling...', end='\r') elif app.stage == Stage.UNINSTALL: print('\x1b[KUninstalling...', end='\r') + elif app.stage == Stage.UPDATE: + print('\x1b[KUpdating...', end='\r') elif app.stage == Stage.DONE: print('\x1b[KDone.') +def install_app(app): + pm = PkgMgr() + app = App(app) + run_install_action(pm.install_app, app) + def update_app(app): pm = PkgMgr() - pm.update_app(app) + run_install_action(pm.update_app, app) def uninstall_app(app): pm = PkgMgr() - pm.uninstall_app(app) + run_install_action(pm.uninstall_app, app) args = parser.parse_args() if not hasattr(args, 'action'): diff --git a/usr/lib/python3.6/lxcmgr/pkgmgr.py b/usr/lib/python3.6/lxcmgr/pkgmgr.py index 6af1aad..02b7ac6 100644 --- a/usr/lib/python3.6/lxcmgr/pkgmgr.py +++ b/usr/lib/python3.6/lxcmgr/pkgmgr.py @@ -21,7 +21,8 @@ class Stage(Enum): UNPACK = 3 INSTALL = 4 UNINSTALL = 5 - DONE = 6 + UPDATE = 6 + DONE = 7 class RepoUnauthorized(Exception): pass @@ -215,7 +216,7 @@ class PkgMgr: image = self.online_packages['images'][image].copy() if 'mounts' in self.online_packages['apps'][app]['containers'][container]: image['mounts'] = self.online_packages['apps'][app]['containers'][container]['mounts'] - if 'depends' in self.online_packages['apps'][app]['containers'][container] + if 'depends' in self.online_packages['apps'][app]['containers'][container]: image['depends'] = self.online_packages['apps'][app]['containers'][container]['depends'] lxcmgr.create_container(container, image) svcmgr.create_service(app, container, image) @@ -224,12 +225,15 @@ class PkgMgr: def uninstall_app(self, app): # Main uninstallation function. Wrapper for uninstall script and filesystem purge if app not in self.installed_packages['apps']: + app.stage = Stage.DONE return + app.stage = Stage.UNINSTALL self.run_uninstall_script(app) self.destroy_containers(app) self.purge_scripts(app) self.unregister_app(app) self.purge_unused_layers() + app.stage = Stage.DONE def destroy_containers(self, app): # Destroy LXC containers @@ -255,6 +259,7 @@ class PkgMgr: # TODO: Implement actual update uninstall_app(app) install_app(app, item) + app.stage = Stage.DONE def has_update(self, app): # Check if online repository list a newer version of app diff --git a/usr/lib/python3.6/lxcmgr/svcmgr.py b/usr/lib/python3.6/lxcmgr/svcmgr.py index 2f3f9ab..cffadb9 100644 --- a/usr/lib/python3.6/lxcmgr/svcmgr.py +++ b/usr/lib/python3.6/lxcmgr/svcmgr.py @@ -8,9 +8,9 @@ from .templates import SERVICE def create_service(app, container, image): depends = ' '.join(image['depends']) if 'depends' in image else '' - check = 'lxc-execute {} -- sh -c \'until $({}); do sleep 0.1; done\''.format(container, image['check']) if 'check' in image else '' + ready = 'lxc-attach {} -- sh -c \'until $({}); do sleep 0.1; done\''.format(container, image['ready']) if 'ready' in image else '' with open(os.path.join(SERVICE_DIR, container), 'w') as f: - f.write(SERVICE.format(app=app, container=container, depends=depends, check=check)) + f.write(SERVICE.format(app=app, container=container, depends=depends, ready=ready)) update_services() def delete_service(service): diff --git a/usr/lib/python3.6/lxcmgr/templates.py b/usr/lib/python3.6/lxcmgr/templates.py index 9787d19..107a9f5 100644 --- a/usr/lib/python3.6/lxcmgr/templates.py +++ b/usr/lib/python3.6/lxcmgr/templates.py @@ -63,7 +63,7 @@ start() {{ }} start_post() {{ - {check} + {ready} }} stop() {{