Hey there and happy shortest day of the year (in the northern hemisphere)! 
Like I said, I’m gonna share my script(s) which let(s) IPFire act like a PiHole (except from the statistical evaluation part). No extra hardware or software needed.
The really nice thing about IPFire is, that it is pretty versatile. It might not have all the features you need but with a little bit of Linux-knowledge you can accomplish a lot of additional things. Anyway, let’s get to it.
First of all, because IPFire does not support the “rev”-command, I needed some “helper-script” (I found it somewhere on the web after Michael suggested it).
#!/usr/bin/sed -f
/../! b
# Reverse a line. Begin embedding the line between two newlines
s/^.*$/\
&\
/
# Move first character at the end. The regexp matches until
# there are zero or one characters between the markers
tx
:x
s/\(\n.\)\(.*\)\(.\n\)/\3\2\1/
tx
# Remove the newline markers
s/\n//g
This code does nothing else than reverse all characters in each line (not a document at whole, but rather line for line) so
bla bla
blup
123
will become
alb alb
pulb
321
I named it “reverse.sh” and put it in the home-folder. The next thing is the main-script itself:
sleep 1
wget -O- -q https://raw.githubusercontent.com/StevenBlack/hosts/master/alternates/fakenews-gambling-porn/hosts > raw
sleep 1
sed -i '/^0.0.0.0/!d' raw
sleep 1
sed -i 's/^0.0.0.0 //' raw
sleep 1
sed -i 's/#.*//' raw
sleep 1
sed -i 's/ //g' raw
sleep 1
cp /root/include /root/include-backup
sleep 1
grep -F -f /root/exclude raw >> /root/include
sleep 1
sed -i 's/^.//' /root/exclude
sleep 1
sed -i 's/$/\\|/' /root/exclude
sleep 1
sed -i '$s/.$//' /root/exclude
sleep 1
exclude=$(cat /root/exclude | tr -d '\n')
sleep 1
sed -i '$s/.$/../' /root/exclude
sleep 1
sed -i 's/^/./' /root/exclude
sleep 1
sed -i 's/..$//' /root/exclude
sleep 1
cat raw | sed -f /root/reverse.sh > rawreverse
sleep 1
rm -f raw
sleep 1
sed -i 's/.[^.]*//3g' rawreverse
sleep 1
awk '!seen[$0]++' rawreverse > clean
sleep 1
rm -f rawreverse
sleep 1
cat clean | sed -f /root/reverse.sh > raw
sleep 1
rm -f clean
sleep 1
sed -i "/^\($exclude)/d" raw
sleep 1
sort raw > hosts
sleep 1
rm -f raw
sleep 1
sort /root/include >> hosts
sleep 1
rm -f /root/include
sleep 1
mv /root/include-backup /root/include
sleep 1
sed -i '1s/.*/server:/' hosts
sleep 1
sed -i '2,$s/^/local-zone: "/' hosts
sleep 1
sed -i '2,$s/$/" always_null/' hosts
sleep 1
rm -f /etc/unbound/local.d/hosts.conf
sleep 1
mv ~/hosts /etc/unbound/local.d/hosts.conf
sleep 1
I named it “hosts.sh” and also put it in the home-folder. Some of you might think “what’s with all the sleepies?”… but I’m old-school and I like to give the machine some time in between the steps, also for debugging purposes. So what does this script do?
I’m not going to explain every line, so I will summarizre. This script downloads one of the hostlists from steven black (in this case: https://raw.githubusercontent.com/StevenBlack/hosts/master/alternates/fakenews-gambling-porn/hosts). It then reformats this list, so that unbound can “read” it and increases the blocking-level by reformatting all sub-domains to the particular TLD, followed by deleting the duplicates (and therefore thinning out the “blocklist”). So for example if the original list contains “telemetry.adware.com”, “commercial.adware.com” and “whatever.adware.com” after the script did its work, it will simply contain “adware.com”.
It also does some exclusions, read from a file named “exclude” looking like this (for example):
.sourceforge.net
.stackoverflow.com
All TLD in this file will be excluded from the “blocklist”! IMPORTANT: Unbound will still block the subdomains, which are listed in Steven Blacks host-list. But there is no “TLD”-blocking for these domains.
And finally the script does some inclusions, read from a file named “include” looking like this (for example):
mov
zip
All domains in this file will be added to the “blocklist”. “exclude” and “include” are also located in the home-folder. The eventually generated “blocklist” is simply a *.conf-file in the folder “/etc/unbound/local.d/” and looks like this (for example):
server:
local-zone: "adware.com" always_null
local-zone: "bloatware.com" always_null
...
Then the script does some cleaning (deleting of temporarly necessary files). Restart of unbound is NOT included.
To keep the “blocklist” up to date, I like to run the script once a week (via fcron) before the IPFire does it’s weekly reboot, so no manual restart of unbound is necessary (except for testing purposes if everything works).
That’s it, feel free to use the script and optimize it. 
Merry Christmas and a “good slide” 
Alex