Version 0.3.0 - Unified Remote Execution Interface
Pabawi is a general-purpose remote execution platform that integrates multiple infrastructure management tools including Puppet Bolt and PuppetDB. It provides a unified web interface for managing infrastructure, executing commands, viewing system information, and tracking operations across your entire environment.
- Multi-Source Inventory: View and manage nodes from Bolt inventory and PuppetDB
- Command Execution: Run ad-hoc commands on remote nodes with whitelist security
- Task Execution: Execute Bolt tasks with parameter support
- Puppet Integration: Trigger Puppet agent runs with full configuration control
- Package Management: Install and manage packages across your infrastructure
- Execution History: Track all operations with detailed results and re-execution capability
- Dynamic Inventory: Automatically discover nodes from PuppetDB
- Node Facts: View comprehensive system information from Puppet agents
- Puppet Reports: Browse detailed Puppet run reports with metrics and resource changes
- Catalog Inspection: Examine compiled Puppet catalogs and resource relationships
- Event Tracking: Monitor individual resource changes and failures over time
- PQL Queries: Filter nodes using PuppetDB Query Language
- Re-execution: Quickly repeat previous operations with preserved or modified parameters
- Expert Mode: View complete command lines and full output for debugging and auditing
- Real-time Streaming: Monitor command and task execution with live output
- Multi-Source Architecture: Seamlessly integrate data from multiple backend systems
- Graceful Degradation: Continue operating when individual integrations are unavailable
padawi/
├── frontend/ # Svelte 5 + Vite frontend
│ ├── src/
│ │ ├── components/ # UI components
│ │ ├── pages/ # Page components
│ │ └── lib/ # Utilities and stores
│ ├── package.json
│ └── vite.config.ts
├── backend/ # Node.js + TypeScript API server
│ ├── src/
│ │ ├── bolt/ # Bolt integration
│ │ ├── integrations/ # Plugin architecture
│ │ │ └── puppetdb/ # PuppetDB integration
│ │ ├── database/ # SQLite database
│ │ ├── routes/ # API endpoints
│ │ └── services/ # Business logic
│ ├── test/ # Unit and integration tests
│ ├── package.json
│ └── tsconfig.json
├── docs/ # Documentation
│ ├── configuration.md
│ ├── api.md
│ ├── user-guide.md
│ ├── puppetdb-integration-setup.md
│ ├── puppetdb-api.md
│ └── v0.2-features-guide.md
└── package.json # Root workspace configuration
- Node.js 20+
- npm 9+
- Bolt CLI installed and configured
# Install all dependencies
npm run install:all# Run backend (port 3000)
npm run dev:backend
# Run frontend (port 5173)
npm run dev:frontendDevelopment Mode (when running both servers separately):
- Frontend UI: http://localhost:5173 (Main application interface)
- Backend API: http://localhost:3000/api (API endpoints)
Production Mode (Docker or built application):
- Application: http://localhost:3000 (Frontend and API served together)
- The backend serves the built frontend as static files
# Build both frontend and backend
npm run buildCopy backend/.env.example to backend/.env and configure:
# Server Configuration
PORT=3000
BOLT_PROJECT_PATH=.
LOG_LEVEL=info
DATABASE_PATH=./data/executions.db
# Security
BOLT_COMMAND_WHITELIST_ALLOW_ALL=false
BOLT_COMMAND_WHITELIST=["ls","pwd","whoami"]
BOLT_EXECUTION_TIMEOUT=300000To enable PuppetDB integration, add to backend/.env:
# Enable PuppetDB
PUPPETDB_ENABLED=true
PUPPETDB_SERVER_URL=https://puppetdb.example.com
PUPPETDB_PORT=8081
# Token based Authentication (Puppet Enterprise only - use certificates for Open Source Puppet)
PUPPETDB_TOKEN=your-token-here
# SSL Configuration
PUPPETDB_SSL_ENABLED=true
PUPPETDB_SSL_CA=/path/to/ca.pem
PUPPETDB_SSL_CERT=/path/to/cert.pem
PUPPETDB_SSL_KEY=/path/to/key.pem
PUPPETDB_SSL_REJECT_UNAUTHORIZED=true
# Connection Settings
PUPPETDB_TIMEOUT=30000
PUPPETDB_RETRY_ATTEMPTS=3
PUPPETDB_CACHE_TTL=300000See PuppetDB Integration Setup Guide for detailed configuration instructions.
# Run all unit and integration tests
npm test
# Run backend tests only
npm test --workspace=backend
# Run frontend tests only
npm test --workspace=frontend# Run all E2E tests
npm run test:e2e
# Run E2E tests with UI (interactive)
npm run test:e2e:ui
# Run E2E tests in headed mode (visible browser)
npm run test:e2e:headedSee E2E Testing Guide for detailed information about end-to-end testing.
This project uses pre-commit hooks to ensure code quality and security before commits.
# Install pre-commit (requires Python)
pip install pre-commit
# Or using homebrew on macOS
brew install pre-commit
# Install the git hooks
pre-commit install
pre-commit install --hook-type commit-msg- Code Quality: ESLint, TypeScript type checking
- Security: Secret detection, private key detection
- File Checks: Trailing whitespace, file size limits, merge conflicts
- Docker: Dockerfile linting with hadolint
- Markdown: Markdown linting and formatting
- Shell Scripts: ShellCheck validation
- Commit Messages: Conventional commit format enforcement
- Duplicate Files: Prevents files with suffixes like
_fixed,_backup, etc.
# Run all hooks on all files
pre-commit run --all-files
# Run specific hook
pre-commit run eslint --all-files
# Update hooks to latest versions
pre-commit autoupdate# Skip pre-commit hooks (not recommended)
git commit --no-verify -m "message"docker build -t padawi:latest .# Using the provided script
./scripts/docker-run.sh
# Or manually executing from your Bolt Project dir
docker run -d \
--name padawi \
-p 3000:3000 \
-v $(pwd):/bolt-project:ro \
-v $(pwd)/data:/data \
-e BOLT_COMMAND_WHITELIST_ALLOW_ALL=false \
example42/padawi:latestdocker run -d \
--name padawi \
-p 3000:3000 \
-v $(pwd):/bolt-project:ro \
-v $(pwd)/data:/data \
-e BOLT_COMMAND_WHITELIST_ALLOW_ALL=false \
-e PUPPETDB_ENABLED=true \
-e PUPPETDB_SERVER_URL=https://puppetdb.example.com \
-e PUPPETDB_PORT=8081 \
-e PUPPETDB_TOKEN=your-token-here \
-e PUPPETDB_SSL_ENABLED=true \
example42/padawi:0.3.0Access the application at http://localhost:3000
# Start the service
docker-compose up -d
# View logs
docker-compose logs -f
# Stop the service
docker-compose downAccess the application at http://localhost:3000
View nodes from Bolt and PuppetDB with clear source attribution:
[Screenshot: Inventory page showing nodes from multiple sources with source badges]
Access comprehensive Puppet data including facts, reports, catalogs, and events:
[Screenshot: Node detail page with PuppetDB tabs showing reports and catalog]
Quickly repeat operations with preserved parameters:
[Screenshot: Executions page with re-execute buttons]
View complete command lines and full output for debugging:
[Screenshot: Expert mode showing full command line and output with search]
Monitor health of all configured integrations:
[Screenshot: Home page with integration status dashboard]
Copy .env.example to .env and configure as needed. Key variables:
Core Settings:
PORT: Application port (default: 3000)BOLT_PROJECT_PATH: Path to Bolt project directoryBOLT_COMMAND_WHITELIST_ALLOW_ALL: Allow all commands (default: false)BOLT_COMMAND_WHITELIST: JSON array of allowed commandsBOLT_EXECUTION_TIMEOUT: Timeout in milliseconds (default: 300000)LOG_LEVEL: Logging level (default: info)
PuppetDB Integration (Optional):
PUPPETDB_ENABLED: Enable PuppetDB integration (default: false)PUPPETDB_SERVER_URL: PuppetDB server URLPUPPETDB_PORT: PuppetDB port (default: 8081)PUPPETDB_TOKEN: Authentication token (Puppet Enterprise only)PUPPETDB_SSL_ENABLED: Enable SSL (default: true)PUPPETDB_SSL_CA: Path to CA certificatePUPPETDB_CACHE_TTL: Cache duration in ms (default: 300000)
Important: Token-based authentication is only available with Puppet Enterprise. Open Source Puppet and OpenVox installations must use certificate-based authentication.
See Configuration Guide for complete reference.
/bolt-project: Mount your Bolt project directory (read-only)/data: Persistent storage for SQLite database
If you see SQLITE_CANTOPEN: unable to open database file, the container user (UID 1001) doesn't have write access to the /data volume.
On Linux:
# Set correct ownership on the data directory
sudo chown -R 1001:1001 ./dataOn macOS/Windows: Docker Desktop handles permissions automatically. Ensure the directory exists:
mkdir -p ./dataUsing the docker-run.sh script: The provided script automatically handles permissions on Linux systems.
If PuppetDB integration shows "Disconnected":
- Verify PuppetDB is running and accessible
- Check configuration in
backend/.env - Test connectivity:
curl https://puppetdb.example.com:8081/pdb/meta/v1/version - Review logs with
LOG_LEVEL=debug - See PuppetDB Integration Setup Guide
If expert mode doesn't show complete output:
- Ensure expert mode is enabled (toggle in navigation)
- Check execution was run with expert mode enabled
- Verify database has
stdoutandstderrcolumns - For historical executions, only those run in v0.2.0+ have full output
See Troubleshooting Guide for more solutions.
We welcome contributions! Here's how you can help:
- Use GitHub Issues for bug reports and feature requests
- Include version information and configuration (sanitized)
- Provide steps to reproduce issues
- Enable expert mode and include relevant error details
- Fork the repository
- Create a feature branch
- Make your changes
- Write tests for new functionality
- Ensure all tests pass
- Submit a pull request
- Follow TypeScript best practices
- Use ESLint and Prettier configurations
- Write meaningful commit messages
- Add documentation for new features
# Run unit and integration tests
npm test
# Run E2E tests
npm run test:e2e
# Run specific test suite
npm test --workspace=backend- Additional Integrations: Ansible, Terraform, AWS CLI, Azure CLI, Kubernetes
- Advanced Querying: Visual query builder for PQL
- Scheduled Executions: Cron-like scheduling for recurring tasks
- Webhooks: Trigger actions based on external events
- Custom Dashboards: User-configurable dashboard widgets
- RBAC: Role-based access control
- Audit Logging: Comprehensive audit trail
= v0.3.0: Puppetserver integration, interface enhancements
- v0.2.0: PuppetDB integration, re-execution, expert mode enhancements
- v0.1.0: Initial release with Bolt integration
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
- Architecture Documentation - System architecture and plugin design
- Configuration Guide
- User Guide
- API Documentation
- PuppetDB Integration Setup
- Check the documentation
- Review Troubleshooting Guide
- Enable expert mode for detailed diagnostics
- Search existing GitHub Issues
- Create a new issue with:
- Version information
- Configuration (sanitized)
- Steps to reproduce
- Error messages and logs
- GitHub Issues: Bug reports and feature requests
- GitHub Discussions: Questions and community support
- Documentation: Comprehensive guides and references
Pabawi builds on excellent open-source projects:
- Puppet Bolt: Remote task execution engine
- PuppetDB: Centralized Puppet data storage
- Svelte 5: Reactive UI framework
- Node.js: Backend runtime
- TypeScript: Type-safe development
- SQLite: Embedded database
Special thanks to all contributors and the Puppet community.
- Architecture Documentation - System architecture and plugin design
- Configuration Guide - Complete configuration reference
- User Guide - Comprehensive user documentation
- API Documentation - REST API reference
- Integrations API Documentation - Complete API reference for all integrations
- API Endpoints Reference - Quick reference table of all endpoints
- Authentication Guide - Authentication setup and troubleshooting
- Error Codes Reference - Complete error code reference
- PuppetDB Integration Setup - PuppetDB configuration guide
- Puppetserver Setup - Puppetserver configuration guide
- PuppetDB API Documentation - PuppetDB-specific API endpoints
- E2E Testing Guide - End-to-end testing documentation
- Troubleshooting Guide - Common issues and solutions
npm run install:allEnsure you have a valid Bolt project with inventory.yaml:
# bolt-project/inventory.yaml
groups:
- name: linux-servers
targets:
- name: server-01
uri: server-01.example.com
config:
transport: ssh
ssh:
user: admin
private-key: ~/.ssh/id_rsa# Terminal 1: Start backend
npm run dev:backend
# Terminal 2: Start frontend
npm run dev:frontend- Frontend: http://localhost:5173
- Backend API: http://localhost:3000/api