Rewrite BMS skill from bash to Python
This commit is contained in:
@@ -1,185 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
# bms-templates.sh — Kaseya BMS template lookups (tickets, notes, timelogs)
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
BMS_API_BASE="${BMS_API_BASE:-https://api.bms.kaseya.com}"
|
||||
|
||||
# ─── Helpers ─────────────────────────────────────────────────────────────────
|
||||
|
||||
die() { echo "ERROR: $*" >&2; exit 1; }
|
||||
|
||||
get_token() {
|
||||
bash "${SCRIPT_DIR}/bms-auth.sh" get-token
|
||||
}
|
||||
|
||||
bms_curl() {
|
||||
local method="$1"; shift
|
||||
local path="$1"; shift
|
||||
local token
|
||||
token=$(get_token)
|
||||
curl -sf -X "$method" \
|
||||
"${BMS_API_BASE}${path}" \
|
||||
-H "Authorization: Bearer ${token}" \
|
||||
-H "Accept: application/json" \
|
||||
-H "Content-Type: application/json" \
|
||||
"$@"
|
||||
}
|
||||
|
||||
# ─── Formatters ──────────────────────────────────────────────────────────────
|
||||
|
||||
format_template_list() {
|
||||
jq -r '
|
||||
(.Data // .Items // .) |
|
||||
if type == "array" then .[] else . end |
|
||||
[
|
||||
(.Id // "-"),
|
||||
(.Name // "(unnamed)"),
|
||||
("Q:" + ((.QueueId // "-") | tostring)),
|
||||
("Pri:" + ((.PriorityId // "-") | tostring)),
|
||||
("Type:" + ((.IssueTypeId // .TypeId // "-") | tostring))
|
||||
] | @tsv
|
||||
' | sort -n | column -t -s $'\t'
|
||||
}
|
||||
|
||||
format_simple_lookup() {
|
||||
# Generic: Id + Name for note/timelog templates
|
||||
jq -r '
|
||||
(.Data // .Items // .) |
|
||||
if type == "array" then .[] else . end |
|
||||
"\(.Id // "-")\t\(.Name // .Text // "(unnamed)")"
|
||||
' | sort -n | column -t -s $'\t'
|
||||
}
|
||||
|
||||
# ─── Templates: Tickets ───────────────────────────────────────────────────────
|
||||
|
||||
cmd_templates_tickets_list() {
|
||||
local format="table"
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--format|-f) format="$2"; shift 2 ;;
|
||||
*) die "Unknown option: $1" ;;
|
||||
esac
|
||||
done
|
||||
|
||||
echo "=== Ticket Templates ===" >&2
|
||||
local response
|
||||
response=$(bms_curl GET "/v2/servicedesk/templates/tickets/lookup")
|
||||
|
||||
if [[ "$format" == "json" ]]; then
|
||||
echo "$response" | jq .
|
||||
else
|
||||
echo "$response" | format_template_list
|
||||
fi
|
||||
}
|
||||
|
||||
cmd_templates_tickets_get() {
|
||||
local template_id="${1:-}"
|
||||
[[ -n "$template_id" ]] || die "Usage: bms templates tickets get <templateId>"
|
||||
|
||||
bms_curl GET "/v2/servicedesk/templates/tickets/${template_id}" | jq .
|
||||
}
|
||||
|
||||
# ─── Templates: Notes ────────────────────────────────────────────────────────
|
||||
|
||||
cmd_templates_notes_list() {
|
||||
local format="table"
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--format|-f) format="$2"; shift 2 ;;
|
||||
*) die "Unknown option: $1" ;;
|
||||
esac
|
||||
done
|
||||
|
||||
echo "=== Note Templates ===" >&2
|
||||
local response
|
||||
response=$(bms_curl GET "/v2/servicedesk/templates/notes/lookup")
|
||||
|
||||
if [[ "$format" == "json" ]]; then
|
||||
echo "$response" | jq .
|
||||
else
|
||||
echo "$response" | format_simple_lookup
|
||||
fi
|
||||
}
|
||||
|
||||
# ─── Templates: Timelogs ─────────────────────────────────────────────────────
|
||||
|
||||
cmd_templates_timelogs_list() {
|
||||
local format="table"
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--format|-f) format="$2"; shift 2 ;;
|
||||
*) die "Unknown option: $1" ;;
|
||||
esac
|
||||
done
|
||||
|
||||
echo "=== Timelog Templates ===" >&2
|
||||
local response
|
||||
response=$(bms_curl GET "/v2/servicedesk/templates/timelogs/lookup")
|
||||
|
||||
if [[ "$format" == "json" ]]; then
|
||||
echo "$response" | jq .
|
||||
else
|
||||
echo "$response" | format_simple_lookup
|
||||
fi
|
||||
}
|
||||
|
||||
# ─── Dispatch ────────────────────────────────────────────────────────────────
|
||||
|
||||
usage_templates() {
|
||||
cat >&2 <<'EOF'
|
||||
Usage: bms templates <resource> <subcommand> [options]
|
||||
|
||||
Resources and subcommands:
|
||||
tickets list List all ticket templates
|
||||
tickets get <id> Get full details for a ticket template
|
||||
notes list List all note templates
|
||||
timelogs list List all timelog templates
|
||||
|
||||
Options:
|
||||
--format json Output raw JSON instead of table
|
||||
|
||||
Examples:
|
||||
bms templates tickets list
|
||||
bms templates tickets get 42
|
||||
bms templates notes list
|
||||
bms templates timelogs list
|
||||
EOF
|
||||
exit 1
|
||||
}
|
||||
|
||||
resource="${1:-}"
|
||||
[[ -n "$resource" ]] || usage_templates
|
||||
shift
|
||||
|
||||
case "$resource" in
|
||||
tickets|ticket)
|
||||
subcmd="${1:-list}"
|
||||
[[ $# -gt 0 ]] && shift
|
||||
case "$subcmd" in
|
||||
list) cmd_templates_tickets_list "$@" ;;
|
||||
get) cmd_templates_tickets_get "$@" ;;
|
||||
*) die "Unknown tickets template subcommand: $subcmd (available: list, get)" ;;
|
||||
esac
|
||||
;;
|
||||
notes|note)
|
||||
subcmd="${1:-list}"
|
||||
[[ $# -gt 0 ]] && shift
|
||||
case "$subcmd" in
|
||||
list) cmd_templates_notes_list "$@" ;;
|
||||
*) die "Unknown notes template subcommand: $subcmd (available: list)" ;;
|
||||
esac
|
||||
;;
|
||||
timelogs|timelog)
|
||||
subcmd="${1:-list}"
|
||||
[[ $# -gt 0 ]] && shift
|
||||
case "$subcmd" in
|
||||
list) cmd_templates_timelogs_list "$@" ;;
|
||||
*) die "Unknown timelogs template subcommand: $subcmd (available: list)" ;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
die "Unknown template resource: $resource (available: tickets, notes, timelogs)"
|
||||
;;
|
||||
esac
|
||||
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||
export PYTHONPATH="${REPO_ROOT}/src${PYTHONPATH:+:$PYTHONPATH}"
|
||||
exec python3 -m openclaw_bms templates "$@"
|
||||
|
||||
Reference in New Issue
Block a user