de9da756e9b60d68c24e085b8a0bc6a389a6fe69
Problem: When SMART errors evolved on the same drive, new tickets were created instead of updating the existing ticket. This happened because the hash was based on specific error values (e.g., "Reallocated_Sector_Ct: 8") instead of just the issue category. Root Cause: - Old hash included specific SMART attribute names and values - When errors changed (8 → 16 reallocated sectors, or new errors appeared), the hash changed, allowing duplicate tickets - Only matched "Warning" attributes, missing "Critical" and "Error X occurred" - Only matched /dev/sd[a-z], missing NVMe devices Solution: - Hash now based on: hostname + device + issue_category (e.g., "smart") - Does NOT include specific error values or attribute names - Supports both /dev/sdX and /dev/nvmeXnY devices - Detects issue categories: smart, storage, memory, cpu, network Result: ✅ Same drive, errors evolve → Same hash → Updates existing ticket ✅ Different device → Different hash → New ticket ✅ Drive replaced → Different device → New ticket ✅ NVMe devices now supported Example: Before: - "Warning Reallocated: 8" → hash abc123 - "Warning Reallocated: 16" → hash xyz789 (NEW TICKET - bad!) After: - "Warning Reallocated: 8" → hash abc123 - "Warning Reallocated: 16" → hash abc123 (SAME TICKET - good!) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Tinker Tickets
A feature-rich PHP-based ticketing system designed for tracking and managing data center infrastructure issues with enterprise-grade workflow management.
✨ Core Features
📊 Dashboard & Ticket Management
- Smart Dashboard: Sortable columns, advanced filtering by status/priority/category/type
- Full-Text Search: Search across tickets, descriptions, and metadata
- Ticket Assignment: Assign tickets to specific users with "Assigned To" column
- Priority Tracking: P1 (Critical) to P5 (Minimal Impact) with color-coded indicators
- Custom Categories: Hardware, Software, Network, Security, General
- Ticket Types: Maintenance, Install, Task, Upgrade, Issue, Problem
🔄 Workflow Management
- Status Transitions: Enforced workflow rules (Open → In Progress → Resolved → Closed)
- Workflow Validation: Server-side validation prevents invalid status changes
- Admin Controls: Certain transitions can require admin privileges
- Comment Requirements: Optional comment requirements for specific transitions
- Activity Timeline: Complete audit trail of all ticket changes
💬 Collaboration Features
- Markdown Comments: Full Markdown support with live preview
- User Tracking: Tracks who created, updated, and assigned tickets
- Activity Timeline: Shows all ticket events (creates, updates, assignments, comments)
- Real-time Updates: AJAX-powered updates without page refreshes
🎫 Ticket Templates
- Quick Creation: Pre-configured templates for common issues
- Default Templates: Hardware Failure, Software Installation, Network Issue, Maintenance
- Auto-fill: Templates populate title, description, category, type, and priority
👥 User Management & Authentication
- SSO Integration: Authelia authentication with LLDAP backend
- Role-Based Access: Admin and standard user roles
- User Display Names: Support for display names and usernames
- Session Management: Secure PHP session handling
⚡ Bulk Actions (Admin Only)
- Bulk Close: Close multiple tickets at once
- Bulk Assign: Assign multiple tickets to a user
- Bulk Priority: Change priority for multiple tickets
- Operation Tracking: All bulk operations logged in audit trail
🔔 Notifications
- Discord Integration: Webhook notifications for ticket creation and updates
- Rich Embeds: Color-coded priority indicators and ticket links
- Change Tracking: Detailed notification of what changed
🎨 User Interface
- Dark Mode: Full dark mode support with proper contrast
- Responsive Design: Works on desktop and mobile devices
- Clean Layout: Modern, intuitive interface
- Hamburger Menu: Quick access to ticket actions (priority, category, type)
🏗️ Technical Architecture
Backend
- Language: PHP 7.4+
- Database: MariaDB/MySQL
- Architecture: MVC pattern with models, views, controllers
- ORM: Custom database abstraction layer
Frontend
- HTML5/CSS3: Semantic markup with modern CSS
- JavaScript: Vanilla JS with Fetch API for AJAX
- Markdown: marked.js for Markdown rendering
- Icons: Unicode emoji icons
Database Schema
- tickets: Core ticket data with user tracking
- comments: Markdown-supported comments
- users: User accounts synced from LLDAP
- audit_log: Complete audit trail with JSON details
- status_transitions: Workflow configuration
- ticket_templates: Reusable ticket templates
- bulk_operations: Tracking for bulk admin operations
API Endpoints
/api/update_ticket.php- Update ticket with workflow validation/api/assign_ticket.php- Assign ticket to user/api/add_comment.php- Add comment to ticket/api/get_template.php- Fetch ticket template/api/get_users.php- Get user list for assignments/api/bulk_operation.php- Perform bulk operations (admin only)
🚀 Setup & Configuration
1. Environment Configuration
Create .env file in project root:
DB_HOST=10.10.10.50
DB_USER=tinkertickets
DB_PASS=your_password
DB_NAME=ticketing_system
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/...
2. Database Setup
Run migrations in order:
# Navigate to project directory
cd /root/code/tinker_tickets
# Run each migration
mysql -h 10.10.10.50 -u tinkertickets -p ticketing_system < migrations/001_initial_schema.sql
mysql -h 10.10.10.50 -u tinkertickets -p ticketing_system < migrations/007_add_ticket_assignment.sql
mysql -h 10.10.10.50 -u tinkertickets -p ticketing_system < migrations/008_add_status_workflows.sql
mysql -h 10.10.10.50 -u tinkertickets -p ticketing_system < migrations/009_add_ticket_templates.sql
mysql -h 10.10.10.50 -u tinkertickets -p ticketing_system < migrations/010_add_bulk_operations.sql
mysql -h 10.10.10.50 -u tinkertickets -p ticketing_system < migrations/011_remove_view_tracking.sql
3. Web Server Configuration
Apache Configuration (recommended):
<VirtualHost *:80>
ServerName t.lotusguild.org
DocumentRoot /root/code/tinker_tickets
<Directory /root/code/tinker_tickets>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
# Enable mod_rewrite for clean URLs
RewriteEngine On
RewriteBase /
# Route ticket URLs
RewriteRule ^ticket/([0-9]+)$ ticket.php?id=$1 [L,QSA]
# Route ticket create
RewriteRule ^ticket/create$ ticket.php?action=create [L,QSA]
</Directory>
</VirtualHost>
4. Authelia Integration
Tinker Tickets uses Authelia for SSO. User information is passed via headers:
Remote-User: UsernameRemote-Name: Display nameRemote-Email: Email addressRemote-Groups: User groups (comma-separated)
Admin users must be in the admins group in LLDAP.
📁 Project Structure
tinker_tickets/
├── api/ # API endpoints
│ ├── add_comment.php
│ ├── assign_ticket.php
│ ├── bulk_operation.php
│ ├── get_template.php
│ ├── get_users.php
│ └── update_ticket.php
├── assets/ # Static assets
│ ├── css/
│ │ ├── dashboard.css
│ │ └── ticket.css
│ └── js/
│ ├── dashboard.js
│ └── ticket.js
├── config/ # Configuration
│ └── config.php
├── controllers/ # MVC Controllers
│ ├── DashboardController.php
│ └── TicketController.php
├── models/ # Data models
│ ├── AuditLogModel.php
│ ├── BulkOperationsModel.php
│ ├── CommentModel.php
│ ├── TemplateModel.php
│ ├── TicketModel.php
│ ├── UserModel.php
│ └── WorkflowModel.php
├── views/ # View templates
│ ├── CreateTicketView.php
│ ├── DashboardView.php
│ └── TicketView.php
├── migrations/ # Database migrations
│ ├── 001_initial_schema.sql
│ ├── 007_add_ticket_assignment.sql
│ ├── 008_add_status_workflows.sql
│ ├── 009_add_ticket_templates.sql
│ ├── 010_add_bulk_operations.sql
│ └── 011_remove_view_tracking.sql
├── index.php # Dashboard entry point
├── ticket.php # Ticket view/create entry point
└── .env # Environment configuration
🔐 Security Features
- SQL Injection Prevention: All queries use prepared statements
- XSS Protection: All output is properly escaped with
htmlspecialchars() - Session Security: Secure PHP session handling
- Admin Validation: Server-side admin checks for privileged operations
- Workflow Enforcement: Status transitions validated server-side
- Audit Logging: Complete audit trail of all actions
🎯 Workflow States
Default Workflow
Open → In Progress → Resolved → Closed
↓ ↓ ↓
└─────────┴──────────┘
(can reopen)
Workflow Configuration
Status transitions are defined in the status_transitions table:
from_status: Current statusto_status: Target statusrequires_comment: Whether transition requires a commentrequires_admin: Whether transition requires admin privilegesis_active: Whether transition is enabled
📝 Usage Examples
Creating a Ticket
- Click "New Ticket" button
- Select template (optional) - auto-fills common fields
- Fill in title, description, category, type, priority
- Click "Create Ticket"
Updating Ticket Status
- Open ticket
- Click status dropdown (next to priority badge)
- Select allowed status (workflow-validated)
- Confirm if comment is required
Assigning Tickets
- Open ticket or use dashboard bulk actions
- Select user from "Assigned to" dropdown
- Changes are auto-saved
Bulk Operations (Admin Only)
- Check multiple tickets on dashboard
- Select bulk action (Close, Assign, Change Priority)
- Complete operation
- All actions are logged in audit trail
🔮 Roadmap
- ✅ Activity Timeline
- ✅ Ticket Assignment
- ✅ Status Transitions with Workflows
- ✅ Ticket Templates
- ✅ Bulk Actions (Admin Only)
- 🎨 ANSI Art Redesign (Next Priority)
- 🔗 Ticket Dependencies (blocks/blocked by)
- 📊 Custom Dashboard Widgets
- 🔧 Custom Fields per Category
🤝 Contributing
This is an internal tool for LotusGuild infrastructure management. For feature requests or bug reports, contact the infrastructure team.
📄 License
Internal use only - LotusGuild Infrastructure
🙏 Credits
Built with ❤️ for the LotusGuild community Powered by PHP, MariaDB, and lots of coffee ☕
Description
A PHP-based ticketing system with a clean web interface for managing and tracking hardware, software, and network issues in Lotus Guild Cluster
Languages
PHP
61.8%
JavaScript
19.2%
CSS
18.7%
Shell
0.3%