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.

@@ -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 _get_proxmox_info() -> Dict[str, Any]:
132
- """Detect if the current host is a Proxmox node."""
133
- info: Dict[str, Any] = {"is_proxmox_node": False, "version": None}
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
- info["version"] = release_file.read_text().strip()
161
+ return release_file.read_text().strip()
139
162
  except Exception:
140
- info["version"] = None
141
- elif Path("/etc/pve").exists():
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
 
@@ -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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: portacode
3
- Version: 1.4.11.dev0
3
+ Version: 1.4.12.dev1
4
4
  Summary: Portacode CLI client and SDK
5
5
  Home-page: https://github.com/portacode/portacode
6
6
  Author: Meena Erian
@@ -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=V3stafZrckfijvIH49elVCm8cQ_x4AD5VnTvqB60X_0,719
5
- portacode/cli.py,sha256=R6BkYM-o2MCUETk-o2h-U_24E96EbVmQpIXJJY2H08Y,20387
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=UpH3FywKSY2l07k76sa4B3n31ecb4Jm5QsvkTZPGCIo,44395
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=De95QT1lT69moV64Qubhrxb7xE-j8lvSoD_-Svyhr9s,86690
18
- portacode/connection/handlers/__init__.py,sha256=4LuqzmVtD_O7EtN6TTGZc2Co6UD2dmPCJ_6qcIKEfz8,2496
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=YocSgNus0TQPOEPUBuuXy-crhyCfpPZV3Mhlwo7iwQQ,10903
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=KfmLC5WOZR7gMOrL9mf6_XLhK5VuDhzgOmOdLi0qyLw,9494
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.11.dev0.dist-info/licenses/LICENSE,sha256=2FGbCnUDgRYuQTkB1O1dUUpu5CVAjK1j4_p6ack9Z54,1066
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.11.dev0.dist-info/METADATA,sha256=XXzgUM_MnhswA3L7SOeRKjeG64Si7CWErIWs_atPhtY,13051
94
- portacode-1.4.11.dev0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
95
- portacode-1.4.11.dev0.dist-info/entry_points.txt,sha256=lLUUL-BM6_wwe44Xv0__5NQ1BnAz6jWjSMFvZdWW3zU,48
96
- portacode-1.4.11.dev0.dist-info/top_level.txt,sha256=TGhTYUxfW8SyVZc_zGgzjzc24gGT7nSw8Qf73liVRKM,41
97
- portacode-1.4.11.dev0.dist-info/RECORD,,
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,,