portacode 1.4.17.dev9__py3-none-any.whl → 1.4.17.dev11__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.
portacode/_version.py CHANGED
@@ -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.dev9'
32
- __version_tuple__ = version_tuple = (1, 4, 17, 'dev9')
31
+ __version__ = version = '1.4.17.dev11'
32
+ __version_tuple__ = version_tuple = (1, 4, 17, 'dev11')
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -1438,6 +1438,15 @@ def _su_command(user: str, command: str) -> str:
1438
1438
  return f"su - {user} -s /bin/sh -c {shlex.quote(command)}"
1439
1439
 
1440
1440
 
1441
+ def _resolve_portacode_cli_path(vmid: int, user: str) -> str:
1442
+ """Resolve the full path to the portacode CLI inside the container."""
1443
+ res = _run_pct(vmid, _su_command(user, "command -v portacode"))
1444
+ path = (res.get("stdout") or "").strip()
1445
+ if path:
1446
+ return path
1447
+ return "portacode"
1448
+
1449
+
1441
1450
  def _run_pct_check(vmid: int, cmd: str) -> Dict[str, Any]:
1442
1451
  res = _run_pct(vmid, cmd)
1443
1452
  if res["returncode"] != 0:
@@ -2240,7 +2249,11 @@ class CreateProxmoxContainerHandler(SyncHandler):
2240
2249
  on_behalf_of_device=device_id,
2241
2250
  )
2242
2251
 
2243
- cmd = _su_command(payload_local["username"], "sudo -S portacode service install")
2252
+ cli_path = _resolve_portacode_cli_path(vmid, payload_local["username"])
2253
+ cmd = _su_command(
2254
+ payload_local["username"],
2255
+ f"sudo -S {shlex.quote(cli_path)} service install",
2256
+ )
2244
2257
  res = _run_pct(vmid, cmd, input_text=payload_local["password"] + "\n")
2245
2258
 
2246
2259
  if res["returncode"] != 0:
@@ -2403,7 +2416,8 @@ class StartPortacodeServiceHandler(SyncHandler):
2403
2416
  on_behalf_of_device=on_behalf_of_device,
2404
2417
  )
2405
2418
 
2406
- cmd = _su_command(user, "sudo -S portacode service install")
2419
+ cli_path = _resolve_portacode_cli_path(vmid, user)
2420
+ cmd = _su_command(user, f"sudo -S {shlex.quote(cli_path)} service install")
2407
2421
  res = _run_pct(vmid, cmd, input_text=password + "\n")
2408
2422
 
2409
2423
  if res["returncode"] != 0:
portacode/service.py CHANGED
@@ -209,6 +209,7 @@ class _OpenRCService:
209
209
 
210
210
  def __init__(self) -> None:
211
211
  self.init_path = Path("/etc/init.d") / self.NAME
212
+ self.wrapper_path = Path("/usr/local/share/portacode/connect_service.sh")
212
213
  self.user = os.environ.get("SUDO_USER") or os.environ.get("USER") or os.getlogin()
213
214
  try:
214
215
  self.home = Path(pwd.getpwnam(self.user).pw_dir)
@@ -224,18 +225,16 @@ class _OpenRCService:
224
225
  return subprocess.run(cmd, text=True, capture_output=True)
225
226
 
226
227
  def _write_init_script(self) -> None:
228
+ self._write_wrapper_script()
227
229
  script = textwrap.dedent(f"""
228
230
  #!/sbin/openrc-run
229
231
  description="Portacode persistent connection"
230
232
 
231
- command="{self.python}"
232
- command_args="-m portacode connect --non-interactive"
233
+ command="{self.wrapper_path}"
233
234
  command_user="{self.user}"
234
235
  command_background="yes"
235
236
  pidfile="/run/portacode.pid"
236
237
  directory="{self.home}"
237
- output_log="{self.log_path}"
238
- error_log="{self.log_path}"
239
238
 
240
239
  depend() {{
241
240
  need net
@@ -243,6 +242,10 @@ class _OpenRCService:
243
242
 
244
243
  start_pre() {{
245
244
  checkpath --directory --mode 0755 /var/log/portacode
245
+ checkpath --directory --mode 0755 /usr/local/share/portacode
246
+ touch "{self.log_path}"
247
+ chown {self.user} "{self.log_path}"
248
+ chown {self.user} /var/log/portacode
246
249
  }}
247
250
  """).lstrip()
248
251
 
@@ -258,6 +261,25 @@ class _OpenRCService:
258
261
  tmp_path.unlink()
259
262
  except Exception:
260
263
  pass
264
+
265
+ def _write_wrapper_script(self) -> None:
266
+ script = textwrap.dedent(f"""
267
+ #!/bin/sh
268
+ cd "{self.home}"
269
+ exec "{self.python}" -m portacode connect --non-interactive >> "{self.log_path}" 2>&1
270
+ """).lstrip()
271
+ tmp_path = Path(tempfile.gettempdir()) / f"portacode-wrapper-{os.getpid()}"
272
+ tmp_path.write_text(script)
273
+ if os.geteuid() != 0:
274
+ self._run("install", "-m", "755", str(tmp_path), str(self.wrapper_path))
275
+ else:
276
+ self.wrapper_path.parent.mkdir(parents=True, exist_ok=True)
277
+ shutil.copyfile(tmp_path, self.wrapper_path)
278
+ self.wrapper_path.chmod(0o755)
279
+ try:
280
+ tmp_path.unlink()
281
+ except Exception:
282
+ pass
261
283
 
262
284
  def install(self) -> None:
263
285
  self._write_init_script()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: portacode
3
- Version: 1.4.17.dev9
3
+ Version: 1.4.17.dev11
4
4
  Summary: Portacode CLI client and SDK
5
5
  Home-page: https://github.com/portacode/portacode
6
6
  Author: Meena Erian
@@ -1,13 +1,13 @@
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=vNmWumwOSakJSXsv8x_EdHyiL23srCSUrbOcexyXbKc,719
4
+ portacode/_version.py,sha256=Lg3L_Yd907oy5QaxmgSlo_Rw45Rv_u8XLVUuKTmx3Gg,721
5
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
9
9
  portacode/pairing.py,sha256=OzSuc0GhrknrDrny4aBU6IUnmKzRDTtocuDpyaVnyrs,3116
10
- portacode/service.py,sha256=RkXWeTDT0t3rJ3szt_qlKR2P_SXIMUcFSl70BfIJpjo,20651
10
+ portacode/service.py,sha256=8dX9bmJ97r8UuM4PJMICQ_D8kWpMPRIdTgPJfsOKmrM,21617
11
11
  portacode/connection/README.md,sha256=f9rbuIEKa7cTm9C98rCiBbEtbiIXQU11esGSNhSMiJg,883
12
12
  portacode/connection/__init__.py,sha256=atqcVGkViIEd7pRa6cP2do07RJOM0UWpbnz5zXjGktU,250
13
13
  portacode/connection/client.py,sha256=jtLb9_YufqPkzi9t8VQH3iz_JEMisbtY6a8L9U5weiU,14181
@@ -22,7 +22,7 @@ portacode/connection/handlers/diff_handlers.py,sha256=iYTIRCcpEQ03vIPKZCsMTE5aZb
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=dxn6m7buw_GHbhkhWX6J7gDpqCpXmmBxfqSb-6aQiPg,98542
25
+ portacode/connection/handlers/proxmox_infra.py,sha256=6Av5QeNQGh38U0kRzoB4ZICmSrRaWLT3YXHoAqUisv4,99102
26
26
  portacode/connection/handlers/registry.py,sha256=qXGE60sYEWg6ZtVQzFcZ5YI2XWR6lMgw4hAL9x5qR1I,6181
27
27
  portacode/connection/handlers/session.py,sha256=uNGfiO_1B9-_yjJKkpvmbiJhIl6b-UXlT86UTfd6WYE,42219
28
28
  portacode/connection/handlers/system_handlers.py,sha256=fr12QpOr_Z8KYGUU-AYrTQwRPAcrLK85hvj3SEq1Kw8,14757
@@ -65,7 +65,7 @@ portacode/utils/__init__.py,sha256=NgBlWTuNJESfIYJzP_3adI1yJQJR0XJLRpSdVNaBAN0,3
65
65
  portacode/utils/diff_apply.py,sha256=4Oi7ft3VUCKmiUE4VM-OeqO7Gk6H7PF3WnN4WHXtjxI,15157
66
66
  portacode/utils/diff_renderer.py,sha256=S76StnQ2DLfsz4Gg0m07UwPfRp8270PuzbNaQq-rmYk,13850
67
67
  portacode/utils/ntp_clock.py,sha256=VqCnWCTehCufE43W23oB-WUdAZGeCcLxkmIOPwInYHc,2499
68
- portacode-1.4.17.dev9.dist-info/licenses/LICENSE,sha256=2FGbCnUDgRYuQTkB1O1dUUpu5CVAjK1j4_p6ack9Z54,1066
68
+ portacode-1.4.17.dev11.dist-info/licenses/LICENSE,sha256=2FGbCnUDgRYuQTkB1O1dUUpu5CVAjK1j4_p6ack9Z54,1066
69
69
  test_modules/README.md,sha256=Do_agkm9WhSzueXjRAkV_xEj6Emy5zB3N3VKY5Roce8,9274
70
70
  test_modules/__init__.py,sha256=1LcbHodIHsB0g-g4NGjSn6AMuCoGbymvXPYLOb6Z7F0,53
71
71
  test_modules/test_device_online.py,sha256=QtYq0Dq9vME8Gp2O4fGSheqVf8LUtpsSKosXXk56gGM,1654
@@ -91,8 +91,8 @@ testing_framework/core/playwright_manager.py,sha256=Tw46qwxIhOFkS48C2IWIQHHNpEe-
91
91
  testing_framework/core/runner.py,sha256=j2QwNJmAxVBmJvcbVS7DgPJUKPNzqfLmt_4NNdaKmZU,19297
92
92
  testing_framework/core/shared_cli_manager.py,sha256=BESSNtyQb7BOlaOvZmm04T8Uezjms4KCBs2MzTxvzYQ,8790
93
93
  testing_framework/core/test_discovery.py,sha256=2FZ9fJ8Dp5dloA-fkgXoJ_gCMC_nYPBnA3Hs2xlagzM,4928
94
- portacode-1.4.17.dev9.dist-info/METADATA,sha256=unCc_gEcNxw9Xt0mzn9Q7uPd9ENflwl8_o_LBb_uH4E,13051
95
- portacode-1.4.17.dev9.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
96
- portacode-1.4.17.dev9.dist-info/entry_points.txt,sha256=lLUUL-BM6_wwe44Xv0__5NQ1BnAz6jWjSMFvZdWW3zU,48
97
- portacode-1.4.17.dev9.dist-info/top_level.txt,sha256=TGhTYUxfW8SyVZc_zGgzjzc24gGT7nSw8Qf73liVRKM,41
98
- portacode-1.4.17.dev9.dist-info/RECORD,,
94
+ portacode-1.4.17.dev11.dist-info/METADATA,sha256=qpoxNNnCxvUgnxqz8EyYsPLpSa6TQIC9YeHhTC-DGH0,13052
95
+ portacode-1.4.17.dev11.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
96
+ portacode-1.4.17.dev11.dist-info/entry_points.txt,sha256=lLUUL-BM6_wwe44Xv0__5NQ1BnAz6jWjSMFvZdWW3zU,48
97
+ portacode-1.4.17.dev11.dist-info/top_level.txt,sha256=TGhTYUxfW8SyVZc_zGgzjzc24gGT7nSw8Qf73liVRKM,41
98
+ portacode-1.4.17.dev11.dist-info/RECORD,,