From 2000084dd6b2bceb7ae25372b17893ba53c8f2cb Mon Sep 17 00:00:00 2001 From: Simon Skoczylas Date: Wed, 4 Feb 2026 17:12:04 +0100 Subject: [PATCH 01/21] Improve templating, add basic details page --- server/resources/detail.html | 7 + server/resources/flags.css | 8 + server/resources/index.html | 21 +-- .../{banned.html => partial_banned.html} | 0 server/resources/partial_head.html | 11 ++ .../{jailcard.html => partial_jailcard.html} | 0 server/server.go | 153 +++++++++++++++--- 7 files changed, 157 insertions(+), 43 deletions(-) create mode 100644 server/resources/detail.html create mode 100644 server/resources/flags.css rename server/resources/{banned.html => partial_banned.html} (100%) create mode 100644 server/resources/partial_head.html rename server/resources/{jailcard.html => partial_jailcard.html} (100%) diff --git a/server/resources/detail.html b/server/resources/detail.html new file mode 100644 index 0000000..1601e34 --- /dev/null +++ b/server/resources/detail.html @@ -0,0 +1,7 @@ + + +{{ template "head" . }} + +

Details

+ + \ No newline at end of file diff --git a/server/resources/flags.css b/server/resources/flags.css new file mode 100644 index 0000000..524c786 --- /dev/null +++ b/server/resources/flags.css @@ -0,0 +1,8 @@ +{{ range $key, $value := . }} +.flag-{{ $key }} { + width: 21px; + height: 15px; + background: url(data:image/png;base64,{{ $value }}) no-repeat; + display: inline-block; +} +{{ end }} \ No newline at end of file diff --git a/server/resources/index.html b/server/resources/index.html index a30dad0..d70af53 100644 --- a/server/resources/index.html +++ b/server/resources/index.html @@ -1,25 +1,6 @@ - - - - - - - - - fail2ban dashboard - {{ .Version }} - - +{{ template "head" . }}
+
+

Details for {{ .Jail.Name }}

+
+
+ {{ template "jailCard" .Jail }} +
+
+
{{ if .HasBanned }}

Currently banned

+ + + + + + + + + {{ range .Banned }} {{ template "banned" . }} diff --git a/server/server.go b/server/server.go index 6883f1c..ba3e684 100644 --- a/server/server.go +++ b/server/server.go @@ -69,13 +69,13 @@ type indexData struct { BasePath string CountryCodes template.URL HasBanned bool - Banned []client.BanEntry - Jails []store.Jail OrderAddress Sorted OrderJail Sorted OrderPenalty Sorted OrderStarted Sorted OrderEnds Sorted + Banned []client.BanEntry + Jails []store.Jail } type detailData struct { @@ -84,6 +84,11 @@ type detailData struct { BasePath string CountryCodes template.URL HasBanned bool + OrderAddress Sorted + OrderJail Sorted + OrderPenalty Sorted + OrderStarted Sorted + OrderEnds Sorted Banned []client.BanEntry Jail store.Jail } @@ -139,6 +144,12 @@ func Serve(version string, fail2banVersion string, basePath string, trustProxyHe return detailHeadTemplateError } + // value isn't needed in code as it is used in the index template + _, detailJailCardTemplateError := detailTemplate.New("jailCard").Parse(string(jailCardHtml)) + if detailJailCardTemplateError != nil { + return detailJailCardTemplateError + } + // value isn't needed in code as it is used in the index template _, detailBannedTemplateError := detailTemplate.New("banned").Parse(string(bannedHtml)) if detailBannedTemplateError != nil { @@ -243,15 +254,15 @@ func Serve(version string, fail2banVersion string, basePath string, trustProxyHe Version: version, Fail2BanVersion: fail2banVersion, BasePath: cleanBasePathForTemplate(cleanedBasePath), - Jails: jails, HasBanned: len(banned) > 0, - Banned: banned, CountryCodes: template.URL("flags.css?c=" + strings.Join(countryCodes, ",")), OrderAddress: toggleSortOrder("address", sorting, order), OrderJail: toggleSortOrder("jail", sorting, order), OrderPenalty: toggleSortOrder("penalty", sorting, order), OrderStarted: toggleSortOrder("started", sorting, order), OrderEnds: toggleSortOrder("ends", sorting, order), + Banned: banned, + Jails: jails, } var sb strings.Builder @@ -290,12 +301,22 @@ func Serve(version string, fail2banVersion string, basePath string, trustProxyHe banned[index] = ban } + sorting := c.Query("sorting", "ends") + order := c.Query("order", "asc") + + sort.Slice(banned, sortSlice(sorting, order, banned)) + detail := &detailData{ Version: version, Fail2BanVersion: fail2banVersion, BasePath: cleanBasePathForTemplate(cleanedBasePath), CountryCodes: template.URL("flags.css?c=" + strings.Join(countryCodes, ",")), HasBanned: len(banned) > 0, + OrderAddress: toggleSortOrder("address", sorting, order), + OrderJail: toggleSortOrder("jail", sorting, order), + OrderPenalty: toggleSortOrder("penalty", sorting, order), + OrderStarted: toggleSortOrder("started", sorting, order), + OrderEnds: toggleSortOrder("ends", sorting, order), Banned: banned, Jail: jailByName, } From 69378e65d2273e98c64b6fc45ca1797c88421d23 Mon Sep 17 00:00:00 2001 From: Simon Skoczylas Date: Sat, 7 Feb 2026 17:14:05 +0100 Subject: [PATCH 04/21] Improve UI --- server/resources/detail.html | 7 ++++- server/resources/index.html | 37 +++++------------------- server/resources/partial_head.html | 10 +++++++ server/resources/partial_jailcard.html | 28 ++++++++++++++---- server/resources/partial_jaildetail.html | 6 ++++ server/server.go | 9 ++++++ 6 files changed, 60 insertions(+), 37 deletions(-) create mode 100644 server/resources/partial_jaildetail.html diff --git a/server/resources/detail.html b/server/resources/detail.html index 4be399c..3f8e2cd 100644 --- a/server/resources/detail.html +++ b/server/resources/detail.html @@ -6,6 +6,11 @@

fail2ban dashboard - {{ .Version }} fail2ban - {{ .Fail2BanVersion }}

@@ -15,7 +20,7 @@

fail2ban dashboar

Details for {{ .Jail.Name }}

- {{ template "jailCard" .Jail }} + {{ template "jailDetail" .Jail }}
diff --git a/server/resources/index.html b/server/resources/index.html index d70af53..1f324ae 100644 --- a/server/resources/index.html +++ b/server/resources/index.html @@ -6,47 +6,24 @@

fail2ban dashboard - {{ .Version }} fail2ban - {{ .Fail2BanVersion }}

-

Current jails

-
-
+

Current jails

+
{{ range .Jails }} {{ template "jailCard" . }} {{ end }} -
- {{ if .HasBanned }} -
-

Currently banned

-
-
-

Address Jail Banned at Curren penalty Ban ends at  +
- - - - - - - - - - - {{ range .Banned }} - {{ template "banned" . }} - {{ end }} - -
Address Jail Banned at Curren penalty Ban ends at  -
-
-
-
- {{ end }}
\ No newline at end of file diff --git a/server/resources/partial_head.html b/server/resources/partial_head.html index 157134d..11d3ae0 100644 --- a/server/resources/partial_head.html +++ b/server/resources/partial_head.html @@ -8,4 +8,14 @@ fail2ban dashboard - {{ .Version }} + \ No newline at end of file diff --git a/server/resources/partial_jailcard.html b/server/resources/partial_jailcard.html index ed425fc..c18db47 100644 --- a/server/resources/partial_jailcard.html +++ b/server/resources/partial_jailcard.html @@ -1,6 +1,22 @@ -
- -
{{ .BannedCount }}
-
failed {{ .CurrentlyFailed }} / {{ .TotalFailed }}
-
banned {{ .CurrentlyBanned }} / {{ .TotalBanned }}
-
\ No newline at end of file + +
{{ .Name }}
+
+
+
Banned
+
{{ .CurrentlyBanned }}
+
+
+
Failed
+
{{ .CurrentlyFailed }}
+
+
+
Total Banned
+
{{ .TotalBanned }}
+
+
+
Total Failed
+
{{ .TotalFailed }}
+
+
+
+
\ No newline at end of file diff --git a/server/resources/partial_jaildetail.html b/server/resources/partial_jaildetail.html new file mode 100644 index 0000000..4c29b00 --- /dev/null +++ b/server/resources/partial_jaildetail.html @@ -0,0 +1,6 @@ +
+
{{ .Name }}
+
{{ .BannedCount }}
+
failed {{ .CurrentlyFailed }} / {{ .TotalFailed }}
+
banned {{ .CurrentlyBanned }} / {{ .TotalBanned }}
+
diff --git a/server/server.go b/server/server.go index ba3e684..a3350d5 100644 --- a/server/server.go +++ b/server/server.go @@ -43,6 +43,9 @@ var detailHtml []byte //go:embed resources/partial_jailcard.html var jailCardHtml []byte +//go:embed resources/partial_jaildetail.html +var jailDetailHtml []byte + //go:embed resources/partial_banned.html var bannedHtml []byte @@ -150,6 +153,12 @@ func Serve(version string, fail2banVersion string, basePath string, trustProxyHe return detailJailCardTemplateError } + // value isn't needed in code as it is used in the detail template + _, detailJailDetailTemplateError := detailTemplate.New("jailDetail").Parse(string(jailDetailHtml)) + if detailJailDetailTemplateError != nil { + return detailJailDetailTemplateError + } + // value isn't needed in code as it is used in the index template _, detailBannedTemplateError := detailTemplate.New("banned").Parse(string(bannedHtml)) if detailBannedTemplateError != nil { From cf3bc4f90cfa1c01edad11ab99c5c8452d3a5e7d Mon Sep 17 00:00:00 2001 From: Simon Skoczylas Date: Sat, 7 Feb 2026 17:22:28 +0100 Subject: [PATCH 05/21] Improve UI --- server/resources/detail.html | 8 ++++---- server/resources/index.html | 2 +- server/resources/partial_jailcard.html | 8 ++++---- server/resources/partial_jaildetail.html | 24 +++++++++++++++++++----- 4 files changed, 28 insertions(+), 14 deletions(-) diff --git a/server/resources/detail.html b/server/resources/detail.html index 3f8e2cd..2526dd6 100644 --- a/server/resources/detail.html +++ b/server/resources/detail.html @@ -16,10 +16,10 @@

fail2ban dashboar
-
-

Details for {{ .Jail.Name }}

-
-
+
+

Details for {{ .Jail.Name }}

+
+
{{ template "jailDetail" .Jail }}
diff --git a/server/resources/index.html b/server/resources/index.html index 1f324ae..ceb098a 100644 --- a/server/resources/index.html +++ b/server/resources/index.html @@ -18,7 +18,7 @@

fail2ban dashboar

Current jails

-
+
{{ range .Jails }} {{ template "jailCard" . }} {{ end }} diff --git a/server/resources/partial_jailcard.html b/server/resources/partial_jailcard.html index c18db47..5abac6f 100644 --- a/server/resources/partial_jailcard.html +++ b/server/resources/partial_jailcard.html @@ -1,6 +1,6 @@ - -
{{ .Name }}
-
+ +
{{ .Name }}
+
Banned
{{ .CurrentlyBanned }}
@@ -18,5 +18,5 @@
{{ .TotalFailed }}
-
+
\ No newline at end of file diff --git a/server/resources/partial_jaildetail.html b/server/resources/partial_jaildetail.html index 4c29b00..ce4c1b6 100644 --- a/server/resources/partial_jaildetail.html +++ b/server/resources/partial_jaildetail.html @@ -1,6 +1,20 @@ -
-
{{ .Name }}
-
{{ .BannedCount }}
-
failed {{ .CurrentlyFailed }} / {{ .TotalFailed }}
-
banned {{ .CurrentlyBanned }} / {{ .TotalBanned }}
+
+
{{ .Name }}
+
{{ .BannedCount }}
+
Currently banned
+
+
+
Currently Failed
+
{{ .CurrentlyFailed }}
+
Active failures
+
+
+
Total Failed
+
{{ .TotalFailed }}
+
All time
+
+
+
Total Banned
+
{{ .TotalBanned }}
+
All time
From 67d5b509845b21f0374011093d44a7b9d24a803b Mon Sep 17 00:00:00 2001 From: Simon Skoczylas Date: Sat, 7 Feb 2026 17:36:54 +0100 Subject: [PATCH 06/21] Improve UI --- server/resources/detail.html | 1 - server/resources/index.html | 1 - server/resources/partial_head.html | 8 +-- server/server.go | 94 ++++++++++++++---------------- 4 files changed, 49 insertions(+), 55 deletions(-) diff --git a/server/resources/detail.html b/server/resources/detail.html index 2526dd6..2876639 100644 --- a/server/resources/detail.html +++ b/server/resources/detail.html @@ -17,7 +17,6 @@

fail2ban dashboar

-

Details for {{ .Jail.Name }}

-

Current jails

{{ range .Jails }} {{ template "jailCard" . }} diff --git a/server/resources/partial_head.html b/server/resources/partial_head.html index 11d3ae0..88e66db 100644 --- a/server/resources/partial_head.html +++ b/server/resources/partial_head.html @@ -3,11 +3,11 @@ - - - + + + fail2ban dashboard - {{ .Version }} - + fail2ban dashboard - {{ .Version }} diff --git a/server/resources/partial_header.html b/server/resources/partial_header.html index 980b433..13fd28b 100644 --- a/server/resources/partial_header.html +++ b/server/resources/partial_header.html @@ -3,7 +3,7 @@

fail2ban dashboar

+ {{ $curBasePath := .BasePath }} {{ range .Jails }} + {{ template "jailCard" . }} + {{ end }}
diff --git a/server/resources/partial_jailcard.html b/server/resources/partial_jailcard.html index 73cfc18..eb2ada7 100644 --- a/server/resources/partial_jailcard.html +++ b/server/resources/partial_jailcard.html @@ -1,22 +1,20 @@ - -
{{ .Name }}
-
-
-
Banned
-
{{ .CurrentlyBanned }}
-
-
-
Failed
-
{{ .CurrentlyFailed }}
-
- - +
{{ .Name }}
+
+
+
Banned
+
{{ .CurrentlyBanned }}
-
-
\ No newline at end of file +
+
Failed
+
{{ .CurrentlyFailed }}
+
+ + +
+
\ No newline at end of file diff --git a/server/server.go b/server/server.go index 3025dde..3f6e7b0 100644 --- a/server/server.go +++ b/server/server.go @@ -199,7 +199,7 @@ func Serve(version string, fail2banVersion string, basePath string, trustProxyHe })) } - cleanedBasePath := cleanBasePath(basePath) + cleanedBasePath := path.Clean(basePath) dashboard := app.Group(cleanedBasePath) dashboard.Get("images/favicon.ico", func(c *fiber.Ctx) error { @@ -470,10 +470,6 @@ func firstNonEmpty(def string, vals ...string) string { return def } -func cleanBasePath(basePath string) string { - return path.Clean(basePath) -} - func cleanBasePathForTemplate(basePath string) string { if !strings.HasSuffix(basePath, "/") { basePath += "/"