core/backend/modules/module.go
enzo 365165c13b fix: RegisterPublicRoute pour pages HTML modules + masquer installés dans store
- RouteEntry.Public bool : routes sans auth (pages HTML navigables par Swup)
- RegisterPublicRoute() ajouté à Registry interface + coreRegistry
- main.go : switch public/auth/admin pour les routes modules
- modules.html : masque les modules déjà installés dans le store

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22 18:44:10 +01:00

79 lines
2.6 KiB
Go

// Package modules définit le contrat d'interface pour les modules ProxmoxPanel.
package modules
import (
"database/sql"
"net/http"
)
// Module est l'interface que chaque module doit implémenter.
type Module interface {
ID() string
Register(registry Registry) error
}
// NavItemDef décrit l'entrée de navigation d'un module dans la sidebar.
type NavItemDef struct {
ID string `json:"id"`
Href string `json:"href"`
Icon string `json:"icon"`
Color string `json:"color"`
LabelKey string `json:"label_key"`
}
// Registry est l'interface exposée aux modules pour s'enregistrer dans le CORE.
// Seuls des types de la bibliothèque standard sont exposés — aucun type internal.
type Registry interface {
// Enregistrement de routes HTTP (avec authentification)
RegisterRoute(method, path string, handler http.HandlerFunc, requireAdmin bool)
// Enregistrement d'une route publique (sans auth — pour les pages HTML)
RegisterPublicRoute(method, path string, handler http.HandlerFunc)
// Enregistrement du canal WebSocket
RegisterWSChannel(channel string, handler WSHandler)
// Widgets et onglets
RegisterWidget(widget WidgetDef)
RegisterSettingsTab(tab SettingsTabDef)
// Traductions et migrations
RegisterTranslations(lang string, keys map[string]string)
RegisterMigration(version int, sql string, fn MigrationFn)
// Entrée de navigation dans la sidebar
RegisterNavItem(item NavItemDef)
// Accès à la base SQLite (isolation par module possible via préfixe)
DB() *sql.DB
// Service SSH — exécute une commande sur la cible (host ou lxc:VMID)
// La cible "host" exécute directement, "lxc:101" wrappe via pct exec
RunOnTarget(target, command string) (string, error)
// Service SSH — streaming de la sortie ligne par ligne
// Le channel est fermé à la fin de la commande
StreamOnTarget(target, command string, output chan<- string) error
}
// 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"`
ComponentPath string `json:"component_path"`
}
// MigrationFn est une fonction de migration optionnelle.
type MigrationFn func(db *sql.DB) error