diff --git a/main.go b/main.go index 35a426a..6240438 100644 --- a/main.go +++ b/main.go @@ -4,8 +4,10 @@ import ( "crypto/rand" "encoding/json" "html/template" + "path/filepath" "log" "net" + "fmt" "net/http" "os" "strconv" @@ -17,8 +19,11 @@ import ( const ( passwordLength = 32 chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + startTimeKey contextKey = "startTime" ) +type contextKey string + var ( debug = false templates = make(map[string]*template.Template) @@ -32,6 +37,11 @@ func initConfig() { if envFile := os.Getenv("COUNTER_FILE"); envFile != "" { counterFile = envFile log.Printf("counterFile st to %s, by ENV\n", envFile) + // Prüfen, ob das Verzeichnis für die Datei existiert + dir := filepath.Dir(counterFile) + if _, err := os.Stat(dir); os.IsNotExist(err) { + log.Printf("WARNUNG: Verzeichnis %s existiert nicht. Counter wird evtl. fehlschlagen.", dir) + } } // 2. Debug-Modus auslesen (String zu Bool) @@ -135,6 +145,12 @@ func loadTemplates() { funcMap := template.FuncMap{ "getAppVersion": func() string { return AppVersion }, "getPassCount": func() int { return GetPasswordCount() }, + "isDebug": func() bool { return debug }, + "dt": func(startTime time.Time) string { + duration := time.Since(startTime) + // Gibt die Zeit in Millisekunden mit 2 Nachkommastellen aus, z.B. "1.45ms" + return fmt.Sprintf("%.2fms", float64(duration.Nanoseconds())/1e6) + }, } // 2. Templates mit FuncMap laden @@ -196,17 +212,37 @@ func passwordAPIHandler(w http.ResponseWriter, r *http.Request) { w.Write([]byte(password)) } +type PageData struct { + Title string + StartTime time.Time + Request *http.Request + Data interface{} // Deine eigentlichen Seitendaten +} + func indexHandler(w http.ResponseWriter, r *http.Request) { if debug { log.Printf("call indexHandler: Request %s %s\n", r.Method, r.URL) } - password := generatePassword() - //password := "load..." - data := struct { - Password string - }{ - Password: password, + + startTime, ok := r.Context().Value(startTimeKey).(time.Time) + if !ok { + startTime = time.Now() // Fallback, falls die Middleware mal fehlt } + + password := generatePassword() + + data := struct { + Password string + StartTime time.Time + Request *http.Request + RealIP string + }{ + Password: password, + StartTime: startTime, + Request: r, + RealIP: getClientIP(r), + } + if debug { log.Printf("prepare template for index\n") } diff --git a/static/style.css b/static/style.css index cc9f966..9f62037 100644 --- a/static/style.css +++ b/static/style.css @@ -211,3 +211,27 @@ a:hover { text-decoration: underline; } +.debug-banner { + position: absolute; + top: 1rem; + left: 4rem; + font-size: 1.2rem; + border-radius: 4px; + border: 1px solid var(--border-color); +} + +.debug-only { + display: none; +} + +.debug-footer { + position: absolute; + bottom: 4em; + left: 0; + +} + +body.is-debug .debug-only { + display: inline-block; + border: 1px dashed red; +} diff --git a/templates/base.html b/templates/base.html index 92d1110..00f8795 100644 --- a/templates/base.html +++ b/templates/base.html @@ -44,8 +44,29 @@
+ {{if isDebug}} + + {{end}} {{ block "body" . }}{{end}} +{{if isDebug}} + +{{end}} +