From 34ff9b309a097a2e2da0c5a905db41268b721b9a Mon Sep 17 00:00:00 2001 From: Igor Rzegocki Date: Thu, 28 Jan 2016 20:42:16 +0100 Subject: [PATCH] Added nginx as an optional server. Why? For the glory of satan of course... Also, many people tends to use their PIs for multiple purposes. As mail servers, webpage hosting etc. Usually in that cases nginx is used as far more powerful alternative to lighttpd, and fair more lighter than apache. This patch allows them to unleash the power of pi-hole without too much hacking. Also, I'm the one of those people, and needed it ;). --- advanced/nginx-pi-hole.conf | 23 ++++ automated install/basic-install.sh | 176 ++++++++++++++++++++--------- automated install/uninstall.sh | 12 +- block hulu ads/nginx-pi-hole.conf | 28 +++++ 4 files changed, 183 insertions(+), 56 deletions(-) create mode 100644 advanced/nginx-pi-hole.conf create mode 100644 block hulu ads/nginx-pi-hole.conf diff --git a/advanced/nginx-pi-hole.conf b/advanced/nginx-pi-hole.conf new file mode 100644 index 00000000..416e3b12 --- /dev/null +++ b/advanced/nginx-pi-hole.conf @@ -0,0 +1,23 @@ +server { + listen 80; + listen [::]:80; + root /var/www/html; + + error_page 404 /pihole/index.html; + + location ~ ^/admin/ { + index index.php; + add_header X-Pi-hole "The Pi-hole Web interface is working!"; + + location ~ .php$ { + fastcgi_pass unix:/var/run/php5-fpm.sock; + fastcgi_index index.php; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + } + } + + location / { + add_header X-Pi-hole "A black hole for Internet advertisements."; + } +} diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 762de49c..a93ef9f2 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -96,7 +96,12 @@ backupLegacyPihole(){ $SUDO mv /etc/dnsmasq.d/adList.conf /etc/pihole/original/adList.conf.$(date "+%Y-%m-%d") $SUDO mv /etc/dnsmasq.conf /etc/pihole/original/dnsmasq.conf.$(date "+%Y-%m-%d") $SUDO mv /etc/resolv.conf /etc/pihole/original/resolv.conf.$(date "+%Y-%m-%d") - $SUDO mv /etc/lighttpd/lighttpd.conf /etc/pihole/original/lighttpd.conf.$(date "+%Y-%m-%d") + if [[ -f /etc/lighttpd/lighttpd.conf ]]; then + $SUDO mv /etc/lighttpd/lighttpd.conf /etc/pihole/original/lighttpd.conf.$(date "+%Y-%m-%d") + fi + if [[ -f /etc/nginx/conf.d/nginx-pi-hole.conf ]]; then + $SUDO mv /etc/nginx/conf.d/nginx-pi-hole.conf /etc/pihole/original/nginx-pi-hole.conf.$(date "+%Y-%m-%d") + fi $SUDO mv /var/www/pihole/index.html /etc/pihole/original/index.html.$(date "+%Y-%m-%d") $SUDO mv /usr/local/bin/gravity.sh /etc/pihole/original/gravity.sh.$(date "+%Y-%m-%d") else @@ -107,12 +112,12 @@ backupLegacyPihole(){ welcomeDialogs(){ # Display the welcome dialog whiptail --msgbox --backtitle "Welcome" --title "Pi-hole automated installer" "This installer will transform your Raspberry Pi into a network-wide ad blocker!" $r $c - + # Support for a part-time dev whiptail --msgbox --backtitle "Plea" --title "Free and open source" "The Pi-hole is free, but powered by your donations: http://pi-hole.net/donate" $r $c - + # Explain the need for a static address - whiptail --msgbox --backtitle "Initating network interface" --title "Static IP Needed" "The Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly. + whiptail --msgbox --backtitle "Initating network interface" --title "Static IP Needed" "The Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly. In the next section, you can choose to use your current network settings (DHCP) or to manually edit them." $r $c } @@ -120,7 +125,7 @@ chooseInterface(){ # Turn the available interfaces into an array so it can be used with a whiptail dialog interfacesArray=() firstloop=1 - + while read -r line do mode="OFF" @@ -130,12 +135,12 @@ chooseInterface(){ fi interfacesArray+=("$line" "available" "$mode") done <<< "$availableInterfaces" - + # Find out how many interfaces are available to choose from interfaceCount=$(echo "$availableInterfaces" | wc -l) chooseInterfaceCmd=(whiptail --separate-output --radiolist "Choose An Interface" $r $c $interfaceCount) chooseInterfaceOptions=$("${chooseInterfaceCmd[@]}" "${interfacesArray[@]}" 2>&1 >/dev/tty) - + for desiredInterface in $chooseInterfaceOptions do piholeInterface=$desiredInterface @@ -144,6 +149,22 @@ chooseInterface(){ done } +chooseWebserver(){ + webserversArray=() + webserversArray+=("lighttpd" "recommended if not sure, or building a standalone configuration" "ON") + webserversArray+=("nginx" "for advanced users building custom solutions" "OFF") + + # Find out how many interfaces are available to choose from + chooseWebserverCmd=(whiptail --separate-output --radiolist "Choose a Webserver" $r $c 2) + chooseWebserverOptions=$("${chooseWebserverCmd[@]}" "${webserversArray[@]}" 2>&1 >/dev/tty) + + for desiredWebserver in $chooseWebserverOptions + do + piholeWebserver=$desiredWebserver + echo "::: Using webserver: $piholeWebserver" + echo ${piholeWebserver} > /tmp/piholeWEB + done +} use4andor6(){ # Let use select IPv4 and/or IPv6 @@ -186,7 +207,7 @@ use4andor6(){ useIPv6dialog(){ piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }') whiptail --msgbox --backtitle "IPv6..." --title "IPv6 Supported" "$piholeIPv6 will be used to block ads." $r $c - + $SUDO touch /etc/pihole/.useIPv6 } @@ -269,13 +290,13 @@ setStaticIPv4(){ installScripts(){ $SUDO echo ":::" $SUDO echo -n "::: Installing scripts..." - $SUDO cp /etc/.pihole/gravity.sh /usr/local/bin/gravity.sh + $SUDO cp /etc/.pihole/gravity.sh /usr/local/bin/gravity.sh $SUDO cp /etc/.pihole/advanced/Scripts/chronometer.sh /usr/local/bin/chronometer.sh - $SUDO cp /etc/.pihole/advanced/Scripts/whitelist.sh /usr/local/bin/whitelist.sh - $SUDO cp /etc/.pihole/advanced/Scripts/blacklist.sh /usr/local/bin/blacklist.sh - $SUDO cp /etc/.pihole/advanced/Scripts/piholeLogFlush.sh /usr/local/bin/piholeLogFlush.sh - $SUDO cp /etc/.pihole/advanced/Scripts/updateDashboard.sh /usr/local/bin/updateDashboard.sh - $SUDO chmod 755 /usr/local/bin/{gravity,chronometer,whitelist,blacklist,piholeLogFlush,updateDashboard}.sh + $SUDO cp /etc/.pihole/advanced/Scripts/whitelist.sh /usr/local/bin/whitelist.sh + $SUDO cp /etc/.pihole/advanced/Scripts/blacklist.sh /usr/local/bin/blacklist.sh + $SUDO cp /etc/.pihole/advanced/Scripts/piholeLogFlush.sh /usr/local/bin/piholeLogFlush.sh + $SUDO cp /etc/.pihole/advanced/Scripts/updateDashboard.sh /usr/local/bin/updateDashboard.sh + $SUDO chmod 755 /usr/local/bin/{gravity,chronometer,whitelist,blacklist,piholeLogFlush,updateDashboard}.sh $SUDO echo " done." } @@ -283,9 +304,15 @@ installConfigs(){ $SUDO echo ":::" $SUDO echo -n "::: Installing configs..." $SUDO mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig - $SUDO mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig - $SUDO cp /etc/.pihole/advanced/dnsmasq.conf /etc/dnsmasq.conf - $SUDO cp /etc/.pihole/advanced/lighttpd.conf /etc/lighttpd/lighttpd.conf + $SUDO cp /etc/.pihole/advanced/dnsmasq.conf /etc/dnsmasq.conf + if [ $piholeWebserver == 'lighttpd' ]; then + $SUDO mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig + $SUDO cp /etc/.pihole/advanced/lighttpd.conf /etc/lighttpd/lighttpd.conf + fi + if [ $piholeWebserver == 'nginx' ]; then + $SUDO cp /etc/.pihole/advanced/nginx-pi-hole.conf /etc/nginx/conf.d/nginx-pi-hole.conf + $SUDO rm /etc/nginx/sites-enabled/default + fi $SUDO sed -i "s/@INT@/$piholeInterface/" /etc/dnsmasq.conf $SUDO echo " done." } @@ -293,52 +320,77 @@ installConfigs(){ stopServices(){ $SUDO echo ":::" $SUDO echo -n "::: Stopping services..." - $SUDO service dnsmasq stop & spinner $! || true - $SUDO service lighttpd stop & spinner $! || true + $SUDO service dnsmasq stop & spinner $! || true + if [ $piholeWebserver == 'lighttpd' ]; then + $SUDO service lighttpd stop & spinner $! || true + fi + if [ $piholeWebserver == 'nginx' ]; then + $SUDO service nginx stop & spinner $! || true + fi $SUDO echo " done." } checkForDependencies(){ - + #Running apt-get update/upgrade with minimal output can cause some issues with #requiring user input (e.g password for phpmyadmin see #218) #We'll change the logic up here, to check to see if there are any updates availible and # if so, advise the user to run apt-get update/upgrade at their own discretion - - + + #Check to see if apt-get update has already been run today # it needs to have been run at least once on new installs! - + timestamp=$(stat -c %Y /var/cache/apt/) timestampAsDate=$(date -d @$timestamp "+%b %e") today=$(date "+%b %e") - - if [ ! "$today" == "$timestampAsDate" ]; then + + if [ ! "$today" == "$timestampAsDate" ]; then #update package lists echo ":::" echo -n "::: apt-get update has not been run today. Running now..." $SUDO apt-get -qq update & spinner $! echo " done!" - fi - - echo ":::" + fi + + echo ":::" echo -n "::: Checking apt-get for upgraded packages...." updatesToInstall=$(sudo apt-get -s -o Debug::NoLocking=true upgrade | grep -c ^Inst) echo " done!" - + echo ":::" if [[ $updatesToInstall -eq "0" ]]; then echo "::: Your pi is up to date! Continuing with pi-hole installation..." - else + else echo "::: There are $updatesToInstall updates availible for your pi!" - echo "::: We recommend you run 'sudo apt-get upgrade' after installing Pi-Hole! " + echo "::: We recommend you run 'sudo apt-get upgrade' after installing Pi-Hole! " echo ":::" - fi - - echo ":::" + fi + + echo ":::" echo "::: Checking dependencies:" - dependencies=( dnsutils bc toilet figlet dnsmasq lighttpd php5-common php5-cgi php5 git curl unzip wget ) + dependencies=( dnsutils bc toilet figlet dnsmasq git curl unzip wget ) + if [ $piholeWebserver == 'lighttpd' ]; then + dependencies+=( lighttpd php5-cgi ) + if [ $(dpkg-query -W -f='${Status}' nginx 2>/dev/null | grep -c "ok installed") -eq 1 ]; then + echo -n "::: Lighttpd selected, but nginx found! Uninstalling...." + $SUDO apt-get -y -qq remove nginx > /dev/null & spinner $! + $SUDO apt-get -y -qq autoremove > /dev/null & spinner $! + echo " done!" + fi + fi + if [ $piholeWebserver == 'nginx' ]; then + dependencies+=( nginx php5-fpm ) + if [ $(dpkg-query -W -f='${Status}' lighttpd 2>/dev/null | grep -c "ok installed") -eq 1 ]; then + echo -n "::: Nginx selected, but lighttpd found! Uninstalling...." + $SUDO apt-get -y -qq remove lighttpd > /dev/null & spinner $! + $SUDO apt-get -y -qq autoremove > /dev/null & spinner $! + echo " done!" + fi + fi + dependencies+=( php5-common php5 ) + for i in "${dependencies[@]}" do : @@ -354,29 +406,29 @@ checkForDependencies(){ } getGitFiles(){ - + echo ":::" echo "::: Checking for existing base files..." - if is_repo $piholeFilesDir; then - make_repo $piholeFilesDir $piholeGitUrl - else - update_repo $piholeFilesDir + if is_repo $piholeFilesDir; then + make_repo $piholeFilesDir $piholeGitUrl + else + update_repo $piholeFilesDir fi - echo ":::" + echo ":::" echo "::: Checking for existing web interface..." - if is_repo $webInterfaceDir; then - make_repo $webInterfaceDir $webInterfaceGitUrl + if is_repo $webInterfaceDir; then + make_repo $webInterfaceDir $webInterfaceGitUrl else update_repo $webInterfaceDir - + fi } is_repo() { echo -n "::: Checking $1 is a repo..." - # if the directory does not have a .git folder + # if the directory does not have a .git folder # it is not a repo if [ -d "$1/.git" ]; then echo " OK!" @@ -384,7 +436,7 @@ is_repo() { fi echo " not found!!" return 0 - + } make_repo() { @@ -415,7 +467,7 @@ CreateLogFile(){ else $SUDO echo " already exists!" fi - + } installPiholeWeb(){ @@ -425,11 +477,16 @@ installPiholeWeb(){ $SUDO echo " Existing page detected, not overwriting" else $SUDO mkdir /var/www/html/pihole - $SUDO mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig + if [ $piholeWebserver == 'lighttpd' ]; then + $SUDO mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig + fi + if [ $piholeWebserver == 'nginx' ]; then + $SUDO mv /var/www/html/index.nginx-debian.html /var/www/html/index.nginx-debian.orig + fi $SUDO cp /etc/.pihole/advanced/index.html /var/www/html/pihole/index.html $SUDO echo " done!" fi - + } installCron(){ @@ -449,9 +506,9 @@ runGravity(){ #Don't run as SUDO, this was causing issues echo "::: Running gravity.sh" echo ":::" - + /usr/local/bin/gravity.sh - + } @@ -462,9 +519,11 @@ installPihole(){ $SUDO chown www-data:www-data /var/www/html $SUDO chmod 775 /var/www/html $SUDO usermod -a -G www-data pi - $SUDO lighty-enable-mod fastcgi fastcgi-php > /dev/null - - getGitFiles + if [ $piholeWebserver == 'lighttpd' ]; then + $SUDO lighty-enable-mod fastcgi fastcgi-php > /dev/null + fi + + getGitFiles installScripts installConfigs #installWebAdmin @@ -494,6 +553,8 @@ welcomeDialogs backupLegacyPihole # Find interfaces and let the user choose one chooseInterface +# Let the user decide which webserver they prefer +chooseWebserver # Let the user decide if they want to block ads over IPv4 and/or IPv6 use4andor6 @@ -505,4 +566,9 @@ $SUDO mv $tmpLog $instalLogLoc displayFinalMessage $SUDO service dnsmasq start -$SUDO service lighttpd start \ No newline at end of file +if [ $piholeWebserver == 'lighttpd' ]; then + $SUDO service lighttpd start +fi +if [ $piholeWebserver == 'nginx' ]; then + $SUDO service nginx start +fi diff --git a/automated install/uninstall.sh b/automated install/uninstall.sh index 59eca67b..02271d6d 100644 --- a/automated install/uninstall.sh +++ b/automated install/uninstall.sh @@ -25,15 +25,24 @@ fi ######### SCRIPT ########### +if [ $(dpkg-query -W -f='${Status}' lighttpd 2>/dev/null | grep -c "ok installed") -eq 1 ]; then + $SUDO apt-get -y remove --purge lighttpd php5-cli +fi +if [ $(dpkg-query -W -f='${Status}' nginx 2>/dev/null | grep -c "ok installed") -eq 1 ]; then + $SUDO apt-get -y remove --purge nginx php5-fpm +fi + $SUDO apt-get -y remove --purge dnsutils bc toilet $SUDO apt-get -y remove --purge dnsmasq -$SUDO apt-get -y remove --purge lighttpd php5-common php5-cgi php5 +$SUDO apt-get -y remove --purge php5-common php5 +$SUDO apt-get -y autoremove --purge # Only web directories/files that are created by pihole should be removed. echo "Removing the Pi-hole Web server files..." $SUDO rm -rf /var/www/html/admin $SUDO rm -rf /var/www/html/pihole $SUDO rm /var/www/html/index.lighttpd.orig +$SUDO rm /var/www/html/index.nginx-debian.orig # If the web directory is empty after removing these files, then the parent html folder can be removed. if [[ ! "$(ls -A /var/www/html)" ]]; then @@ -63,6 +72,7 @@ fi echo "Removing config files and scripts..." $SUDO rm /etc/dnsmasq.conf $SUDO rm -rf /etc/lighttpd/ +$SUDO rm -rf /etc/nginx/ $SUDO rm /var/log/pihole.log $SUDO rm /usr/local/bin/gravity.sh $SUDO rm /usr/local/bin/chronometer.sh diff --git a/block hulu ads/nginx-pi-hole.conf b/block hulu ads/nginx-pi-hole.conf new file mode 100644 index 00000000..95b64e02 --- /dev/null +++ b/block hulu ads/nginx-pi-hole.conf @@ -0,0 +1,28 @@ +server { + listen 80; + listen [::]:80; + root /var/www/html; + + error_page 404 /pihole/index.html; + + location ~ ^/admin/ { + index index.php; + add_header X-Pi-hole "The Pi-hole Web interface is working!"; + + location ~ .php$ { + fastcgi_pass unix:/var/run/php5-fpm.sock; + fastcgi_index index.php; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + } + } + + location / { + add_header X-Pi-hole "A black hole for Internet advertisements."; + } +} + +server { + server_name ads.hulu.com ads-v-darwin.hulu.com; + return 301 http://192.168.1.101:8200/MediaItems/19.mov; +}