Wer kennt das nicht: Da hast Du Deinen Pihole redundant laufen und dann musst Du die Blocklisten manuell synchronisieren. Unschön.

Aber da kann man was machen.

Ich habe mir da Pihole Cloudsync angeschaut und fand das sehr vielversprechend. Was mich ein bisschen gestört hat ist, dass man da mit Git eine zusätzliche “Middleware” ins Spiel bringt, was das Ganze ein wenig komplizierter macht als es sein müsste.

Man kann das Ganze auch ein bisschen eleganter machen, indem man die “Cloud"durch ein SMB Share ersetzt.

So ein halbes Jahr später ist mir dann eingefallen, dass man das ja auch gleich per rsync machen kann, dann braucht man nicht mal mehr ein SMB Share. 💩

Ich lass das Skript trotzdem mal stehen.

#!/bin/bash

# pihole-sync
# sync pihole config using smb share
# some code adopted from steven jenkins' pihole-cloudsync
# see https://github.com/stevejenkins/pihole-cloudsync

# djonz mar 2022

SHARE=/mnt/smb/pihole
PIHOLE_DIR=/etc/pihole
GRAVITY=/etc/pihole/gravity.db
DNSMASQ_DIR=/etc/dnsmasq.d/
AD_LIST=adlist.csv
CUSTOM_LIST=custom.list
DOMAIN_LIST=domainlist.csv
CNAME_LIST=05-pihole-custom-cname.conf
LOGFILE=/var/log/pihole-sync.log

push () {
        # export gravity db to smb share. run on master
        exec > $LOGFILE 2>&1
        pihole -g
        cd $PIHOLE_DIR || exit
        touch $CUSTOM_LIST
        touch $DNSMASQ_DIR/$CNAME_LIST
        cp $CUSTOM_LIST $SHARE
        cp $DNSMASQ_DIR/$CNAME_LIST $SHARE
        cd $SHARE || exit
        sqlite3 $GRAVITY -header -csv "SELECT * FROM adlist" >$AD_LIST
        sqlite3 $GRAVITY -header -csv "SELECT * FROM domainlist" >$DOMAIN_LIST
        echo "Gravity db exported."
}
pull () {
	# import gravity db. run on slave.
        exec > $LOGFILE 2>&1
	      cd $SHARE || exit
        systemctl stop pihole-FTL.service
        cp $CUSTOM_LIST $PIHOLE_DIR
        cp $CNAME_LIST $DNSMASQ_DIR
        sqlite3 $GRAVITY "DROP TABLE adlist;"
        sqlite3 $GRAVITY -header -csv ".import adlist.csv adlist"
        sqlite3 $GRAVITY "DROP TABLE domainlist;"
        sqlite3 $GRAVITY -header -csv ".import domainlist.csv domainlist"
        echo "Gravity db imported."
        systemctl start pihole-FTL.service
        pihole -g -r recreate
}

if [ -z "$1" ]
   then
      echo "Usage: pihole-sync.sh [push|pull]"
      exit 1
fi

case $1 in
   push)
   push
   ;;
   pull)
   pull
   ;;
   *)
   echo "Usage: pihole-sync.sh [push|pull]"
   ;;
esac

Man plant das dann per Crontab auf beiden Systemen ein (“push” auf dem Master und “pull”) auf dem/den Slave System(en) und ab sofort sind die Blocklisten auf beiden Systemen immer synchron.

Geht aber, wie oben beschrieben noch einfacher:

  • Als Wert für sie SHARE Variable /tmp/pihole verwenden
  • Im Push-Teil noch ein rsync -av /tmp/pihole/ slave:/tmp/pihole einbauen
  • Auf dem Slave lsyncd installieren und dem Pull-Teil ausführen, wenn sich der Inhalt von /tmp/pihole ändert

Könnte so auch funktionieren. Meinungen?