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.
- {bt_cli-0.4.33 → bt_cli-0.4.34}/CLAUDE.md +1 -1
- {bt_cli-0.4.33 → bt_cli-0.4.34}/PKG-INFO +1 -1
- {bt_cli-0.4.33 → bt_cli-0.4.34}/pyproject.toml +1 -1
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/__init__.py +1 -1
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/data/CLAUDE.md +1 -1
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/client/base.py +41 -14
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/rbp_hostgrps.py +6 -2
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/rbp_roles.py +10 -2
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/rbp_usergrps.py +6 -2
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/epml/test_client.py +7 -4
- {bt_cli-0.4.33/src/bt_cli/data → bt_cli-0.4.34/.claude}/skills/bt/SKILL.md +0 -0
- {bt_cli-0.4.33/src/bt_cli/data → bt_cli-0.4.34/.claude}/skills/entitle/SKILL.md +0 -0
- {bt_cli-0.4.33/src/bt_cli/data → bt_cli-0.4.34/.claude}/skills/epml/SKILL.md +0 -0
- {bt_cli-0.4.33/src/bt_cli/data → bt_cli-0.4.34/.claude}/skills/epmw/SKILL.md +0 -0
- {bt_cli-0.4.33/src/bt_cli/data → bt_cli-0.4.34/.claude}/skills/pra/SKILL.md +0 -0
- {bt_cli-0.4.33/src/bt_cli/data → bt_cli-0.4.34/.claude}/skills/pws/SKILL.md +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/.env.example +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/.github/workflows/ci.yml +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/.github/workflows/release.yml +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/.gitignore +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/README.md +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/assets/cli-help.png +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/assets/cli-output.png +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/bt-cli.spec +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/bt_entry.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/epml-implementation-plan.md +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/scripts/bt_entry.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/scripts/sync-package-data.sh +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/cli.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/commands/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/commands/configure.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/commands/learn.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/commands/quick.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/core/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/core/auth.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/core/client.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/core/config.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/core/config_file.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/core/csv_utils.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/core/errors.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/core/output.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/core/prompts.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/core/rest_debug.py +0 -0
- {bt_cli-0.4.33/tests/pws → bt_cli-0.4.34/src/bt_cli/data}/__init__.py +0 -0
- {bt_cli-0.4.33/.claude → bt_cli-0.4.34/src/bt_cli/data}/skills/bt/SKILL.md +0 -0
- {bt_cli-0.4.33/.claude → bt_cli-0.4.34/src/bt_cli/data}/skills/entitle/SKILL.md +0 -0
- {bt_cli-0.4.33/.claude → bt_cli-0.4.34/src/bt_cli/data}/skills/epml/SKILL.md +0 -0
- {bt_cli-0.4.33/.claude → bt_cli-0.4.34/src/bt_cli/data}/skills/epmw/SKILL.md +0 -0
- {bt_cli-0.4.33/.claude → bt_cli-0.4.34/src/bt_cli/data}/skills/pra/SKILL.md +0 -0
- {bt_cli-0.4.33/.claude → bt_cli-0.4.34/src/bt_cli/data}/skills/pws/SKILL.md +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/client/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/client/base.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/accounts.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/applications.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/auth.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/bundles.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/integrations.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/permissions.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/policies.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/resources.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/roles.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/users.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/commands/workflows.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/models/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/models/bundle.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/models/common.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/models/integration.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/models/permission.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/models/policy.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/models/resource.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/models/role.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/models/user.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/entitle/models/workflow.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/client/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/audit.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/auth.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/client_pkg.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/external_apis.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/hosts.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/iolog.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/license.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/quick.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/rbp_cmdgrps.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/rbp_entitlement.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/rbp_policy.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/rbp_tests.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/rbp_tmdategrps.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/rbp_tx.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/settings.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/siems.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/commands/users.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epml/models/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/client/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/client/base.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/audits.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/auth.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/computers.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/events.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/groups.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/policies.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/quick.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/requests.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/roles.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/tasks.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/commands/users.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/epmw/models/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/client/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/client/base.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/auth.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/import_export.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/jump_clients.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/jump_groups.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/jump_items.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/jumpoints.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/policies.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/quick.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/teams.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/users.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/commands/vault.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/models/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/models/common.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/models/jump_client.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/models/jump_group.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/models/jump_item.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/models/jumpoint.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/models/team.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/models/user.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pra/models/vault.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/client/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/client/base.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/client/beyondinsight.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/client/passwordsafe.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/accounts.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/assets.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/attributes.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/auth.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/clouds.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/config.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/credentials.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/databases.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/directories.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/functional.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/import_export.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/platforms.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/quick.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/search.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/secrets.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/systems.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/users.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/commands/workgroups.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/config.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/models/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/models/account.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/models/asset.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/models/common.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/src/bt_cli/pws/models/system.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/conftest.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/core/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/core/test_auth.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/core/test_config.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/core/test_errors.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/core/test_rest_debug.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/entitle/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/entitle/test_client.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/entitle/test_commands.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/entitle-smoke-test.sh +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/epml/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/epml/test_commands.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/epmw/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/epmw/test_client.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/epmw/test_commands.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/epmw-quick-test-plan.md +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/fixtures/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/fixtures/responses.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/integration/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/integration/conftest.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/integration/helpers.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/integration/test_entitle_integration.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/integration/test_epmw_integration.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/integration/test_epmw_lifecycle.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/integration/test_pra_integration.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/integration/test_pra_lifecycle.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/integration/test_pws_integration.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/integration/test_pws_lifecycle.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/pra/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/pra/test_client.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/pra/test_commands.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/pra-smoke-test.sh +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/pra-test-plan.md +0 -0
- {bt_cli-0.4.33/src/bt_cli/data → bt_cli-0.4.34/tests/pws}/__init__.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/pws/test_client.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/pws/test_commands.py +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/pws-quick-test-plan.md +0 -0
- {bt_cli-0.4.33 → bt_cli-0.4.34}/tests/pws-smoke-test.sh +0 -0
|
@@ -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) ->
|
|
316
|
+
def delete_cmdgrps(self, ids: List[int], host_id: Optional[int] = None) -> None:
|
|
317
317
|
h = self.host(host_id)
|
|
318
|
-
|
|
319
|
-
|
|
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
|
-
|
|
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) ->
|
|
346
|
+
def delete_hostgrps(self, ids: List[int], host_id: Optional[int] = None) -> None:
|
|
344
347
|
h = self.host(host_id)
|
|
345
|
-
|
|
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
|
-
|
|
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) ->
|
|
376
|
+
def delete_usergrps(self, ids: List[int], host_id: Optional[int] = None) -> None:
|
|
370
377
|
h = self.host(host_id)
|
|
371
|
-
|
|
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) ->
|
|
403
|
+
def delete_tmdategrps(self, ids: List[int], host_id: Optional[int] = None) -> None:
|
|
396
404
|
h = self.host(host_id)
|
|
397
|
-
|
|
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
|
-
|
|
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) ->
|
|
421
|
+
def delete_roles(self, ids: List[int], host_id: Optional[int] = None) -> None:
|
|
410
422
|
h = self.host(host_id)
|
|
411
|
-
|
|
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
|
|
150
|
-
"""
|
|
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(
|
|
153
|
+
).mock(return_value=httpx.Response(200))
|
|
154
154
|
|
|
155
155
|
c = EPMLClient(epml_config)
|
|
156
156
|
c.delete_cmdgrps([1, 2, 3])
|
|
157
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|