Skip to main content

Escape from Rackspace ticket hell - a minimal CLI for ticket management

Project description

๐Ÿ—ก๏ธ Raxodus

PyPI version Python versions License: MIT Tests

"Neither demon nor machine, but something altogether different" - Ultima III

Raxodus - Escape from Rackspace ticket hell. A minimal CLI for managing Rackspace support tickets, built specifically for automation and n8n workflow integration.

๐ŸŽฏ Why Raxodus?

The Rackspace ticket API is broken in numerous ways (30+ second response times, inconsistent field names, "demo" endpoints in production). This tool works around those issues to give you reliable ticket access.

โœจ Features

  • ๐ŸŽซ Read-Only Ticket Access - List and view Rackspace support tickets
  • ๐Ÿ“Š Multiple Output Formats - JSON, table, or CSV output
  • ๐Ÿš€ Fast & Lightweight - Minimal dependencies, quick responses (when API allows)
  • ๐Ÿ” Secure by Design - No CLI credential flags, environment variables only
  • โฑ๏ธ Debug Mode - Track API performance with timing metadata
  • ๐Ÿ”„ n8n Ready - JSON output perfect for workflow automation
  • ๐Ÿš Shell Completions - Bash, Zsh, and Fish support
  • ๐Ÿ’พ Smart Caching - Work around slow API responses
  • ๐Ÿ›ก๏ธ Type Safe - Pydantic models handle API inconsistencies

๐Ÿ“ฆ Installation

# Quick run without installation (recommended)
uvx raxodus --version

# Install with pip
pip install raxodus

# Install with uv
uv pip install raxodus

๐Ÿš€ Quick Start

1. Set Credentials

# Required environment variables
export RACKSPACE_USERNAME="your-username"
export RACKSPACE_API_KEY="your-api-key"
export RACKSPACE_ACCOUNT="123456"  # Optional default account

โš ๏ธ Security Note: Never pass credentials as command-line arguments. This is by design for security.

2. Test Authentication

# Verify your credentials work
raxodus auth test

3. List Tickets

# List all tickets (table format)
raxodus tickets list --format table

# List open tickets from last 7 days
raxodus tickets list --status open --days 7

# JSON output for automation
raxodus tickets list --format json

# CSV for spreadsheets
raxodus tickets list --format csv > tickets.csv

# With debug timing info
raxodus tickets list --debug --format json

4. Get Specific Ticket

# View single ticket
raxodus tickets get 250625-02866

# As JSON
raxodus tickets get 250625-02866 --format json

๐Ÿ“š Complete Command Reference

Main Commands

raxodus --help                    # Show help
raxodus --version                  # Show version info

Authentication Commands

# Test credentials
raxodus auth test

# Example output:
# โœ“ Authentication successful
# โœ“ Token expires: 2025-01-07 15:30:00

Ticket Commands

# List tickets with ALL options
raxodus tickets list \
    --account 123456 \           # Specific account (overrides env)
    --status open \              # Filter: open, closed, pending
    --days 30 \                  # Tickets from last N days
    --page 1 \                   # Pagination
    --per-page 100 \             # Results per page (max 100)
    --format json \              # Output: json, table, csv
    --debug                      # Include timing metadata

# Get single ticket
raxodus tickets get TICKET-ID \
    --format json \              # Output: json, table
    --debug                      # Include timing metadata

Shell Completions

# Install completions for your shell
raxodus completion install

# Or manually add to your shell config
raxodus completion show >> ~/.bashrc     # Bash
raxodus completion show >> ~/.zshrc      # Zsh

๐Ÿ”ง Configuration

Environment Variables

# Required
RACKSPACE_USERNAME="your-username"       # Your Rackspace username
RACKSPACE_API_KEY="your-api-key"        # Your API key

# Optional
RACKSPACE_ACCOUNT="123456"               # Default account number
RACKSPACE_REGION="us"                    # API region (default: us)
RAXODUS_CACHE_DIR="~/.cache/raxodus"    # Cache directory
RAXODUS_CACHE_TTL="300"                 # Cache TTL in seconds

๐Ÿค– n8n Integration

Execute Command Node

{
  "nodes": [{
    "name": "List Tickets",
    "type": "n8n-nodes-base.executeCommand",
    "parameters": {
      "command": "raxodus tickets list --format json --debug",
      "env": {
        "RACKSPACE_USERNAME": "={{ $credentials.rackspace.username }}",
        "RACKSPACE_API_KEY": "={{ $credentials.rackspace.apiKey }}",
        "RACKSPACE_ACCOUNT": "={{ $credentials.rackspace.account }}"
      }
    }
  }]
}

Process JSON Output

// Code node to process tickets
const output = JSON.parse($input.item.json.stdout);
const openTickets = output.tickets.filter(t => t.status === 'open');

// Check performance
if (output.elapsed_seconds > 30) {
  console.warn(`Slow API response: ${output.elapsed_seconds}s`);
}

return openTickets;

Complete n8n Workflow Example

{
  "name": "Monitor Rackspace Tickets",
  "nodes": [
    {
      "name": "Every 15 minutes",
      "type": "n8n-nodes-base.scheduleTrigger",
      "parameters": {
        "rule": {
          "interval": [{"field": "minutes", "value": 15}]
        }
      }
    },
    {
      "name": "Get Open Tickets",
      "type": "n8n-nodes-base.executeCommand",
      "parameters": {
        "command": "uvx raxodus tickets list --status open --format json",
        "env": {
          "RACKSPACE_USERNAME": "={{ $credentials.rackspace.username }}",
          "RACKSPACE_API_KEY": "={{ $credentials.rackspace.apiKey }}"
        }
      }
    },
    {
      "name": "Parse and Filter",
      "type": "n8n-nodes-base.code",
      "parameters": {
        "code": "const data = JSON.parse($input.item.json.stdout);\nreturn data.tickets.filter(t => t.severity === 'urgent');"
      }
    },
    {
      "name": "Send Alert",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "channel": "#alerts",
        "text": "Urgent ticket: {{ $json.subject }}"
      }
    }
  ]
}

๐Ÿ“Š Output Format Examples

JSON Format

{
  "tickets": [
    {
      "ticketId": "250625-02866",
      "subject": "Server connectivity issue",
      "status": "open",
      "severity": "normal",
      "created": "2025-06-25T14:30:00Z",
      "modified": "2025-06-26T09:15:00Z"
    }
  ],
  "elapsed_seconds": 31.5,
  "from_cache": false
}

Table Format

โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“
โ”ƒ Ticket ID    โ”ƒ Subject                 โ”ƒ Statusโ”ƒ Severity โ”ƒ Modified   โ”ƒ
โ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ
โ”‚ 250625-02866 โ”‚ Server connectivity...  โ”‚ open  โ”‚ normal   โ”‚ 2025-06-26 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

CSV Format

ticketId,subject,status,severity,created,modified
250625-02866,Server connectivity issue,open,normal,2025-06-25T14:30:00Z,2025-06-26T09:15:00Z

โš ๏ธ Known Issues & Workarounds

Rackspace API Problems

  1. 30+ Second Response Times - Use --debug to track performance
  2. Invalid Dates in Responses - Pydantic models handle gracefully
  3. Inconsistent Field Names - Abstracted in our models
  4. No Write Access - API claims to support updates but returns 404

Workarounds

# Use debug flag to track slow responses
raxodus tickets list --debug --format json

# Cache results to avoid repeated slow calls
export RAXODUS_CACHE_TTL=600  # 10 minute cache

# Use pagination for large result sets
raxodus tickets list --page 1 --per-page 50

๐Ÿ› ๏ธ Development

# Clone repository
git clone https://github.com/bdmorin/raxodus
cd raxodus

# Install for development
uv pip install -e ".[dev]"

# Run tests
pytest

# Check linting
ruff check src/

# Build package
uv build

๐ŸŽฎ Why "Raxodus"?

Like the villain Exodus from Ultima III - neither demon nor machine, but something altogether different - Rackspace tickets exist in a frustrating limbo between automated systems and human support. This tool helps you escape that hell.

Each release is named after an Ultima III character:

  • v0.1.x - "Mondain" (The dark wizard)
  • v0.2.x - "Minax" (The enchantress)
  • v0.3.x - "Exodus" (Neither demon nor machine)

๐Ÿ“ License

MIT - See LICENSE file

๐Ÿค Contributing

Pull requests welcome! Please ensure:

  • All tests pass
  • Code follows existing style
  • New features include tests
  • API workarounds are documented

โš–๏ธ Disclaimer

This is an unofficial tool and is not affiliated with or supported by Rackspace Technology. Use at your own risk.

๐Ÿ› Issues & Support

๐Ÿ“ˆ Project Status

Current Version: v0.1.2 (Mondain)

The tool is functional but limited by Rackspace API issues. We maintain 0.x versioning to indicate these limitations. Version 1.0 will only be released when Rackspace fixes their API.

See CLAUDE.md for v1.0 release criteria.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

raxodus-0.1.3.tar.gz (44.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

raxodus-0.1.3-py3-none-any.whl (16.0 kB view details)

Uploaded Python 3

File details

Details for the file raxodus-0.1.3.tar.gz.

File metadata

  • Download URL: raxodus-0.1.3.tar.gz
  • Upload date:
  • Size: 44.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.11

File hashes

Hashes for raxodus-0.1.3.tar.gz
Algorithm Hash digest
SHA256 ccc124344c05cea470ba5bdd6e1836714ea90e662545a2d7720dbc12024f4a2f
MD5 f2180fa5a53227bb9c8917430f1acd41
BLAKE2b-256 d115e293c5afc1b5f330e4c35d2f10e1d3ee08187c9c08bf9826ebfc8288f6d3

See more details on using hashes here.

File details

Details for the file raxodus-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: raxodus-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 16.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.11

File hashes

Hashes for raxodus-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 5148238cdf9b18c5c1b6e232b940a979134c533b06f7baa4b15bc00ed6ea7c71
MD5 c17e479ca45964388cd8219d81250efc
BLAKE2b-256 7055b48c5284e8a521de2fdb4ed9302bd97620223e09276a8c4f3b1951e62a73

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page