Backend Go 1.23+ : - API REST + WebSocket (chi, gorilla/websocket) - Authentification PAM via SSH + JWT RS256 - Chiffrement AES-256-GCM pour secrets SQLite - Pool SSH, client Proxmox REST, hub WebSocket pub/sub - Système de modules compilés à initialisation conditionnelle - Audit log, migrations SQLite versionnées Frontend Vue 3 + Vite + TypeScript : - Thème Neumorphism sombre/clair (CSS custom properties) - Wizard d'installation, Dashboard drag-drop, Terminal xterm.js - Toutes les vues CORE + stubs modules optionnels - i18n EN/FR (vue-i18n v11) Infrastructure : - Docker multi-stage (Go → alpine, Node → nginx) - docker-compose.yml, .gitattributes, LICENSE MIT, README Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
66 lines
2.4 KiB
Go
66 lines
2.4 KiB
Go
// Package modules définit le contrat d'interface pour les modules ProxmoxPanel.
|
|
// Chaque module implémente l'interface Module et s'enregistre auprès du ModuleRegistry.
|
|
package modules
|
|
|
|
import (
|
|
"database/sql"
|
|
"net/http"
|
|
)
|
|
|
|
// Module est l'interface que chaque module doit implémenter.
|
|
type Module interface {
|
|
// ID retourne l'identifiant unique du module (doit correspondre à la table modules en DB).
|
|
ID() string
|
|
|
|
// Register est appelé au chargement du module actif.
|
|
// Il reçoit le registry pour enregistrer ses routes, widgets, etc.
|
|
Register(registry Registry) error
|
|
}
|
|
|
|
// Registry est l'interface exposée aux modules pour s'enregistrer dans le CORE.
|
|
type Registry interface {
|
|
// RegisterRoute enregistre une route HTTP dans le router principal.
|
|
RegisterRoute(method, path string, handler http.HandlerFunc, requireAdmin bool)
|
|
|
|
// RegisterWSChannel enregistre un handler WebSocket pour un channel nommé.
|
|
RegisterWSChannel(channel string, handler WSHandler)
|
|
|
|
// RegisterWidget déclare un type de widget disponible pour le dashboard.
|
|
RegisterWidget(widget WidgetDef)
|
|
|
|
// RegisterSettingsTab ajoute un onglet dans la page paramètres.
|
|
RegisterSettingsTab(tab SettingsTabDef)
|
|
|
|
// RegisterTranslations fusionne des clés de traduction pour une langue donnée.
|
|
RegisterTranslations(lang string, keys map[string]string)
|
|
|
|
// RegisterMigration déclare une migration de base de données propre au module.
|
|
RegisterMigration(version int, sql string, fn MigrationFn)
|
|
|
|
// DB retourne un accès à SQLite avec isolation par module (préfixe de tables).
|
|
DB() *sql.DB
|
|
}
|
|
|
|
// WSHandler est un handler WebSocket pour un channel nommé.
|
|
type WSHandler func(userID int64, send chan<- []byte, recv <-chan []byte)
|
|
|
|
// WidgetDef décrit un type de widget disponible pour le dashboard.
|
|
type WidgetDef struct {
|
|
Type string `json:"type"`
|
|
Name string `json:"name"`
|
|
Description string `json:"description"`
|
|
DefaultW int `json:"default_width"`
|
|
DefaultH int `json:"default_height"`
|
|
}
|
|
|
|
// SettingsTabDef décrit un onglet de paramètres fourni par un module.
|
|
type SettingsTabDef struct {
|
|
ID string `json:"id"`
|
|
Label string `json:"label"`
|
|
Icon string `json:"icon"`
|
|
// Path est le chemin frontend du composant Vue à charger (lazy import).
|
|
ComponentPath string `json:"component_path"`
|
|
}
|
|
|
|
// MigrationFn est une fonction de migration optionnelle (pour les migrations non-SQL).
|
|
type MigrationFn func(db *sql.DB) error
|