]> git.ipfire.org Git - ipfire.org.git/commitdiff
dbl: Major refactor of the front page and "How To Use?"
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 8 Feb 2026 15:58:22 +0000 (15:58 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 8 Feb 2026 15:58:22 +0000 (15:58 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
17 files changed:
Makefile.am
src/static/img/adguard.svg [new file with mode: 0644]
src/static/img/bind.png [new file with mode: 0644]
src/static/img/knot.png [new file with mode: 0644]
src/static/img/opnsense.svg [new file with mode: 0644]
src/static/img/pfsense.png [new file with mode: 0644]
src/static/img/pi-hole.png [new file with mode: 0644]
src/static/img/powerdns.svg [new file with mode: 0644]
src/static/img/suricata.png [new file with mode: 0644]
src/static/img/ublock-origin.svg [new file with mode: 0644]
src/static/img/unbound.svg [new file with mode: 0644]
src/templates/base.html
src/templates/dbl/how-to-use.html [new file with mode: 0644]
src/templates/dbl/index.html
src/templates/dbl/lists/show.html
src/web/__init__.py
src/web/dbl.py

index 175cafde4eb4a08dcfb7444723a35b519839e6eb..102466f2b6021e3872b21ea4245b5785ba3a347a 100644 (file)
@@ -191,6 +191,7 @@ templates_blog_modules_DATA = \
 templates_blog_modulesdir = $(templates_blogdir)/modules
 
 templates_dbl_DATA = \
+       src/templates/dbl/how-to-use.html \
        src/templates/dbl/index.html \
        src/templates/dbl/search.html \
        src/templates/dbl/search-not-found.html
@@ -1129,6 +1130,7 @@ CLEANFILES += \
        $(static_fonts_DATA)
 
 static_img_DATA = \
+       src/static/img/adguard.svg \
        src/static/img/apple-touch-icon-192x192-precomposed.png \
        src/static/img/apple-touch-icon-180x180-precomposed.png \
        src/static/img/apple-touch-icon-152x152-precomposed.png \
@@ -1138,15 +1140,24 @@ static_img_DATA = \
        src/static/img/apple-touch-icon-72x72-precomposed.png \
        src/static/img/apple-touch-icon-60x60-precomposed.png \
        src/static/img/bash-logo.svg \
+       src/static/img/bind.png \
        src/static/img/debian-logo.svg \
        src/static/img/default-avatar.jpg \
        src/static/img/fdroid-logo.svg \
        src/static/img/ipfire-tux.png \
        src/static/img/iuse-not-found.png \
+       src/static/img/knot.png \
        src/static/img/kyberio-logo.svg \
        src/static/img/lightningwirelabs-logo.svg \
+       src/static/img/opnsense.svg \
+       src/static/img/pfsense.png \
+       src/static/img/pi-hole.png \
+       src/static/img/powerdns.svg \
        src/static/img/python-logo.svg \
-       src/static/img/tor.svg
+       src/static/img/suricata.png \
+       src/static/img/tor.svg \
+       src/static/img/ublock-origin.svg \
+       src/static/img/unbound.svg
 
 static_imgdir = $(staticdir)/img
 
diff --git a/src/static/img/adguard.svg b/src/static/img/adguard.svg
new file mode 100644 (file)
index 0000000..06dd3fd
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="80px" height="80px" viewBox="0 0 80 80" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch -->
+    <title>logo@2x</title>
+    <desc>Created with Sketch.</desc>
+    <g id="logo" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <rect id="Rectangle" fill="#FFFFFF" x="0" y="0" width="80" height="80" rx="20"></rect>
+        <g id="Group-10" transform="translate(12.000000, 12.000000)">
+            <g id="Group-9">
+                <g id="Group-8">
+                    <g id="Group-7">
+                        <path d="M28.2221276,0 C19.4007575,0 8.75997994,2.07442553 8.65485005e-06,6.64038298 C8.65485005e-06,16.501617 -0.120909272,41.0689362 28.2221276,57.855 C56.5657909,41.0689362 56.4454995,16.501617 56.4454995,6.64038298 C47.6849017,2.07442553 37.0441241,0 28.2221276,0 L28.2221276,0 Z" id="Path" fill="#68BC71"></path>
+                        <path d="M28.1932991,57.8379179 C-0.120827266,41.0522735 8.65485006e-06,16.4982725 8.65485006e-06,6.64038298 C8.75043947,2.07939831 19.3775821,0.00452145957 28.1932991,7.38217799e-06 L28.1932991,57.8379237 Z" id="Combined-Shape" fill="#67B279"></path>
+                    </g>
+                    <path d="M27.1926958,38.6027397 L44.2590846,15.6010416 C43.0084943,14.5986526 41.911548,15.3061181 41.3076915,15.8538333 L41.2856573,15.8555888 L27.0557264,30.6585285 L21.6942672,24.2064902 C19.1365123,21.2514028 15.6592758,23.5054616 14.8469876,24.1011604 L27.1926958,38.6027397" id="Fill-11" fill="#FFFFFF"></path>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/static/img/bind.png b/src/static/img/bind.png
new file mode 100644 (file)
index 0000000..4d3748f
Binary files /dev/null and b/src/static/img/bind.png differ
diff --git a/src/static/img/knot.png b/src/static/img/knot.png
new file mode 100644 (file)
index 0000000..49141e4
Binary files /dev/null and b/src/static/img/knot.png differ
diff --git a/src/static/img/opnsense.svg b/src/static/img/opnsense.svg
new file mode 100644 (file)
index 0000000..c406bf5
--- /dev/null
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="cvfy" x="652px" y="152px" width="600" height="119.8" version="1.1" viewBox="0 250 600 119.8" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xlink="http://www.w3.org/1999/xlink"><title>OPNsense logo</title><metadata><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title>OPNsense logo</dc:title></cc:Work></rdf:RDF></metadata>
+<title>OPNsense logo</title>
+<style type="text/css">
+       .st0{clip-path:url(#cvfb);fill:#898B8D;}
+       .st1{clip-path:url(#cvfb);fill:url(#cvfj);}
+       .st2{clip-path:url(#cvfb);fill:url(#cvfi);}
+       .st3{fill:#403F41;}
+       .st4{clip-path:url(#cvfa);fill:#898B8D;}
+       .st5{clip-path:url(#cvfa);fill:url(#cvfh);}
+       .st6{clip-path:url(#cvfa);fill:url(#cvfg);}
+       .st7{clip-path:url(#cvff);fill:#58595B;}
+       .st8{clip-path:url(#cvff);fill:url(#cvfr);}
+       .st9{clip-path:url(#cvfe);fill:#58595B;}
+       .st10{clip-path:url(#cvfe);fill:url(#cvfq);}
+       .st11{clip-path:url(#cvfd);fill:#58595B;}
+       .st12{clip-path:url(#cvfd);fill:url(#cvfp);}
+       .st13{clip-path:url(#cvfc);fill:#58595B;}
+       .st14{clip-path:url(#cvfc);fill:url(#cvfo);}
+       .st15{fill:url(#cvfn);}
+       .st16{fill:url(#cvfm);}
+       .st17{fill:url(#cvfl);}
+       .st18{fill:url(#cvfk);}
+       .st19{fill:#E24525;}
+       .st20{fill:#808183;}
+</style>
+<g transform="matrix(.9957 0 0 1 -29.69 -15.7)">
+       
+               <defs>
+                       <path id="cvfu" d="m38.8 284.1v-4.8c0-0.4 0.1-1.1 0.1-1.1l0.2-0.5v-0.2l0.2-0.4 0.1-0.1 0.1-0.2 0.1-0.1v-0.1l0.2-0.2v-0.1l0.7-0.7 0.2-0.1h0.1l0.3-0.2h0.3l0.6-0.3c0.4-0.1 0.7-0.1 1.1-0.1h94.6v9.2h9v-18.4h-103.6c-7.3 0-13.3 6.1-13.3 13.6v4.8z"/>
+               </defs>
+               <clipPath id="cvfb">
+                       <use width="100%" height="100%" xlink:href="#cvfu"/>
+               </clipPath>
+               <rect class="st0" x="30.2" y="264.7" width="117.1" height="12" clip-path="url(#cvfb)"/>
+               
+                       <linearGradient id="cvfj" x1="-2420" x2="-2400" y1="800.1" y2="800.1" gradientTransform="matrix(.1869 .3575 -.6751 .353 1133 856.1)" gradientUnits="userSpaceOnUse">
+                       <stop style="stop-color:#737373" offset="0"/>
+                       <stop style="stop-color:#333" offset="1"/>
+               </linearGradient>
+               <polygon class="st1" points="133.8 277 147 269.9 150.7 277.1 137.5 284.2" clip-path="url(#cvfb)" style="fill:url(#cvfj)"/>
+               
+                       <linearGradient id="cvfi" x1="-2368" x2="-2347" y1="2163" y2="2163" gradientTransform="matrix(-.1861 .3579 -.5495 -.2858 785 1739)" gradientUnits="userSpaceOnUse">
+                       <stop style="stop-color:#737373" offset="0"/>
+                       <stop style="stop-color:#333" offset="1"/>
+               </linearGradient>
+               <polygon class="st2" points="31.9 271.1 42.6 276.9 38.9 284.1 28.2 278.4" clip-path="url(#cvfb)" style="fill:url(#cvfi)"/>
+       
+       <rect class="st3" x="47.8" y="284.1" width="80.9" height="9.2"/>
+       <rect class="st3" x="47.8" y="358" width="80.9" height="9.2"/>
+       
+               <defs>
+                       <path id="cvft" d="m137.7 367.2v4.8c0 0.4-0.1 1.1-0.1 1.1l-0.2 0.5v0.2l-0.2 0.4-0.1 0.1-0.1 0.2-0.1 0.1v0.1l-0.2 0.2v0.1l-0.5 0.5h-0.1l-0.1 0.1-0.2 0.1-0.1 0.1-0.3 0.2h-0.3l-0.5 0.2c-0.4 0.1-0.7 0.1-1.1 0.1h-94.7v-9.2h-9v18.4h103.6c7.3 0 13.3-6.1 13.3-13.6v-4.8h-9z"/>
+               </defs>
+               <clipPath id="cvfa">
+                       <use width="100%" height="100%" xlink:href="#cvft"/>
+               </clipPath>
+               <rect class="st4" x="29.2" y="374.6" width="117.1" height="12" clip-path="url(#cvfa)"/>
+               
+                       <linearGradient id="cvfh" x1="1480" x2="1501" y1="2101" y2="2101" gradientTransform="matrix(-.1869 -.3575 .6751 -.353 -1106 1649)" gradientUnits="userSpaceOnUse">
+                       <stop style="stop-color:#737373" offset="0"/>
+                       <stop style="stop-color:#333" offset="1"/>
+               </linearGradient>
+               <polygon class="st5" points="42.7 374.4 29.5 381.5 25.8 374.2 39 367.1" clip-path="url(#cvfa)" style="fill:url(#cvfh)"/>
+               
+                       <linearGradient id="cvfg" x1="1880" x2="1900" y1="995.7" y2="995.7" gradientTransform="matrix(.1861 -.3579 .5495 .2858 -757.7 765.5)" gradientUnits="userSpaceOnUse">
+                       <stop style="stop-color:#737373" offset="0"/>
+                       <stop style="stop-color:#333" offset="1"/>
+               </linearGradient>
+               <polygon class="st6" points="144.7 380.2 133.9 374.4 137.6 367.2 148.4 372.9" clip-path="url(#cvfa)" style="fill:url(#cvfg)"/>
+       
+       
+               <defs>
+                       <rect id="cvfs" x="38.8" y="302.6" width="34.6" height="9.2"/>
+               </defs>
+               <clipPath id="cvff">
+                       <use width="100%" height="100%" xlink:href="#cvfs"/>
+               </clipPath>
+               <rect class="st7" x="38.8" y="302.6" width="34.6" height="9.2" clip-path="url(#cvff)"/>
+               
+                       <linearGradient id="cvfr" x1="2724" x2="2762" y1="2480" y2="2480" gradientTransform="matrix(-1.521 -1.021 3.14 1.519 -3559 -659.4)" gradientUnits="userSpaceOnUse">
+                       <stop style="stop-color:#58595B" offset=".107"/>
+                       <stop offset="1"/>
+               </linearGradient>
+               <polygon class="st8" points="69.7 319.2 38.4 302.4 42.1 295 73.5 311.8" clip-path="url(#cvff)" style="fill:url(#cvfr)"/>
+       
+       
+               <defs>
+                       <rect id="cvfx" x="103.1" y="302.6" width="34.6" height="9.2"/>
+               </defs>
+               <clipPath id="cvfe">
+                       <use width="100%" height="100%" xlink:href="#cvfx"/>
+               </clipPath>
+               <rect class="st9" x="103.1" y="302.6" width="34.6" height="9.2" clip-path="url(#cvfe)"/>
+               
+                       <linearGradient id="cvfq" x1="2370" x2="2408" y1="2242" y2="2242" gradientTransform="matrix(1.521 -1.021 -3.14 1.519 3527 -659.4)" gradientUnits="userSpaceOnUse">
+                       <stop style="stop-color:#58595B" offset=".107"/>
+                       <stop offset="1"/>
+               </linearGradient>
+               <polygon class="st10" points="106.8 319.2 138.2 302.4 134.4 295 103.1 311.8" clip-path="url(#cvfe)" style="fill:url(#cvfq)"/>
+       
+       
+               <defs>
+                       <rect id="cvfw" x="103.1" y="339.5" width="34.6" height="9.2"/>
+               </defs>
+               <clipPath id="cvfd">
+                       <use width="100%" height="100%" xlink:href="#cvfw"/>
+               </clipPath>
+               <rect class="st11" x="103.1" y="339.5" width="34.6" height="9.2" clip-path="url(#cvfd)"/>
+               
+                       <linearGradient id="cvfp" x1="-2721" x2="-2683" y1="-204.9" y2="-204.9" gradientTransform="matrix(1.521 1.021 -3.14 -1.519 3587 2791)" gradientUnits="userSpaceOnUse">
+                       <stop style="stop-color:#58595B" offset=".107"/>
+                       <stop offset="1"/>
+               </linearGradient>
+               <polygon class="st12" points="106.8 332.1 138.2 348.9 134.4 356.3 103.1 339.5" clip-path="url(#cvfd)" style="fill:url(#cvfp)"/>
+       
+       
+               <defs>
+                       <rect id="cvfv" x="38.8" y="339.5" width="34.6" height="9.2"/>
+               </defs>
+               <clipPath id="cvfc">
+                       <use width="100%" height="100%" xlink:href="#cvfv"/>
+               </clipPath>
+               <rect class="st13" x="38.8" y="339.5" width="34.6" height="9.2" clip-path="url(#cvfc)"/>
+               
+                       <linearGradient id="cvfo" x1="-2569" x2="-2530" y1="-102.7" y2="-102.7" gradientTransform="matrix(-1.521 1.021 3.14 -1.519 -3500 2791)" gradientUnits="userSpaceOnUse">
+                       <stop style="stop-color:#58595B" offset=".107"/>
+                       <stop offset="1"/>
+               </linearGradient>
+               <polygon class="st14" points="69.7 332.1 38.4 348.9 42.1 356.3 73.5 339.5" clip-path="url(#cvfc)" style="fill:url(#cvfo)"/>
+       
+       <linearGradient id="cvfn" x1="29.84" x2="73.4" y1="295.5" y2="295.5" gradientUnits="userSpaceOnUse">
+               <stop style="stop-color:#A6A8AB" offset=".2373"/>
+               <stop style="stop-color:#404040" offset="1"/>
+       </linearGradient>
+       <polygon class="st15" points="73.4 302.6 73.4 311.8 29.8 288.5 29.8 279.3" style="fill:url(#cvfn)"/>
+       
+               <linearGradient id="cvfm" x1="-287.9" x2="-244.3" y1="295.5" y2="295.5" gradientTransform="matrix(-1 0 0 1 -141.2 0)" gradientUnits="userSpaceOnUse">
+               <stop style="stop-color:#A6A8AB" offset=".2373"/>
+               <stop style="stop-color:#404040" offset="1"/>
+       </linearGradient>
+       <polygon class="st16" points="103.1 302.6 103.1 311.8 146.7 288.5 146.7 279.3" style="fill:url(#cvfm)"/>
+       
+               <linearGradient id="cvfl" x1="-119.4" x2="-75.84" y1="1846" y2="1846" gradientTransform="rotate(180 13.64 1101)" gradientUnits="userSpaceOnUse">
+               <stop style="stop-color:#A6A8AB" offset=".2373"/>
+               <stop style="stop-color:#404040" offset="1"/>
+       </linearGradient>
+       <polygon class="st17" points="103.1 348.8 103.1 339.5 146.7 362.8 146.7 372.1" style="fill:url(#cvfl)"/>
+       
+               <linearGradient id="cvfk" x1="-138.6" x2="-95.07" y1="1846" y2="1846" gradientTransform="matrix(1 0 0 -1 168.5 2202)" gradientUnits="userSpaceOnUse">
+               <stop style="stop-color:#A6A8AB" offset=".2373"/>
+               <stop style="stop-color:#404040" offset="1"/>
+       </linearGradient>
+       <polygon class="st18" points="73.4 348.8 73.4 339.5 29.8 362.8 29.8 372.1" style="fill:url(#cvfk)"/>
+       <polygon class="st19" points="103.1 330.3 103.1 330.3 103.1 330.3 103.1 330.3 128.7 344 128.7 334.7 120.4 330.3 146.7 330.3 146.7 321 120.4 321 128.7 316.6 128.7 307.4 103.1 321"/>
+       <polygon class="st19" points="47.8 344 73.4 330.3 73.4 330.3 73.4 330.3 73.4 330.3 73.4 321 73.4 321 73.4 321 47.8 307.4 47.8 316.6 56.2 321 29.8 321 29.8 330.3 56.1 330.3 47.8 334.7"/>
+</g>
+<path class="st20" d="m208.9 257.4h-50.18c-7.368 0-13.34 6-13.34 13.4v90.6h54.76c7.368 0 13.34-6 13.34-13.5v-90.6h-4.58zm107 104.4h-9.061v-90.5c0-3.7 1.494-7.1 3.883-9.5s5.775-3.9 9.459-3.9h54.67v90.5c0 11.8-9.459 13.7-18.62 13.7-1.494 0-3.385-0.1-5.178-0.2-1.095-0.1-2.191-0.1-3.485-0.1v-9c0.8962 0 2.29 0.1 3.784 0.1 1.394 0.1 2.888 0.1 4.779 0.1 4.68 0 9.559-0.6 9.559-4.6v-81.5h-46.2c-0.7966 0.8-1.294 1.9-1.294 3.1m-30.47-12.5h-47.6c-6.87 0-12.55 5.6-12.55 12.6v91.2h9.061v-41.2h43.02c6.87 0 12.55-5.7 12.55-12.6v-50zm-47.6 9.1h43.02v40.8 0.5 1l-0.0996 0.1v0.1l-0.0996 0.1v0.2l-0.1992 0.2-0.0996 0.2-0.1992 0.2-0.1991 0.1-0.1992 0.2h-0.0996l-0.1992 0.1-0.0996 0.1h-0.0996c-0.0996 0-0.1992 0.1-0.2987 0.1h-0.498-0.4979-43.02v-40.8-0.5-0.5l0.0996-0.2v-0.2l0.0996-0.1 0.0996-0.2v-0.1l0.8964-0.9h0.1992l0.0996-0.1h0.0996l0.0996-0.1h1.096c-0.1991-0.2 0-0.3 0.0996-0.3zm43.02 41.4m-0.0996 0.1m0 0.1m0 0.1m0 0.1m0 0.1m-0.0996 0m0 0.1m0 0.1m-0.0996 0.1m0 0.1m-0.0996 0.1m0 0.1m-0.0996 0.2m-0.0996 0.1m-0.0996 0.2m-0.0996 0.1m-0.5974 0.5m-0.0996 0.1m-0.1991 0.1m-0.0996 0.1m-0.2987 0.1m-0.4979 0.2m-0.1992 0m-0.0996 0.1m-43.51-41.3m0-0.1m0.0996-0.2m0-0.1m0.1992-0.5m0.0996-0.3m0.0996-0.1m0-0.1m0.0996-0.1m0.1992-0.3m0.0996 0m0.2987-0.3m0.0996-0.1m0.0996-0.1m0.1992-0.1m0.0996-0.1m0.0996 0m0-0.1m0.1992 0m0.0996-0.1m0.4979-0.2m0.0996 0m0.0996 0m0.0996 0m-80.95-0.2h45.6v81.5c0 0.4-0.0996 1.1-0.0996 1.1l-0.1991 0.5v0.2l-0.1992 0.3-0.0996 0.1-0.0996 0.2-0.3984 0.4v0.1l-0.498 0.5h-0.0996l-0.0996 0.1-0.1992 0.1-0.0996 0.1-0.2987 0.2h-0.2988l-0.4979 0.2c-0.3983 0.1-0.697 0.1-1.095 0.1h-45.7v-81.5c0-0.4 0.0996-1.1 0.0996-1.1l0.1991-0.5v-0.2l0.1992-0.3 0.0996-0.1 0.0996-0.2 0.3984-0.4v-0.1l0.498-0.5h0.0996l0.0996-0.1 0.1991-0.1 0.0996-0.1 0.2987-0.2h0.2988l0.4979-0.2c0.3983-0.1 0.7966-0.1 1.195-0.1zm45.31 83.1m0 0.1m-0.0996 0m-0.1991 0.4m0 0.1m-0.0996 0.2m-0.0996 0.1m-0.0996 0.1m0 0.1m-0.0996 0m-0.0996 0.2m-0.0996 0m-0.0996 0.2m-0.0996 0m-0.1992 0.2m-0.0996 0.1m-0.0996 0.1m-0.0996 0.1m-0.1992 0.1m-0.0996 0m-0.3983 0.2m-0.5974 0.3m-46.5-83m0.0996-0.1m0-0.1m0.1992-0.3m0-0.1m0.0996-0.2m0.0996-0.1m0.0996-0.1m0.0996-0.1m0.1991-0.2m0-0.1m0.1992-0.1m0-0.1m0.1991-0.1m0-0.1m0.0996 0m0.0996-0.1m0.0996-0.1m0.1992-0.1m0.0996 0m0.3983-0.3m0.697-0.2m431.5 22c1.394 0 2.788 0.4 4.082 1.1 1.294 0.7 2.39 1.7 3.087 3.1 0.697 1.3 1.095 2.7 1.095 4.2 0 1.4-0.3983 2.8-1.095 4.1-0.697 1.3-1.792 2.4-3.087 3.1-1.294 0.7-2.688 1.1-4.182 1.1-1.394 0-2.788-0.4-4.182-1.1-1.294-0.7-2.39-1.8-3.087-3.1-0.697-1.3-1.095-2.7-1.095-4.1s0.3983-2.8 1.095-4.2c0.697-1.3 1.792-2.4 3.087-3.1 1.494-0.7 2.888-1.1 4.282-1.1zm0 1.4c-1.195 0-2.29 0.3-3.385 0.9s-1.991 1.5-2.589 2.6c-0.5974 1.1-0.8962 2.3-0.8962 3.5s0.2987 2.4 0.8962 3.5c0.5974 1.1 1.494 2 2.589 2.6s2.29 0.9 3.485 0.9 2.39-0.3 3.485-0.9c1.095-0.6 1.991-1.5 2.589-2.6 0.5974-1.1 0.8962-2.3 0.8962-3.5s-0.2987-2.4-0.8962-3.5c-0.5974-1.1-1.494-2-2.589-2.6-1.294-0.6-2.39-0.9-3.585-0.9zm3.385 9.8c-0.3983-0.8-0.9957-1.4-1.294-1.7-0.1992-0.2-0.3983-0.4-0.7966-0.5 0.7966-0.1 1.394-0.3 1.892-0.8 0.4979-0.5 0.697-1.1 0.697-1.7 0-0.5-0.0996-0.9-0.3983-1.3-0.2987-0.4-0.697-0.7-1.095-0.9-0.4979-0.2-1.195-0.2-2.29-0.2h-3.087v9h1.394v-3.8h0.8962c0.4979 0 0.8962 0.2 1.095 0.4 0.3983 0.3 1.095 1.1 1.394 1.8 0.2987 0.5 0.4979 1.5 0.4979 1.5h1.792c-0.0996-0.1-0.2987-1.1-0.697-1.8zm-3.286-3.3h-1.792v-2.7h1.593c0.697 0 1.195 0.1 1.494 0.2s0.4979 0.3 0.5974 0.5c0.0996 0.2 0.1992 0.4 0.1992 0.7 0 0.4-0.1992 0.7-0.4979 1-0.1992 0.1-0.697 0.3-1.593 0.3z" style="stroke-width:.9979"/>
+<path class="st19" d="m418.7 324.3h-14.54v-3c0-2.5-0.0996-4.1-0.3983-4.8-0.2987-0.7-0.9957-1-2.091-1-0.8962 0-1.593 0.3-2.091 0.9-0.4979 0.6-0.697 1.5-0.697 2.8 0 1.7 0.0996 2.9 0.2987 3.7 0.1991 0.8 0.8962 1.6 2.091 2.6 1.095 0.9 3.485 2.3 7.07 4.1 4.779 2.3 7.866 4.6 9.36 6.6 1.494 2.1 2.191 5.1 2.191 9 0 4.4-0.5974 7.8-1.693 10-1.095 2.2-3.087 4-5.676 5.2-2.688 1.2-5.875 1.8-9.659 1.8-4.182 0-7.767-0.7-10.75-2s-4.979-3.1-6.173-5.3c-1.095-2.2-1.693-5.6-1.693-10.1v-2.6h14.64v3.4c0 2.9 0.1991 4.8 0.4979 5.7 0.3983 0.9 1.095 1.3 2.191 1.3 1.195 0 1.991-0.3 2.39-0.9 0.4979-0.6 0.697-1.8 0.697-3.7 0-2.6-0.2987-4.2-0.8962-4.9-0.5974-0.7-3.784-2.6-9.559-5.8-4.779-2.7-7.767-5.2-8.862-7.4s-1.593-4.9-1.593-7.9c0-4.3 0.5974-7.5 1.693-9.6 1.095-2.1 3.087-3.7 5.775-4.8 2.688-1.1 5.875-1.7 9.459-1.7s6.671 0.5 9.161 1.4 4.481 2.1 5.775 3.6 2.191 2.9 2.39 4.2c0.2987 1.3 0.3983 3.3 0.3983 6v3.2zm43.02 10.7h-21.41v11.8c0 2.5 0.1992 4 0.4979 4.8 0.3983 0.7 0.9957 1.1 2.091 1.1 1.294 0 2.091-0.5 2.489-1.4 0.3983-1 0.5974-2.8 0.5974-5.5v-6.8h15.63v3.7c0 3.4-0.1991 5.9-0.5974 7.7s-1.394 3.7-2.987 5.8c-1.494 2.1-3.485 3.6-5.875 4.6s-5.377 1.5-8.962 1.5c-3.485 0-6.572-0.5-9.26-1.5-2.688-1-4.68-2.4-6.174-4.1-1.494-1.8-2.489-3.7-3.087-5.8-0.5974-2.1-0.8962-5.2-0.8962-9.2v-15.8c0-4.7 0.5974-8.5 1.892-11.2s3.385-4.8 6.273-6.3 6.273-2.2 10.06-2.2c4.58 0 8.464 0.9 11.45 2.6 2.987 1.8 5.078 4.1 6.373 7 1.195 2.9 1.792 7 1.792 12.2v7zm-16.43-8.8v-4c0-2.8-0.1992-4.6-0.4979-5.4-0.2987-0.8-0.8962-1.2-1.892-1.2-1.195 0-1.892 0.4-2.191 1-0.2987 0.7-0.3983 2.6-0.3983 5.6v4zm38.43-19.3-0.2987 4.1c1.693-2 2.489-2.7 4.182-3.7s3.883-1.4 6.173-1.4c2.788 0 5.078 0.7 6.97 2 1.792 1.3 2.987 3 3.485 5.1 0.4979 2 0.7966 5.4 0.7966 10.2v38.1h-16.43v-37.6c0-3.7-0.0996-6-0.3983-6.8-0.1991-0.8-0.8962-1.2-2.091-1.2s-1.892 0.5-2.191 1.4c-0.2987 1-0.3983 3.5-0.3983 7.6v36.7h-16.43v-54.3h16.63zm60.54 17.4h-14.54v-3c0-2.5-0.0996-4.1-0.3983-4.8-0.2987-0.7-0.9957-1-2.091-1-0.8962 0-1.593 0.3-2.091 0.9s-0.697 1.5-0.697 2.8c0 1.7 0.0996 2.9 0.2987 3.7 0.1991 0.8 0.8962 1.6 2.091 2.6 1.095 0.9 3.485 2.3 7.07 4.1 4.779 2.3 7.866 4.6 9.36 6.6 1.494 2.1 2.191 5.1 2.191 9 0 4.4-0.5974 7.8-1.693 10s-3.087 4-5.676 5.2c-2.688 1.2-5.875 1.8-9.659 1.8-4.182 0-7.767-0.7-10.75-2-2.987-1.3-4.979-3.1-6.173-5.3-1.095-2.2-1.693-5.6-1.693-10.1v-2.6h14.64v3.4c0 2.9 0.1992 4.8 0.4979 5.7 0.3983 0.9 1.095 1.3 2.191 1.3 1.195 0 1.991-0.3 2.39-0.9 0.4979-0.6 0.697-1.8 0.697-3.7 0-2.6-0.2987-4.2-0.8962-4.9-0.5974-0.7-3.784-2.6-9.559-5.8-4.779-2.7-7.767-5.2-8.862-7.4-1.095-2.2-1.593-4.9-1.593-7.9 0-4.3 0.5974-7.5 1.693-9.6 1.095-2.1 3.087-3.7 5.775-4.8s5.875-1.7 9.459-1.7c3.585 0 6.671 0.5 9.161 1.4s4.481 2.1 5.775 3.6c1.294 1.5 2.191 2.9 2.39 4.2 0.2987 1.3 0.3983 3.3 0.3983 6v3.2zm42.92 10.7h-21.31v11.8c0 2.5 0.1991 4 0.4979 4.8 0.3983 0.7 0.9957 1.1 2.091 1.1 1.294 0 2.091-0.5 2.489-1.4 0.3983-1 0.5974-2.8 0.5974-5.5v-6.8h15.63v3.7c0 3.4-0.1992 5.9-0.5974 7.7s-1.394 3.7-2.987 5.8c-1.494 2.1-3.485 3.6-5.875 4.6s-5.377 1.5-8.962 1.5c-3.485 0-6.572-0.5-9.26-1.5s-4.68-2.4-6.173-4.1c-1.494-1.8-2.489-3.7-3.087-5.8s-0.8962-5.2-0.8962-9.2v-15.8c0-4.7 0.5974-8.5 1.892-11.2 1.294-2.7 3.385-4.8 6.273-6.3s6.273-2.2 10.06-2.2c4.58 0 8.464 0.9 11.45 2.6 2.987 1.8 5.078 4.1 6.373 7 1.195 2.9 1.792 7 1.792 12.2zm-16.43-8.8v-4c0-2.8-0.1992-4.6-0.4979-5.4-0.2987-0.8-0.8962-1.2-1.892-1.2-1.195 0-1.892 0.4-2.191 1-0.2987 0.7-0.3983 2.6-0.3983 5.6v4z" style="stroke-width:.9979"/>
+</svg>
diff --git a/src/static/img/pfsense.png b/src/static/img/pfsense.png
new file mode 100644 (file)
index 0000000..9e9332a
Binary files /dev/null and b/src/static/img/pfsense.png differ
diff --git a/src/static/img/pi-hole.png b/src/static/img/pi-hole.png
new file mode 100644 (file)
index 0000000..7f3b65a
Binary files /dev/null and b/src/static/img/pi-hole.png differ
diff --git a/src/static/img/powerdns.svg b/src/static/img/powerdns.svg
new file mode 100644 (file)
index 0000000..9b0b92d
--- /dev/null
@@ -0,0 +1,241 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="159.92409mm"
+   height="21.657249mm"
+   viewBox="0 0 159.92409 21.657249"
+   version="1.1"
+   id="svg1"
+   inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
+   sodipodi:docname="Logo of PowerDNS.svg"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <sodipodi:namedview
+     id="namedview1"
+     pagecolor="#ffffff"
+     bordercolor="#000000"
+     borderopacity="0.25"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     inkscape:document-units="mm"
+     inkscape:zoom="0.7349537"
+     inkscape:cx="338.11654"
+     inkscape:cy="331.31339"
+     inkscape:window-width="1870"
+     inkscape:window-height="1011"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1" />
+  <defs
+     id="defs1">
+    <clipPath
+       id="clip-0">
+      <path
+         clip-rule="nonzero"
+         d="m 429,71.113281 h 30 V 100 h -30 z m 0,0"
+         id="path72" />
+    </clipPath>
+    <clipPath
+       id="clip-1">
+      <path
+         clip-rule="nonzero"
+         d="m 429,104 h 30 v 28.50391 h -30 z m 0,0"
+         id="path73" />
+    </clipPath>
+    <clipPath
+       id="clip-2">
+      <path
+         clip-rule="nonzero"
+         d="m 462,71.113281 h 30 V 100 h -30 z m 0,0"
+         id="path74" />
+    </clipPath>
+    <clipPath
+       id="clip-3">
+      <path
+         clip-rule="nonzero"
+         d="m 462,104 h 30 v 28.50391 h -30 z m 0,0"
+         id="path75" />
+    </clipPath>
+    <clipPath
+       id="clip-4">
+      <path
+         clip-rule="nonzero"
+         d="m 495,71.113281 h 29.19531 V 100 H 495 Z m 0,0"
+         id="path76" />
+    </clipPath>
+    <clipPath
+       id="clip-5">
+      <path
+         clip-rule="nonzero"
+         d="m 495,104 h 29.19531 v 28.50391 H 495 Z m 0,0"
+         id="path77" />
+    </clipPath>
+    <clipPath
+       id="clip-6">
+      <path
+         clip-rule="nonzero"
+         d="M 70.867188,72 H 109 v 60 H 70.867188 Z m 0,0"
+         id="path78" />
+    </clipPath>
+    <clipPath
+       id="clip-7">
+      <path
+         clip-rule="nonzero"
+         d="m 112,71.113281 h 44 v 61.390629 h -44 z m 0,0"
+         id="path79" />
+    </clipPath>
+    <clipPath
+       id="clip-8">
+      <path
+         clip-rule="nonzero"
+         d="m 394,71.113281 h 32 v 61.390629 h -32 z m 0,0"
+         id="path80" />
+    </clipPath>
+  </defs>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-15.345417,-60.812495)">
+    <g
+       clip-path="url(#clip-0)"
+       id="g81"
+       transform="matrix(0.35277777,0,0,0.35277777,-9.654952,35.72531)">
+      <path
+         fill-rule="nonzero"
+         fill="#e96619"
+         fill-opacity="1"
+         d="m 458.08594,85.28125 c 0,7.824219 -6.34375,14.167969 -14.16797,14.167969 -7.82422,0 -14.16797,-6.34375 -14.16797,-14.167969 0,-7.824219 6.34375,-14.167969 14.16797,-14.167969 7.82422,0 14.16797,6.34375 14.16797,14.167969"
+         id="path81" />
+    </g>
+    <g
+       clip-path="url(#clip-1)"
+       id="g82"
+       transform="matrix(0.35277777,0,0,0.35277777,-9.654952,35.72531)">
+      <path
+         fill-rule="nonzero"
+         fill="#e96619"
+         fill-opacity="1"
+         d="m 458.08594,118.33594 c 0,7.82422 -6.34375,14.16797 -14.16797,14.16797 -7.82422,0 -14.16797,-6.34375 -14.16797,-14.16797 0,-7.82422 6.34375,-14.16406 14.16797,-14.16406 7.82422,0 14.16797,6.33984 14.16797,14.16406"
+         id="path82" />
+    </g>
+    <g
+       clip-path="url(#clip-2)"
+       id="g83"
+       transform="matrix(0.35277777,0,0,0.35277777,-9.654952,35.72531)">
+      <path
+         fill-rule="nonzero"
+         fill="#e96619"
+         fill-opacity="1"
+         d="m 491.13672,85.28125 c 0,7.824219 -6.33985,14.167969 -14.16406,14.167969 -7.82422,0 -14.16407,-6.34375 -14.16407,-14.167969 0,-7.824219 6.33985,-14.167969 14.16407,-14.167969 7.82421,0 14.16406,6.34375 14.16406,14.167969"
+         id="path83" />
+    </g>
+    <g
+       clip-path="url(#clip-3)"
+       id="g84"
+       transform="matrix(0.35277777,0,0,0.35277777,-9.654952,35.72531)">
+      <path
+         fill-rule="nonzero"
+         fill="#e96619"
+         fill-opacity="1"
+         d="m 491.13672,118.33594 c 0,7.82422 -6.33985,14.16797 -14.16406,14.16797 -7.82422,0 -14.16407,-6.34375 -14.16407,-14.16797 0,-7.82422 6.33985,-14.16406 14.16407,-14.16406 7.82421,0 14.16406,6.33984 14.16406,14.16406"
+         id="path84" />
+    </g>
+    <g
+       clip-path="url(#clip-4)"
+       id="g85"
+       transform="matrix(0.35277777,0,0,0.35277777,-9.654952,35.72531)">
+      <path
+         fill-rule="nonzero"
+         fill="#e96619"
+         fill-opacity="1"
+         d="m 524.19531,85.28125 c 0,7.824219 -6.34375,14.167969 -14.16406,14.167969 -7.82813,0 -14.17188,-6.34375 -14.17188,-14.167969 0,-7.824219 6.34375,-14.167969 14.17188,-14.167969 7.82031,0 14.16406,6.34375 14.16406,14.167969"
+         id="path85" />
+    </g>
+    <g
+       clip-path="url(#clip-5)"
+       id="g86"
+       transform="matrix(0.35277777,0,0,0.35277777,-9.654952,35.72531)">
+      <path
+         fill-rule="nonzero"
+         fill="#e96619"
+         fill-opacity="1"
+         d="m 524.19531,118.33594 c 0,7.82422 -6.34375,14.16797 -14.16406,14.16797 -7.82813,0 -14.17188,-6.34375 -14.17188,-14.16797 0,-7.82422 6.34375,-14.16406 14.17188,-14.16406 7.82031,0 14.16406,6.33984 14.16406,14.16406"
+         id="path86" />
+    </g>
+    <g
+       clip-path="url(#clip-6)"
+       id="g87"
+       transform="matrix(0.35277777,0,0,0.35277777,-9.654952,35.72531)">
+      <path
+         fill-rule="nonzero"
+         fill="#5a5758"
+         fill-opacity="1"
+         d="M 86.328125,131.42187 H 70.867188 V 72.199219 h 14.957031 c 7.457031,0 13.003906,1.574219 16.632811,4.730469 4.2461,3.699218 6.3711,8.847656 6.3711,15.441406 0,4.3125 -0.89454,8.058596 -2.6836,11.238286 -2.375,4.2539 -6.08984,6.88281 -11.14453,7.89843 -1.703125,0.34375 -3.785156,0.51953 -6.242188,0.51953 -0.476562,0 -1.285156,-0.0156 -2.429687,-0.043 v 19.43749 m 0,-32.714839 c 0.332031,0.03125 0.570313,0.04297 0.710937,0.04297 1.480469,0 2.78125,-0.417969 3.898438,-1.257812 1.507812,-1.097657 2.261719,-2.890626 2.261719,-5.378907 0,-2.140625 -0.589844,-3.875 -1.761719,-5.207031 -1.03125,-1.1875 -2.375,-1.777344 -4.019531,-1.777344 -0.28125,0 -0.644531,0.01172 -1.089844,0.04297 v 13.535156"
+         id="path87" />
+    </g>
+    <g
+       clip-path="url(#clip-7)"
+       id="g88"
+       transform="matrix(0.35277777,0,0,0.35277777,-9.654952,35.72531)">
+      <path
+         fill-rule="nonzero"
+         fill="#5a5758"
+         fill-opacity="1"
+         d="m 134.08594,71.113281 c 4.60937,0 8.67187,1.503907 12.1914,4.511719 6.25782,5.351562 9.38672,14.144531 9.38672,26.37891 0,9.57422 -2.17969,17.19531 -6.53906,22.86328 -1.84375,2.40234 -4.0625,4.28125 -6.66016,5.64062 -2.59765,1.33203 -5.33593,1.9961 -8.21093,1.9961 -4.21875,0 -8.15625,-1.3711 -11.81641,-4.1211 -6.84375,-5.17578 -10.26562,-14.1875 -10.26562,-27.02734 0,-9.750001 2.25,-17.312501 6.74609,-22.691408 4.1875,-5.035156 9.24609,-7.550781 15.16797,-7.550781 m 0,14.925781 c -1.59375,0 -2.89453,1.070313 -3.89844,3.210938 -1.33984,2.777344 -2.01172,6.957031 -2.01172,12.53906 0,6.12891 0.71094,10.51172 2.13672,13.14453 0.92187,1.73438 2.09766,2.60157 3.51953,2.60157 1.39844,0 2.61328,-0.91016 3.64844,-2.73047 1.42187,-2.48828 2.13672,-6.71094 2.13672,-12.67188 0,-10.730466 -1.84375,-16.093748 -5.53125,-16.093748"
+         id="path88" />
+    </g>
+    <path
+       fill-rule="nonzero"
+       fill="#5a5758"
+       fill-opacity="1"
+       d="M 63.972249,82.08802 H 58.7109 L 56.670024,69.44453 55.0591,82.08802 H 49.752274 L 45.259868,61.19559 h 5.379861 l 1.788693,12.64212 1.892049,-12.64212 h 4.68533 l 2.054652,12.79508 1.685343,-12.79508 h 5.321984 l -4.095531,20.89243"
+       id="path89"
+       style="stroke-width:0.352778" />
+    <path
+       fill-rule="nonzero"
+       fill="#5a5758"
+       fill-opacity="1"
+       d="M 69.491291,82.08802 V 61.19559 h 10.124447 v 4.91271 h -4.67155 v 3.04546 h 4.198884 v 4.72943 h -4.198884 v 3.18326 h 4.67155 v 5.02157 H 69.491291"
+       id="path90"
+       style="stroke-width:0.352778" />
+    <path
+       fill-rule="nonzero"
+       fill="#5a5758"
+       fill-opacity="1"
+       d="m 96.678607,82.08802 h -5.898003 l -2.99999,-8.58655 v 8.58655 H 82.326338 V 61.19559 h 5.586567 c 2.463934,0 4.302234,0.50023 5.513532,1.4993 0.740005,0.61185 1.310513,1.39734 1.715657,2.35783 0.403765,0.95911 0.604958,1.99402 0.604958,3.1061 0,2.53145 -1.03904,4.27605 -3.118499,5.23516 z M 87.780614,70.85288 c 0.14745,0.011 0.271473,0.0152 0.369316,0.0152 0.650434,0 1.168576,-0.24391 1.551668,-0.73449 0.424437,-0.53055 0.635279,-1.16307 0.635279,-1.89756 0,-1.16307 -0.457511,-1.89756 -1.373908,-2.20349 -0.275607,-0.0923 -0.669723,-0.13918 -1.182355,-0.13918 v 4.95956"
+       id="path91"
+       style="stroke-width:0.352778" />
+    <path
+       fill-rule="nonzero"
+       fill="#5a5758"
+       fill-opacity="1"
+       d="M 98.107632,82.08802 V 61.19559 h 4.714268 c 2.9366,0 5.18831,0.91777 6.75514,2.7547 1.65641,1.9389 2.48323,4.5048 2.48323,7.6991 0,3.46852 -0.83234,6.14742 -2.49701,8.03534 -0.90675,1.01975 -2.03123,1.71428 -3.37068,2.08083 -0.79788,0.21498 -1.79282,0.32246 -2.98621,0.32246 z m 5.454278,-5.05188 c 1.9513,-0.0909 2.92695,-1.83141 2.92695,-5.21863 0,-2.27514 -0.46302,-3.89709 -1.39044,-4.86723 -0.33486,-0.34727 -0.84749,-0.52504 -1.53651,-0.53606 v 10.62192"
+       id="path92"
+       style="stroke-width:0.352778" />
+    <path
+       fill-rule="nonzero"
+       fill="#5a5758"
+       fill-opacity="1"
+       d="M 113.82278,82.08802 V 61.19559 h 5.20347 l 3.79787,10.91268 V 61.19559 h 5.20348 v 20.89243 h -5.20348 l -3.79787,-10.98985 v 10.98985 h -5.20347"
+       id="path93"
+       style="stroke-width:0.352778" />
+    <g
+       clip-path="url(#clip-8)"
+       id="g94"
+       transform="matrix(0.35277777,0,0,0.35277777,-9.654952,35.72531)">
+      <path
+         fill-rule="nonzero"
+         fill="#5a5758"
+         fill-opacity="1"
+         d="M 395.15625,129.94531 V 111.375 c 3.04297,4.3125 6.32422,6.46484 9.84375,6.46484 1.34375,0 2.46094,-0.39062 3.35156,-1.17187 0.78516,-0.69141 1.17578,-1.58984 1.17578,-2.6875 0,-1.35938 -0.6289,-2.64844 -1.88672,-3.86328 -0.27734,-0.26172 -1.39843,-1.1836 -3.35156,-2.77735 -2.40234,-1.9375 -4.25781,-3.75781 -5.57422,-5.46484 -2.51172,-3.296875 -3.76953,-7.074219 -3.76953,-11.324219 0,-3.730469 0.94922,-7.289062 2.84766,-10.671875 3.29687,-5.84375 8.14453,-8.765625 14.53906,-8.765625 3.66016,0 7.36328,1.011719 11.10547,3.039063 v 18.132812 c -0.94922,-1.558594 -2.02734,-2.863281 -3.22656,-3.902344 -2.01172,-1.765624 -3.95313,-2.648437 -5.82422,-2.648437 -1.45313,0 -2.58203,0.535156 -3.39453,1.605469 -0.47266,0.609375 -0.71094,1.257812 -0.71094,1.953125 0,1.214843 0.71094,2.5 2.13672,3.863281 0.30859,0.316406 1.46484,1.226562 3.47656,2.730469 2.03906,1.503906 3.80078,3.152343 5.28125,4.949221 2.57031,3.03515 3.85547,6.88281 3.85547,11.53906 0,5.89844 -1.73438,10.73047 -5.19922,14.48828 -3.46094,3.76172 -7.79297,5.64063 -12.98828,5.64063 -3.82813,0 -7.72266,-0.85157 -11.6875,-2.5586"
+         id="path94" />
+    </g>
+  </g>
+</svg>
diff --git a/src/static/img/suricata.png b/src/static/img/suricata.png
new file mode 100644 (file)
index 0000000..c20f9dd
Binary files /dev/null and b/src/static/img/suricata.png differ
diff --git a/src/static/img/ublock-origin.svg b/src/static/img/ublock-origin.svg
new file mode 100644 (file)
index 0000000..e6b7ff9
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
+<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 128 128" height="128" width="128">\r
+  <g style="display:inline;opacity:1">\r
+    <g style="fill:#800000;fill-opacity:1;stroke:#ffffff;stroke-width:1.62100744;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" transform="matrix(0.6778654,0,0,0.56141828,-241.07537,-247.27712)"/>\r
+    <g transform="matrix(-0.6945203,0,0,0.56109687,375.02964,-247.42947)" style="fill:#800000;fill-opacity:1;stroke:#ffffff;stroke-width:1.60191178000000001;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;stroke-linejoin:round">\r
+      <path d="m 447.83376,669.09921 c -80.63119,-57.03115 -80.63119,-57.03115 -80.63119,-199.60903 34.55623,0 46.07497,0 80.63119,-28.51558 m 0,228.12461 c 80.6312,-57.03115 80.6312,-57.03115 80.6312,-199.60903 -34.55623,0 -46.07497,0 -80.6312,-28.51558" style="fill:#800000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.60191178;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>\r
+    </g>\r
+  </g>\r
+  <g transform="translate(-17.872548,-17.32535)" style="display:inline">\r
+    <ellipse transform="matrix(1.3333335,0,0,1.3333334,-42.290862,-31.108461)" ry="12" rx="11.999999" cy="81.325356" cx="102.12254" style="fill:none;stroke:#ffffff;stroke-width:5.99999952;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;"/>\r
+    <g style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1.99999996999999996;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" transform="scale(1.0018026,0.99820067)">\r
+      <path d="m 81.72523,81.471945 c 0,11.019828 -4.991003,16.028841 -15.97121,16.028841 -10.980207,0 -15.97121,-5.009013 -15.97121,-16.028841 l 0,-24.043262 7.985605,0 0,24.043262 c 0,7.012618 0.9982,8.014421 7.985605,8.014421 6.987404,0 7.985605,-1.001803 7.985605,-8.014421 l 0,-24.043262 7.985605,0 z" style="fill:#ffffff;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;"/>\r
+    </g>\r
+  </g>\r
+</svg>
\ No newline at end of file
diff --git a/src/static/img/unbound.svg b/src/static/img/unbound.svg
new file mode 100644 (file)
index 0000000..d303338
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="669px" height="153px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"><g><g><path d="M87.5,6.548l0,86.4l-29.5,17c-0.597,0.299 -1.303,0.299 -1.9,0l-29.5,-17l0,-86.4l-20.9,12.1c-3.528,2.042 -5.706,5.824 -5.7,9.9l0,86.4c0.021,4.07 2.191,7.839 5.7,9.9l45.7,26.4c3.533,1.998 7.867,1.998 11.4,0l45.7,-26.4c3.528,-2.042 5.706,-5.824 5.7,-9.9l0,-86.4c-0.021,-4.07 -2.191,-7.839 -5.7,-9.9l-21,-12.1Z" style="fill:#2d2e83;fill-rule:nonzero;"/><path d="M87.5,6.548l0,86.4l-29.5,17c-0.597,0.299 -1.303,0.299 -1.9,0l-29.5,-17l0,-86.4l-20.9,12.1c-3.528,2.042 -5.706,5.824 -5.7,9.9l0,86.4c0.021,4.07 2.191,7.839 5.7,9.9l45.7,26.4c3.533,1.998 7.867,1.998 11.4,0l45.7,-26.4c3.528,-2.042 5.706,-5.824 5.7,-9.9l0,-86.4c-0.021,-4.07 -2.191,-7.839 -5.7,-9.9l-21,-12.1Z" style="fill:url(#_Linear1);fill-rule:nonzero;"/><path d="M114.2,28.548c-0.021,-4.07 -2.191,-7.839 -5.7,-9.9l-30.4,-17.6c-2.337,-1.398 -5.263,-1.398 -7.6,0c-2.354,1.359 -3.807,3.882 -3.8,6.6l0,66.6c0.021,4.07 2.191,7.839 5.7,9.9l36.1,20.9c3.528,2.042 5.706,5.824 5.7,9.9l0,-86.4Z" style="fill:#1fc2d7;fill-rule:nonzero;"/><path d="M0,28.548c0.021,-4.07 2.191,-7.839 5.7,-9.9l30.5,-17.6c2.337,-1.398 5.263,-1.398 7.6,0c2.354,1.359 3.807,3.882 3.8,6.6l0,66.6c-0.021,4.07 -2.191,7.839 -5.7,9.9l-36.1,20.9c-3.528,2.042 -5.706,5.824 -5.7,9.9l-0.1,-86.4Z" style="fill:#1fc2d7;fill-rule:nonzero;"/></g><g><path d="M221.9,44.348l0,64l-11.5,0l-0.6,-5c-7.6,3.9 -15.6,6.5 -22.6,6.5c-10.8,0 -18.7,-6.1 -18.6,-21.3l0,-44.2l12.8,0l0,42.4c0,9.1 3.4,11.8 9.3,11.8c4.8,0 11.5,-2 18.4,-5.5l0,-48.7l12.8,0Z" style="fill:#0d0d27;fill-rule:nonzero;"/><path d="M296.9,64.148l0,44.2l-12.8,0l0,-42.4c0,-9.1 -3.5,-11.8 -9.8,-11.8c-5.5,0 -12.9,2 -20.9,5.7l0,48.6l-12.8,0l0,-64l11.5,0l0.6,5.1c8.7,-4.1 17.5,-6.6 24.8,-6.6c11.4,0 19.4,6 19.4,21.2Z" style="fill:#0d0d27;fill-rule:nonzero;"/><path d="M349.7,42.948c19.3,0 24.5,12.8 24.6,33.6c0.1,20.8 -5.2,33.4 -24.5,33.4c-7.1,0 -12.8,-1.7 -21.9,-6.8l-0.6,5.4l-11.5,0l0,-90.6l12.8,0l0,31.6c8.5,-4.9 14.1,-6.6 21.1,-6.6Zm-3.5,55.7c11.8,0 14.9,-6.3 15,-22.2c0.1,-15.9 -3.1,-22.2 -14.9,-22.2c-5,0 -9.1,1.1 -17.7,5.9l0,32.7c8.6,4.7 12.7,5.8 17.6,5.8Z" style="fill:#0d0d27;fill-rule:nonzero;"/><path d="M448.6,76.348c0,21.3 -7.2,33.5 -29.8,33.5c-22.6,0 -29.8,-12.2 -29.8,-33.5c0,-21.3 7.2,-33.5 29.8,-33.5c22.6,0 29.8,12.3 29.8,33.5Zm-46.4,0c0,16 3.8,22.2 16.6,22.2c12.8,0 16.6,-6.2 16.6,-22.2c0,-16 -3.8,-22.2 -16.6,-22.2c-12.8,0 -16.6,6.2 -16.6,22.2Z" style="fill:#0d0d27;fill-rule:nonzero;"/><path d="M518.2,44.348l0,64l-11.5,0l-0.6,-5c-7.6,3.9 -15.6,6.5 -22.6,6.5c-10.8,0 -18.7,-6.1 -18.6,-21.3l0,-44.2l12.8,0l0,42.4c0,9.1 3.4,11.8 9.3,11.8c4.8,0 11.5,-2 18.4,-5.5l0,-48.7l12.8,0Z" style="fill:#0d0d27;fill-rule:nonzero;"/><path d="M593.2,64.148l0,44.2l-12.8,0l0,-42.4c0,-9.1 -3.5,-11.8 -9.8,-11.8c-5.5,0 -12.9,2 -20.9,5.7l0,48.6l-12.8,0l0,-64l11.5,0l0.6,5.1c8.7,-4.1 17.5,-6.6 24.8,-6.6c11.4,0 19.4,6 19.4,21.2Z" style="fill:#0d0d27;fill-rule:nonzero;"/><path d="M656.9,108.448l-0.6,-5.4c-9,5 -14.6,6.8 -21.9,6.8c-19.3,0 -24.5,-12.7 -24.5,-33.4c0,-20.7 5.2,-33.6 24.5,-33.6c7.1,0 12.6,1.7 21.2,6.5l0,-31.6l12.8,0l0,90.6l-11.5,0.1Zm-33.9,-32.1c0,15.9 3.2,22.2 15,22.2c5,0 9,-1.1 17.6,-5.9l0,-32.7c-8.8,-4.8 -12.8,-5.9 -17.6,-5.9c-11.8,0.1 -15,6.4 -15,22.3Z" style="fill:#0d0d27;fill-rule:nonzero;"/></g></g><defs><linearGradient id="_Linear1" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(114.2,0,0,114.2,1.23648e-05,79.6485)"><stop offset="0" style="stop-color:#0d0d27;stop-opacity:1"/><stop offset="0.02" style="stop-color:#10102f;stop-opacity:1"/><stop offset="0.1" style="stop-color:#1a1b4d;stop-opacity:1"/><stop offset="0.19" style="stop-color:#232365;stop-opacity:1"/><stop offset="0.28" style="stop-color:#282976;stop-opacity:1"/><stop offset="0.38" style="stop-color:#2c2d80;stop-opacity:1"/><stop offset="0.5" style="stop-color:#2d2e83;stop-opacity:1"/><stop offset="0.62" style="stop-color:#2c2d80;stop-opacity:1"/><stop offset="0.72" style="stop-color:#282976;stop-opacity:1"/><stop offset="0.81" style="stop-color:#232365;stop-opacity:1"/><stop offset="0.9" style="stop-color:#1a1b4d;stop-opacity:1"/><stop offset="0.98" style="stop-color:#10102f;stop-opacity:1"/><stop offset="1" style="stop-color:#0d0d27;stop-opacity:1"/></linearGradient></defs></svg>
\ No newline at end of file
index 28a91cfa614cec5033f62c260c9ee4dce78cb65b..1747646193db4339407608819fabcc1955227531 100644 (file)
 
                                                                {# DBL #}
                                                                {% if request.path.startswith("/dbl") %}
+                                                                       <a class="navbar-item is-tab
+                                                                                       {% if request.path.startswith("/dbl/how-to-use") %}is-active{% end %}"
+                                                                                       href="/dbl/how-to-use">
+                                                                               {{ _("How To Use?") }}
+                                                                       </a>
+
                                                                        <a class="navbar-item is-tab
                                                                                        {% if request.path.startswith("/dbl/lists") %}is-active{% end %}"
                                                                                        href="/dbl/lists">
diff --git a/src/templates/dbl/how-to-use.html b/src/templates/dbl/how-to-use.html
new file mode 100644 (file)
index 0000000..454c942
--- /dev/null
@@ -0,0 +1,452 @@
+{% extends "../base.html" %}
+
+{% block head %}
+       {% module OpenGraph(
+               title=_("IPFire DBL - How To Use?"),
+       ) %}
+{% end block %}
+
+{% block title %}{{ _("IPFire DBL - How To Use?") }}{% end block %}
+
+{% block container %}
+       {% import urllib.parse %}
+
+       <section class="hero is-large">
+               <div class="hero-body">
+                       <div class="container">
+                               <h1 class="title is-1">
+                                       How To Use IPFire DBL
+                               </h1>
+
+                               <p class="subtitle">
+                                       IPFire DBL works with virtually any network security tool or DNS resolver.
+                                       Choose the integration method that fits your infrastructure and start
+                                       blocking malicious domains in minutes.
+                               </p>
+                       </div>
+               </div>
+       </section>
+
+       {# RPZ #}
+       <section class="section" id="rpz">
+               <div class="container">
+                       <h3 class="title is-3">
+                               {{ _("DNS Request Policy Zone (RPZ)") }}
+                       </h3>
+
+                       <div class="level">
+                               <div class="level-left">
+                                       <div class="level-item">
+                                               <strong>
+                                                       {{ _("Compatible with:") }}
+                                               </strong>
+                                       </div>
+
+                                       <div class="level-item">
+                                               <a href="https://www.isc.org/bind/" rel="noopener">
+                                                       {{ _("BIND") }}
+                                               </a>
+                                       </div>
+
+                                       <div class="level-item">
+                                               <a href="https://www.knot-resolver.cz" rel="noopener">
+                                                       {{ _("Knot Resolver") }}
+                                               </a>
+                                       </div>
+
+                                       <div class="level-item">
+                                               <a href="https://pi-hole.net" rel="noopener">
+                                                       {{ _("Pi-Hole") }}
+                                               </a>
+                                       </div>
+
+                                       <div class="level-item">
+                                               <a href="https://www.powerdns.com" rel="noopener">
+                                                       {{ _("PowerDNS Recursor") }}
+                                               </a>
+                                       </div>
+
+                                       <div class="level-item">
+                                               <a href="https://nlnetlabs.nl/projects/unbound/about/" rel="noopener">
+                                                       {{ _("Unbound") }}
+                                               </a>
+                                       </div>
+                               </div>
+                       </div>
+
+                       <div class="content">
+                               <p>
+                                       The IPFire DBL is published as a Response Policy Zone (RPZ) and
+                                       can be consumed by many popular recursive DNS resolvers.
+                               </p>
+
+                               <p>
+                                       Resolvers fetch the list via AXFR/IXFR, store it locally, and only
+                                       transfer updates when the zone changes — keeping bandwidth usage
+                                       low and resolution fast.
+                                       The primary to fetch the zones from is hosted at
+                                       <code>primary.dbl.ipfire.org</code> and TLS is available.
+                               </p>
+
+                               <p>
+                                       If your DNS software does not allow to fetch the lists using
+                                       AXFR/IXFR, a HTTPS download is also available as a fallback.
+                               </p>
+                       </div>
+
+                       <details>
+                               <summary class="button is-small">
+                                       {{ _("Configuration Examples") }}
+                               </summary>
+
+                               <div class="content my-5">
+                                       <h6>PowerDNS Recursor</h6>
+
+                                       <pre>
+recursor:
+&nbsp;&nbsp;rpzs:
+&nbsp;&nbsp;- name: <strong>NAME</strong>.rpz.ipfire.org
+&nbsp;&nbsp;&nbsp;&nbsp;addresses:
+&nbsp;&nbsp;&nbsp;&nbsp;- 'primary.dbl.ipfire.org'</pre>
+
+                                       <h6>Unbound</h6>
+
+                                       <pre>
+server:
+&nbsp;&nbsp;module-config: "respip validator iterator"
+
+rpz:
+&nbsp;&nbsp;name: <strong>NAME</strong>.rpz.ipfire.org
+&nbsp;&nbsp;primary: primary.dbl.ipfire.org
+&nbsp;&nbsp;zonefile: /var/cache/unbound/NAME.rpz.ipfire.org.zone</pre>
+
+                                       <p>
+                                               Ensure to replace <strong>NAME</strong> with the list you want to block:
+                                       </p>
+
+                                       <table>
+                                               <thead>
+                                                       <tr>
+                                                               <th>
+                                                                       {{ _("List") }}
+                                                               </th>
+
+                                                               <th>
+                                                                       {{ _("Zone") }}
+                                                               </th>
+
+                                                               <th>
+                                                                       {{ _("Download") }}
+                                                               </th>
+                                                       </tr>
+                                               </thead>
+
+                                               <tbody>
+                                                       {% for list in lists %}
+                                                               <tr>
+                                                                       <th scope="row">
+                                                                               {{ list.name }}
+                                                                       </th>
+
+                                                                       <td>
+                                                                               {{ "%s.rpz.ipfire.org" % list.slug }}
+                                                                       </td>
+
+                                                                       <td>
+                                                                               <a href="https://dbl.ipfire.org/lists/{{ list.slug }}/rpz.zone">
+                                                                                       {{ _("Download") }}
+                                                                               </a>
+                                                                       </td>
+                                                               </tr>
+                                                       {% end %}
+                                               </tbody>
+                                       </table>
+                               </div>
+                       </details>
+               </div>
+       </section>
+
+       {# DBL #}
+       <section class="section" id="dbl">
+               <div class="container">
+                       <h3 class="title is-3">
+                               {{ _("Query the list using DNS") }}
+                       </h3>
+
+                       <div class="content">
+                               <p>
+                                       IPFire DBL lists are also available as a regular blocklist in DNS.
+                                       That way, you can quickly check if a domain is listed in a specific
+                                       category without fetching the entire list.
+                               </p>
+
+                               <pre>
+# dig +short A example.tld.<strong>NAME</strong>.dbl.ipfire.org
+127.0.0.2</pre>
+
+                               <p>
+                                       The response will be <code>127.0.0.2</code> for any listed domains,
+                                       and <code>NXDOMAIN</code> otherwise.
+                                       Use DNSSEC to ensure the authenticity of the data.
+                               </p>
+                       </div>
+
+                       <details>
+                               <summary class="button is-small">
+                                       {{ _("Zones") }}
+                               </summary>
+
+                               <div class="content my-5">
+                                       <table>
+                                               <thead>
+                                                       <tr>
+                                                               <th>
+                                                                       {{ _("List") }}
+                                                               </th>
+
+                                                               <th>
+                                                                       {{ _("Zone") }}
+                                                               </th>
+                                                       </tr>
+                                               </thead>
+
+                                               <tbody>
+                                                       {% for list in lists %}
+                                                               <tr>
+                                                                       <th scope="row">
+                                                                               {{ list.name }}
+                                                                       </th>
+
+                                                                       <td>
+                                                                               {{ "%s.dbl.ipfire.org" % list.slug }}
+                                                                       </td>
+                                                               </tr>
+                                                       {% end %}
+                                               </tbody>
+                                       </table>
+                               </div>
+                       </details>
+               </div>
+       </section>
+
+       {# Plaintext #}
+       <section class="section" id="plaintext">
+               <div class="container">
+                       <h3 class="title is-3">
+                               {{ _("Plaintext Formats") }}
+                       </h3>
+
+                       <div class="content">
+                               <p>
+                                       All IPFire DBL lists are also available as downloadable domain and hosts files.
+                               </p>
+
+                               <p>
+                                       These formats are intended for setups where the lists are consumed directly,
+                                       for example by firewalls, filtering proxies, custom scripts, or systems using
+                                       hosts-file based blocking. The files can be fetched periodically and applied locally.
+                               </p>
+                       </div>
+
+                       <div class="level">
+                               <div class="level-left">
+                                       <div class="level-item">
+                                               <div class="dropdown">
+                                                       <div class="dropdown-trigger">
+                                                               <button class="button is-primary is-small" aria-haspopup="true" aria-controls="dropdown-menu">
+                                                                       <span>
+                                                                               {{ _("Domains") }}
+                                                                       </span>
+
+                                                                       <span class="icon is-small">
+                                                                               <i class="fas fa-angle-down" aria-hidden="true"></i>
+                                                                       </span>
+                                                               </button>
+                                                       </div>
+
+                                                       <div class="dropdown-menu" id="dropdown-menu" role="menu">
+                                                               <div class="dropdown-content">
+                                                                       {% for list in lists %}
+                                                                               <a href="https://dbl.ipfire.org/lists/{{ list.slug }}/domains.txt" class="dropdown-item">
+                                                                                       {{ list.name }}
+                                                                               </a>
+                                                                       {% end %}
+                                                               </div>
+                                                       </div>
+                                               </div>
+                                       </div>
+
+                                       <div class="level-item">
+                                               <div class="dropdown">
+                                                       <div class="dropdown-trigger">
+                                                               <button class="button is-primary is-small" aria-haspopup="true" aria-controls="dropdown-menu">
+                                                                       <span>
+                                                                               {{ _("Hosts") }}
+                                                                       </span>
+
+                                                                       <span class="icon is-small">
+                                                                               <i class="fas fa-angle-down" aria-hidden="true"></i>
+                                                                       </span>
+                                                               </button>
+                                                       </div>
+
+                                                       <div class="dropdown-menu" id="dropdown-menu" role="menu">
+                                                               <div class="dropdown-content">
+                                                                       {% for list in lists %}
+                                                                               <a href="https://dbl.ipfire.org/lists/{{ list.slug }}/hosts.txt" class="dropdown-item">
+                                                                                       {{ list.name }}
+                                                                               </a>
+                                                                       {% end %}
+                                                               </div>
+                                                       </div>
+                                               </div>
+                                       </div>
+                               </div>
+                       </div>
+               </div>
+       </section>
+
+       {# Suricata #}
+       <section class="section" id="suricata">
+               <div class="container">
+                       <h3 class="title is-3">
+                               {{ _("Suricata") }}
+                       </h3>
+
+                       <div class="content">
+                               <p>
+                                       IPFire DBL lists are available as a ruleset for Suricata
+                                       which can filter:
+                               </p>
+
+                               <ul>
+                                       <li>
+                                               DNS Queries
+                                       </li>
+
+                                       <li>
+                                               TLS and QUIC connections using SNI
+                                       </li>
+
+                                       <li>
+                                               HTTP Requests
+                                       </li>
+                               </ul>
+
+                               <a class="button is-primary is-small" href="https://dbl.ipfire.org/lists/suricata.tar.gz">
+                                       <span class="icon">
+                                                <i class="fas fa-download"></i>
+                                       </span>
+
+                                       <span>
+                                               {{ _("Download Suricata Ruleset") }}
+                                       </span>
+                               </a>
+                       </div>
+               </div>
+       </section>
+
+       {# Browser Extensions #}
+       <section class="section" id="browser-extensions">
+               <div class="container">
+                       <h3 class="title is-3">
+                               {{ _("Browser Extensions") }}
+                       </h3>
+
+                       <div class="level">
+                               <div class="level-left">
+                                       <div class="level-item">
+                                               <strong>
+                                                       {{ _("Compatible with:") }}
+                                               </strong>
+                                       </div>
+
+                                       <div class="level-item">
+                                               <a href="https://adblockplus.org" rel="noopener">
+                                                       {{ _("Adblock Plus") }}
+                                               </a>
+                                       </div>
+
+                                       <div class="level-item">
+                                               <a href="https://adguard.com/en/welcome.html" rel="noopener">
+                                                       {{ _("AdGuard") }}
+                                               </a>
+                                       </div>
+
+                                       <div class="level-item">
+                                               <a href="https://ublockorigin.com" rel="noopener">
+                                                       {{ _("uBlock Origin") }}
+                                               </a>
+                                       </div>
+                               </div>
+                       </div>
+
+                       <div class="content">
+                               <p>
+                                       Click below to automatically subscribe to our blocklist in compatible clients:
+                               </p>
+
+                               <div class="dropdown">
+                                       <div class="dropdown-trigger">
+                                               <button class="button is-primary is-small" aria-haspopup="true" aria-controls="dropdown-menu">
+                                                       <span>
+                                                               {{ _("Subscribe to...") }}
+                                                       </span>
+
+                                                       <span class="icon is-small">
+                                                               <i class="fas fa-angle-down" aria-hidden="true"></i>
+                                                       </span>
+                                               </button>
+                                       </div>
+
+                                       <div class="dropdown-menu" id="dropdown-menu" role="menu">
+                                               <div class="dropdown-content">
+                                                       {% for list in lists %}
+                                                               {# Compose the subscription URL #}
+                                                               {% set url = "https://subscribe.adblockplus.org/?%s" % \
+                                                                       urllib.parse.urlencode({
+                                                                               "location" : list.url("abp.txt"),
+                                                                               "title"    : "IPFire DBL - %s" % list,
+                                                                       })
+                                                               %}
+
+                                                               <a href="{{ url }}" class="dropdown-item">
+                                                                       {{ list.name }}
+                                                               </a>
+                                                       {% end %}
+                                               </div>
+                                       </div>
+                               </div>
+                       </div>
+               </div>
+       </section>
+
+       {# IPFire #}
+       <section class="section" id="ipfire">
+               <div class="container">
+                       <h3 class="title is-3">
+                               {% module IPFireLogo() %}
+                       </h3>
+
+                       <div class="content">
+                               <p>
+                                       IPFire DBL is natively integrated into IPFire in the following features:
+                               </p>
+
+                               <ul>
+                                       <li>
+                                               <a href="/docs/configuration/network/proxy/url-filter">
+                                                       {{ _("URL Filter")}}
+                                               </a>
+                                       </li>
+
+                                       <li>
+                                               <a href="/docs/configuration/firewall/ips">
+                                                       {{ _("Intrusion Prevention System") }}
+                                               </a>
+                                       </li>
+                               </ul>
+                       </div>
+               </div>
+       </section>
+{% end block %}
index 8c581df0881520a54c579e8e2511d43fff9eac6b..5bac8c05a08f7fec79cc527dce4d20a5c8b0d5a2 100644 (file)
 {% block title %}{{ _("Welcome to IPFire DBL") }}{% end block %}
 
 {% block container %}
-       <section class="hero is-medium is-primary">
+       {% set total_domains = sum(list.total_domains for list in lists) %}
+
+       <section class="hero is-fullheight-with-navbar is-primary">
                <div class="hero-body">
                        <div class="container">
                                <h1 class="title">{{ _("IPFire Domain Blocklist") }}</h1>
 
-                               <h6 class="subtitle mb-6">
-                                       {{ _("Early threat mitigation, enforced over DNS") }}
+                               <h6 class="subtitle">
+                                       {{ _("Network Security Through Intelligent Domain Control") }}
                                </h6>
 
-                               <div class="columns is-multiline my-6">
+                               <div class="content">
+                                       <p class="is-size-5">
+                                               IPFire DBL is a comprehensive, community-maintained domain
+                                               blocklist that protects your network from malware, phishing,
+                                               unwanted content, and emerging  threats.
+                                               With millions of categorized domains across multiple
+                                               threat categories, IPFire DBL integrates seamlessly into DNS
+                                               servers, firewalls, IPS systems, and browser extensions.
+                                       </p>
+
+                                       <p class="is-size-5">
+                                               Built on open standards, actively maintained, and free for
+                                               everyone — IPFire DBL  stops threats before they reach your
+                                               network, whether you are securing a home network, enterprise
+                                               infrastructure, or managed services for clients.
+                                       </p>
+
+                                       <div class="buttons">
+                                               <a class="button" href="#lists">
+                                                       {{ _("View Available Lists") }}
+                                               </a>
+
+                                               <a class="button" href="/dbl/how-to-use">
+                                                       {{ _("How To Use?") }}
+                                               </a>
+                                       </div>
+
+                                       <p class="tag is-success">
+                                               <span class="icon-text">
+                                                       <span class="icon">
+                                                               <i class="fas fa-fire"></i>
+                                                       </span>
+
+                                                       <span>
+                                                               <a href="https://www.ipfire.org/blog/ipfire-2-29-core-update-200-is-available-for-testing">
+                                                                       Beta Available in IPFire 2.29 - Core Update 200
+                                                               </a>
+                                                       </span>
+                                               </span>
+                                       </p>
+                               </div>
+                       </div>
+               </div>
+
+               <div class="hero-foot p-5">
+                       <div class="container">
+                               <div class="level">
+                                       <div class="level-item has-text-centered">
+                                               <div>
+                                                       <p class="title">
+                                                               {{ format_number(len(lists)) }}
+                                                       </p>
+
+                                                       <p class="heading">
+                                                               {{ _("Lists") }}
+                                                       </p>
+                                               </div>
+                                       </div>
+
+                                       <div class="level-item has-text-centered">
+                                               <div>
+                                                       <p class="title">
+                                                               {{ format_number(total_domains) }}
+                                                       </p>
+
+                                                       <p class="heading">
+                                                               {{ _("Domains") }}
+                                                       </p>
+                                               </div>
+                                       </div>
+
+                                       <div class="level-item has-text-centered">
+                                               <div>
+                                                       <p class="title">
+                                                               {{ format_percent(1) }}
+                                                       </p>
+
+                                                       <p class="heading">
+                                                               {{ _("Free") }}
+                                                       </p>
+                                               </div>
+                                       </div>
+                               </div>
+                       </div>
+               </div>
+       </section>
+
+       <section class="hero is-fullheight" id="lists">
+               <div class="hero-body">
+                       <div class="container">
+                               <h3 class="title is-3">
+                                       <span class="icon">
+                                               <i class="fa-solid fa-shield-halved"></i>
+                                       </span>
+
+                                       {{ _("What Gets Blocked?") }}
+                               </h3>
+
+                               <h5 class="subtitle is-5">
+                                       IPFire DBL categorizes and blocks domains across different threat categories.
+                                       Choose which categories to block based on your security and content policies.
+                               </h5>
+
+                               <div class="columns is-multiline my-5">
+                                       {% for list in lists %}
+                                               <div class="column is-one-third">
+                                                       <div class="columns my-1">
+                                                               <div class="column">
+                                                                       <h4 class="title is-4">
+                                                                               <a href="/dbl/lists/{{ list.slug }}">
+                                                                                       {{ list.name }}
+                                                                               </a>
+                                                                       </h4>
+                                                               </div>
+
+                                                               <div class="column is-narrow">
+                                                                       <span class="tag">
+                                                                               {{ _("One Domain", "%(num)s Domains", list.total_domains) \
+                                                                                       % { "num" : format_number(list.total_domains) } }}
+                                                                       </span>
+                                                               </div>
+                                                       </div>
+                                               </div>
+                                       {% end %}
+                               </div>
+                       </div>
+               </div>
+       </section>
+
+       <section class="hero is-dark is-fullheight">
+               <div class="hero-body">
+                       <div class="container">
+                               <h3 class="title is-3">
+                                       The IPFire DBL Vision
+                               </h3>
+
+                               <div class="content">
+                                       <p>
+                                               The IPFire team has spent years protecting networks at the edge —
+                                               we understand threats, filtering, and what it takes to keep systems
+                                               secure.
+                                               Combined with our community's expertise, we are building a blocklist
+                                               that is not just comprehensive, but extremely accurate through
+                                               continuous refinement and real-world feedback.
+                                       </p>
+
+                                       <p>
+                                               What sets DBL apart is how we deliver it.
+                                               Beyond traditional filtering methods, we have implemented DNS
+                                               Response Policy Zones (RPZ) with IXFR for lightning-fast incremental
+                                               updates — your resolver only downloads what has changed.
+                                               We provide Suricata rulesets for deep packet inspection across
+                                               DNS, TLS, HTTP, and QUIC — catching threats that bypass simple
+                                               domain matching.
+                                               And we support standard formats like domain lists and hosts files
+                                               for maximum compatibility.
+                                       </p>
+
+                                       <p>
+                                               This is our contribution to the open-source security community:
+                                               a blocklist built by firewall experts, maintained by practitioners,
+                                               and engineered for the real world.
+                                               Transparent, collaborative, and designed to evolve with every
+                                               threat we face together.
+                                       </p>
+                               </div>
+
+                               <div class="columns is-multiline py-6">
                                        <div class="column is-half">
                                                <div class="columns is-mobile is-vcentered">
                                                        <div class="column is-3 has-text-centered">
-                                                               <i class="fa-solid fa-magnifying-glass fa-5x"></i>
+                                                               <i class="fa-solid fa-layer-group fa-5x"></i>
                                                        </div>
 
                                                        <div class="column">
-                                                               <p class="title is-5">{{ _("Accuracy First, Always") }}</p>
+                                                               <p class="title is-5">
+                                                                       {{ _("Category-Based Filtering") }}
+                                                               </p>
 
                                                                <div class="content">
                                                                        <p>
-                                                                               We prioritise high-confidence, well-verified data over raw volume.
-                                                                               Every listed domain must meet clear criteria, be reviewed continuously,
-                                                                               and be removed quickly when it no longer poses a threat.
-                                                                               The goal is trustworthy blocking with minimal false positives, suitable
-                                                                               for production networks.
+                                                                               Block entire categories of domains including malware,
+                                                                               phishing, adult content, social media, gambling, and more.
+                                                                               Exercise granular control over what content reaches
+                                                                               your network.
                                                                        </p>
                                                                </div>
                                                        </div>
                                        <div class="column is-half">
                                                <div class="columns is-mobile is-vcentered">
                                                        <div class="column is-3 has-text-centered">
-                                                               <i class="fa-solid fa-shield-heart fa-5x"></i>
+                                                               <i class="fa-solid fa-magnifying-glass fa-5x"></i>
                                                        </div>
 
                                                        <div class="column">
-                                                               <p class="title is-5">{{ _("Privacy-Respecting Operation") }}</p>
+                                                               <p class="title is-5">
+                                                                       {{ _("Deep Packet Inspection") }}
+                                                               </p>
 
                                                                <div class="content">
                                                                        <p>
-                                                                               The service is operated without tracking users or collecting
-                                                                               resolver telemetry. DNS security should improve safety without
-                                                                               introducing new privacy risks.
+                                                                               Integrates with Suricata IDS/IPS to analyze DNS,
+                                                                               TLS, HTTP, and QUIC traffic.
+                                                                               Blocks malicious domains at multiple network layers
+                                                                               for comprehensive protection.
                                                                        </p>
                                                                </div>
                                                        </div>
                                        <div class="column is-half">
                                                <div class="columns is-mobile is-vcentered">
                                                        <div class="column is-3 has-text-centered">
-                                                               <i class="fa-solid fa-earth-europe fa-5x"></i>
+                                                               <i class="fab fa-osi fa-5x"></i>
                                                        </div>
 
                                                        <div class="column">
-                                                               <p class="title is-5">{{ _("Built on DNS Standards and Best Practices") }}</p>
+                                                               <p class="title is-5">
+                                                                       {{ _("Open & Community-Driven") }}
+                                                               </p>
 
                                                                <div class="content">
                                                                        <p>
-                                                                               These blocklists are developed with a deep understanding of DNS
-                                                                               infrastructure. They integrate naturally with technologies like
-                                                                               Response Policy Zones (RPZ), follow established standards, and
-                                                                               are operated with stability and long-term reliability in mind
-                                                                               — even at scale.
+                                                                               Built and maintained by the IPFire community with
+                                                                               full transparency and a commitment to long-term
+                                                                               sustainability.
+                                                                               Continuously updated with emerging threats, completely
+                                                                               open-source, and welcoming community contributions
+                                                                               — you are in control of your security.
                                                                        </p>
                                                                </div>
                                                        </div>
                                        <div class="column is-half">
                                                <div class="columns is-mobile is-vcentered">
                                                        <div class="column is-3 has-text-centered">
-                                                               <span class="fab fa-osi fa-5x"></span>
+                                                               <i class="fa-solid fa-earth-europe fa-5x"></i>
                                                        </div>
 
                                                        <div class="column">
-                                                               <p class="title is-5">{{ _("Open, Inclusive, and Free Software") }}</p>
+                                                               <p class="title is-5">
+                                                                       {{ _("Works Everywhere") }}
+                                                               </p>
 
                                                                <div class="content">
                                                                        <p>
-                                                                               The IPFire DNS blocklists are built as a public good:
-                                                                               open, transparent, and free to use.
-                                                                               They are available to anyone, regardless of platform or vendor,
-                                                                               and developed in the open so the wider community can inspect,
-                                                                               contribute, and benefit.
+                                                                               Built directly into IPFire's Web Proxy and
+                                                                               Intrusion Prevention System.
+                                                                               Also designed to work with other firewall and
+                                                                               filtering solutions.
+                                                                               Open standards mean you can use IPFire DBL
+                                                                               wherever you need domain-based protection.
                                                                        </p>
                                                                </div>
                                                        </div>
                </div>
        </section>
 
+       <section class="hero is-fullheight">
+               <div class="hero-body">
+                       <div class="container">
+                               <h3 class="title is-3">
+                                       {{ _("Works With Your Existing Infrastructure") }}
+                               </h3>
+
+                               <h5 class="subtitle is-5">
+                                       IPFire DBL integrates seamlessly with popular DNS servers, firewalls,
+                                       IPS systems, and browser extensions
+                               </h5>
+
+                               <div class="columns is-multiline is-centered is-vcentered">
+                                       <div class="column is-one-quarter is-flex is-justify-content-center"">
+                                               <a href="/dbl/how-to-use#rpz">
+                                                       <figure class="image is-128x128 is-flex is-align-items-center">
+                                                               <img src="{{ static_url("img/powerdns.svg") }}" alt="{{ _("PowerDNS") }}">
+                                                       </figure>
+                                               </a>
+                                       </div>
+
+                                       <div class="column is-one-quarter is-flex is-justify-content-center"">
+                                               <a href="/dbl/how-to-use#rpz">
+                                                       <figure class="image is-128x128 is-flex is-align-items-center">
+                                                               <img src="{{ static_url("img/unbound.svg") }}" alt="{{ _("Unbound") }}">
+                                                       </figure>
+                                               </a>
+                                       </div>
+
+                                       <div class="column is-one-quarter is-flex is-justify-content-center"">
+                                               <a href="/dbl/how-to-use#rpz">
+                                                       <figure class="image is-128x128 is-flex is-align-items-center">
+                                                               <img src="{{ static_url("img/bind.png") }}" alt="{{ _("BIND") }}">
+                                                       </figure>
+                                               </a>
+                                       </div>
+
+                                       <div class="column is-one-quarter is-flex is-justify-content-center"">
+                                               <a href="/dbl/how-to-use#rpz">
+                                                       <figure class="image is-128x128 is-flex is-align-items-center">
+                                                               <img src="{{ static_url("img/knot.png") }}" alt="{{ _("Knot DNS") }}">
+                                                       </figure>
+                                               </a>
+                                       </div>
+
+                                       <div class="column is-one-quarter is-flex is-justify-content-center"">
+                                               <a href="/dbl/how-to-use#suricata">
+                                                       <figure class="image is-128x128 is-flex is-align-items-center">
+                                                               <img src="{{ static_url("img/suricata.png") }}" alt="{{ _("Suricata") }}">
+                                                       </figure>
+                                               </a>
+                                       </div>
+
+                                       <div class="column is-one-quarter is-flex is-justify-content-center"">
+                                               <a href="/dbl/how-to-use#rpz">
+                                                       <figure class="image is-128x128 is-flex is-align-items-center">
+                                                               <img src="{{ static_url("img/opnsense.svg") }}" alt="{{ _("OPNsense") }}">
+                                                       </figure>
+                                               </a>
+                                       </div>
+
+                                       <div class="column is-one-quarter is-flex is-justify-content-center"">
+                                               <a href="/dbl/how-to-use#rpz">
+                                                       <figure class="image is-128x128 is-flex is-align-items-center">
+                                                               <img src="{{ static_url("img/pfsense.png") }}" alt="{{ _("pfSense") }}">
+                                                       </figure>
+                                               </a>
+                                       </div>
+
+                                       <div class="column is-one-quarter is-flex is-justify-content-center"">
+                                               <a href="/dbl/how-to-use#rpz">
+                                                       <figure class="image is-64x64 is-flex is-align-items-center">
+                                                               <img src="{{ static_url("img/pi-hole.png") }}" alt="{{ _("Pi-Hole") }}">
+                                                       </figure>
+                                               </a>
+                                       </div>
+
+                                       <div class="column is-one-quarter is-flex is-justify-content-center"">
+                                               <a href="/dbl/how-to-use#browser-extensions">
+                                                       <figure class="image is-64x64 is-flex is-align-items-center">
+                                                               <img src="{{ static_url("img/ublock-origin.svg") }}" alt="{{ _("uBlock Origin") }}">
+                                                       </figure>
+                                               </a>
+                                       </div>
+
+                                       <div class="column is-one-quarter is-flex is-justify-content-center"">
+                                               <a href="/dbl/how-to-use#browser-extensions">
+                                                       <figure class="image is-64x64 is-flex is-align-items-center">
+                                                               <img src="{{ static_url("img/adguard.svg") }}" alt="{{ _("AdGuard") }}">
+                                                       </figure>
+                                               </a>
+                                       </div>
+
+                                       <div class="column is-full is-flex is-justify-content-center">
+                                               <h1 class="title is-1 py-5">
+                                                       {% module IPFireLogo() %}
+                                               </h1>
+                                       </div>
+
+                                       <div class="column is-full has-text-centered">
+                                               <div class="content">
+                                                       <p>
+                                                               ...and any system that supports RPZ, domain lists,
+                                                               hosts files, or Suricata rulesets
+                                                       </p>
+                                               </div>
+
+                                               <a class="button is-primary is-medium" href="/dbl/how-to-use">
+                                                       {{ _("See All Integration Methods") }}
+                                               </a>
+                                       </div>
+                               </div>
+                       </div>
+               </div>
+       </section>
+
+       <section class="hero is-dark is-fullheight">
+               <div class="hero-body">
+                       <div class="container">
+                               <h3 class="title is-3">
+                                       {{ _("Perfect For...") }}
+                               </h3>
+
+                               <div class="columns is-multiline">
+                                       <div class="column is-half p-5">
+                                               <h4 class="title is-4">
+                                                       <span class="icon">
+                                                               <i class="fa-solid fa-building"></i>
+                                                       </span>
+
+                                                       Corporate Networks
+                                               </h4>
+
+                                               <div class="content">
+                                                       <p>
+                                                               Enforce acceptable use policies by blocking social media,
+                                                               gambling, or adult content.
+                                                               Protect employees from phishing and malware sites at the
+                                                               network edge.
+                                                       </p>
+                                               </div>
+                                       </div>
+
+                                       <div class="column is-half p-5">
+                                               <h4 class="title is-4">
+                                                       <span class="icon">
+                                                               <i class="fa-solid fa-graduation-cap"></i>
+                                                       </span>
+
+                                                       Educational Institutions
+                                               </h4>
+
+                                               <div class="content">
+                                                       <p>
+                                                               Create safe browsing environments for students.
+                                                               Filter inappropriate content and ensure compliance with
+                                                               child safety regulations across the entire campus network.
+                                                       </p>
+                                               </div>
+                                       </div>
+
+                                       <div class="column is-half p-5">
+                                               <h4 class="title is-4">
+                                                       <span class="icon">
+                                                               <i class="fa-solid fa-house"></i>
+                                                       </span>
+
+                                                       Home Networks
+                                               </h4>
+
+                                               <div class="content">
+                                                       <p>
+                                                               Protect family members from malicious sites, phishing attempts,
+                                                               and inappropriate content.
+                                                               Set up parental controls with category-based filtering.
+                                                       </p>
+                                               </div>
+                                       </div>
+
+                                       <div class="column is-half p-5">
+                                               <h4 class="title is-4">
+                                                       <span class="icon">
+                                                               <i class="fa-solid fa-circle-nodes"></i>
+                                                       </span>
+
+                                                       Managed Service Providers
+                                               </h4>
+
+                                               <div class="content">
+                                                       <p>
+                                                               Deploy consistent, reliable domain filtering across multiple
+                                                               client firewalls.
+                                                               Reduce attack surface with actively maintained threat intelligence.
+                                                       </p>
+                                               </div>
+                                       </div>
+                               </div>
+                       </div>
+               </div>
+       </section>
+
        <section class="hero">
                <div class="hero-body">
                        <div class="container">
-                               <a class="button is-primary is-large is-fullwidth" href="/donate">
-                                       <span class="icon">
-                                               <i class="fa-solid fa-heart"></i>
-                                       </span>
-                                       <span>
-                                               Help keep the Internet safe and free — support IPFire DBL today
-                                       </span>
-                               </a>
+                               <div class="columns is-centered">
+                                       <div class="column is-half">
+                                               <div class="box">
+                                                       <h3 class="title is-3">
+                                                               {{ _("Want More Network Intelligence? Try IPFire Location") }}
+                                                       </h3>
+
+                                                       <div class="content">
+                                                               <p>
+                                                                       Need to know where network traffic is coming from?
+                                                                       IPFire Location provides  lightning-fast IP geolocation data
+                                                                       with country codes, ASN information, and  network flags —
+                                                                       perfect for geo-blocking, compliance, and traffic analysis.
+                                                               </p>
+
+                                                               <p>
+                                                                       Built with the same commitment to quality as DBL:
+                                                                       open-source, actively  maintained, and trusted by
+                                                                       enterprises worldwide.
+                                                               </p>
+
+                                                               <a class="button is-primary" href="/location">
+                                                                       Learn More About IPFire Location
+                                                               </a>
+                                                       </div>
+                                               </div>
+                                       </div>
+                               </div>
                        </div>
                </div>
        </section>
index e9de1789b1ba1582e47d8235014d8e82ffcbc9cb..37716bba3abab849c18503f8f7d253695e9a588a 100644 (file)
                        </div>
                </div>
        </section>
-
-       {# How To Use? #}
-       <section class="section">
-               <div class="container">
-                       <h5 class="title is-5">
-                               {{ _("How To Use?") }}
-                       </h5>
-
-                       <div class="tabs">
-                               <ul>
-                                       <li class="is-active" data-tab="ipfire">
-                                               <a>{% module IPFireLogo() %}</a>
-                                       </li>
-
-                                       <li data-tab="abp">
-                                               <a>{{ _("Adblock Plus, uBlock Origin, etc.") }}</a>
-                                       </li>
-
-                                       <li data-tab="rpz">
-                                               <a>{{ _("Request Policy Zone (RPZ)") }}</a>
-                                       </li>
-
-                                       <li data-tab="suricata">
-                                               <a>{{ _("Suricata") }}</a>
-                                       </li>
-
-                                       <li data-tab="alternative">
-                                               <a>{{ _("Alternative Formats") }}</a>
-                                       </li>
-                               </ul>
-                       </div>
-
-                       <div id="ipfire" class="tab-content">
-                               <div class="content">
-                                       <p>
-                                               In IPFire, all blocklists are already included and integrated into the following features:
-                                       </p>
-
-                                       <ul>
-                                               <li>
-                                                       {{ _("URL Filter")}}
-                                               </li>
-
-                                               <li>
-                                                       {{ _("Intrusion Prevention System") }}
-                                               </li>
-                                       </ul>
-                               </div>
-                       </div>
-
-                       <div id="abp" class="tab-content is-hidden">
-                               <div class="content">
-                                       {# Compose the subscription URL #}
-                                       {% set url = "https://subscribe.adblockplus.org/?%s" % \
-                                               urllib.parse.urlencode({
-                                                       "location" : list.url("abp.txt"),
-                                                       "title"    : "IPFire DBL - %s" % list,
-                                               })
-                                       %}
-
-                                       <p>
-                                               Click below to automatically subscribe to our blocklist in uBlock Origin, AdGuard, and compatible clients.
-                                       </p>
-
-                                       <a class="button is-primary is-small" href="{{ url }}">
-                                               {{ _("Subscribe") }}
-                                       </a>
-                               </div>
-                       </div>
-
-                       <div id="rpz" class="tab-content is-hidden">
-                               <div class="content">
-                                       <p>
-                                               The IPFire DBL is published as a Response Policy Zone (RPZ) and
-                                               can be consumed by many popular recursive DNS resolvers.
-                                       </p>
-
-                                       <p>
-                                               Resolvers fetch the list via AXFR/IXFR, store it locally, and only
-                                               transfer updates when the zone changes — keeping bandwidth usage
-                                               low and resolution fast.
-                                       </p>
-
-                                       <h6>PowerDNS Recursor</h6>
-
-                                       <pre>
-recursor:
-&nbsp;&nbsp;rpzs:
-&nbsp;&nbsp;- name: {{ list.slug }}.rpz.ipfire.org
-&nbsp;&nbsp;&nbsp;&nbsp;addresses:
-&nbsp;&nbsp;&nbsp;&nbsp;- 'primary.dbl.ipfire.org'</pre>
-
-                                       <h6>Unbound</h6>
-
-                                       <pre>
-server:
-&nbsp;&nbsp;module-config: "respip validator iterator"
-
-rpz:
-&nbsp;&nbsp;name: {{ list.slug }}.rpz.ipfire.org
-&nbsp;&nbsp;primary: primary.dbl.ipfire.org
-&nbsp;&nbsp;zonefile: /var/cache/unbound/{{ list.slug }}.rpz.ipfire.org.zone</pre>
-                               </div>
-                       </div>
-
-                       <div id="suricata" class="tab-content is-hidden">
-                               <div class="content">
-                                       <p>
-                                               IPFire DBL lists are available as a ruleset for Suricata
-                                               which can filter:
-                                       </p>
-
-                                       <ul>
-                                               <li>
-                                                       DNS Queries
-                                               </li>
-
-                                               <li>
-                                                       TLS and QUIC connections using SNI
-                                               </li>
-
-                                               <li>
-                                                       HTTP Requests
-                                               </li>
-                                       </ul>
-
-                                       <a class="button is-primary is-small" href="https://dbl.ipfire.org/lists/suricata.tar.gz">
-                                               <span class="icon">
-                                                        <i class="fas fa-download"></i>
-                                               </span>
-
-                                               <span>
-                                                       {{ _("Suricata Ruleset (containing all lists)") }}
-                                               </span>
-                                       </a>
-                               </div>
-                       </div>
-
-                       <div id="alternative" class="tab-content is-hidden">
-                               <div class="content">
-                                       <p>
-                                               All IPFire DBL lists are also available as downloadable domain and hosts files.
-                                       </p>
-
-                                       <p>
-                                               These formats are intended for setups where the lists are consumed directly,
-                                               for example by firewalls, filtering proxies, custom tooling, or systems using
-                                               hosts-file based blocking. The files can be fetched periodically and applied locally.
-                                       </p>
-                               </div>
-
-                               <div class="buttons are-small">
-                                       <a class="button is-primary" href="https://dbl.ipfire.org/lists/{{ list.slug }}/domains.txt">
-                                               <span class="icon">
-                                                        <i class="fas fa-download"></i>
-                                               </span>
-
-                                               <span>
-                                                       {{ _("Domains") }}
-                                               </span>
-                                       </a>
-
-                                       <a class="button is-primary" href="https://dbl.ipfire.org/lists/{{ list.slug }}/hosts.txt">
-                                               <span class="icon">
-                                                        <i class="fas fa-download"></i>
-                                               </span>
-
-                                               <span>
-                                                       {{ _("Hosts") }}
-                                               </span>
-                                       </a>
-                               </div>
-                       </div>
-               </div>
-       </section>
 {% end block %}
index d856235a4bd3ec7e83b2ab210cebf8f163da9b6e..065e9bfddfdc8c4ca9a24bb3859ca967ae8b0756 100644 (file)
@@ -217,7 +217,8 @@ class Application(tornado.web.Application):
                        (r"/location/lookup/(.+)", location.LookupHandler),
 
                        # DBL
-                       (r"/dbl/?", StaticHandler, { "template" : "dbl/index.html" }),
+                       (r"/dbl/?", dbl.IndexHandler),
+                       (r"/dbl/how\-to\-use", dbl.HowToUseHandler),
                        (r"/dbl/lists", dbl.ListsHandler),
                        (r"/dbl/lists/([\w\-]+)", dbl.ListHandler),
                        (r"/dbl/lists/([\w\-]+)/domains/(.*)", dbl.ListDomainHandler),
index 550d58d9156145d5af0f0b24330bdc44e36d7a66..d7a511a8dd1b972077a12265e95fe91630bb0ff6 100644 (file)
@@ -12,6 +12,24 @@ class BaseHandler(base.BaseHandler):
                return await self.backend.dbl.get_list(slug)
 
 
+class IndexHandler(base.AnalyticsMixin, BaseHandler):
+       async def get(self):
+               # Fetch all lists
+               lists = await self.backend.dbl.get_lists()
+
+               # Render the page
+               self.render("dbl/index.html", lists=lists)
+
+
+class HowToUseHandler(base.AnalyticsMixin, BaseHandler):
+       async def get(self):
+               # Fetch all lists
+               lists = await self.backend.dbl.get_lists()
+
+               # Render the page
+               self.render("dbl/how-to-use.html", lists=lists)
+
+
 class ListsHandler(base.AnalyticsMixin, BaseHandler):
        async def get(self):
                # Fetch all lists