Escape from Rackspace ticket hell - a minimal CLI for ticket management
Project description
๐ก๏ธ Raxodus
"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
- 30+ Second Response Times - Use
--debugto track performance - Invalid Dates in Responses - Pydantic models handle gracefully
- Inconsistent Field Names - Abstracted in our models
- 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
- Bug Reports: GitHub Issues
- Feature Requests: GitHub Issues
- Security Issues: Please email privately
๐ 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ccc124344c05cea470ba5bdd6e1836714ea90e662545a2d7720dbc12024f4a2f
|
|
| MD5 |
f2180fa5a53227bb9c8917430f1acd41
|
|
| BLAKE2b-256 |
d115e293c5afc1b5f330e4c35d2f10e1d3ee08187c9c08bf9826ebfc8288f6d3
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5148238cdf9b18c5c1b6e232b940a979134c533b06f7baa4b15bc00ed6ea7c71
|
|
| MD5 |
c17e479ca45964388cd8219d81250efc
|
|
| BLAKE2b-256 |
7055b48c5284e8a521de2fdb4ed9302bd97620223e09276a8c4f3b1951e62a73
|