Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
80 lines
2.3 KiB
Go
80 lines
2.3 KiB
Go
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,
|
|
Timeout: time.Duration(cfg.AD.Timeout),
|
|
})
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
return fw, ad, nil
|
|
}
|