ugly hack to whitelist from the Web interface

I wanted the whitelist feature to keep the user on the same page
without having to reload it.  I'm sure someone better versed in PHP
could eliminate the need for this hack.  Nonetheless, it works.

www-data runs the script if executed from the Web interface.  www-data
also needs access to write to /etc/pihole/gravity.list to actually
remove the domain.  So a few more things need to happen before this
will fully work.

The changes in this script won't change what is displayed if run from
the terminal, but will help when it needs to be run from the Web
interface, so I am just committing this now.

The only other thing I would like to see would be a progress spinner,
but my Web skills still need some work...
This commit is contained in:
Jacob Salmela 2015-12-09 15:16:34 -06:00
parent 263d9a222a
commit 57282cfe16

View file

@ -9,21 +9,47 @@
whitelist=/etc/pihole/whitelist.txt whitelist=/etc/pihole/whitelist.txt
adList=/etc/pihole/gravity.list adList=/etc/pihole/gravity.list
webInterfaceEchos=/tmp/whitelistEchoFile
if [[ ! -f $whitelist ]];then if [[ ! -f $whitelist ]];then
touch $whitelist touch $whitelist
fi fi
formatEchoes()
{
if [[ "$(whoami)" = "www-data" ]];then
echo "$1" >> $webInterfaceEchos
else
echo "$1"
fi
}
if [[ $# = 0 ]]; then if [[ $# = 0 ]]; then
# echoes go to a file for showing in the Web interface
echo "Immediately whitelists one or more domains." echo "Immediately whitelists one or more domains."
echo "Usage: whitelist.sh domain1 [domain2 ...]" echo "Usage: whitelist.sh domain1 [domain2 ...]"
if [[ "$(whoami)" = "www-data" ]];then
formatEchoes "Enter one or more space-separated FQDN."
# If the user is www-data, the script is probably being called from the Web interface
# Since the Web interface only displays the last echo in the script (I'm still a n00b with PHP)
webInterfaceDisplay=$(cat $webInterfaceEchos)
# The last echo needs to be delimited by a semi-colon so I translate newlines into semi-colons so it displays properly
# Someone better in PHP might be able to come up with a better solution, but this is a highly-requested feature
# This is also used later in the script, too
echo "$webInterfaceDisplay" | tr "\n" ";"
fi
fi fi
combopattern="" combopattern=""
# Overwrite any previously existing file so the output is always correct
echo "" > $webInterfaceEchos
# For each argument passed to this script # For each argument passed to this script
for var in "$@" for var in "$@"
do do
echo "Whitelisting $var..." # Start appending the echoes into the file for display in the Web interface later
formatEchoes "Whitelisting $var..."
# Construct basic pattern to match domain name. # Construct basic pattern to match domain name.
basicpattern=$(echo $var | awk -F '[# \t]' 'NF>0&&$1!="" {print ""$1""}' | sed 's/\./\\./g') basicpattern=$(echo $var | awk -F '[# \t]' 'NF>0&&$1!="" {print ""$1""}' | sed 's/\./\\./g')
@ -41,7 +67,7 @@ done
# Now report on and remove matched domains # Now report on and remove matched domains
if [[ "$combopattern" != "" ]]; then if [[ "$combopattern" != "" ]]; then
echo "Modifying hosts file..." formatEchoes "Modifying hosts file..."
# Construct pattern to match entry in hosts file. # Construct pattern to match entry in hosts file.
# This consists of one or more IP addresses followed by the domain name. # This consists of one or more IP addresses followed by the domain name.
@ -51,7 +77,13 @@ if [[ "$combopattern" != "" ]]; then
sed -r -n 's/'"$pattern"'/ Removed: \3/p' $adList sed -r -n 's/'"$pattern"'/ Removed: \3/p' $adList
sed -r -i '/'"$pattern"'/d' $adList sed -r -i '/'"$pattern"'/d' $adList
echo "** $# domain(s) whitelisted." formatEchoes "** $# domain(s) whitelisted."
# Only echo the semi-colon delimited echoes if the user running the script is www-data (meaning it is run the from Web interface)
if [[ "$(whoami)" = "www-data" ]];then
webInterfaceDisplay=$(cat $webInterfaceEchos)
echo "$webInterfaceDisplay" | tr "\n" ";"
fi
# Force dnsmasq to reload /etc/pihole/gravity.list # Force dnsmasq to reload /etc/pihole/gravity.list
kill -HUP $(pidof dnsmasq) kill -HUP $(pidof dnsmasq)
fi fi