From 469ff45f0100d22c3419489a60c292018f15c544 Mon Sep 17 00:00:00 2001
From: Adam Warner <awarner@croydon.parkeon.com>
Date: Wed, 26 Oct 2016 09:36:02 +0100
Subject: [PATCH 1/3] create list.sh. Combines whitelist and blacklist scripts
 in an effort to reduce code duplication. update pihole script to reflect new
 white/blacklist command.

---
 advanced/Scripts/list.sh | 166 +++++++++++++++++++++++++++++++++++++++
 pihole                   |   6 +-
 2 files changed, 168 insertions(+), 4 deletions(-)
 create mode 100644 advanced/Scripts/list.sh

diff --git a/advanced/Scripts/list.sh b/advanced/Scripts/list.sh
new file mode 100644
index 00000000..4884e354
--- /dev/null
+++ b/advanced/Scripts/list.sh
@@ -0,0 +1,166 @@
+#!/usr/bin/env bash
+# Pi-hole: A black hole for Internet advertisements
+# (c) 2015, 2016 by Jacob Salmela
+# Network-wide ad blocking via your Raspberry Pi
+# http://pi-hole.net
+# Whitelists and blacklists domains
+#
+# Pi-hole is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+#globals
+basename=pihole
+piholeDir=/etc/${basename}
+whitelist=${piholeDir}/whitelist.txt
+blacklist=${piholeDir}/blacklist.txt
+reload=false
+addmode=true
+verbose=true
+
+domList=()
+domToRemoveList=()
+
+listMain=""
+listAlt=""
+
+helpFunc() {
+
+    if [[ ${listMain} == ${whitelist} ]]; then
+        letter="w"
+        word="white"
+    else
+        letter="b"
+        word="black"
+    fi
+
+	cat << EOM
+::: Immediately ${word}lists one or more domains in the hosts file
+:::
+::: Usage: pihole -${letter} domain1 [domain2 ...]
+:::
+::: Options:
+:::  -d, --delmode			Remove domains from the ${word}list
+:::  -nr, --noreload		Update ${word}list without refreshing dnsmasq
+:::  -q, --quiet			output is less verbose
+:::  -h, --help				Show this help dialog
+:::  -l, --list				Display your ${word}listed domains
+EOM
+	exit 1
+}
+
+HandleOther(){
+  #check validity of domain
+	validDomain=$(echo "$1" | perl -ne'print if /\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b/')
+	if [ -z "${validDomain}" ]; then
+		echo "::: $1 is not a valid argument or domain name"
+	else
+		domList=("${domList[@]}" ${validDomain})
+	fi
+}
+
+PoplistFile() {
+	#check whitelist file exists, and if not, create it
+	if [[ ! -f ${whitelist} ]]; then
+		touch ${whitelist}
+	fi
+	for dom in "${domList[@]}"; do
+	    # Logic : If addmode then add to desired list and remove from the other; if delmode then remove from desired list but do not add to the other
+		if ${addmode}; then
+			AddDomain "${dom}" "${listMain}"
+			RemoveDomain "${dom}" "${listAlt}"
+		else
+			RemoveDomain "${dom}" "${listMain}"
+		fi
+	done
+}
+
+AddDomain() {
+
+	list="$2"
+
+	bool=true
+	#Is the domain in the list we want to add it to?
+	grep -Ex -q "$1" ${list} || bool=false
+
+	if [[ "${bool}" == false ]]; then
+	  #domain not found in the whitelist file, add it!
+	  if [[ "${verbose}" == true ]]; then
+		echo "::: Adding $1 to $list..."
+	  fi
+	  reload=true
+	  # Add it to the list we want to add it to
+	  echo "$1" >> ${list}
+	else
+        if [[ "${verbose}" == true ]]; then
+            echo "::: ${1} already exists in ${list}, no need to add!"
+        fi
+	fi
+}
+
+RemoveDomain() {
+    list="$2"
+
+    bool=true
+    #Is it in the other list? Logic follows that if its whitelisted it should not be blacklisted and vice versa
+    grep -Ex -q "$1" ${list} || bool=false
+    if [[ "${bool}" == true ]]; then
+        # Remove it from the other one
+        echo "::: Removing $1 from $list..."
+        echo "$1" | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /'{}'(?!.)/;' ${list}
+        reload=true
+    else
+        if [[ "${verbose}" == true ]]; then
+            echo "::: ${1} does not exist in ${list}, no need to remove!"
+        fi
+    fi
+}
+
+Reload() {
+	# Reload hosts file
+	pihole -g -sd
+}
+
+Displaylist() {
+    if [[ ${listMain} == ${whitelist} ]]; then
+        string="gravity resistant domains"
+    else
+        string="domains caught in the sinkhole"
+    fi
+	verbose=false
+	echo -e " Displaying $string \n"
+	count=1
+	while IFS= read -r RD; do
+		echo "${count}: ${RD}"
+		count=$((count+1))
+	done < "${listMain}"
+	exit 0;
+}
+
+for var in "$@"; do
+	case "${var}" in
+	    "-w" | "whitelist"   ) listMain="${whitelist}"; listAlt="${blacklist}";;
+	    "-b" | "blacklist"   ) listMain="${blacklist}"; listAlt="${whitelist}";;
+		"-nr"| "--noreload"  ) reload=false;;
+		"-d" | "--delmode"   ) addmode=false;;
+		"-f" | "--force"     ) force=true;;
+		"-q" | "--quiet"     ) verbose=false;;
+		"-h" | "--help"      ) helpFunc;;
+		"-l" | "--list"      ) Displaylist;;
+		*                    ) HandleOther "${var}";;
+	esac
+done
+
+shift
+
+if [[ $# = 0 ]]; then
+	helpFunc
+fi
+
+PoplistFile
+
+if ${reload}; then
+	Reload
+fi
+
diff --git a/pihole b/pihole
index 9a678393..4b197d12 100755
--- a/pihole
+++ b/pihole
@@ -22,14 +22,12 @@ if [[ ! $EUID -eq 0 ]];then
 fi
 
 whitelistFunc() {
-	shift
-	/opt/pihole/whitelist.sh "$@"
+	/opt/pihole/list.sh "$@"
 	exit 0
 }
 
 blacklistFunc() {
-	shift
-	/opt/pihole/blacklist.sh "$@"
+	/opt/pihole/list.sh "$@"
 	exit 0
 }
 

From 0d6a6b97f96906ec8fa7eeb202d27f037389c213 Mon Sep 17 00:00:00 2001
From: Adam Warner <awarner@croydon.parkeon.com>
Date: Wed, 26 Oct 2016 09:56:45 +0100
Subject: [PATCH 2/3] remove whitelist and blacklist scripts

---
 advanced/Scripts/blacklist.sh | 140 ---------------------------------
 advanced/Scripts/whitelist.sh | 141 ----------------------------------
 2 files changed, 281 deletions(-)
 delete mode 100755 advanced/Scripts/blacklist.sh
 delete mode 100755 advanced/Scripts/whitelist.sh

diff --git a/advanced/Scripts/blacklist.sh b/advanced/Scripts/blacklist.sh
deleted file mode 100755
index acf0cf60..00000000
--- a/advanced/Scripts/blacklist.sh
+++ /dev/null
@@ -1,140 +0,0 @@
-#!/usr/bin/env bash
-# Pi-hole: A black hole for Internet advertisements
-# (c) 2015, 2016 by Jacob Salmela
-# Network-wide ad blocking via your Raspberry Pi
-# http://pi-hole.net
-# Blacklists domains
-#
-# Pi-hole is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 2 of the License, or
-# (at your option) any later version.
-
-helpFunc() {
-	cat << EOM
-::: Immediately blacklists one or more domains in the hosts file
-:::
-:::
-::: Usage: pihole -b domain1 [domain2 ...]
-::: Options:
-:::  -d, --delmode			Remove domains from the blacklist
-:::  -nr, --noreload			Update blacklist without refreshing dnsmasq
-:::  -q, --quiet			output is less verbose
-:::  -h, --help				Show this help dialog
-:::  -l, --list				Display your blacklisted domains
-EOM
-	exit 1
-}
-
-if [[ $# = 0 ]]; then
-	helpFunc
-fi
-
-#globals
-basename=pihole
-piholeDir=/etc/${basename}
-adList=${piholeDir}/gravity.list
-blacklist=${piholeDir}/blacklist.txt
-reload=false
-addmode=true
-verbose=true
-
-domList=()
-domToRemoveList=()
-
-HandleOther(){
-  #check validity of domain
-	validDomain=$(echo "$1" | perl -ne'print if /\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b/')
-	if [ -z "$validDomain" ]; then
-		echo "::: $1 is not a valid argument or domain name"
-	else
-	  domList=("${domList[@]}" ${validDomain})
-	fi
-}
-
-PopBlacklistFile() {
-	#check blacklist file exists, and if not, create it
-	if [[ ! -f ${blacklist} ]];then
-  	  touch ${blacklist}
-	fi
-	for dom in "${domList[@]}"; do
-	  if "$addmode"; then
-	  	AddDomain "$dom"
-	  else
-	    RemoveDomain "$dom"
-	  fi
-	done
-}
-
-AddDomain() {
-#| sed 's/\./\\./g'
-	bool=false
-	grep -Ex -q "$1" ${blacklist} || bool=true
-	if ${bool}; then
-	  #domain not found in the blacklist file, add it!
-	  if ${verbose}; then
-	    echo -n "::: Adding $1 to blacklist file..."
-	  fi
-		echo "$1" >> ${blacklist}
-		reload=true
-		echo " done!"
-	else
-	if ${verbose}; then
-		echo "::: $1 already exists in $blacklist! No need to add"
-		fi
-	fi
-}
-
-RemoveDomain() {
-
-  bool=false
-  grep -Ex -q "$1" ${blacklist} || bool=true
-  if ${bool}; then
-  	#Domain is not in the blacklist file, no need to Remove
-  	if ${verbose}; then
-  	echo "::: $1 is NOT blacklisted! No need to remove"
-  	fi
-  else
-    #Domain is in the blacklist file,remove it
-    if ${verbose}; then
-    echo "::: Un-blacklisting $dom..."
-    fi
-   echo "$1" | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /'{}'(?!.)/;' ${blacklist}
-   reload=true
-  fi
-}
-
-Reload() {
-    pihole -g -sd
-}
-
-DisplayBlist() {
-	verbose=false
-	echo -e " Displaying Gravity Affected Domains \n"
-	count=1
-	while IFS= read -r AD
-	do
-		echo "${count}: $AD"
-		count=$((count+1))
-	done < "$blacklist"
-}
-
-###################################################
-
-for var in "$@"
-do
-  case "$var" in
-    "-nr"| "--noreload"  ) reload=false;;
-    "-d" | "--delmode"   ) addmode=false;;
-    "-q" | "--quiet"     ) verbose=false;;
-    "-h" | "--help"	     ) helpFunc;;
-    "-l" | "--list"      ) DisplayBlist;;
-    *                    ) HandleOther "$var";;
-  esac
-done
-
-PopBlacklistFile
-
-if ${reload}; then
-	Reload
-fi
diff --git a/advanced/Scripts/whitelist.sh b/advanced/Scripts/whitelist.sh
deleted file mode 100755
index 82ff3bb3..00000000
--- a/advanced/Scripts/whitelist.sh
+++ /dev/null
@@ -1,141 +0,0 @@
-#!/usr/bin/env bash
-# Pi-hole: A black hole for Internet advertisements
-# (c) 2015, 2016 by Jacob Salmela
-# Network-wide ad blocking via your Raspberry Pi
-# http://pi-hole.net
-# Whitelists domains
-#
-# Pi-hole is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 2 of the License, or
-# (at your option) any later version.
-
-
-helpFunc() {
-	cat << EOM
-::: Immediately whitelists one or more domains in the hosts file
-:::
-::: Usage: pihole -w domain1 [domain2 ...]
-:::
-::: Options:
-:::  -d, --delmode			Remove domains from the whitelist
-:::  -nr, --noreload			Update Whitelist without refreshing dnsmasq
-:::  -q, --quiet			output is less verbose
-:::  -h, --help				Show this help dialog
-:::  -l, --list				Display your whitelisted domains
-EOM
-	exit 1
-}
-
-if [[ $# = 0 ]]; then
-	helpFunc
-fi
-
-#globals
-basename=pihole
-piholeDir=/etc/${basename}
-adList=${piholeDir}/gravity.list
-whitelist=${piholeDir}/whitelist.txt
-reload=false
-addmode=true
-verbose=true
-
-domList=()
-domToRemoveList=()
-
-HandleOther(){
-  #check validity of domain
-	validDomain=$(echo "$1" | perl -ne'print if /\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b/')
-	if [ -z "${validDomain}" ]; then
-		echo "::: $1 is not a valid argument or domain name"
-	else
-		domList=("${domList[@]}" ${validDomain})
-	fi
-}
-
-PopWhitelistFile() {
-	#check whitelist file exists, and if not, create it
-	if [[ ! -f ${whitelist} ]]; then
-		touch ${whitelist}
-	fi
-	for dom in "${domList[@]}"; do
-		if ${addmode}; then
-			AddDomain "${dom}"
-		else
-			RemoveDomain "${dom}"
-		fi
-	done
-}
-
-AddDomain() {
-	#| sed 's/\./\\./g'
-	bool=false
-
-	grep -Ex -q "$1" ${whitelist} || bool=true
-	if ${bool}; then
-	  #domain not found in the whitelist file, add it!
-	  if ${verbose}; then
-		echo -n "::: Adding $1 to $whitelist..."
-	  fi
-	  reload=true
-	  echo "$1" >> ${whitelist}
-      if ${verbose}; then
-	  	echo " done!"
-	  fi
-	else
-		if ${verbose}; then
-			echo "::: ${1} already exists in ${whitelist}, no need to add!"
-		fi
-	fi
-}
-
-RemoveDomain() {
-
-  bool=false
-  grep -Ex -q "$1" ${whitelist} || bool=true
-  if ${bool}; then
-  	#Domain is not in the whitelist file, no need to Remove
-  	if ${verbose}; then
-  	    echo "::: $1 is NOT whitelisted! No need to remove"
-  	fi
-  else
-    echo "$1" | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /'{}'(?!.)/;' ${whitelist}
-    reload=true
-  fi
-}
-
-Reload() {
-	# Reload hosts file
-	pihole -g -sd
-}
-
-DisplayWlist() {
-	verbose=false
-	echo -e " Displaying Gravity Resistant Domains \n"
-	count=1
-	while IFS= read -r RD; do
-		echo "${count}: ${RD}"
-		count=$((count+1))
-	done < "${whitelist}"
-	exit 0;
-}
-
-###################################################
-
-for var in "$@"; do
-	case "${var}" in
-		"-nr"| "--noreload"  ) reload=false;;
-		"-d" | "--delmode"   ) addmode=false;;
-		"-f" | "--force"     ) force=true;;
-		"-q" | "--quiet"     ) verbose=false;;
-		"-h" | "--help"      ) helpFunc;;
-		"-l" | "--list"      ) DisplayWlist;;
-		*                    ) HandleOther "${var}";;
-	esac
-done
-
-PopWhitelistFile
-
-if ${reload}; then
-	Reload
-fi

From 55a653aca422b0c3614c8bce21ce12cc4e7b5c64 Mon Sep 17 00:00:00 2001
From: Adam Warner <awarner@croydon.parkeon.com>
Date: Wed, 26 Oct 2016 10:00:00 +0100
Subject: [PATCH 3/3] clear out /opt/pihole folder before installing scripts

---
 automated install/basic-install.sh | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh
index dfed93a1..c2396bf5 100755
--- a/automated install/basic-install.sh	
+++ b/automated install/basic-install.sh	
@@ -553,6 +553,8 @@ installScripts() {
 	# Install the scripts from /etc/.pihole to their various locations
 	echo ":::"
 	echo -n "::: Installing scripts to /opt/pihole..."
+	#clear out /opt/pihole and recreate it. This allows us to remove scripts from future installs
+	rm -rf /opt/pihole
 	install -o "${USER}" -m755 -d /opt/pihole
 
 	cd /etc/.pihole/