portacode 1.4.15.dev20__py3-none-any.whl → 1.4.15.dev21__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.15.dev20'
32
- __version_tuple__ = version_tuple = (1, 4, 15, 'dev20')
31
+ __version__ = version = '1.4.15.dev21'
32
+ __version_tuple__ = version_tuple = (1, 4, 15, 'dev21')
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -892,6 +892,10 @@ def _run_pct(vmid: int, cmd: str, input_text: Optional[str] = None) -> Dict[str,
892
892
  }
893
893
 
894
894
 
895
+ def _su_command(user: str, command: str) -> str:
896
+ return f"su - {user} -s /bin/sh -c {shlex.quote(command)}"
897
+
898
+
895
899
  def _run_pct_check(vmid: int, cmd: str) -> Dict[str, Any]:
896
900
  res = _run_pct(vmid, cmd)
897
901
  if res["returncode"] != 0:
@@ -951,7 +955,7 @@ def _push_bytes_to_container(
951
955
 
952
956
 
953
957
  def _resolve_portacode_key_dir(vmid: int, user: str) -> str:
954
- data_dir_cmd = f"su - {user} -c 'echo -n ${{XDG_DATA_HOME:-$HOME/.local/share}}'"
958
+ data_dir_cmd = _su_command(user, "echo -n ${XDG_DATA_HOME:-$HOME/.local/share}")
955
959
  data_home = _run_pct_check(vmid, data_dir_cmd)["stdout"].strip()
956
960
  portacode_dir = f"{data_home}/portacode"
957
961
  _run_pct_exec_check(vmid, ["mkdir", "-p", portacode_dir])
@@ -968,18 +972,19 @@ def _deploy_device_keypair(vmid: int, user: str, private_key: str, public_key: s
968
972
 
969
973
 
970
974
  def _portacode_connect_and_read_key(vmid: int, user: str, timeout_s: int = 10) -> Dict[str, Any]:
971
- cmd = ["pct", "exec", str(vmid), "--", "bash", "-lc", f"su - {user} -c 'portacode connect'"]
975
+ su_connect_cmd = _su_command(user, "portacode connect")
976
+ cmd = ["pct", "exec", str(vmid), "--", "/bin/sh", "-c", su_connect_cmd]
972
977
  proc = subprocess.Popen(cmd, text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
973
978
  start = time.time()
974
979
 
975
- data_dir_cmd = f"su - {user} -c 'echo -n ${{XDG_DATA_HOME:-$HOME/.local/share}}'"
980
+ data_dir_cmd = _su_command(user, "echo -n ${XDG_DATA_HOME:-$HOME/.local/share}")
976
981
  data_dir = _run_pct_check(vmid, data_dir_cmd)["stdout"].strip()
977
982
  key_dir = f"{data_dir}/portacode/keys"
978
983
  pub_path = f"{key_dir}/id_portacode.pub"
979
984
  priv_path = f"{key_dir}/id_portacode"
980
985
 
981
986
  def file_size(path: str) -> Optional[int]:
982
- stat_cmd = f"su - {user} -c 'test -s {path} && stat -c %s {path}'"
987
+ stat_cmd = _su_command(user, f"test -s {path} && stat -c %s {path}")
983
988
  res = _run_pct(vmid, stat_cmd)
984
989
  if res["returncode"] != 0:
985
990
  return None
@@ -1037,7 +1042,7 @@ def _portacode_connect_and_read_key(vmid: int, user: str, timeout_s: int = 10) -
1037
1042
  final_pub = file_size(pub_path)
1038
1043
  final_priv = file_size(priv_path)
1039
1044
  if final_pub and final_priv:
1040
- key_res = _run_pct(vmid, f"su - {user} -c 'cat {pub_path}'")
1045
+ key_res = _run_pct(vmid, _su_command(user, f"cat {pub_path}"))
1041
1046
  if not process_exited:
1042
1047
  proc.terminate()
1043
1048
  try:
@@ -1077,7 +1082,7 @@ def _portacode_connect_and_read_key(vmid: int, user: str, timeout_s: int = 10) -
1077
1082
  except subprocess.TimeoutExpired:
1078
1083
  proc.kill()
1079
1084
 
1080
- key_res = _run_pct(vmid, f"su - {user} -c 'cat {pub_path}'")
1085
+ key_res = _run_pct(vmid, _su_command(user, f"cat {pub_path}"))
1081
1086
  return {
1082
1087
  "ok": True,
1083
1088
  "public_key": key_res["stdout"].strip(),
@@ -1620,7 +1625,7 @@ class CreateProxmoxContainerHandler(SyncHandler):
1620
1625
  on_behalf_of_device=device_id,
1621
1626
  )
1622
1627
 
1623
- cmd = f"su - {payload['username']} -c 'sudo -S portacode service install'"
1628
+ cmd = _su_command(payload["username"], "sudo -S portacode service install")
1624
1629
  res = _run_pct(vmid, cmd, input_text=payload["password"] + "\n")
1625
1630
 
1626
1631
  if res["returncode"] != 0:
@@ -1752,7 +1757,7 @@ class StartPortacodeServiceHandler(SyncHandler):
1752
1757
  on_behalf_of_device=on_behalf_of_device,
1753
1758
  )
1754
1759
 
1755
- cmd = f"su - {user} -c 'sudo -S portacode service install'"
1760
+ cmd = _su_command(user, "sudo -S portacode service install")
1756
1761
  res = _run_pct(vmid, cmd, input_text=password + "\n")
1757
1762
 
1758
1763
  if res["returncode"] != 0:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: portacode
3
- Version: 1.4.15.dev20
3
+ Version: 1.4.15.dev21
4
4
  Summary: Portacode CLI client and SDK
5
5
  Home-page: https://github.com/portacode/portacode
6
6
  Author: Meena Erian
@@ -1,7 +1,7 @@
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=EtNExlVc69CYMOUqVHfUwnvcPdwIJ3mbJi0bUDaa61w,721
4
+ portacode/_version.py,sha256=U9P73QDPcoNTjwvbpqz9ybWnBOiKr03eV2nhMcRk5Xo,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
@@ -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=1cL2X6ovdyjt2nWRav6bq-ic8wnLvl2WbxmbxPcutTk,70607
25
+ portacode/connection/handlers/proxmox_infra.py,sha256=xm2utGUde1wZjH_ltMJHTL1Ibvxh_LYgeHmfFi4zUIw,70766
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.15.dev20.dist-info/licenses/LICENSE,sha256=2FGbCnUDgRYuQTkB1O1dUUpu5CVAjK1j4_p6ack9Z54,1066
68
+ portacode-1.4.15.dev21.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.15.dev20.dist-info/METADATA,sha256=Iy_i4HjHxat7PXmtofy00vurrM3SPQHTmyUUcQ0BMrI,13052
95
- portacode-1.4.15.dev20.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
96
- portacode-1.4.15.dev20.dist-info/entry_points.txt,sha256=lLUUL-BM6_wwe44Xv0__5NQ1BnAz6jWjSMFvZdWW3zU,48
97
- portacode-1.4.15.dev20.dist-info/top_level.txt,sha256=TGhTYUxfW8SyVZc_zGgzjzc24gGT7nSw8Qf73liVRKM,41
98
- portacode-1.4.15.dev20.dist-info/RECORD,,
94
+ portacode-1.4.15.dev21.dist-info/METADATA,sha256=e65XngiIyI4jPmQqu43qYc3XVYJfYwzQJQAlftfm2ww,13052
95
+ portacode-1.4.15.dev21.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
96
+ portacode-1.4.15.dev21.dist-info/entry_points.txt,sha256=lLUUL-BM6_wwe44Xv0__5NQ1BnAz6jWjSMFvZdWW3zU,48
97
+ portacode-1.4.15.dev21.dist-info/top_level.txt,sha256=TGhTYUxfW8SyVZc_zGgzjzc24gGT7nSw8Qf73liVRKM,41
98
+ portacode-1.4.15.dev21.dist-info/RECORD,,