package main import ( "context" "fmt" "io" "time" "git.ravensburg.dev/cabele/opnsense-portal/internal/auth" "git.ravensburg.dev/cabele/opnsense-portal/internal/check" "git.ravensburg.dev/cabele/opnsense-portal/internal/config" "git.ravensburg.dev/cabele/opnsense-portal/internal/opnsense" ) func runCheck(args []string, stdout, stderr io.Writer) int { fs, path := configFlags("check", stderr) testAuth := fs.String("test-auth", "", "Suche und Gruppenprüfung für einen konkreten Benutzer durchspielen (ohne Passwort)") if err := fs.Parse(args); err != nil { return 2 } cfg, err := config.Load(*path, nil) if err != nil { // Ohne lesbare Konfiguration lässt sich nichts weiter prüfen. fmt.Fprintf(stdout, "✗ Konfiguration\n %v\n", err) return 1 } fw, ad, err := buildBackends(cfg) if err != nil { fmt.Fprintf(stdout, "✗ Initialisierung\n %v\n", err) return 1 } ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() c := &check.Checker{Cfg: cfg, ConfigPath: *path, FW: fw, Dir: ad} report := c.Run(ctx, *testAuth) report.WriteTo(stdout) if !report.OK() { fmt.Fprintln(stdout, "\nEs sind Fehler aufgetreten. Das Portal würde nicht korrekt arbeiten.") return 1 } fmt.Fprintln(stdout, "\nAlle Prüfungen bestanden.") return 0 } // buildBackends erzeugt Firewall- und Verzeichnis-Client aus der Konfiguration. // Wird von serve und check gemeinsam genutzt. func buildBackends(cfg *config.Config) (*opnsense.Client, *auth.AD, error) { fw, err := opnsense.New(opnsense.Options{ BaseURL: cfg.OPNsense.URL, APIKey: cfg.OPNsense.APIKey, APISecret: cfg.OPNsense.APISecret, CAFile: cfg.OPNsense.CAFile, InsecureSkipVerify: cfg.OPNsense.InsecureSkipVerify, Timeout: 20 * time.Second, }) if err != nil { return nil, nil, err } ad, err := auth.NewAD(auth.Options{ Servers: cfg.AD.Servers, Port: cfg.AD.Port, TLSMode: cfg.AD.TLSMode, BaseDN: cfg.EffectiveBaseDN(), BindUser: cfg.AD.BindUser, BindPassword: cfg.AD.BindPassword, VPNGroup: cfg.AD.VPNGroup, CAFile: cfg.AD.CAFile, MinTLSVersion: auth.ParseTLSVersion(cfg.AD.MinTLSVersion), MaxTLSVersion: auth.ParseTLSVersion(cfg.AD.MaxTLSVersion), Timeout: time.Duration(cfg.AD.Timeout), }) if err != nil { return nil, nil, err } return fw, ad, nil }