portacode 1.4.11.dev0__py3-none-any.whl → 1.4.12.dev1__py3-none-any.whl
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.
Potentially problematic release.
This version of portacode might be problematic. Click here for more details.
- portacode/_version.py +2 -2
- portacode/cli.py +39 -0
- portacode/connection/handlers/WEBSOCKET_PROTOCOL.md +212 -16
- portacode/connection/handlers/__init__.py +16 -2
- portacode/connection/handlers/proxmox_infra.py +1118 -8
- portacode/connection/handlers/system_handlers.py +48 -7
- portacode/connection/terminal.py +7 -0
- {portacode-1.4.11.dev0.dist-info → portacode-1.4.12.dev1.dist-info}/METADATA +1 -1
- {portacode-1.4.11.dev0.dist-info → portacode-1.4.12.dev1.dist-info}/RECORD +13 -13
- {portacode-1.4.11.dev0.dist-info → portacode-1.4.12.dev1.dist-info}/WHEEL +0 -0
- {portacode-1.4.11.dev0.dist-info → portacode-1.4.12.dev1.dist-info}/entry_points.txt +0 -0
- {portacode-1.4.11.dev0.dist-info → portacode-1.4.12.dev1.dist-info}/licenses/LICENSE +0 -0
- {portacode-1.4.11.dev0.dist-info → portacode-1.4.12.dev1.dist-info}/top_level.txt +0 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""System command handlers."""
|
|
2
|
+
from __future__ import annotations
|
|
2
3
|
|
|
3
4
|
import concurrent.futures
|
|
4
5
|
import getpass
|
|
@@ -7,6 +8,7 @@ import logging
|
|
|
7
8
|
import os
|
|
8
9
|
import platform
|
|
9
10
|
import shutil
|
|
11
|
+
import subprocess
|
|
10
12
|
import threading
|
|
11
13
|
from pathlib import Path
|
|
12
14
|
from typing import Any, Dict
|
|
@@ -128,18 +130,57 @@ def _get_playwright_info() -> Dict[str, Any]:
|
|
|
128
130
|
return result
|
|
129
131
|
|
|
130
132
|
|
|
131
|
-
def
|
|
132
|
-
|
|
133
|
-
|
|
133
|
+
def _run_probe_command(cmd: list[str]) -> str | None:
|
|
134
|
+
try:
|
|
135
|
+
result = subprocess.run(cmd, capture_output=True, text=True, check=True, timeout=3)
|
|
136
|
+
except (subprocess.CalledProcessError, FileNotFoundError, subprocess.TimeoutExpired):
|
|
137
|
+
return None
|
|
138
|
+
return result.stdout.strip()
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def _parse_pveversion(output: str) -> str | None:
|
|
142
|
+
first_token = output.split(None, 1)[0] if output else ""
|
|
143
|
+
if not first_token:
|
|
144
|
+
return None
|
|
145
|
+
if "/" in first_token:
|
|
146
|
+
return first_token.split("/", 1)[1]
|
|
147
|
+
return first_token
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def _parse_dpkg_version(output: str) -> str | None:
|
|
151
|
+
for line in output.splitlines():
|
|
152
|
+
if line.lower().startswith("version:"):
|
|
153
|
+
return line.split(":", 1)[1].strip()
|
|
154
|
+
return None
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def _get_proxmox_version() -> str | None:
|
|
134
158
|
release_file = Path("/etc/proxmox-release")
|
|
135
159
|
if release_file.exists():
|
|
136
|
-
info["is_proxmox_node"] = True
|
|
137
160
|
try:
|
|
138
|
-
|
|
161
|
+
return release_file.read_text().strip()
|
|
139
162
|
except Exception:
|
|
140
|
-
|
|
141
|
-
|
|
163
|
+
pass
|
|
164
|
+
value = _run_probe_command(["pveversion"])
|
|
165
|
+
parsed = _parse_pveversion(value or "")
|
|
166
|
+
if parsed:
|
|
167
|
+
return parsed
|
|
168
|
+
for pkg in ("pve-manager", "proxmox-ve"):
|
|
169
|
+
pkg_output = _run_probe_command(["dpkg", "-s", pkg])
|
|
170
|
+
parsed = _parse_dpkg_version(pkg_output or "")
|
|
171
|
+
if parsed:
|
|
172
|
+
return parsed
|
|
173
|
+
return None
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def _get_proxmox_info() -> Dict[str, Any]:
|
|
177
|
+
"""Detect if the current host is a Proxmox node."""
|
|
178
|
+
info: Dict[str, Any] = {"is_proxmox_node": False, "version": None}
|
|
179
|
+
if Path("/etc/proxmox-release").exists() or Path("/etc/pve").exists():
|
|
142
180
|
info["is_proxmox_node"] = True
|
|
181
|
+
version = _get_proxmox_version()
|
|
182
|
+
if version:
|
|
183
|
+
info["version"] = version
|
|
143
184
|
info["infra"] = get_infra_snapshot()
|
|
144
185
|
return info
|
|
145
186
|
|
portacode/connection/terminal.py
CHANGED
|
@@ -53,6 +53,9 @@ from .handlers import (
|
|
|
53
53
|
ProjectStateGitCommitHandler,
|
|
54
54
|
UpdatePortacodeHandler,
|
|
55
55
|
ConfigureProxmoxInfraHandler,
|
|
56
|
+
CreateProxmoxContainerHandler,
|
|
57
|
+
RevertProxmoxInfraHandler,
|
|
58
|
+
StartPortacodeServiceHandler,
|
|
56
59
|
)
|
|
57
60
|
from .handlers.project_aware_file_handlers import (
|
|
58
61
|
ProjectAwareFileWriteHandler,
|
|
@@ -412,6 +415,7 @@ class TerminalManager:
|
|
|
412
415
|
"mux": mux,
|
|
413
416
|
"use_content_caching": True, # Enable content caching optimization
|
|
414
417
|
"debug": self.debug,
|
|
418
|
+
"event_loop": asyncio.get_running_loop(),
|
|
415
419
|
}
|
|
416
420
|
|
|
417
421
|
# Initialize command registry
|
|
@@ -474,6 +478,9 @@ class TerminalManager:
|
|
|
474
478
|
self._command_registry.register(ProjectStateGitCommitHandler)
|
|
475
479
|
# System management handlers
|
|
476
480
|
self._command_registry.register(ConfigureProxmoxInfraHandler)
|
|
481
|
+
self._command_registry.register(CreateProxmoxContainerHandler)
|
|
482
|
+
self._command_registry.register(StartPortacodeServiceHandler)
|
|
483
|
+
self._command_registry.register(RevertProxmoxInfraHandler)
|
|
477
484
|
self._command_registry.register(UpdatePortacodeHandler)
|
|
478
485
|
|
|
479
486
|
# ---------------------------------------------------------------------
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
portacode/README.md,sha256=4dKtpvR8LNgZPVz37GmkQCMWIr_u25Ao63iW56s7Ke4,775
|
|
2
2
|
portacode/__init__.py,sha256=oB3sV1wXr-um-RXio73UG8E5Xx6cF2ZVJveqjNmC-vQ,1086
|
|
3
3
|
portacode/__main__.py,sha256=jmHTGC1hzmo9iKJLv-SSYe9BSIbPPZ2IOpecI03PlTs,296
|
|
4
|
-
portacode/_version.py,sha256=
|
|
5
|
-
portacode/cli.py,sha256=
|
|
4
|
+
portacode/_version.py,sha256=KBZ1gEZmvt1J4XR1FpwaCleg3ayMUckV-yZYhnXlSCU,719
|
|
5
|
+
portacode/cli.py,sha256=mGLKoZ-T2FBF7IA9wUq0zyG0X9__-A1ao7gajjcVRH8,21828
|
|
6
6
|
portacode/data.py,sha256=5-s291bv8J354myaHm1Y7CQZTZyRzMU3TGe5U4hb-FA,1591
|
|
7
7
|
portacode/keypair.py,sha256=0OO4vHDcF1XMxCDqce61xFTlFwlTcmqe5HyGsXFEt7s,5838
|
|
8
8
|
portacode/logging_categories.py,sha256=9m-BYrjyHh1vjZYBQT4JhAh6b_oYUhIWayO-noH1cSE,5063
|
|
@@ -12,20 +12,20 @@ portacode/connection/README.md,sha256=f9rbuIEKa7cTm9C98rCiBbEtbiIXQU11esGSNhSMiJ
|
|
|
12
12
|
portacode/connection/__init__.py,sha256=atqcVGkViIEd7pRa6cP2do07RJOM0UWpbnz5zXjGktU,250
|
|
13
13
|
portacode/connection/client.py,sha256=jtLb9_YufqPkzi9t8VQH3iz_JEMisbtY6a8L9U5weiU,14181
|
|
14
14
|
portacode/connection/multiplex.py,sha256=L-TxqJ_ZEbfNEfu1cwxgJ5vUdyRzZjsMy2Kx1diiZys,5237
|
|
15
|
-
portacode/connection/terminal.py,sha256=
|
|
15
|
+
portacode/connection/terminal.py,sha256=07wxG_55JMy3yQ9TXCBldW9h43qCW3U8rv2yzGMx4FM,44757
|
|
16
16
|
portacode/connection/handlers/README.md,sha256=HsLZG1QK1JNm67HsgL6WoDg9nxzKXxwkc5fJPFJdX5g,12169
|
|
17
|
-
portacode/connection/handlers/WEBSOCKET_PROTOCOL.md,sha256=
|
|
18
|
-
portacode/connection/handlers/__init__.py,sha256=
|
|
17
|
+
portacode/connection/handlers/WEBSOCKET_PROTOCOL.md,sha256=7tBYNEY8EBGAPIMT606BqeHnyMOQIZVlQYpH7me26LY,97962
|
|
18
|
+
portacode/connection/handlers/__init__.py,sha256=WSeBmi65GWFQPYt9M3E10rn0uZ_EPCJzNJOzSf2HZyw,2921
|
|
19
19
|
portacode/connection/handlers/base.py,sha256=oENFb-Fcfzwk99Qx8gJQriEMiwSxwygwjOiuCH36hM4,10231
|
|
20
20
|
portacode/connection/handlers/chunked_content.py,sha256=h6hXRmxSeOgnIxoU8CkmvEf2Odv-ajPrpHIe_W3GKcA,9251
|
|
21
21
|
portacode/connection/handlers/diff_handlers.py,sha256=iYTIRCcpEQ03vIPKZCsMTE5aZbQw6sF04M3dM6rUV8Q,24477
|
|
22
22
|
portacode/connection/handlers/file_handlers.py,sha256=nAJH8nXnX07xxD28ngLpgIUzcTuRwZBNpEGEKdRqohw,39507
|
|
23
23
|
portacode/connection/handlers/project_aware_file_handlers.py,sha256=AqgMnDqX2893T2NsrvUSCwjN5VKj4Pb2TN0S_SuboOE,9803
|
|
24
24
|
portacode/connection/handlers/project_state_handlers.py,sha256=v6ZefGW9i7n1aZLq2jOGumJIjYb6aHlPI4m1jkYewm8,1686
|
|
25
|
-
portacode/connection/handlers/proxmox_infra.py,sha256=
|
|
25
|
+
portacode/connection/handlers/proxmox_infra.py,sha256=Sd25UGM7edWDTIiatZvA2Dh3-4NOzfIDmixG0Fz5m0U,51343
|
|
26
26
|
portacode/connection/handlers/registry.py,sha256=qXGE60sYEWg6ZtVQzFcZ5YI2XWR6lMgw4hAL9x5qR1I,6181
|
|
27
27
|
portacode/connection/handlers/session.py,sha256=uNGfiO_1B9-_yjJKkpvmbiJhIl6b-UXlT86UTfd6WYE,42219
|
|
28
|
-
portacode/connection/handlers/system_handlers.py,sha256=
|
|
28
|
+
portacode/connection/handlers/system_handlers.py,sha256=AKh7IbwptlLYrbSw5f-DHigvlaKHsg9lDP-lkAUm8cE,10755
|
|
29
29
|
portacode/connection/handlers/tab_factory.py,sha256=yn93h6GASjD1VpvW1oqpax3EpoT0r7r97zFXxML1wdA,16173
|
|
30
30
|
portacode/connection/handlers/terminal_handlers.py,sha256=HRwHW1GiqG1NtHVEqXHKaYkFfQEzCDDH6YIlHcb4XD8,11866
|
|
31
31
|
portacode/connection/handlers/update_handler.py,sha256=f2K4LmG4sHJZ3LahzzoRtHBULTKkPUNwuyhwuAAg3RA,2054
|
|
@@ -64,7 +64,7 @@ portacode/utils/__init__.py,sha256=NgBlWTuNJESfIYJzP_3adI1yJQJR0XJLRpSdVNaBAN0,3
|
|
|
64
64
|
portacode/utils/diff_apply.py,sha256=4Oi7ft3VUCKmiUE4VM-OeqO7Gk6H7PF3WnN4WHXtjxI,15157
|
|
65
65
|
portacode/utils/diff_renderer.py,sha256=S76StnQ2DLfsz4Gg0m07UwPfRp8270PuzbNaQq-rmYk,13850
|
|
66
66
|
portacode/utils/ntp_clock.py,sha256=VqCnWCTehCufE43W23oB-WUdAZGeCcLxkmIOPwInYHc,2499
|
|
67
|
-
portacode-1.4.
|
|
67
|
+
portacode-1.4.12.dev1.dist-info/licenses/LICENSE,sha256=2FGbCnUDgRYuQTkB1O1dUUpu5CVAjK1j4_p6ack9Z54,1066
|
|
68
68
|
test_modules/README.md,sha256=Do_agkm9WhSzueXjRAkV_xEj6Emy5zB3N3VKY5Roce8,9274
|
|
69
69
|
test_modules/__init__.py,sha256=1LcbHodIHsB0g-g4NGjSn6AMuCoGbymvXPYLOb6Z7F0,53
|
|
70
70
|
test_modules/test_device_online.py,sha256=QtYq0Dq9vME8Gp2O4fGSheqVf8LUtpsSKosXXk56gGM,1654
|
|
@@ -90,8 +90,8 @@ testing_framework/core/playwright_manager.py,sha256=Tw46qwxIhOFkS48C2IWIQHHNpEe-
|
|
|
90
90
|
testing_framework/core/runner.py,sha256=j2QwNJmAxVBmJvcbVS7DgPJUKPNzqfLmt_4NNdaKmZU,19297
|
|
91
91
|
testing_framework/core/shared_cli_manager.py,sha256=BESSNtyQb7BOlaOvZmm04T8Uezjms4KCBs2MzTxvzYQ,8790
|
|
92
92
|
testing_framework/core/test_discovery.py,sha256=2FZ9fJ8Dp5dloA-fkgXoJ_gCMC_nYPBnA3Hs2xlagzM,4928
|
|
93
|
-
portacode-1.4.
|
|
94
|
-
portacode-1.4.
|
|
95
|
-
portacode-1.4.
|
|
96
|
-
portacode-1.4.
|
|
97
|
-
portacode-1.4.
|
|
93
|
+
portacode-1.4.12.dev1.dist-info/METADATA,sha256=o7psDA6l4eoRJLFQipCS3XcgsqTLxNMf39xhh6qYJ00,13051
|
|
94
|
+
portacode-1.4.12.dev1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
95
|
+
portacode-1.4.12.dev1.dist-info/entry_points.txt,sha256=lLUUL-BM6_wwe44Xv0__5NQ1BnAz6jWjSMFvZdWW3zU,48
|
|
96
|
+
portacode-1.4.12.dev1.dist-info/top_level.txt,sha256=TGhTYUxfW8SyVZc_zGgzjzc24gGT7nSw8Qf73liVRKM,41
|
|
97
|
+
portacode-1.4.12.dev1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|