// cmd/gen-modules génère registered_modules.go à partir de la variable d'env MODULES. // Appelé pendant le build Docker : go run ./cmd/gen-modules // MODULES = liste d'IDs séparés par des virgules (ex: "viewLogs,viewServices") // Le fichier généré déclare RegisterModules(*modules.Loader) qui enregistre chaque module. package main import ( "fmt" "os" "strings" "text/template" ) const outputFile = "registered_modules.go" // moduleDef décrit un module à importer. type moduleDef struct { ID string // ex: "viewLogs" Alias string // ex: "viewlogs" (alias Go valide) Pkg string // ex: "git.geronzi.fr/proxmoxPanel/viewLogs" } // tplNoModules : fichier généré quand aucun module n'est installé. const tplNoModules = `// Code généré automatiquement par cmd/gen-modules — ne pas modifier manuellement. // Régénéré lors du build Docker avec la liste des modules compilés. package main import "git.geronzi.fr/proxmoxPanel/core/backend/modules" // RegisterModules enregistre les modules compilés dans le binaire. func RegisterModules(l *modules.Loader) {} ` // tplWithModules : fichier généré avec des modules. const tplWithModules = `// Code généré automatiquement par cmd/gen-modules — ne pas modifier manuellement. // Régénéré lors du build Docker avec la liste des modules compilés. package main import ( "git.geronzi.fr/proxmoxPanel/core/backend/modules" {{- range .}} {{.Alias}} "{{.Pkg}}" {{- end}} ) // RegisterModules enregistre les modules compilés dans le binaire. func RegisterModules(l *modules.Loader) { {{- range .}} l.RegisterModule({{.Alias}}.New()) {{- end}} } ` func main() { modulesEnv := strings.TrimSpace(os.Getenv("MODULES")) // Pas de modules : générer la version vide if modulesEnv == "" { if err := os.WriteFile(outputFile, []byte(tplNoModules), 0644); err != nil { fmt.Fprintf(os.Stderr, "Erreur écriture %s : %v\n", outputFile, err) os.Exit(1) } fmt.Printf("Généré %s (aucun module)\n", outputFile) return } // Parser la liste des modules ids := strings.Split(modulesEnv, ",") defs := make([]moduleDef, 0, len(ids)) for _, id := range ids { id = strings.TrimSpace(id) if id == "" { continue } // Alias Go = ID en minuscules sans tirets ni underscores alias := strings.ToLower(strings.NewReplacer("-", "", "_", "").Replace(id)) defs = append(defs, moduleDef{ ID: id, Alias: alias, Pkg: "git.geronzi.fr/proxmoxPanel/" + id, }) } // Générer le fichier avec les imports et les appels RegisterModule tmpl, err := template.New("modules").Parse(tplWithModules) if err != nil { fmt.Fprintf(os.Stderr, "Erreur template : %v\n", err) os.Exit(1) } f, err := os.Create(outputFile) if err != nil { fmt.Fprintf(os.Stderr, "Erreur création %s : %v\n", outputFile, err) os.Exit(1) } defer f.Close() if err := tmpl.Execute(f, defs); err != nil { fmt.Fprintf(os.Stderr, "Erreur génération : %v\n", err) os.Exit(1) } fmt.Printf("Généré %s avec %d module(s) : %s\n", outputFile, len(defs), modulesEnv) }