bt-cli 0.4.22__tar.gz → 0.4.24__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.
Files changed (173) hide show
  1. {bt_cli-0.4.22 → bt_cli-0.4.24}/CLAUDE.md +1 -1
  2. {bt_cli-0.4.22 → bt_cli-0.4.24}/PKG-INFO +1 -1
  3. {bt_cli-0.4.22 → bt_cli-0.4.24}/pyproject.toml +1 -1
  4. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/__init__.py +1 -1
  5. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/client/base.py +71 -0
  6. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/commands/jump_items.py +64 -0
  7. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/commands/vault.py +119 -0
  8. {bt_cli-0.4.22 → bt_cli-0.4.24}/.claude/skills/bt/SKILL.md +0 -0
  9. {bt_cli-0.4.22 → bt_cli-0.4.24}/.claude/skills/entitle/SKILL.md +0 -0
  10. {bt_cli-0.4.22 → bt_cli-0.4.24}/.claude/skills/epmw/SKILL.md +0 -0
  11. {bt_cli-0.4.22 → bt_cli-0.4.24}/.claude/skills/pra/SKILL.md +0 -0
  12. {bt_cli-0.4.22 → bt_cli-0.4.24}/.claude/skills/pws/SKILL.md +0 -0
  13. {bt_cli-0.4.22 → bt_cli-0.4.24}/.env.example +0 -0
  14. {bt_cli-0.4.22 → bt_cli-0.4.24}/.github/workflows/ci.yml +0 -0
  15. {bt_cli-0.4.22 → bt_cli-0.4.24}/.github/workflows/release.yml +0 -0
  16. {bt_cli-0.4.22 → bt_cli-0.4.24}/.gitignore +0 -0
  17. {bt_cli-0.4.22 → bt_cli-0.4.24}/README.md +0 -0
  18. {bt_cli-0.4.22 → bt_cli-0.4.24}/assets/cli-help.png +0 -0
  19. {bt_cli-0.4.22 → bt_cli-0.4.24}/assets/cli-output.png +0 -0
  20. {bt_cli-0.4.22 → bt_cli-0.4.24}/bt-cli.spec +0 -0
  21. {bt_cli-0.4.22 → bt_cli-0.4.24}/bt_entry.py +0 -0
  22. {bt_cli-0.4.22 → bt_cli-0.4.24}/scripts/bt_entry.py +0 -0
  23. {bt_cli-0.4.22 → bt_cli-0.4.24}/scripts/sync-package-data.sh +0 -0
  24. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/cli.py +0 -0
  25. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/commands/__init__.py +0 -0
  26. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/commands/configure.py +0 -0
  27. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/commands/learn.py +0 -0
  28. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/commands/quick.py +0 -0
  29. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/core/__init__.py +0 -0
  30. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/core/auth.py +0 -0
  31. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/core/client.py +0 -0
  32. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/core/config.py +0 -0
  33. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/core/config_file.py +0 -0
  34. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/core/csv_utils.py +0 -0
  35. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/core/errors.py +0 -0
  36. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/core/output.py +0 -0
  37. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/core/prompts.py +0 -0
  38. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/core/rest_debug.py +0 -0
  39. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/data/CLAUDE.md +0 -0
  40. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/data/__init__.py +0 -0
  41. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/data/skills/bt/SKILL.md +0 -0
  42. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/data/skills/entitle/SKILL.md +0 -0
  43. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/data/skills/epmw/SKILL.md +0 -0
  44. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/data/skills/pra/SKILL.md +0 -0
  45. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/data/skills/pws/SKILL.md +0 -0
  46. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/__init__.py +0 -0
  47. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/client/__init__.py +0 -0
  48. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/client/base.py +0 -0
  49. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/commands/__init__.py +0 -0
  50. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/commands/accounts.py +0 -0
  51. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/commands/applications.py +0 -0
  52. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/commands/auth.py +0 -0
  53. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/commands/bundles.py +0 -0
  54. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/commands/integrations.py +0 -0
  55. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/commands/permissions.py +0 -0
  56. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/commands/policies.py +0 -0
  57. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/commands/resources.py +0 -0
  58. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/commands/roles.py +0 -0
  59. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/commands/users.py +0 -0
  60. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/commands/workflows.py +0 -0
  61. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/models/__init__.py +0 -0
  62. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/models/bundle.py +0 -0
  63. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/models/common.py +0 -0
  64. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/models/integration.py +0 -0
  65. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/models/permission.py +0 -0
  66. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/models/policy.py +0 -0
  67. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/models/resource.py +0 -0
  68. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/models/role.py +0 -0
  69. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/models/user.py +0 -0
  70. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/entitle/models/workflow.py +0 -0
  71. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/epmw/__init__.py +0 -0
  72. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/epmw/client/__init__.py +0 -0
  73. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/epmw/client/base.py +0 -0
  74. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/epmw/commands/__init__.py +0 -0
  75. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/epmw/commands/audits.py +0 -0
  76. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/epmw/commands/auth.py +0 -0
  77. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/epmw/commands/computers.py +0 -0
  78. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/epmw/commands/events.py +0 -0
  79. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/epmw/commands/groups.py +0 -0
  80. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/epmw/commands/policies.py +0 -0
  81. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/epmw/commands/quick.py +0 -0
  82. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/epmw/commands/requests.py +0 -0
  83. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/epmw/commands/roles.py +0 -0
  84. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/epmw/commands/tasks.py +0 -0
  85. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/epmw/commands/users.py +0 -0
  86. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/epmw/models/__init__.py +0 -0
  87. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/__init__.py +0 -0
  88. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/client/__init__.py +0 -0
  89. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/commands/__init__.py +0 -0
  90. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/commands/auth.py +0 -0
  91. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/commands/import_export.py +0 -0
  92. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/commands/jump_clients.py +0 -0
  93. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/commands/jump_groups.py +0 -0
  94. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/commands/jumpoints.py +0 -0
  95. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/commands/policies.py +0 -0
  96. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/commands/quick.py +0 -0
  97. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/commands/teams.py +0 -0
  98. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/commands/users.py +0 -0
  99. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/models/__init__.py +0 -0
  100. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/models/common.py +0 -0
  101. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/models/jump_client.py +0 -0
  102. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/models/jump_group.py +0 -0
  103. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/models/jump_item.py +0 -0
  104. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/models/jumpoint.py +0 -0
  105. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/models/team.py +0 -0
  106. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/models/user.py +0 -0
  107. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pra/models/vault.py +0 -0
  108. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/__init__.py +0 -0
  109. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/client/__init__.py +0 -0
  110. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/client/base.py +0 -0
  111. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/client/beyondinsight.py +0 -0
  112. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/client/passwordsafe.py +0 -0
  113. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/commands/__init__.py +0 -0
  114. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/commands/accounts.py +0 -0
  115. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/commands/assets.py +0 -0
  116. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/commands/auth.py +0 -0
  117. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/commands/clouds.py +0 -0
  118. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/commands/config.py +0 -0
  119. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/commands/credentials.py +0 -0
  120. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/commands/databases.py +0 -0
  121. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/commands/directories.py +0 -0
  122. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/commands/functional.py +0 -0
  123. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/commands/import_export.py +0 -0
  124. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/commands/platforms.py +0 -0
  125. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/commands/quick.py +0 -0
  126. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/commands/search.py +0 -0
  127. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/commands/secrets.py +0 -0
  128. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/commands/systems.py +0 -0
  129. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/commands/users.py +0 -0
  130. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/commands/workgroups.py +0 -0
  131. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/config.py +0 -0
  132. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/models/__init__.py +0 -0
  133. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/models/account.py +0 -0
  134. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/models/asset.py +0 -0
  135. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/models/common.py +0 -0
  136. {bt_cli-0.4.22 → bt_cli-0.4.24}/src/bt_cli/pws/models/system.py +0 -0
  137. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/__init__.py +0 -0
  138. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/conftest.py +0 -0
  139. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/core/__init__.py +0 -0
  140. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/core/test_auth.py +0 -0
  141. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/core/test_config.py +0 -0
  142. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/core/test_errors.py +0 -0
  143. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/core/test_rest_debug.py +0 -0
  144. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/entitle/__init__.py +0 -0
  145. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/entitle/test_client.py +0 -0
  146. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/entitle/test_commands.py +0 -0
  147. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/entitle-smoke-test.sh +0 -0
  148. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/epmw/__init__.py +0 -0
  149. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/epmw/test_client.py +0 -0
  150. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/epmw/test_commands.py +0 -0
  151. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/epmw-quick-test-plan.md +0 -0
  152. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/fixtures/__init__.py +0 -0
  153. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/fixtures/responses.py +0 -0
  154. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/integration/__init__.py +0 -0
  155. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/integration/conftest.py +0 -0
  156. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/integration/helpers.py +0 -0
  157. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/integration/test_entitle_integration.py +0 -0
  158. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/integration/test_epmw_integration.py +0 -0
  159. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/integration/test_epmw_lifecycle.py +0 -0
  160. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/integration/test_pra_integration.py +0 -0
  161. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/integration/test_pra_lifecycle.py +0 -0
  162. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/integration/test_pws_integration.py +0 -0
  163. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/integration/test_pws_lifecycle.py +0 -0
  164. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/pra/__init__.py +0 -0
  165. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/pra/test_client.py +0 -0
  166. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/pra/test_commands.py +0 -0
  167. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/pra-smoke-test.sh +0 -0
  168. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/pra-test-plan.md +0 -0
  169. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/pws/__init__.py +0 -0
  170. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/pws/test_client.py +0 -0
  171. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/pws/test_commands.py +0 -0
  172. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/pws-quick-test-plan.md +0 -0
  173. {bt_cli-0.4.22 → bt_cli-0.4.24}/tests/pws-smoke-test.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  # BT-CLI
2
2
 
3
- BeyondTrust Platform CLI for Password Safe, Entitle, PRA, and EPM Windows. **Version: 0.4.22**
3
+ BeyondTrust Platform CLI for Password Safe, Entitle, PRA, and EPM Windows. **Version: 0.4.24**
4
4
 
5
5
  ## Setup
6
6
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bt-cli
3
- Version: 0.4.22
3
+ Version: 0.4.24
4
4
  Summary: BeyondTrust Platform CLI (unofficial) - Password Safe, Entitle, PRA, EPM
5
5
  Author-email: Dave Grendysz <dgrendysz@beyondtrust.com>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "bt-cli"
7
- version = "0.4.22"
7
+ version = "0.4.24"
8
8
  description = "BeyondTrust Platform CLI (unofficial) - Password Safe, Entitle, PRA, EPM"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -1,3 +1,3 @@
1
1
  """BeyondTrust Unified Admin CLI."""
2
2
 
3
- __version__ = "0.4.21"
3
+ __version__ = "0.4.24"
@@ -183,6 +183,17 @@ class PRAClient:
183
183
  response = self._client.delete(url, headers=self._headers())
184
184
  response.raise_for_status()
185
185
 
186
+ def delete_with_body(self, endpoint: str, data: Dict[str, Any]) -> None:
187
+ """Make DELETE request to API with JSON body.
188
+
189
+ Args:
190
+ endpoint: API endpoint path
191
+ data: JSON body data
192
+ """
193
+ url = f"{self.api_base}{endpoint}"
194
+ response = self._client.request("DELETE", url, headers=self._headers(), json=data)
195
+ response.raise_for_status()
196
+
186
197
  def close(self) -> None:
187
198
  """Close the HTTP client."""
188
199
  self._client.close()
@@ -429,6 +440,14 @@ class PRAClient:
429
440
  params["jump_group_id"] = jump_group_id
430
441
  return self.get_paginated("/jump-item/web-jump", params)
431
442
 
443
+ def get_web_jump(self, item_id: int) -> Dict[str, Any]:
444
+ """Get a Web Jump item."""
445
+ return self.get(f"/jump-item/web-jump/{item_id}")
446
+
447
+ def delete_web_jump(self, item_id: int) -> None:
448
+ """Delete a Web Jump item."""
449
+ self.delete(f"/jump-item/web-jump/{item_id}")
450
+
432
451
  def list_protocol_tunnels(
433
452
  self,
434
453
  jump_group_id: Optional[int] = None,
@@ -561,6 +580,58 @@ class PRAClient:
561
580
  """Delete a Vault account."""
562
581
  self.delete(f"/vault/account/{account_id}")
563
582
 
583
+ def associate_vault_account_jump_item(
584
+ self,
585
+ account_id: int,
586
+ jump_item_id: int,
587
+ jump_item_type: str = "shell_jump",
588
+ ) -> Dict[str, Any]:
589
+ """Associate a Vault account with a Jump Item.
590
+
591
+ Args:
592
+ account_id: Vault Account ID
593
+ jump_item_id: Jump Item ID to associate
594
+ jump_item_type: Type of jump item - 'shell_jump', 'remote_rdp', 'remote_vnc', 'web_jump'
595
+
596
+ Returns:
597
+ The created association
598
+ """
599
+ data = {
600
+ "id": jump_item_id,
601
+ "type": jump_item_type,
602
+ }
603
+ return self.post(f"/vault/account/{account_id}/jump-item-association/jump-item", data)
604
+
605
+ def disassociate_vault_account_jump_item(
606
+ self,
607
+ account_id: int,
608
+ jump_item_id: int,
609
+ jump_item_type: str = "shell_jump",
610
+ ) -> None:
611
+ """Remove association between a Vault account and a Jump Item.
612
+
613
+ Args:
614
+ account_id: Vault Account ID
615
+ jump_item_id: Jump Item ID to disassociate
616
+ jump_item_type: Type of jump item - 'shell_jump', 'remote_rdp', etc.
617
+ """
618
+ # API requires body with id and type, not path parameters
619
+ self.delete_with_body(
620
+ f"/vault/account/{account_id}/jump-item-association/jump-item",
621
+ {"id": jump_item_id, "type": jump_item_type}
622
+ )
623
+
624
+ def list_vault_account_jump_items(self, account_id: int) -> Dict[str, Any]:
625
+ """List Jump Items associated with a Vault account.
626
+
627
+ Args:
628
+ account_id: Vault Account ID
629
+
630
+ Returns:
631
+ Association info with filter criteria and jump_items list
632
+ """
633
+ return self.get(f"/vault/account/{account_id}/jump-item-association")
634
+
564
635
  def list_vault_account_groups(self) -> List[Dict[str, Any]]:
565
636
  """List Vault account groups."""
566
637
  return self.get_paginated("/vault/account-group")
@@ -458,6 +458,70 @@ def list_web_jumps(
458
458
  raise typer.Exit(1)
459
459
 
460
460
 
461
+ @web_app.command("get")
462
+ def get_web_jump(
463
+ item_id: int = typer.Argument(..., help="Web Jump ID"),
464
+ output: OutputFormat = typer.Option(OutputFormat.JSON, "--output", "-o"),
465
+ ):
466
+ """Get Web Jump details."""
467
+ from bt_cli.pra.client import get_client
468
+
469
+ try:
470
+ client = get_client()
471
+ item = client.get_web_jump(item_id)
472
+
473
+ if output == OutputFormat.JSON:
474
+ print_json(item)
475
+ else:
476
+ from rich.console import Console
477
+ from rich.panel import Panel
478
+ console = Console()
479
+ console.print(Panel(
480
+ f"[bold]{item.get('name', '')}[/bold]\n\n"
481
+ f"[dim]URL:[/dim] {item.get('url', '')}\n"
482
+ f"[dim]Username:[/dim] {item.get('username', '') or '-'}\n"
483
+ f"[dim]Jump Group:[/dim] {item.get('jump_group_id', '')}\n"
484
+ f"[dim]Jumpoint:[/dim] {item.get('jumpoint_id', '')}",
485
+ title="Web Jump Details",
486
+ subtitle=f"ID: {item.get('id', '')}",
487
+ ))
488
+ except httpx.HTTPStatusError as e:
489
+ print_api_error(e, "get web jump")
490
+ raise typer.Exit(1)
491
+ except httpx.RequestError as e:
492
+ print_api_error(e, "get web jump")
493
+ raise typer.Exit(1)
494
+ except Exception as e:
495
+ print_api_error(e, "get web jump")
496
+ raise typer.Exit(1)
497
+
498
+
499
+ @web_app.command("delete")
500
+ def delete_web_jump(
501
+ item_id: int = typer.Argument(..., help="Web Jump ID"),
502
+ force: bool = typer.Option(False, "--force", "-f", help="Skip confirmation"),
503
+ ):
504
+ """Delete a Web Jump item."""
505
+ from bt_cli.pra.client import get_client
506
+
507
+ if not force:
508
+ typer.confirm(f"Delete web jump {item_id}?", abort=True)
509
+
510
+ try:
511
+ client = get_client()
512
+ client.delete_web_jump(item_id)
513
+ print_success(f"Deleted web jump {item_id}")
514
+ except httpx.HTTPStatusError as e:
515
+ print_api_error(e, "delete web jump")
516
+ raise typer.Exit(1)
517
+ except httpx.RequestError as e:
518
+ print_api_error(e, "delete web jump")
519
+ raise typer.Exit(1)
520
+ except Exception as e:
521
+ print_api_error(e, "delete web jump")
522
+ raise typer.Exit(1)
523
+
524
+
461
525
  # Protocol Tunnel subcommands (TCP, MSSQL, PostgreSQL, MySQL, K8s)
462
526
  tunnel_app = typer.Typer(no_args_is_help=True, help="Protocol Tunnel Jump items (TCP, MSSQL, PostgreSQL, MySQL, K8s)")
463
527
  app.add_typer(tunnel_app, name="tunnel")
@@ -517,6 +517,125 @@ def rotate_vault_account(
517
517
  raise typer.Exit(1)
518
518
 
519
519
 
520
+ @accounts_app.command("associate")
521
+ def associate_vault_account_jump_item(
522
+ account_id: int = typer.Argument(..., help="Vault Account ID"),
523
+ jump_item_id: int = typer.Option(..., "--jump-item", "-j", help="Jump Item ID to associate"),
524
+ jump_item_type: str = typer.Option(
525
+ "shell_jump", "--type", "-t",
526
+ help="Jump item type: shell_jump, remote_rdp, remote_vnc, web_jump"
527
+ ),
528
+ output: OutputFormat = typer.Option(OutputFormat.JSON, "--output", "-o"),
529
+ ):
530
+ """Associate a Vault account with a Jump Item.
531
+
532
+ Links a vault account to a jump item so credentials can be injected
533
+ automatically when accessing that jump item.
534
+
535
+ Examples:
536
+ # Associate vault account 5 with shell jump item 10
537
+ bt pra vault accounts associate 5 -j 10
538
+
539
+ # Associate with RDP jump item
540
+ bt pra vault accounts associate 5 -j 10 -t remote_rdp
541
+ """
542
+ from bt_cli.pra.client import get_client
543
+
544
+ try:
545
+ client = get_client()
546
+ result = client.associate_vault_account_jump_item(account_id, jump_item_id, jump_item_type)
547
+ print_success(f"Associated vault account {account_id} with jump item {jump_item_id}")
548
+
549
+ if output == OutputFormat.JSON:
550
+ print_json(result)
551
+ except httpx.HTTPStatusError as e:
552
+ print_api_error(e, "associate vault account")
553
+ raise typer.Exit(1)
554
+ except httpx.RequestError as e:
555
+ print_api_error(e, "associate vault account")
556
+ raise typer.Exit(1)
557
+ except Exception as e:
558
+ print_api_error(e, "associate vault account")
559
+ raise typer.Exit(1)
560
+
561
+
562
+ @accounts_app.command("disassociate")
563
+ def disassociate_vault_account_jump_item(
564
+ account_id: int = typer.Argument(..., help="Vault Account ID"),
565
+ jump_item_id: int = typer.Option(..., "--jump-item", "-j", help="Jump Item ID to disassociate"),
566
+ jump_item_type: str = typer.Option(
567
+ "shell_jump", "--type", "-t",
568
+ help="Jump item type: shell_jump, remote_rdp, remote_vnc, web_jump"
569
+ ),
570
+ force: bool = typer.Option(False, "--force", "-f", help="Skip confirmation"),
571
+ ):
572
+ """Remove association between a Vault account and a Jump Item.
573
+
574
+ Examples:
575
+ bt pra vault accounts disassociate 5 -j 10
576
+ bt pra vault accounts disassociate 5 -j 10 -t remote_rdp
577
+ bt pra vault accounts disassociate 5 -j 10 -f # Skip confirmation
578
+ """
579
+ from bt_cli.pra.client import get_client
580
+
581
+ if not force:
582
+ typer.confirm(
583
+ f"Remove association between vault account {account_id} and jump item {jump_item_id}?",
584
+ abort=True
585
+ )
586
+
587
+ try:
588
+ client = get_client()
589
+ client.disassociate_vault_account_jump_item(account_id, jump_item_id, jump_item_type)
590
+ print_success(f"Removed association between vault account {account_id} and jump item {jump_item_id}")
591
+ except httpx.HTTPStatusError as e:
592
+ print_api_error(e, "disassociate vault account")
593
+ raise typer.Exit(1)
594
+ except httpx.RequestError as e:
595
+ print_api_error(e, "disassociate vault account")
596
+ raise typer.Exit(1)
597
+ except Exception as e:
598
+ print_api_error(e, "disassociate vault account")
599
+ raise typer.Exit(1)
600
+
601
+
602
+ @accounts_app.command("list-jump-items")
603
+ def list_vault_account_jump_items(
604
+ account_id: int = typer.Argument(..., help="Vault Account ID"),
605
+ output: OutputFormat = typer.Option(OutputFormat.TABLE, "--output", "-o"),
606
+ ):
607
+ """List Jump Items associated with a Vault account.
608
+
609
+ Examples:
610
+ bt pra vault accounts list-jump-items 5
611
+ bt pra vault accounts list-jump-items 5 -o json
612
+ """
613
+ from bt_cli.pra.client import get_client
614
+
615
+ try:
616
+ client = get_client()
617
+ result = client.list_vault_account_jump_items(account_id)
618
+ items = result.get("jump_items", [])
619
+
620
+ if output == OutputFormat.JSON:
621
+ print_json(result)
622
+ else:
623
+ columns = [
624
+ ("ID", "id"),
625
+ ("Type", "type"),
626
+ ]
627
+ print_table(items, columns, title=f"Jump Items for Vault Account {account_id}")
628
+ except httpx.HTTPStatusError as e:
629
+ print_api_error(e, "list vault account jump items")
630
+ raise typer.Exit(1)
631
+ except httpx.RequestError as e:
632
+ print_api_error(e, "list vault account jump items")
633
+ raise typer.Exit(1)
634
+ except Exception as e:
635
+ print_api_error(e, "list vault account jump items")
636
+ raise typer.Exit(1)
637
+
638
+
520
639
  # Account Groups subcommands
521
640
  groups_app = typer.Typer(no_args_is_help=True, help="Vault account groups")
522
641
  app.add_typer(groups_app, name="groups")
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