diff --git a/air_link/main_page.py b/air_link/main_page.py index 849925d..4c31670 100644 --- a/air_link/main_page.py +++ b/air_link/main_page.py @@ -1,7 +1,7 @@ from nicegui import app, ui from .authorized_keys import AuthorizedKeysDialog -from .package import add_package, get_target_folder, read_env, show_packages, write_env +from .package import add_package, read_env, show_packages, write_env from .system import docker_prune_preview, show_disk_space @@ -29,14 +29,15 @@ def main_page(): with ui.row(): ui.label('Environment variables').classes('text-2xl') - ui.button(icon='refresh', on_click=lambda: read_env(get_target_folder())) \ + ui.button(icon='refresh', on_click=read_env) \ .props('flat outline').tooltip('Load environment variables') - ui.button(icon='save', on_click=lambda: write_env(get_target_folder())) \ + ui.button(icon='save', on_click=write_env) \ .props('flat outline').tooltip('Save environment variables') ui.codemirror().bind_value(app.storage.general, 'env').classes('h-32 border') ui.label('Packages').classes('text-2xl') - ui.input('Installation directory', value='~/robot').bind_value(app.storage.general, 'target_directory') + ui.input('Installation directory', value=app.storage.general.get('target_directory', ''), + placeholder='~/robot').bind_value(app.storage.general, 'target_directory') show_packages() upload = ui.upload(auto_upload=True, on_upload=add_package).props('accept=.zip').classes('hidden') ui.button('Upload package', icon='upload', on_click=lambda: upload.run_method('pickFiles')).props('outline') diff --git a/air_link/package.py b/air_link/package.py index 825f6e9..d49eb5d 100644 --- a/air_link/package.py +++ b/air_link/package.py @@ -5,7 +5,7 @@ import subprocess import zipfile from pathlib import Path -from typing import List +from typing import List, Optional from nicegui import app, events, run, ui @@ -19,23 +19,37 @@ def sorted_nicely(paths: List[Path]) -> List[Path]: return sorted(paths, key=lambda path: [int(c) if c.isdigit() else c for c in re.split('([0-9]+)', path.stem)]) -def write_env(target_folder: Path) -> None: +def get_target_folder() -> Optional[Path]: + target_folder_name = app.storage.general.get('target_directory', False) + if not target_folder_name: + return None + target_folder = Path(target_folder_name).expanduser() + return target_folder + + +def write_env() -> None: + target_folder = get_target_folder() + if target_folder is None: + ui.notify('Please set the installation directory first', type='negative') + return + target_folder.mkdir(exist_ok=True) Path(target_folder / '.env').write_text(app.storage.general.get('env', '')) -def read_env(target_folder: Path) -> None: +def read_env() -> None: + target_folder = get_target_folder() + if target_folder is None: + ui.notify('Please set the installation directory first', type='negative') + return + if not target_folder.exists(): + ui.notify('Installation directory not found', type='negative') + return file_path = Path(target_folder / '.env') if not file_path.exists(): file_path.touch() app.storage.general['env'] = file_path.read_text() -def get_target_folder() -> Path: - target_folder = Path(app.storage.general['target_directory']).expanduser() - target_folder.mkdir(exist_ok=True) - return target_folder - - @ui.refreshable def show_packages() -> ui.row: paths = sorted_nicely(list(PACKAGES_PATH.glob('*.zip'))) @@ -65,17 +79,21 @@ def remove_package(path: Path) -> None: async def install_package(path: Path) -> None: + target_folder = get_target_folder() + if not target_folder: + ui.notify('Please set the installation directory first', type='negative') + return + target_folder.mkdir(exist_ok=True) logging.info(f'Extracting {path}...') - target = get_target_folder() - shutil.rmtree(target) + shutil.rmtree(target_folder) with zipfile.ZipFile(path, 'r') as zip_ref: members = zip_ref.infolist() for member in members: - extracted_path = zip_ref.extract(member, target) + extracted_path = zip_ref.extract(member, target_folder) os.chmod(extracted_path, member.external_attr >> 16) logging.info('...done!') - write_env(target) + write_env() logging.info('Running install script...') with ui.dialog(value=True).props('maximized persistent') as dialog, ui.card(): @@ -86,7 +104,7 @@ async def install_package(path: Path) -> None: close_button = ui.button(icon='close', on_click=dialog.close).props('flat round color=gray-500') close_button.visible = False log = ui.log().classes('h-full') - await run_sh(f'cd {target}; ./install.sh', log) + await run_sh(f'cd {target_folder}; ./install.sh', log) spinner.visible = False close_button.visible = True ui.notification('Installation complete', icon='done', type='positive') diff --git a/air_link/run.py b/air_link/run.py index e653f51..f31fc1f 100644 --- a/air_link/run.py +++ b/air_link/run.py @@ -3,7 +3,7 @@ from nicegui import app, ui from .main_page import create_page -from .package import get_target_folder, read_env +from .package import read_env from .ssh import setup @@ -15,7 +15,6 @@ def run() -> None: if on_air: app.on_startup(setup) - read_env(get_target_folder()) create_page() - + app.on_startup(read_env) ui.run(title='Air Link', favicon='⛑', reload=False, on_air=on_air)