portacode 1.4.17.dev7__tar.gz → 1.4.17.dev8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/PKG-INFO +1 -1
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/_version.py +2 -2
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/proxmox_infra.py +246 -234
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode.egg-info/PKG-INFO +1 -1
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/.claude/agents/communication-manager.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/.claude/settings.local.json +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/.gitignore +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/.gitmodules +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/LICENSE +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/MANIFEST.in +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/Makefile +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/README.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/backup.sh +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/connect.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/connect.sh +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/docker-compose.yaml +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/docs/images/device-transfer-button.png +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/docs/images/device-transfer-modal.png +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/docs/images/pair-device-button.png +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/docs/images/pairing-request.png +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/docs/images/student-workspace.png +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/README.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/simple_device/Dockerfile +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/simple_device/README.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/simple_device/data/device-01/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/simple_device/data/device-01/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/simple_device/docker-compose.yaml +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/Dockerfile +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/README.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/.local/share/portacode/run/gateway.pid +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/.gitignore +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/README.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/db.sqlite3 +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/settings.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/urls.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/__pycache__/wsgi.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/manage.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/requirements.txt +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/treats/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/admin.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/apps.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/menu.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/models.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/urls.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/treats/__pycache__/views.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/treats/admin.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/treats/apps.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/treats/menu.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/treats/migrations/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/treats/models.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/treats/tests.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/treats/urls.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-01/workspace/treats/views.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-02/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-02/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-02/workspace/README.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-02/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-02/workspace/manage.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-02/workspace/requirements.txt +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-02/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-02/workspace/treats/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-02/workspace/treats/admin.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-02/workspace/treats/apps.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-02/workspace/treats/menu.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-02/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-02/workspace/treats/models.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-02/workspace/treats/tests.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-02/workspace/treats/urls.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-02/workspace/treats/views.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-03/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-03/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-03/workspace/README.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-03/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-03/workspace/manage.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-03/workspace/requirements.txt +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-03/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-03/workspace/treats/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-03/workspace/treats/admin.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-03/workspace/treats/apps.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-03/workspace/treats/menu.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-03/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-03/workspace/treats/models.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-03/workspace/treats/tests.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-03/workspace/treats/urls.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-03/workspace/treats/views.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-04/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-04/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-04/workspace/README.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-04/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-04/workspace/manage.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-04/workspace/requirements.txt +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-04/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-04/workspace/treats/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-04/workspace/treats/admin.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-04/workspace/treats/apps.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-04/workspace/treats/menu.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-04/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-04/workspace/treats/models.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-04/workspace/treats/tests.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-04/workspace/treats/urls.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-04/workspace/treats/views.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-05/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-05/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-05/workspace/README.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-05/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-05/workspace/manage.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-05/workspace/requirements.txt +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-05/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-05/workspace/treats/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-05/workspace/treats/admin.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-05/workspace/treats/apps.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-05/workspace/treats/menu.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-05/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-05/workspace/treats/models.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-05/workspace/treats/tests.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-05/workspace/treats/urls.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-05/workspace/treats/views.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-06/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-06/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-06/workspace/README.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-06/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-06/workspace/manage.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-06/workspace/requirements.txt +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-06/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-06/workspace/treats/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-06/workspace/treats/admin.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-06/workspace/treats/apps.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-06/workspace/treats/menu.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-06/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-06/workspace/treats/models.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-06/workspace/treats/tests.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-06/workspace/treats/urls.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-06/workspace/treats/views.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-07/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-07/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-07/workspace/README.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-07/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-07/workspace/manage.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-07/workspace/requirements.txt +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-07/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-07/workspace/treats/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-07/workspace/treats/admin.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-07/workspace/treats/apps.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-07/workspace/treats/menu.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-07/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-07/workspace/treats/models.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-07/workspace/treats/tests.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-07/workspace/treats/urls.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-07/workspace/treats/views.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-08/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-08/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-08/workspace/README.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-08/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-08/workspace/manage.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-08/workspace/requirements.txt +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-08/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-08/workspace/treats/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-08/workspace/treats/admin.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-08/workspace/treats/apps.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-08/workspace/treats/menu.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-08/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-08/workspace/treats/models.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-08/workspace/treats/tests.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-08/workspace/treats/urls.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-08/workspace/treats/views.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-09/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-09/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-09/workspace/README.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-09/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-09/workspace/manage.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-09/workspace/requirements.txt +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-09/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-09/workspace/treats/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-09/workspace/treats/admin.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-09/workspace/treats/apps.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-09/workspace/treats/menu.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-09/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-09/workspace/treats/models.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-09/workspace/treats/tests.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-09/workspace/treats/urls.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-09/workspace/treats/views.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-10/.local/share/portacode/keys/id_portacode +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-10/.local/share/portacode/keys/id_portacode.pub +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-10/workspace/README.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-10/workspace/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-10/workspace/manage.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-10/workspace/requirements.txt +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-10/workspace/templates/treats/home.html +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-10/workspace/treats/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-10/workspace/treats/admin.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-10/workspace/treats/apps.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-10/workspace/treats/menu.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-10/workspace/treats/migrations/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-10/workspace/treats/models.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-10/workspace/treats/tests.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-10/workspace/treats/urls.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/data/student-10/workspace/treats/views.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/docker-compose.yaml +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/initial_content/README.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/initial_content/galactic_bakeshop/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/initial_content/galactic_bakeshop/asgi.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/initial_content/galactic_bakeshop/settings.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/initial_content/galactic_bakeshop/urls.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/initial_content/galactic_bakeshop/wsgi.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/initial_content/manage.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/initial_content/requirements.txt +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/initial_content/templates/treats/home.html +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/initial_content/treats/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/initial_content/treats/admin.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/initial_content/treats/apps.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/initial_content/treats/menu.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/initial_content/treats/migrations/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/initial_content/treats/models.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/initial_content/treats/tests.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/initial_content/treats/urls.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/initial_content/treats/views.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/examples/workshop_fleet/instructions/WELCOME.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/README.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/__main__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/cli.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/README.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/client.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/README.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/WEBSOCKET_PROTOCOL.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/base.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/chunked_content.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/diff_handlers.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/file_handlers.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/project_aware_file_handlers.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/project_state/README.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/project_state/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/project_state/file_system_watcher.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/project_state/git_manager.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/project_state/handlers.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/project_state/manager.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/project_state/models.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/project_state/utils.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/project_state_handlers.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/registry.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/session.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/system_handlers.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/tab_factory.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/terminal_handlers.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/test_proxmox_infra.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/update_handler.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/multiplex.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/terminal.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/data.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/keypair.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/link_capture/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/link_capture/__pycache__/__init__.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/link_capture/bin/__pycache__/link_capture_wrapper.cpython-311.pyc +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/link_capture/bin/elinks +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/link_capture/bin/gio-open +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/link_capture/bin/gnome-open +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/link_capture/bin/gvfs-open +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/link_capture/bin/kde-open +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/link_capture/bin/kfmclient +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/link_capture/bin/link_capture_exec.sh +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/link_capture/bin/link_capture_wrapper.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/link_capture/bin/links +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/link_capture/bin/links2 +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/link_capture/bin/lynx +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/link_capture/bin/mate-open +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/link_capture/bin/netsurf +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/link_capture/bin/sensible-browser +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/link_capture/bin/w3m +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/link_capture/bin/x-www-browser +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/link_capture/bin/xdg-open +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/logging_categories.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/pairing.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/service.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/static/js/test-ntp-clock.html +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/static/js/utils/ntp-clock.js +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/utils/NTP_ARCHITECTURE.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/utils/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/utils/diff_apply.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/utils/diff_renderer.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/utils/ntp_clock.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode.egg-info/SOURCES.txt +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode.egg-info/dependency_links.txt +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode.egg-info/entry_points.txt +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode.egg-info/requires.txt +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode.egg-info/top_level.txt +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/pyproject.toml +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/restore.sh +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/run_tests.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/setup.cfg +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/setup.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/test.sh +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/test_modules/README.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/test_modules/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/test_modules/test_device_online.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/test_modules/test_file_operations.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/test_modules/test_git_status_ui.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/test_modules/test_login_flow.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/test_modules/test_navigate_testing_folder.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/test_modules/test_play_store_screenshots.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/test_modules/test_terminal_buffer_performance.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/test_modules/test_terminal_interaction.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/test_modules/test_terminal_loading_race_condition.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/test_modules/test_terminal_start.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/test_request_id.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/testing_framework/.env.example +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/testing_framework/README.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/testing_framework/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/testing_framework/cli.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/testing_framework/core/__init__.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/testing_framework/core/base_test.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/testing_framework/core/cli_manager.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/testing_framework/core/hierarchical_runner.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/testing_framework/core/playwright_manager.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/testing_framework/core/runner.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/testing_framework/core/shared_cli_manager.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/testing_framework/core/test_discovery.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/testing_framework/requirements.txt +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/todo/UI_UX/opening_a_file_on_desktop_results_in_nothing.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/todo/agent_context_management.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/todo/django_server_time_sync.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/todo/issues/device_performance_degradation.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/todo/issues/git_data_not_captured_in_proxmox.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/todo/issues/indefinite_resource_loading.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/todo/issues/portacode_service_silently_down.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/todo/issues/premature_terminal_exit.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/todo/issues/project_cpu_hotspots.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/todo/issues/terminals_exit_upon_starting.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/todo/issues/wrong_item_classification_on_client_side.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/todo/smartphone_terminal_input_frustrations.md +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/tools/generate_play_store_assets.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/tools/pairing_tester.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/tools/run_screenshot_suite.sh +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/tools/test_python_ntp_clock.py +0 -0
- {portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/validate.sh +0 -0
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '1.4.17.
|
|
32
|
-
__version_tuple__ = version_tuple = (1, 4, 17, '
|
|
31
|
+
__version__ = version = '1.4.17.dev8'
|
|
32
|
+
__version_tuple__ = version_tuple = (1, 4, 17, 'dev8')
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
{portacode-1.4.17.dev7 → portacode-1.4.17.dev8}/portacode/connection/handlers/proxmox_infra.py
RENAMED
|
@@ -2058,266 +2058,278 @@ class CreateProxmoxContainerHandler(SyncHandler):
|
|
|
2058
2058
|
_validate_environment,
|
|
2059
2059
|
)
|
|
2060
2060
|
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
payload["cpulimit"] = float(payload["cpus"])
|
|
2074
|
-
payload["cores"] = int(max(math.ceil(payload["cpus"]), 1))
|
|
2075
|
-
payload["memory"] = int(payload["ram_mib"])
|
|
2076
|
-
payload["node"] = node
|
|
2077
|
-
reservation_id = _reserve_container_resources(
|
|
2078
|
-
payload, device_id=device_id, request_id=request_id
|
|
2079
|
-
)
|
|
2080
|
-
_emit_host_event(
|
|
2081
|
-
self,
|
|
2082
|
-
{
|
|
2083
|
-
"event": "proxmox_container_accepted",
|
|
2084
|
-
"success": True,
|
|
2085
|
-
"message": "Provisioning accepted; resources reserved.",
|
|
2086
|
-
"device_id": device_id,
|
|
2087
|
-
"request_id": request_id,
|
|
2088
|
-
},
|
|
2089
|
-
)
|
|
2090
|
-
provisioning_id = secrets.token_hex(6)
|
|
2091
|
-
payload["description"] = f"{payload.get('description', MANAGED_MARKER)};provisioning_id={provisioning_id}"
|
|
2092
|
-
logger.debug(
|
|
2093
|
-
"Provisioning container node=%s template=%s ram=%s cpu=%s storage=%s",
|
|
2094
|
-
node,
|
|
2095
|
-
payload["template"],
|
|
2096
|
-
payload["ram_mib"],
|
|
2097
|
-
payload["cpus"],
|
|
2098
|
-
payload["storage"],
|
|
2099
|
-
)
|
|
2100
|
-
try:
|
|
2101
|
-
vmid = _allocate_vmid(proxmox)
|
|
2102
|
-
vmid, _ = _instantiate_container(proxmox, node, payload, vmid=vmid)
|
|
2103
|
-
except Exception:
|
|
2104
|
-
_release_container_reservation(reservation_id)
|
|
2105
|
-
if vmid is not None:
|
|
2106
|
-
_cleanup_failed_container(proxmox, node, vmid, provisioning_id)
|
|
2107
|
-
raise
|
|
2108
|
-
payload["vmid"] = vmid
|
|
2109
|
-
payload["created_at"] = datetime.utcnow().isoformat() + "Z"
|
|
2110
|
-
payload["status"] = "creating"
|
|
2111
|
-
payload["device_id"] = device_id
|
|
2112
|
-
try:
|
|
2113
|
-
_write_container_record(vmid, payload, reservation_id=reservation_id)
|
|
2114
|
-
created_record = True
|
|
2115
|
-
except Exception:
|
|
2116
|
-
_release_container_reservation(reservation_id)
|
|
2117
|
-
_cleanup_failed_container(proxmox, node, vmid, provisioning_id)
|
|
2118
|
-
raise
|
|
2119
|
-
return proxmox, node, vmid, payload
|
|
2120
|
-
|
|
2121
|
-
try:
|
|
2122
|
-
proxmox, node, vmid, payload = _run_lifecycle_step(
|
|
2123
|
-
"create_container",
|
|
2124
|
-
"Creating container",
|
|
2125
|
-
"Provisioning the LXC container…",
|
|
2126
|
-
"Container created.",
|
|
2127
|
-
_create_container,
|
|
2128
|
-
)
|
|
2129
|
-
|
|
2130
|
-
def _start_container_step():
|
|
2131
|
-
_start_container(proxmox, node, vmid)
|
|
2061
|
+
node = config.get("node") or DEFAULT_NODE_NAME
|
|
2062
|
+
payload = _build_container_payload(message, config)
|
|
2063
|
+
payload["cpulimit"] = float(payload["cpus"])
|
|
2064
|
+
payload["cores"] = int(max(math.ceil(payload["cpus"]), 1))
|
|
2065
|
+
payload["memory"] = int(payload["ram_mib"])
|
|
2066
|
+
payload["node"] = node
|
|
2067
|
+
|
|
2068
|
+
reservation_id = _reserve_container_resources(
|
|
2069
|
+
payload, device_id=device_id, request_id=request_id
|
|
2070
|
+
)
|
|
2071
|
+
provisioning_id = secrets.token_hex(6)
|
|
2072
|
+
payload["description"] = f"{payload.get('description', MANAGED_MARKER)};provisioning_id={provisioning_id}"
|
|
2132
2073
|
|
|
2133
|
-
|
|
2134
|
-
|
|
2135
|
-
|
|
2136
|
-
|
|
2137
|
-
|
|
2138
|
-
|
|
2139
|
-
|
|
2140
|
-
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
|
|
2144
|
-
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
|
|
2167
|
-
|
|
2168
|
-
|
|
2169
|
-
|
|
2170
|
-
|
|
2171
|
-
|
|
2172
|
-
|
|
2173
|
-
|
|
2174
|
-
|
|
2175
|
-
|
|
2176
|
-
|
|
2177
|
-
request_id=request_id,
|
|
2178
|
-
details=details or None,
|
|
2179
|
-
on_behalf_of_device=device_id,
|
|
2074
|
+
def _provision_background() -> None:
|
|
2075
|
+
nonlocal current_step_index
|
|
2076
|
+
proxmox: Any = None
|
|
2077
|
+
vmid: Optional[int] = None
|
|
2078
|
+
created_record = False
|
|
2079
|
+
try:
|
|
2080
|
+
def _create_container():
|
|
2081
|
+
nonlocal proxmox, vmid, created_record
|
|
2082
|
+
proxmox = _connect_proxmox(config)
|
|
2083
|
+
logger.debug(
|
|
2084
|
+
"Provisioning container node=%s template=%s ram=%s cpu=%s storage=%s",
|
|
2085
|
+
node,
|
|
2086
|
+
payload["template"],
|
|
2087
|
+
payload["ram_mib"],
|
|
2088
|
+
payload["cpus"],
|
|
2089
|
+
payload["storage"],
|
|
2090
|
+
)
|
|
2091
|
+
try:
|
|
2092
|
+
vmid = _allocate_vmid(proxmox)
|
|
2093
|
+
vmid, _ = _instantiate_container(proxmox, node, payload, vmid=vmid)
|
|
2094
|
+
except Exception:
|
|
2095
|
+
_release_container_reservation(reservation_id)
|
|
2096
|
+
if vmid is not None:
|
|
2097
|
+
_cleanup_failed_container(proxmox, node, vmid, provisioning_id)
|
|
2098
|
+
raise
|
|
2099
|
+
payload["vmid"] = vmid
|
|
2100
|
+
payload["created_at"] = datetime.utcnow().isoformat() + "Z"
|
|
2101
|
+
payload["status"] = "creating"
|
|
2102
|
+
payload["device_id"] = device_id
|
|
2103
|
+
try:
|
|
2104
|
+
_write_container_record(vmid, payload, reservation_id=reservation_id)
|
|
2105
|
+
created_record = True
|
|
2106
|
+
except Exception:
|
|
2107
|
+
_release_container_reservation(reservation_id)
|
|
2108
|
+
_cleanup_failed_container(proxmox, node, vmid, provisioning_id)
|
|
2109
|
+
raise
|
|
2110
|
+
return proxmox, node, vmid, payload
|
|
2111
|
+
|
|
2112
|
+
proxmox, _, vmid, payload_local = _run_lifecycle_step(
|
|
2113
|
+
"create_container",
|
|
2114
|
+
"Creating container",
|
|
2115
|
+
"Provisioning the LXC container…",
|
|
2116
|
+
"Container created.",
|
|
2117
|
+
_create_container,
|
|
2180
2118
|
)
|
|
2181
2119
|
|
|
2182
|
-
|
|
2183
|
-
|
|
2184
|
-
payload["username"],
|
|
2185
|
-
payload["password"],
|
|
2186
|
-
payload["ssh_public_key"],
|
|
2187
|
-
steps=bootstrap_steps,
|
|
2188
|
-
progress_callback=_bootstrap_progress_callback,
|
|
2189
|
-
start_index=current_step_index,
|
|
2190
|
-
total_steps=total_steps,
|
|
2191
|
-
default_public_key=device_public_key if has_device_keypair else None,
|
|
2192
|
-
)
|
|
2193
|
-
current_step_index += len(bootstrap_steps)
|
|
2120
|
+
def _start_container_step():
|
|
2121
|
+
_start_container(proxmox, node, vmid)
|
|
2194
2122
|
|
|
2195
|
-
|
|
2196
|
-
|
|
2197
|
-
|
|
2198
|
-
"
|
|
2199
|
-
|
|
2200
|
-
|
|
2123
|
+
_run_lifecycle_step(
|
|
2124
|
+
"start_container",
|
|
2125
|
+
"Starting container",
|
|
2126
|
+
"Booting the container…",
|
|
2127
|
+
"Container startup completed.",
|
|
2128
|
+
_start_container_step,
|
|
2201
2129
|
)
|
|
2202
|
-
|
|
2203
|
-
|
|
2204
|
-
|
|
2205
|
-
|
|
2206
|
-
|
|
2207
|
-
|
|
2208
|
-
|
|
2209
|
-
|
|
2130
|
+
_update_container_record(vmid, {"status": "running"})
|
|
2131
|
+
|
|
2132
|
+
def _bootstrap_progress_callback(
|
|
2133
|
+
step_index: int,
|
|
2134
|
+
total: int,
|
|
2135
|
+
step: Dict[str, Any],
|
|
2136
|
+
status: str,
|
|
2137
|
+
result: Optional[Dict[str, Any]],
|
|
2138
|
+
):
|
|
2139
|
+
label = step.get("display_name") or _friendly_step_label(step.get("name", "bootstrap"))
|
|
2140
|
+
error_summary = (result or {}).get("error_summary") or (result or {}).get("error")
|
|
2141
|
+
attempt = (result or {}).get("attempt")
|
|
2142
|
+
if status == "in_progress":
|
|
2143
|
+
message_text = f"{label} is running…"
|
|
2144
|
+
elif status == "completed":
|
|
2145
|
+
message_text = f"{label} completed."
|
|
2146
|
+
elif status == "retrying":
|
|
2147
|
+
attempt_desc = f" (attempt {attempt})" if attempt else ""
|
|
2148
|
+
message_text = f"{label} failed{attempt_desc}; retrying…"
|
|
2149
|
+
else:
|
|
2150
|
+
message_text = f"{label} failed"
|
|
2151
|
+
if error_summary:
|
|
2152
|
+
message_text += f": {error_summary}"
|
|
2153
|
+
details: Dict[str, Any] = {}
|
|
2154
|
+
if attempt:
|
|
2155
|
+
details["attempt"] = attempt
|
|
2156
|
+
if error_summary:
|
|
2157
|
+
details["error_summary"] = error_summary
|
|
2158
|
+
_emit_progress_event(
|
|
2159
|
+
self,
|
|
2160
|
+
step_index=step_index,
|
|
2161
|
+
total_steps=total,
|
|
2162
|
+
step_name=step.get("name", "bootstrap"),
|
|
2163
|
+
step_label=label,
|
|
2164
|
+
status=status,
|
|
2165
|
+
message=message_text,
|
|
2166
|
+
phase="bootstrap",
|
|
2167
|
+
request_id=request_id,
|
|
2168
|
+
details=details or None,
|
|
2169
|
+
on_behalf_of_device=device_id,
|
|
2170
|
+
)
|
|
2210
2171
|
|
|
2211
|
-
|
|
2212
|
-
|
|
2213
|
-
|
|
2214
|
-
|
|
2215
|
-
|
|
2172
|
+
public_key, steps = _bootstrap_portacode(
|
|
2173
|
+
vmid,
|
|
2174
|
+
payload_local["username"],
|
|
2175
|
+
payload_local["password"],
|
|
2176
|
+
payload_local["ssh_public_key"],
|
|
2177
|
+
steps=bootstrap_steps,
|
|
2178
|
+
progress_callback=_bootstrap_progress_callback,
|
|
2179
|
+
start_index=current_step_index,
|
|
2216
2180
|
total_steps=total_steps,
|
|
2217
|
-
|
|
2218
|
-
step_label=auth_label,
|
|
2219
|
-
status="in_progress",
|
|
2220
|
-
message="Notifying the server of the new device…",
|
|
2221
|
-
phase="service",
|
|
2222
|
-
request_id=request_id,
|
|
2223
|
-
on_behalf_of_device=device_id,
|
|
2224
|
-
)
|
|
2225
|
-
_emit_progress_event(
|
|
2226
|
-
self,
|
|
2227
|
-
step_index=service_start_index,
|
|
2228
|
-
total_steps=total_steps,
|
|
2229
|
-
step_name=auth_step_name,
|
|
2230
|
-
step_label=auth_label,
|
|
2231
|
-
status="completed",
|
|
2232
|
-
message="Authentication metadata recorded.",
|
|
2233
|
-
phase="service",
|
|
2234
|
-
request_id=request_id,
|
|
2235
|
-
on_behalf_of_device=device_id,
|
|
2181
|
+
default_public_key=device_public_key if has_device_keypair else None,
|
|
2236
2182
|
)
|
|
2183
|
+
current_step_index += len(bootstrap_steps)
|
|
2184
|
+
|
|
2185
|
+
service_installed = False
|
|
2186
|
+
if has_device_keypair:
|
|
2187
|
+
logger.info(
|
|
2188
|
+
"deploying dashboard-provided Portacode keypair (device_id=%s) into container %s",
|
|
2189
|
+
device_id,
|
|
2190
|
+
vmid,
|
|
2191
|
+
)
|
|
2192
|
+
_deploy_device_keypair(
|
|
2193
|
+
vmid,
|
|
2194
|
+
payload_local["username"],
|
|
2195
|
+
device_private_key,
|
|
2196
|
+
device_public_key,
|
|
2197
|
+
)
|
|
2198
|
+
service_installed = True
|
|
2199
|
+
service_start_index = current_step_index
|
|
2237
2200
|
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
|
|
2246
|
-
|
|
2247
|
-
|
|
2248
|
-
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2201
|
+
auth_step_name = "setup_device_authentication"
|
|
2202
|
+
auth_label = "Setting up device authentication"
|
|
2203
|
+
_emit_progress_event(
|
|
2204
|
+
self,
|
|
2205
|
+
step_index=service_start_index,
|
|
2206
|
+
total_steps=total_steps,
|
|
2207
|
+
step_name=auth_step_name,
|
|
2208
|
+
step_label=auth_label,
|
|
2209
|
+
status="in_progress",
|
|
2210
|
+
message="Notifying the server of the new device…",
|
|
2211
|
+
phase="service",
|
|
2212
|
+
request_id=request_id,
|
|
2213
|
+
on_behalf_of_device=device_id,
|
|
2214
|
+
)
|
|
2215
|
+
_emit_progress_event(
|
|
2216
|
+
self,
|
|
2217
|
+
step_index=service_start_index,
|
|
2218
|
+
total_steps=total_steps,
|
|
2219
|
+
step_name=auth_step_name,
|
|
2220
|
+
step_label=auth_label,
|
|
2221
|
+
status="completed",
|
|
2222
|
+
message="Authentication metadata recorded.",
|
|
2223
|
+
phase="service",
|
|
2224
|
+
request_id=request_id,
|
|
2225
|
+
on_behalf_of_device=device_id,
|
|
2226
|
+
)
|
|
2252
2227
|
|
|
2253
|
-
|
|
2254
|
-
|
|
2228
|
+
install_step = service_start_index + 1
|
|
2229
|
+
install_label = "Launching Portacode service"
|
|
2230
|
+
_emit_progress_event(
|
|
2231
|
+
self,
|
|
2232
|
+
step_index=install_step,
|
|
2233
|
+
total_steps=total_steps,
|
|
2234
|
+
step_name="launch_portacode_service",
|
|
2235
|
+
step_label=install_label,
|
|
2236
|
+
status="in_progress",
|
|
2237
|
+
message="Running sudo portacode service install…",
|
|
2238
|
+
phase="service",
|
|
2239
|
+
request_id=request_id,
|
|
2240
|
+
on_behalf_of_device=device_id,
|
|
2241
|
+
)
|
|
2242
|
+
|
|
2243
|
+
cmd = _su_command(payload_local["username"], "sudo -S portacode service install")
|
|
2244
|
+
res = _run_pct(vmid, cmd, input_text=payload_local["password"] + "\n")
|
|
2245
|
+
|
|
2246
|
+
if res["returncode"] != 0:
|
|
2247
|
+
_emit_progress_event(
|
|
2248
|
+
self,
|
|
2249
|
+
step_index=install_step,
|
|
2250
|
+
total_steps=total_steps,
|
|
2251
|
+
step_name="launch_portacode_service",
|
|
2252
|
+
step_label=install_label,
|
|
2253
|
+
status="failed",
|
|
2254
|
+
message=f"{install_label} failed: {res.get('stderr') or res.get('stdout')}",
|
|
2255
|
+
phase="service",
|
|
2256
|
+
request_id=request_id,
|
|
2257
|
+
details={
|
|
2258
|
+
"stderr": res.get("stderr"),
|
|
2259
|
+
"stdout": res.get("stdout"),
|
|
2260
|
+
},
|
|
2261
|
+
on_behalf_of_device=device_id,
|
|
2262
|
+
)
|
|
2263
|
+
raise RuntimeError(res.get("stderr") or res.get("stdout") or "Service install failed")
|
|
2255
2264
|
|
|
2256
|
-
if res["returncode"] != 0:
|
|
2257
2265
|
_emit_progress_event(
|
|
2258
2266
|
self,
|
|
2259
2267
|
step_index=install_step,
|
|
2260
2268
|
total_steps=total_steps,
|
|
2261
2269
|
step_name="launch_portacode_service",
|
|
2262
2270
|
step_label=install_label,
|
|
2263
|
-
status="
|
|
2264
|
-
message=
|
|
2271
|
+
status="completed",
|
|
2272
|
+
message="Portacode service install finished.",
|
|
2265
2273
|
phase="service",
|
|
2266
2274
|
request_id=request_id,
|
|
2267
|
-
details={
|
|
2268
|
-
"stderr": res.get("stderr"),
|
|
2269
|
-
"stdout": res.get("stdout"),
|
|
2270
|
-
},
|
|
2271
2275
|
on_behalf_of_device=device_id,
|
|
2272
2276
|
)
|
|
2273
|
-
raise RuntimeError(res.get("stderr") or res.get("stdout") or "Service install failed")
|
|
2274
2277
|
|
|
2275
|
-
|
|
2278
|
+
logger.info(
|
|
2279
|
+
"create_proxmox_container: portacode service install completed inside ct %s", vmid
|
|
2280
|
+
)
|
|
2281
|
+
|
|
2282
|
+
current_step_index += 2
|
|
2283
|
+
|
|
2284
|
+
_emit_host_event(
|
|
2276
2285
|
self,
|
|
2277
|
-
|
|
2278
|
-
|
|
2279
|
-
|
|
2280
|
-
|
|
2281
|
-
|
|
2282
|
-
|
|
2283
|
-
|
|
2284
|
-
|
|
2285
|
-
|
|
2286
|
+
{
|
|
2287
|
+
"event": "proxmox_container_created",
|
|
2288
|
+
"success": True,
|
|
2289
|
+
"message": f"Container {vmid} is ready and Portacode key captured.",
|
|
2290
|
+
"ctid": str(vmid),
|
|
2291
|
+
"public_key": public_key,
|
|
2292
|
+
"container": {
|
|
2293
|
+
"vmid": vmid,
|
|
2294
|
+
"hostname": payload_local["hostname"],
|
|
2295
|
+
"template": payload_local["template"],
|
|
2296
|
+
"storage": payload_local["storage"],
|
|
2297
|
+
"disk_gib": payload_local["disk_gib"],
|
|
2298
|
+
"ram_mib": payload_local["ram_mib"],
|
|
2299
|
+
"cpus": payload_local["cpus"],
|
|
2300
|
+
},
|
|
2301
|
+
"setup_steps": steps,
|
|
2302
|
+
"device_id": device_id,
|
|
2303
|
+
"on_behalf_of_device": device_id,
|
|
2304
|
+
"service_installed": service_installed,
|
|
2305
|
+
"request_id": request_id,
|
|
2306
|
+
},
|
|
2286
2307
|
)
|
|
2287
|
-
|
|
2288
|
-
|
|
2289
|
-
|
|
2308
|
+
except Exception as exc:
|
|
2309
|
+
if reservation_id and not created_record:
|
|
2310
|
+
_release_container_reservation(reservation_id)
|
|
2311
|
+
if vmid is not None and proxmox and node:
|
|
2312
|
+
_cleanup_failed_container(proxmox, node, vmid, provisioning_id)
|
|
2313
|
+
_remove_container_record(vmid)
|
|
2314
|
+
_emit_host_event(
|
|
2315
|
+
self,
|
|
2316
|
+
{
|
|
2317
|
+
"event": "error",
|
|
2318
|
+
"message": str(exc),
|
|
2319
|
+
"device_id": device_id,
|
|
2320
|
+
"request_id": request_id,
|
|
2321
|
+
},
|
|
2290
2322
|
)
|
|
2291
2323
|
|
|
2292
|
-
|
|
2293
|
-
|
|
2294
|
-
|
|
2295
|
-
|
|
2296
|
-
|
|
2297
|
-
|
|
2298
|
-
|
|
2299
|
-
|
|
2300
|
-
|
|
2301
|
-
"vmid": vmid,
|
|
2302
|
-
"hostname": payload["hostname"],
|
|
2303
|
-
"template": payload["template"],
|
|
2304
|
-
"storage": payload["storage"],
|
|
2305
|
-
"disk_gib": payload["disk_gib"],
|
|
2306
|
-
"ram_mib": payload["ram_mib"],
|
|
2307
|
-
"cpus": payload["cpus"],
|
|
2308
|
-
},
|
|
2309
|
-
"setup_steps": steps,
|
|
2310
|
-
"device_id": device_id,
|
|
2311
|
-
"on_behalf_of_device": device_id,
|
|
2312
|
-
"service_installed": service_installed,
|
|
2313
|
-
}
|
|
2314
|
-
except Exception:
|
|
2315
|
-
if reservation_id and not created_record:
|
|
2316
|
-
_release_container_reservation(reservation_id)
|
|
2317
|
-
if vmid is not None and proxmox and node:
|
|
2318
|
-
_cleanup_failed_container(proxmox, node, vmid, provisioning_id)
|
|
2319
|
-
_remove_container_record(vmid)
|
|
2320
|
-
raise
|
|
2324
|
+
threading.Thread(target=_provision_background, daemon=True).start()
|
|
2325
|
+
|
|
2326
|
+
return {
|
|
2327
|
+
"event": "proxmox_container_accepted",
|
|
2328
|
+
"success": True,
|
|
2329
|
+
"message": "Provisioning accepted; resources reserved.",
|
|
2330
|
+
"device_id": device_id,
|
|
2331
|
+
"request_id": request_id,
|
|
2332
|
+
}
|
|
2321
2333
|
|
|
2322
2334
|
|
|
2323
2335
|
class StartPortacodeServiceHandler(SyncHandler):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|