feat(check,serve): Startvalidierung, HTTPS-Server, Signal-Handling und Versionscheck
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
This commit is contained in:
parent
7e23df9fec
commit
2d223c5823
9 changed files with 1158 additions and 6 deletions
|
|
@ -1,17 +1,80 @@
|
|||
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 Benutzer durchspielen")
|
||||
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
|
||||
}
|
||||
_ = testAuth
|
||||
fmt.Fprintf(stderr, "Fehler: config %q kann noch nicht geladen werden (nicht implementiert)\n", *path)
|
||||
return 1
|
||||
|
||||
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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue