bt-cli 0.4.33__tar.gz → 0.4.34__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 (205) hide show
  1. {bt_cli-0.4.33 → bt_cli-0.4.34}/CLAUDE.md +1 -1
  2. {bt_cli-0.4.33 → bt_cli-0.4.34}/PKG-INFO +1 -1
  3. {bt_cli-0.4.33 → bt_cli-0.4.34}/pyproject.toml +1 -1
  4. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/__init__.py +1 -1
  5. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/data/CLAUDE.md +1 -1
  6. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/client/base.py +41 -14
  7. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/rbp_hostgrps.py +6 -2
  8. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/rbp_roles.py +10 -2
  9. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/rbp_usergrps.py +6 -2
  10. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/epml/test_client.py +7 -4
  11. {bt_cli-0.4.33/src/bt_cli/data → bt_cli-0.4.34/.claude}/skills/bt/SKILL.md +0 -0
  12. {bt_cli-0.4.33/src/bt_cli/data → bt_cli-0.4.34/.claude}/skills/entitle/SKILL.md +0 -0
  13. {bt_cli-0.4.33/src/bt_cli/data → bt_cli-0.4.34/.claude}/skills/epml/SKILL.md +0 -0
  14. {bt_cli-0.4.33/src/bt_cli/data → bt_cli-0.4.34/.claude}/skills/epmw/SKILL.md +0 -0
  15. {bt_cli-0.4.33/src/bt_cli/data → bt_cli-0.4.34/.claude}/skills/pra/SKILL.md +0 -0
  16. {bt_cli-0.4.33/src/bt_cli/data → bt_cli-0.4.34/.claude}/skills/pws/SKILL.md +0 -0
  17. {bt_cli-0.4.33 → bt_cli-0.4.34}/.env.example +0 -0
  18. {bt_cli-0.4.33 → bt_cli-0.4.34}/.github/workflows/ci.yml +0 -0
  19. {bt_cli-0.4.33 → bt_cli-0.4.34}/.github/workflows/release.yml +0 -0
  20. {bt_cli-0.4.33 → bt_cli-0.4.34}/.gitignore +0 -0
  21. {bt_cli-0.4.33 → bt_cli-0.4.34}/README.md +0 -0
  22. {bt_cli-0.4.33 → bt_cli-0.4.34}/assets/cli-help.png +0 -0
  23. {bt_cli-0.4.33 → bt_cli-0.4.34}/assets/cli-output.png +0 -0
  24. {bt_cli-0.4.33 → bt_cli-0.4.34}/bt-cli.spec +0 -0
  25. {bt_cli-0.4.33 → bt_cli-0.4.34}/bt_entry.py +0 -0
  26. {bt_cli-0.4.33 → bt_cli-0.4.34}/epml-implementation-plan.md +0 -0
  27. {bt_cli-0.4.33 → bt_cli-0.4.34}/scripts/bt_entry.py +0 -0
  28. {bt_cli-0.4.33 → bt_cli-0.4.34}/scripts/sync-package-data.sh +0 -0
  29. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/cli.py +0 -0
  30. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/commands/__init__.py +0 -0
  31. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/commands/configure.py +0 -0
  32. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/commands/learn.py +0 -0
  33. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/commands/quick.py +0 -0
  34. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/core/__init__.py +0 -0
  35. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/core/auth.py +0 -0
  36. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/core/client.py +0 -0
  37. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/core/config.py +0 -0
  38. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/core/config_file.py +0 -0
  39. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/core/csv_utils.py +0 -0
  40. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/core/errors.py +0 -0
  41. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/core/output.py +0 -0
  42. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/core/prompts.py +0 -0
  43. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/core/rest_debug.py +0 -0
  44. {bt_cli-0.4.33/tests/pws → bt_cli-0.4.34/src/bt_cli/data}/__init__.py +0 -0
  45. {bt_cli-0.4.33/.claude → bt_cli-0.4.34/src/bt_cli/data}/skills/bt/SKILL.md +0 -0
  46. {bt_cli-0.4.33/.claude → bt_cli-0.4.34/src/bt_cli/data}/skills/entitle/SKILL.md +0 -0
  47. {bt_cli-0.4.33/.claude → bt_cli-0.4.34/src/bt_cli/data}/skills/epml/SKILL.md +0 -0
  48. {bt_cli-0.4.33/.claude → bt_cli-0.4.34/src/bt_cli/data}/skills/epmw/SKILL.md +0 -0
  49. {bt_cli-0.4.33/.claude → bt_cli-0.4.34/src/bt_cli/data}/skills/pra/SKILL.md +0 -0
  50. {bt_cli-0.4.33/.claude → bt_cli-0.4.34/src/bt_cli/data}/skills/pws/SKILL.md +0 -0
  51. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/__init__.py +0 -0
  52. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/client/__init__.py +0 -0
  53. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/client/base.py +0 -0
  54. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/__init__.py +0 -0
  55. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/accounts.py +0 -0
  56. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/applications.py +0 -0
  57. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/auth.py +0 -0
  58. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/bundles.py +0 -0
  59. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/integrations.py +0 -0
  60. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/permissions.py +0 -0
  61. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/policies.py +0 -0
  62. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/resources.py +0 -0
  63. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/roles.py +0 -0
  64. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/users.py +0 -0
  65. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/workflows.py +0 -0
  66. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/models/__init__.py +0 -0
  67. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/models/bundle.py +0 -0
  68. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/models/common.py +0 -0
  69. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/models/integration.py +0 -0
  70. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/models/permission.py +0 -0
  71. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/models/policy.py +0 -0
  72. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/models/resource.py +0 -0
  73. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/models/role.py +0 -0
  74. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/models/user.py +0 -0
  75. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/models/workflow.py +0 -0
  76. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/__init__.py +0 -0
  77. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/client/__init__.py +0 -0
  78. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/__init__.py +0 -0
  79. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/audit.py +0 -0
  80. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/auth.py +0 -0
  81. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/client_pkg.py +0 -0
  82. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/external_apis.py +0 -0
  83. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/hosts.py +0 -0
  84. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/iolog.py +0 -0
  85. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/license.py +0 -0
  86. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/quick.py +0 -0
  87. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/rbp_cmdgrps.py +0 -0
  88. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/rbp_entitlement.py +0 -0
  89. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/rbp_policy.py +0 -0
  90. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/rbp_tests.py +0 -0
  91. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/rbp_tmdategrps.py +0 -0
  92. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/rbp_tx.py +0 -0
  93. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/settings.py +0 -0
  94. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/siems.py +0 -0
  95. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/users.py +0 -0
  96. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/models/__init__.py +0 -0
  97. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/__init__.py +0 -0
  98. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/client/__init__.py +0 -0
  99. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/client/base.py +0 -0
  100. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/__init__.py +0 -0
  101. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/audits.py +0 -0
  102. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/auth.py +0 -0
  103. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/computers.py +0 -0
  104. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/events.py +0 -0
  105. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/groups.py +0 -0
  106. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/policies.py +0 -0
  107. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/quick.py +0 -0
  108. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/requests.py +0 -0
  109. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/roles.py +0 -0
  110. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/tasks.py +0 -0
  111. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/users.py +0 -0
  112. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/models/__init__.py +0 -0
  113. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/__init__.py +0 -0
  114. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/client/__init__.py +0 -0
  115. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/client/base.py +0 -0
  116. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/__init__.py +0 -0
  117. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/auth.py +0 -0
  118. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/import_export.py +0 -0
  119. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/jump_clients.py +0 -0
  120. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/jump_groups.py +0 -0
  121. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/jump_items.py +0 -0
  122. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/jumpoints.py +0 -0
  123. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/policies.py +0 -0
  124. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/quick.py +0 -0
  125. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/teams.py +0 -0
  126. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/users.py +0 -0
  127. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/vault.py +0 -0
  128. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/models/__init__.py +0 -0
  129. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/models/common.py +0 -0
  130. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/models/jump_client.py +0 -0
  131. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/models/jump_group.py +0 -0
  132. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/models/jump_item.py +0 -0
  133. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/models/jumpoint.py +0 -0
  134. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/models/team.py +0 -0
  135. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/models/user.py +0 -0
  136. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/models/vault.py +0 -0
  137. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/__init__.py +0 -0
  138. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/client/__init__.py +0 -0
  139. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/client/base.py +0 -0
  140. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/client/beyondinsight.py +0 -0
  141. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/client/passwordsafe.py +0 -0
  142. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/__init__.py +0 -0
  143. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/accounts.py +0 -0
  144. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/assets.py +0 -0
  145. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/attributes.py +0 -0
  146. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/auth.py +0 -0
  147. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/clouds.py +0 -0
  148. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/config.py +0 -0
  149. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/credentials.py +0 -0
  150. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/databases.py +0 -0
  151. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/directories.py +0 -0
  152. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/functional.py +0 -0
  153. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/import_export.py +0 -0
  154. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/platforms.py +0 -0
  155. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/quick.py +0 -0
  156. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/search.py +0 -0
  157. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/secrets.py +0 -0
  158. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/systems.py +0 -0
  159. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/users.py +0 -0
  160. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/workgroups.py +0 -0
  161. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/config.py +0 -0
  162. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/models/__init__.py +0 -0
  163. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/models/account.py +0 -0
  164. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/models/asset.py +0 -0
  165. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/models/common.py +0 -0
  166. {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/models/system.py +0 -0
  167. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/__init__.py +0 -0
  168. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/conftest.py +0 -0
  169. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/core/__init__.py +0 -0
  170. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/core/test_auth.py +0 -0
  171. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/core/test_config.py +0 -0
  172. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/core/test_errors.py +0 -0
  173. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/core/test_rest_debug.py +0 -0
  174. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/entitle/__init__.py +0 -0
  175. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/entitle/test_client.py +0 -0
  176. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/entitle/test_commands.py +0 -0
  177. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/entitle-smoke-test.sh +0 -0
  178. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/epml/__init__.py +0 -0
  179. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/epml/test_commands.py +0 -0
  180. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/epmw/__init__.py +0 -0
  181. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/epmw/test_client.py +0 -0
  182. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/epmw/test_commands.py +0 -0
  183. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/epmw-quick-test-plan.md +0 -0
  184. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/fixtures/__init__.py +0 -0
  185. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/fixtures/responses.py +0 -0
  186. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/integration/__init__.py +0 -0
  187. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/integration/conftest.py +0 -0
  188. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/integration/helpers.py +0 -0
  189. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/integration/test_entitle_integration.py +0 -0
  190. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/integration/test_epmw_integration.py +0 -0
  191. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/integration/test_epmw_lifecycle.py +0 -0
  192. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/integration/test_pra_integration.py +0 -0
  193. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/integration/test_pra_lifecycle.py +0 -0
  194. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/integration/test_pws_integration.py +0 -0
  195. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/integration/test_pws_lifecycle.py +0 -0
  196. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/pra/__init__.py +0 -0
  197. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/pra/test_client.py +0 -0
  198. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/pra/test_commands.py +0 -0
  199. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/pra-smoke-test.sh +0 -0
  200. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/pra-test-plan.md +0 -0
  201. {bt_cli-0.4.33/src/bt_cli/data → bt_cli-0.4.34/tests/pws}/__init__.py +0 -0
  202. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/pws/test_client.py +0 -0
  203. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/pws/test_commands.py +0 -0
  204. {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/pws-quick-test-plan.md +0 -0
  205. {bt_cli-0.4.33 → bt_cli-0.4.34}/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, EPM Windows, and EPM Linux. **Version: 0.4.33**
3
+ BeyondTrust Platform CLI for Password Safe, Entitle, PRA, EPM Windows, and EPM Linux. **Version: 0.4.34**
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.33
3
+ Version: 0.4.34
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.33"
7
+ version = "0.4.34"
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.33"
3
+ __version__ = "0.4.34"
@@ -1,6 +1,6 @@
1
1
  # BT-CLI
2
2
 
3
- BeyondTrust Platform CLI for Password Safe, Entitle, PRA, EPM Windows, and EPM Linux. **Version: 0.4.33**
3
+ BeyondTrust Platform CLI for Password Safe, Entitle, PRA, EPM Windows, and EPM Linux. **Version: 0.4.34**
4
4
 
5
5
  ## Setup
6
6
 
@@ -313,10 +313,10 @@ class EPMLClient:
313
313
  h = self.host(host_id)
314
314
  return self.post(f"/api/pbul/{h}/rbp/cmdgrps", json=data)
315
315
 
316
- def delete_cmdgrps(self, ids: List[int], host_id: Optional[int] = None) -> Any:
316
+ def delete_cmdgrps(self, ids: List[int], host_id: Optional[int] = None) -> None:
317
317
  h = self.host(host_id)
318
- # /api/pbul/{hostid}/rbp/cmdgrps DELETE deletes a list of IDs in body.
319
- return self._delete_with_body(f"/api/pbul/{h}/rbp/cmdgrps", ids)
318
+ for cid in ids:
319
+ self._delete_with_query(f"/api/pbul/{h}/rbp/cmdgrps", {"id": cid})
320
320
 
321
321
  def list_cmdgrp_commands(self, cmdgrp_id: int, host_id: Optional[int] = None) -> Any:
322
322
  h = self.host(host_id)
@@ -338,11 +338,15 @@ class EPMLClient:
338
338
 
339
339
  def create_hostgrp(self, data: Dict[str, Any], host_id: Optional[int] = None) -> Any:
340
340
  h = self.host(host_id)
341
- return self.post(f"/api/pbul/{h}/rbp/hostgrps", json=data)
341
+ # Server requires `type` ∈ {"I","E"}. Default to Internal if omitted.
342
+ body = dict(data)
343
+ body.setdefault("type", "I")
344
+ return self.post(f"/api/pbul/{h}/rbp/hostgrps", json=body)
342
345
 
343
- def delete_hostgrps(self, ids: List[int], host_id: Optional[int] = None) -> Any:
346
+ def delete_hostgrps(self, ids: List[int], host_id: Optional[int] = None) -> None:
344
347
  h = self.host(host_id)
345
- return self._delete_with_body(f"/api/pbul/{h}/rbp/hostgrps", ids)
348
+ for hid in ids:
349
+ self._delete_with_query(f"/api/pbul/{h}/rbp/hostgrps", {"id": hid})
346
350
 
347
351
  def list_hostgrp_hosts(self, hostgrp_id: int, host_id: Optional[int] = None) -> Any:
348
352
  h = self.host(host_id)
@@ -364,11 +368,15 @@ class EPMLClient:
364
368
 
365
369
  def create_usergrp(self, data: Dict[str, Any], host_id: Optional[int] = None) -> Any:
366
370
  h = self.host(host_id)
367
- return self.post(f"/api/pbul/{h}/rbp/usergrps", json=data)
371
+ # Server requires `type` ∈ {"I","E"}. Default to Internal if omitted.
372
+ body = dict(data)
373
+ body.setdefault("type", "I")
374
+ return self.post(f"/api/pbul/{h}/rbp/usergrps", json=body)
368
375
 
369
- def delete_usergrps(self, ids: List[int], host_id: Optional[int] = None) -> Any:
376
+ def delete_usergrps(self, ids: List[int], host_id: Optional[int] = None) -> None:
370
377
  h = self.host(host_id)
371
- return self._delete_with_body(f"/api/pbul/{h}/rbp/usergrps", ids)
378
+ for uid in ids:
379
+ self._delete_with_query(f"/api/pbul/{h}/rbp/usergrps", {"id": uid})
372
380
 
373
381
  def list_usergrp_users(self, usergrp_id: int, host_id: Optional[int] = None) -> Any:
374
382
  h = self.host(host_id)
@@ -392,9 +400,10 @@ class EPMLClient:
392
400
  h = self.host(host_id)
393
401
  return self.post(f"/api/pbul/{h}/rbp/tmdategrps", json=data)
394
402
 
395
- def delete_tmdategrps(self, ids: List[int], host_id: Optional[int] = None) -> Any:
403
+ def delete_tmdategrps(self, ids: List[int], host_id: Optional[int] = None) -> None:
396
404
  h = self.host(host_id)
397
- return self._delete_with_body(f"/api/pbul/{h}/rbp/tmdategrps", ids)
405
+ for tid in ids:
406
+ self._delete_with_query(f"/api/pbul/{h}/rbp/tmdategrps", {"id": tid})
398
407
 
399
408
  # ----- RBP: roles ---------------------------------------------------
400
409
 
@@ -404,11 +413,15 @@ class EPMLClient:
404
413
 
405
414
  def create_role(self, data: Dict[str, Any], host_id: Optional[int] = None) -> Any:
406
415
  h = self.host(host_id)
407
- return self.post(f"/api/pbul/{h}/rbp/roles", json=data)
416
+ # Server requires `action` ∈ {"A","R"} (Allow / Reject). Default Allow.
417
+ body = dict(data)
418
+ body.setdefault("action", "A")
419
+ return self.post(f"/api/pbul/{h}/rbp/roles", json=body)
408
420
 
409
- def delete_roles(self, ids: List[int], host_id: Optional[int] = None) -> Any:
421
+ def delete_roles(self, ids: List[int], host_id: Optional[int] = None) -> None:
410
422
  h = self.host(host_id)
411
- return self._delete_with_body(f"/api/pbul/{h}/rbp/roles", ids)
423
+ for rid in ids:
424
+ self._delete_with_query(f"/api/pbul/{h}/rbp/roles", {"id": rid})
412
425
 
413
426
  def duplicate_role(self, role_id: int, host_id: Optional[int] = None) -> Any:
414
427
  h = self.host(host_id)
@@ -569,6 +582,20 @@ class EPMLClient:
569
582
  except ValueError:
570
583
  return response.text
571
584
 
585
+ def _delete_with_query(self, spec_path: str, params: Dict[str, Any]) -> None:
586
+ """DELETE with query parameters (no body).
587
+
588
+ RBP collection deletes (`/pbul/{hostid}/rbp/{entity}`) take `id` as a
589
+ query param, not a JSON body. Repeated `?id=A&id=B` is accepted by the
590
+ server but only the first value is honored — callers should loop.
591
+ """
592
+ response = self._client.delete(
593
+ self._build_url(spec_path),
594
+ headers=self._headers(),
595
+ params=params,
596
+ )
597
+ response.raise_for_status()
598
+
572
599
  # ----- iologs --------------------------------------------------------
573
600
 
574
601
  def list_iologs(
@@ -45,13 +45,17 @@ def list_hostgrps(
45
45
  def create_hostgrp(
46
46
  name: str = typer.Option(..., "--name", "-n"),
47
47
  description: str = typer.Option("", "--description", "-d"),
48
+ type_: str = typer.Option("I", "--type", "-t", help="Group type: I=Internal, E=External"),
48
49
  host: Optional[int] = _host_opt(),
49
50
  ):
50
- """Create a host group."""
51
+ """Create a host group. API requires `type` ∈ {I,E}; defaults to Internal."""
51
52
  from bt_cli.epml.client import get_client
53
+ if type_ not in ("I", "E"):
54
+ typer.echo(f"--type must be 'I' or 'E', got {type_!r}", err=True)
55
+ raise typer.Exit(2)
52
56
  try:
53
57
  with get_client() as c:
54
- result = c.create_hostgrp({"name": name, "description": description}, host_id=host)
58
+ result = c.create_hostgrp({"name": name, "description": description, "type": type_}, host_id=host)
55
59
  print_json(result)
56
60
  except httpx.HTTPStatusError as e:
57
61
  print_api_error(e, "create hostgrp"); raise typer.Exit(1)
@@ -45,13 +45,21 @@ def list_roles(
45
45
  def create_role(
46
46
  name: str = typer.Option(..., "--name", "-n"),
47
47
  description: str = typer.Option("", "--description", "-d"),
48
+ action: str = typer.Option("A", "--action", "-a", help="Role verdict: A=Allow, R=Reject"),
48
49
  host: Optional[int] = _host_opt(),
49
50
  ):
50
- """Create a role."""
51
+ """Create a role.
52
+
53
+ The API requires `action` to be exactly `A` (Allow) or `R` (Reject) —
54
+ not 'Allow'/'Reject'. Defaults to A.
55
+ """
51
56
  from bt_cli.epml.client import get_client
57
+ if action not in ("A", "R"):
58
+ typer.echo(f"--action must be 'A' or 'R', got {action!r}", err=True)
59
+ raise typer.Exit(2)
52
60
  try:
53
61
  with get_client() as c:
54
- result = c.create_role({"name": name, "description": description}, host_id=host)
62
+ result = c.create_role({"name": name, "description": description, "action": action}, host_id=host)
55
63
  print_json(result)
56
64
  except httpx.HTTPStatusError as e:
57
65
  print_api_error(e, "create role"); raise typer.Exit(1)
@@ -45,13 +45,17 @@ def list_usergrps(
45
45
  def create_usergrp(
46
46
  name: str = typer.Option(..., "--name", "-n"),
47
47
  description: str = typer.Option("", "--description", "-d"),
48
+ type_: str = typer.Option("I", "--type", "-t", help="Group type: I=Internal, E=External"),
48
49
  host: Optional[int] = _host_opt(),
49
50
  ):
50
- """Create a user group."""
51
+ """Create a user group. API requires `type` ∈ {I,E}; defaults to Internal."""
51
52
  from bt_cli.epml.client import get_client
53
+ if type_ not in ("I", "E"):
54
+ typer.echo(f"--type must be 'I' or 'E', got {type_!r}", err=True)
55
+ raise typer.Exit(2)
52
56
  try:
53
57
  with get_client() as c:
54
- result = c.create_usergrp({"name": name, "description": description}, host_id=host)
58
+ result = c.create_usergrp({"name": name, "description": description, "type": type_}, host_id=host)
55
59
  print_json(result)
56
60
  except httpx.HTTPStatusError as e:
57
61
  print_api_error(e, "create usergrp"); raise typer.Exit(1)
@@ -146,15 +146,18 @@ class TestHTTPVerbs:
146
146
  assert c.delete_testsuite(1) is None
147
147
 
148
148
  @respx.mock
149
- def test_delete_with_body(self, epml_config):
150
- """DELETE with a JSON body for batch deletes."""
149
+ def test_delete_via_query_param_one_per_id(self, epml_config):
150
+ """RBP collection deletes use ?id=N query string, single ID per call."""
151
151
  route = respx.delete(
152
152
  "https://mock-gateway.example.com/site/SITE/epm/linux/pbul/100/rbp/cmdgrps"
153
- ).mock(return_value=httpx.Response(204))
153
+ ).mock(return_value=httpx.Response(200))
154
154
 
155
155
  c = EPMLClient(epml_config)
156
156
  c.delete_cmdgrps([1, 2, 3])
157
- assert route.calls.last.request.read() == b"[1,2,3]"
157
+ # Three separate requests, one per id
158
+ assert route.call_count == 3
159
+ sent_ids = sorted(call.request.url.params["id"] for call in route.calls)
160
+ assert sent_ids == ["1", "2", "3"]
158
161
 
159
162
 
160
163
  # ---------------------------------------------------------------------------
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