Skip to content

Commit

Permalink
Fix missing installation directory (#15)
Browse files Browse the repository at this point in the history
* save and read env vars manually and read on startup

* fix env not found error

* handle non existent installation directory

* revert bind_value_to

* revert to old typing
  • Loading branch information
pascalzauberzeug authored Sep 18, 2024
1 parent 0538cf0 commit e9c3834
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 21 deletions.
9 changes: 5 additions & 4 deletions air_link/main_page.py
Original file line number Diff line number Diff line change
@@ -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


Expand Down Expand Up @@ -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')
Expand Down
46 changes: 32 additions & 14 deletions air_link/package.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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')))
Expand Down Expand Up @@ -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():
Expand All @@ -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')
Expand Down
5 changes: 2 additions & 3 deletions air_link/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand All @@ -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)

0 comments on commit e9c3834

Please sign in to comment.