Dinge die ich bediene.

Ich glaube ich habe mich noch niemals bzgl. meiner privaten Situation mit Technik so wohl gefühlt wie bisher. Das Equipment, das OS. Macht Spaß und funktioniert.

Ein bisschen wie bei usesthis.com (wtf, wie langweilig ist bitte das Setup von Bruce Schneier?) beschreibe ich mal was ich so benutze.

MacBook Pro 13”

Seit Ende 2014 benutze ich ein MacBook. Mein Zweites. Zwischenzeitlich hatte ich ein Lenovo Thinkpad x201 was zwar seitens der Hardware super geil war, mir aber das mit dem Betriebssystem und alles zum Hals raushing. Hatte ich schon erwähnt das 2015 das Jahr von Linux auf dem Desktop ist?

All diese Dinge die bei OS X einfach so angenehm sind. Safari synchronisiert einfach alles zwischen iPhone und anderen MacBooks hin und her. Airmail2 als Mailclient ist großartig. Die Kalender & Adressbuch Synchronisation rockt. Nutze 1Password, Spotify und seit dem Switch von iPhoto zu Photos kann man das auch wieder benutzen. Ich mag es sehr wie alles sich integriert, funktioniert und man eigentlich nie irgendwas tun muss. Ganz besonders toll: Die iMessage/SMS/FaceTime vom Handy zum OS. Ich hätte nie gedacht, dass ich das so intensiv benutze. Mit iMessage beweist Apple auch noch, dass benutzerfreundliche Crypto nicht unmöglich ist. Die Meisten wissen es nichteinmal.

Genug Kuschelkurs, OS X Liebesschwüre gibts schon genug im Netz. Die uralte Software z.B. rsync oder OpenSSH ist ein echtes Unding. Auch iTunes. Ich benutze es einfach nicht. Es fehlt mir nicht.

OpenBSD CLI VM

Ich habe es mir angewöhnt alles was ich so für den Alltag brauche auf einer klein dimensionierten VM irgendwo im Internet zu hosten.

Das ist extrem praktisch, da ich egal wo ich bin, egal an welchem Rechner ich sitze immer alles da habe. Software die ich dort auf dem bei rootbsd gehosteten System nutze ist unter Anderem:

Auf der Maschine befindet sich sonst nichts. Alles läuft unter meinem User, kein Daemon der lauscht, nichts. Gesichert wird die Kiste mittels tarsnap

Klar hat das auch Nachteile, ich kann auf meine Todoliste nicht zugreifen wenn ich nur mit dem iPhone bestückt im Supermarkt stehe, aber diesen Use-Case habe ich auch einfach nicht. Mit newsbeuter Urls im Browser öffnen ist auch bescheiden, daher muss ich dort immer klicken. Wenn jemand hierfür eine Lösung hat, immer her damit.

OpenBSD Server

Der Normal-Nerd hat natürlich auch Bedürfnisse Dinge zu hosten. Deshalb gibts eine zweite Maschine, die alle meine Dienste bereitstellt die ich so brauche, diverse PHP/MySQL Applikationen für den Eigengebrauch.

OpenBSD, brauche ich jetzt nicht erwähnen, ist dafür momentan so mein liebstes OS. Sicher per default. Die Devs hauen immer wieder allerhand nützliche Sachen wie lustiges Crypto für Ping oder seit neuestem privilege separated file

  • Meine privaten git Repos mit gitolite
  • der Blog
  • Zwei Instanzen von nichtparasoup
  • Isso Kommentarsystem
  • MongoDB
  • und diverse andere Websites

Demnächst kommst vielleicht noch etwas DNS hinzu, was ich dort hoste.

Dinge die mich Nerven gibt es auch hier. Nämlich die fehlende SNI Funktionalität bei httpd, relayd und libTLS. Somit muss ich bisher noch nginx für die Websites nutzen. Aber das ist nur eine Frage der Zeit.

Weechat Copy & Paste

Etwas aus vim mit Tagbar oder mutt mit Sidebarpatch kopieren ist halt immer irgendwie kacke. Bei weechat gibts das gleiche Problem mit dem buffers Plugin und der nicklist.

Kreuz und quer Pipes und nicks drin. Nervt. Deshalb hier zwei kleine Aliases, die ich mir gebastelt hab.

/alias hidebars /bar hide nicklist ; /bar hide buffers
/alias showbars /bar show nicklist ; /bar show buffers

So ist’s für mich am Einfachsten irgendwelches Zeugs aus IRC zu kopieren.

  • /hidebars
  • Copy
  • /showbars

Hugo Templating und Themes

Ein bisschen Hands-On an meine neue Blogging Engine. Bevor ich den Blog migrieren konnte fehlten noch einige Anpassungen am Theme.

Da keines der Themes mir Out-of-the-Box gefallen hat, musste ich das Hyde Theme ziemlich aufbohren.

Pagination

Pages. Alle Blogposts auf der Startseite laden ist echt ungünstig. Pagination ist allerdings ziemlich gut dokumentiert.

  <div class="posts">

    {{ $paginator := .Paginate (where .Data.Pages "Type" "post") }}
    {{ range $paginator.Pages }}

    <div class="post">
      <h1><a href="{{ .Permalink }}">{{ .Title }}</a></h1>
      <span class="post-date">{{ .Date.Format "2006-01-02" }}</span>
      {{ .Content }}
    </div>

    {{ end }}
  </div>

  {{ partial "pagination.html" $paginator }}

Kurz gesagt, Variable $paginator mit Content befüllen und mit range drüber integrieren. Paginate greift dabei auf die Variablen aus der Config zurück.

$ cat config.yaml
paginate: 10
paginatePath: "page"

Danach kann man durch die Seiten pagen.

Das komplette Fils gibts auf github

Archive Page

Damit man aber trotzdem nicht alle Seiten einzeln durchkramen muss, fand ich ‘ne Archivseite auf Blogs schon immer sinnvoll. Gerade wenn die Site an sich statisch ist und es somit keine Suche gibt.

Was man im Endeffekt erreichen möchte ist also eine statische Seite erzeugen, die kein Blogpost und aber zur Build-Zeit dynamischen Content hat.

Pages können dazu konfiguriert werden einem bestimmten Typ zu entsprechen.

$ hugo new archives.md
$ vim content/archives.md
---
date: "2012-03-31T21:38:03+02:00"
draft: false
title: "Archives"
type: archives
url: "/archives/"
---

Für den type muss ein Layout gleichen Namens im Theme enthalten sein:

$ tree themes/noqqe/layouts/
themes/noqqe/layouts/
├── 404.html
├── _default
│   ├── list.html
│   └── single.html
├── archives
│   └── single.html
├── index.html
├── page
│   ├── list.html
│   └── single.html
├── partials
│   ├── head.html
│   ├── isso.html
│   ├── pagination.html
│   └── sidebar.html
└── post
    ├── list.html
    └── single.html

Hier erkennt man auch, dass ich neben archives auch noch post und page als Types definiert habe.

Der Single View für das Archiv ist das einzige was benötigt wird.

{{ partial "head.html" . }}
<body class="theme-base-0b">

{{ partial "sidebar.html" . }}

  <div class="content container">
  <div class="post">
  <h1>{{ .Title }}</h1>
      {{ range (where .Site.Pages "Type" "post").GroupByDate "2006"  }}
        <h2>{{ .Key }}</h2>
        <ul>
          {{ range .Pages }}
          <li>
              <span>{{ .Date.Format "02.01" }}</span>
              <a href="{{ .Permalink }}">{{ .Title }}</a>
          </li>
            {{ end }}
        </ul>
      {{ end }}
  </div>
  </div>
</body>
</html>

Im Endeffekt ist die Syntax ziemlich ähnlich wie bei der Pagination. Nur der range-Query ist etwas mehr advanced. Im Endeffekt for-Loop über allen Content mit WHERE und GROUP BY Command.

An dem “2006” nicht stören. Die Templating Engine funktioniert nicht mit wilden %Y-%m-%d Commands, sondern einem Referenz-Datum. Schön sehen kann man das auch hier

Tags und Categories

Was auch gefehlt hat war, dass Tags und Kategorien im Single-View der einzelnen Posts angezeigt werden. In themes/noqqe/layouts/post/single.html:

 <div class="post">
 <h1>{{ .Title }}</h1>
   <span class="post-date">{{ .Date.Format "2006-01-02" }}</span>
   {{ .Content }}

   <span class="meta">Categories:
   {{ range .Params.categories}}
     <a href="/categories/{{ . | urlize }}">{{ . }}</a>
   {{ end }}
   </span>
   <br/>
   <span class="meta">Tags:
   {{ range .Params.tags }}
     <a href="/tags/{{ . | urlize }}">{{ . }}</a>
   {{ end }}
   </span>
 </div>

Genau die Funktion urlize macht dann noch Links aus den Tagnamen.

So schön <3 Macht Spaß

noqqe.de auf GitHub

Wie bereits auf Twitter gesagt, wer möchte darf gerne meine falschen Kommata reparieren und Rechtschreibfehler korrigieren.

Zum Durchsuchen und Wiederverwenden ist der Source auf Github ebenfalls nützlich, schätze ich. <3

Github Repository: github.com/noqqe/noqqe.de

Bookmarks

Seit 2013 benutze ich Pinboard. Letztens flog auf GitHub allerdings ein Commandline Bookmark Manager vorbei. Den Gedanken fand ich eigentlich total toll. Die Syntax fand ich komisch, Ausgabe sah strange aus. Aber es kam auch noch erschwerend hinzu, dass es nicht mal gebaut werden konnte. Also hab ich weiter gesucht und einen ziemlich schönen gefunden.

bm ist in Bash geschrieben, sah schön aus, einfach gestrickt. Eigentlich super. Aber auch hier liess die Bedienung etwas zu wünschen übrig. Aber da das Zeug ja Opensource ist, fork it baby.

bm Fork

Was anfangs nur ein “ja ich passe mir das Teil ein klein bisschen an” war, wurde irgendwie zum Komplettumbau.

  • Der ganze Dropbox Folder Kack ist weg
  • HTML Preview im Browser mit webkit2png ist weg
  • Title wird automatisch mit curl beim adden eines Links hinzugefügt.
  • Syntax zum Bedienen stark umgeschrieben
  • Clean Funktion entfernt
  • Datum (wann wurde der Link geadded) wird automatisch hinzugefügt.
  • Farblich / Formatsmäßig umstrukturiert.

Das Repo: github.com/noqqe/bm

Eine Lizenz würde ich dem ganzen auch gerne hinzufügen, aber da der original Autor noch keine Lizenz hinzugefügt hat, muss ich damit erstmal warten.

Migration von Pinboard

Jetzt musste ich nur noch alle >1000 Bookmarks von Pinboard umziehen. Pinboard bietet einen json Export der eigenen Bookmarks mit allen Meta Informationen an.

Diesen hab ich mir per einfacher Download Funktion lokal gespeichert und mittels dieses Python Schnipsels in das “neue” bm Format umkonvertiert.

import json

with open('dump.json') as dataf:
  data = json.load(dataf)
    for x in data:
      print x["href"]+"|"+x["tags"]+"|"+x["time"]+"|"+x["description"]

Und wenn es beim Umleiten des STDOUT mit Python wegen des Encodings nicht klappt, export PYTHONIOENCODING=utf-8 benutzen. Saugeil. Damit hatte ich immer Probleme.

Ich weiss von ein paar Leuten, dass Sie den RSS Feed meines Pinboard Profils lesen. Für den Moment wird es dort keine neuen Dinge geben. Eventuell bastle ich mich in Python ein kleines Skript dass meine Bookmarks regelmäßig in RSS giesst. Da schau ich aber erstmal.

Von Octopress zu Hugo

Ich war genervt. Oh mein Gott, wie war ich genervt. Von diesem ständigem Ruby, Octopress, Gem Fuckup, Pygments Fuckup.

Octopress

  • 2-3 Minuten Blog-Compiles für poplige 300 Posts.
  • Man kann nie irgendwas updaten, da sonst der ganze Blog bricht.
  • Theming ist scheisse
  • Mit einem Ruby Gem eine Software bedienen die eigentlich Python ist.
  • Abhängigkeiten
  • Kryptische Fehlermeldungen
  • SCSS und Konsorten
  • Hauseigenes, nicht Markdown-konformes Auszeichnen von Images, Quotes, Codeblocks

Aber am Meisten von der Struktur. Man muss sich das vorstellen. Man will einen Blog eröffnen, klont den Source des Bloggingframeworks, fängt an innerhalb des Repos hinein zu committen. Ändert Themes, Configs, fummelt Plugins mit Git-Submodulen hinein. Und versucht dabei noch Upstream in das Repo mit den eigentlichen Posts hineinzumergen.

Das haben mittlerweile auch die Entwickler von Octopress erkannt und Octopress 3 angekündigt, mit dem alles besser werden soll. Aber irgendwie fühlt sich das an wie die neue Version des Internet Explorer.

Hugo

3 Jahre hab ich mir das jetzt angetan. Und jetzt? Alles schön. So wunderschön. Nachdem mir posativ auch letztens nochmal gohugo.io empfohlen hat, hab ich mir die in go geschriebene Software mal angesehen. Und sie machen einfach alles richtig. Alles.

Das bauen meines ganzen Blogs dauert nur noch 400ms, eine aktive Community (mit Discourse Installation \o/), Dokumentation ohne Ende (im Gegensatz zu 4 Seiten Octopress Doku). Keine 1000 Subkomponenten, im Blog-Repo ist nur das Theme, Config/Meta Daten und die Posts selbst. Es wirkt im Moment wie ein schnelles, straight-forward, monolithisches Stück Software.

Migrationsschritte:

  • Neuen Hugo Blog erstellen
  • Demo Theme in themes/ herunterladen
  • config.toml mit Meta Daten des Blogs befüllen
  • Umbenennen und CSS nach eigenen wünschen anpassen
  • Logo und Favicon einbauen
  • uploads/ und _posts/ aus Octopress umziehen
  • Date Format anpassen
  • Codeblock Syntax von {% codeblock %} zu Standard Markdown ändern
  • Quote Syntax von {% blockquote %} zu Standard Markdown > ändern
  • Image Syntax von {% img center %} zu figure ändern
  • Default Template auf YAML ändern
  • Pagination in das Theme patchen
  • Pages in die Sidebar einbauen und aus Octopress umziehen
  • JavaScript Client-Side Syntax Highlightning (highlightjs) einbauen
  • CSS für Codeblocks
  • Switch von GoogleFonts zu lokalen Fonts
  • Archive Page erstellen (denke hierzu gibts nen separaten Blogpost)
  • Comments (isso) als partial

Gerade das gebaue der Archiv Seite und der Pagination hat mir gezeigt wie unfassbar geil die Templating Sprache ist. Zum Beispiel sind GROUPS und WHERE Clauses ohne Probleme möglich.

{{ range (where .Site.Pages "Type" "post").GroupByDate "2006"  }}

Würde mich jetzt jemand fragen, welche Blogging Engine ich empfehlen würde, wäre es defintiv Hugo. Aber ich glaube das merkt man auch an meiner Schreibweise.

Traffic Analysis in pf

Für devnull-as-a-serivce hoste ich auf Port 9 über den inetd einen Discard Service. Aus historischen Gründen. Backwards compatibility. Letztens hatte ich bereits über ein paar Leute geschrieben, die sehr lange Connections zu Port 9 offen hielten. Über Monate. Aber wie viel Traffic haben diese Connections eigentlich verbraucht. Und überhaupt, welche Services verbrauchen auf meiner Kiste wie viel Traffic?

Seit ich Tor Relays auf meinen Maschinen betreibe habe ich darauf nochmal ein extra Augenmerk. Einfach um abwägen zu können wie viel Bandwith ich Tor zuweisen kann und wo ich Limits setzen muss. Zum Vergleich, Rechnung meines Providers vor und nach Tor Installation:

pf bietet viele verschiedene Möglichkeiten Traffic zu analysieren. Drei davon habe ich mir mal angesehen.

pflog

Das erste worauf man stößt ist pflog. Das Pseudo-Interface, von dem per default eines unter /dev/pflog0 existiert aber beliebig viele pflogX nachgeladen werden können.

Logging wird einfach in die spezielle Regel eingebettet.

pass in log (all, to pflog0) on $extif proto tcp from any to any port 9001

das sympathische daran ist, dass sowohl über Regeln als auch über den eigentlichen tcpdump der zum Auslesen des Logdevices benutzt wird, noch gefiltert werden kann.

$ tcpdump -n -e -ttt -i pflog0
tcpdump: WARNING: snaplen raised from 116 to 160
tcpdump: listening on pflog0, link-type PFLOG
Mar 16 09:38:10.163701 rule 38/(match) pass in on em0: 166.84.7.148.55675 > 185.34.0.188.9001: P 629511846:629512411(565) ack 110187399 win 605 <nop,nop,timestamp 131188075 3701794136>

Über mehrere Logdevices uns vordefinierte tcpdump Calls kann daraus ein ziemlich advancedes Setup entstehen.

pflow

pf ist außerdem im Stande Netflow Daten zu generieren. Das hört sich ziemlich overengineert an für eine einzelne Kiste. NetFlow wollt ich aber auch schon immer mal ausprobieren.

Kurz gesagt braucht man nur einen NetFlow Sensor und einen NetFlow Collector Zuerst installiert man einen Collector Dienst. Am einfachsten und minimalistischsten ist hier flowd, der von Damien Miller geschrieben wurde. Kann eigentlich nur gut sein. Ein paar Restrictions und das Ziel für das Logfile konfiguriert und fertig.

$ pkg_add flowd
$ cat /etc/flowd.conf
logfile "/var/log/flowd"
listen on 127.0.0.1:3001
flow source 127.0.0.1
store ALL
discard all
accept agent 127.0.0.1
$ flowd -gf /etc/flowd.conf

Der Sensor ist im Grunde ein weiteres Pseudo Interface, dass mit ifconfig eingerichtet wird. Die Parameter des Interfaces bestimmen Quelle und Ziel der Netflow Daten.

$ ifconfig pflow0 flowsrc 127.0.0.1 flowdst 127.0.0.1:3001
$ ifconfig pflow0
pflow0: flags=20041<UP,RUNNING,NOINET6> mtu 1492
        priority: 0
        pflow: sender: 127.0.0.1 receiver: 127.0.0.1:3001 version: 5
        groups: pflow

Aber ohne Infos aus pf hilft auch das schönste NetFlow Interface nichts. Wie bei pflog werden entweder bestimmte Rules via Parameter dazu bewogen die State Informationen an das pflow0 Interface zu schicken oder eben gleich alle States per default.

pass in on $extif proto tcp from any to any port 9001 keep state (pflow)
# or
set state-defaults pflow

Um die Daten dann auszulesen, lässt man das das mitgebrachte Tool flowd-reader auf das flowd Logfile los.

$ flowd-reader /var/log/flowd
FLOW recv_time 2015-03-16T10:28:07.883062 proto 6 tcpflags 00 tos 00 agent [127.0.0.1] src [188.226.189.53]:60608 dst [185.34.0.188]:9001 packets 12 octets 2862
FLOW recv_time 2015-03-16T10:28:07.883062 proto 6 tcpflags 00 tos 00 agent [127.0.0.1] src [185.34.0.188]:9001 dst [188.226.189.53]:60608 packets 8 octets 2727
FLOW recv_time 2015-03-16T10:28:45.982868 proto 6 tcpflags 00 tos 00 agent [127.0.0.1] src [93.115.94.243]:10361 dst [185.34.0.188]:9001 packets 10 octets 2647
FLOW recv_time 2015-03-16T10:28:45.982868 proto 6 tcpflags 00 tos 00 agent [127.0.0.1] src [185.34.0.188]:9001 dst [93.115.94.243]:10361 packets 8 octets 2631

Hier können mit Filter usw. spezifischer Traffic im definierten Output Format ausgelesen werden. Ziemlich nice.

pf labels

Die letzte (und mir sympathischste) Variante sind labels.

Hinter einer bestimmten Rule in der pf.conf kann entsprechendes Label angebracht werden.

pass in on $extif proto tcp from any to any port 9001 label tor

Nun werden Bytes(in/out), Packets(in/out), Statechanges usw. die auf dieser Regel matchen erfasst. Reihenfolge am Besten in der Manpage nachlesen.

$ pfctl -sl
ssh 22115 247697 74839158 130093 9043197 117604 65795961 1467
tor 17813 1329213 988230585 603981 291521453 725232 696709132 9923
monitoring 17813 54035 11840438 27936 5725257 26099 6115181 3145
discard 17813 4 200 2 120 2 80 2

Da die meisten Rulesets mit Tables für die Ports versehen sind, ist die Lösung mit dem statischen String als Label aber ungeeignet. Dafür gibts auch eine Lösung, da im Labelstring auch ein Set aus Variablen verwendet werden kann.

The following macros can be used in labels: $dstaddr The destination IP address. $dstport The destination port specification. $if The interface. $nr The rule number. $proto The protocol name. $srcaddr The source IP address. $srcport The source port specification.

Die pf.conf könnte dann wie folgt aussehen.

# Port tables
tcpin = "{ ssh, smtp, domain, www, https, ftp, ftp-data }"
udpin = "{ 9, domain }"
# Incoming rule
pass in on $extif proto tcp from any to any port $tcpin label "tcp:in:$dstport"
pass in on $extif proto udp from any to any port $udpin label "udp:in:$dstport"

und der dynamisch generierte Output:

tcp:out:80 151 2099 1121133 1105 996878 994 124255 6
tcp:out:443 151 17524 14295556 9411 13062701 8113 1232855 35

Fazit

Was mir tatsächlich fehlt ist etwas das dynamische Auswerten von Source IP und verbrauchtem Traffic. Was pf zwar beherrscht ist einer bestimmten Regel eine Bandwith (über queues) zu Garantieren/Drosseln aber tatsächlich konsumierte Bandbreite limitieren funktioniert nicht so ohne weiteres.

Dazu müsste man sich schon etwas eigenes Basteln, das Traffic zählt und dann darauf reagiert. Erschwerend kommt hinzu, dass sich bei tcpdump kein tatsächliches Outputformat definieren lässt. Zum Beispiel nur SRC IP und Bytes. Wenn man danach im Netz sucht, existieren zwar allerhand wilde sed und awk konstrukte, aber nichts auf das ich mich wirklich verlassen möchte.

Also gibts das erstmal nicht.

Dwarf Fortress unter OS X Yosemite

Dwarf Fortress unter OSX Yosemite zum Laufen zu bekommen ist garnichtmal so einfach. Bisher hab ich immer direkt die Version von DF von den Entwicklern heruntergeladen. Diesmal die OS X Homebrew Version heruntergeladen. Die Probleme sind aber die gleichen.

Installation

Viel mehr als die Sources herunterladen und an eine bestimmte Stelle auspacken, wird bei der Brew Version auch nicht gemacht.

brew tap homebrew/games
brew install dwarf-fortress

Da Dwarf Fortress auf viel X11 und deren Libraries aufbaut, Xquartz installieren.

Fehlerbehebung

$ ./df
dyld: Library not loaded: /usr/X11R6/lib/libfreetype.6.dylib
  Referenced from:
    /usr/local/Cellar/dwarf-fortress/0.40.23/libexec/libs/SDL_ttf.framework/Versions/A/SDL_ttf
  Reason: no suitable image found.  Did find:
    /usr/local/lib/libfreetype.6.dylib: mach-o, but wrong architecture

Der obige Fehler entsteht, da die default Location der Libraries nicht mit Xquartz kommt. Daher diese umkopieren.

sudo mkdir /usr/X11R6
sudo cp -a /usr/X11/* /usr/X11R6/

Ein weiteres Problem gibt es allerdings mit Retina Displays. Die Standardauflösung bzw. der Darstellungsmodus ist dafür nicht gemacht.

Dafür noch den PRINT_MODE von 2D auf STANDARD umstellen.

$ vim /usr/local/Cellar/dwarf-fortress/0.40.23/libexec/data/init/init.txt
[...]
[PRINT_MODE:STANDARD]
[...]

Schon läufts.

OpenBL in pf

Das Projekt OpenBL, dass ursprünglich die OpenSSH Blacklist war, hat auf der ganzen Welt verteilte Honeypots rumstehen und publiziert regelmäßig Blacklisten sortiert nach Zeitraum und Protokoll des Angriffs.

Das Resultat daraus kann jeder frei benutzen und zum Beispiel in seine Firewall einbauen. Realisiert hab ich das über einen pf Table.

table <blacklist> persist
pass in quick from <admins>
block quick from <blacklist>

Die Regel ist relativ unspektakulär, abgesehen davon, dass die pass-Regel für die Admin IPs vor der Blacklist-Block Regel matchen sollte. Nur für den Fall dass man mal selbst auf so einer Liste landen sollte. Ein kleines Bash Script, dass mit Cron einmal die Woche die IPs updated.

#!/usr/local/bin/bash
STORE="/tmp/"
RULES="base.txt.gz"
TABLE="blacklist"
/usr/local/bin/wget -q https://www.openbl.org/lists/$RULES -P $STORE
gunzip $STORE/$RULES
pfctl -t $TABLE -T flush
pfctl -t $TABLE -T add -f $STORE/${RULES%.*}
rm $STORE/${RULES%.*}

Es gibt natürlich auch 10.000 andere Listen, die sowas bewerkstelligen. Darunter auch ganze Wrapper die solche Listen parsen. War mir aber dann etwas zu hart overengineert.

In Erinnerung