From 57282cfe161222dd4c2aa336a37dd16d36356a44 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Wed, 9 Dec 2015 15:16:34 -0600 Subject: [PATCH] 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... --- advanced/Scripts/whitelist.sh | 38 ++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/advanced/Scripts/whitelist.sh b/advanced/Scripts/whitelist.sh index f66f56d0..7b964cdf 100755 --- a/advanced/Scripts/whitelist.sh +++ b/advanced/Scripts/whitelist.sh @@ -9,21 +9,47 @@ whitelist=/etc/pihole/whitelist.txt adList=/etc/pihole/gravity.list +webInterfaceEchos=/tmp/whitelistEchoFile + if [[ ! -f $whitelist ]];then touch $whitelist fi +formatEchoes() +{ +if [[ "$(whoami)" = "www-data" ]];then + echo "$1" >> $webInterfaceEchos +else + echo "$1" +fi +} + if [[ $# = 0 ]]; then + # echoes go to a file for showing in the Web interface echo "Immediately whitelists one or more domains." 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 combopattern="" +# Overwrite any previously existing file so the output is always correct +echo "" > $webInterfaceEchos + # For each argument passed to this script for var in "$@" 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. 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 if [[ "$combopattern" != "" ]]; then - echo "Modifying hosts file..." + formatEchoes "Modifying hosts file..." # Construct pattern to match entry in hosts file. # 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 -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 kill -HUP $(pidof dnsmasq) fi