From ce0ca3cc61a138a37e1f285eb2f14a5e15ca603a Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 7 Nov 2015 07:58:35 -0600 Subject: [PATCH 01/50] for use with /etc/crontab Adding a system-wide crontab to update the ad source lists, flush the log daily, and (eventually) record the stats for historical purposes. --- advanced/pihole.cron | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/advanced/pihole.cron b/advanced/pihole.cron index a707607..47bc61f 100644 --- a/advanced/pihole.cron +++ b/advanced/pihole.cron @@ -1 +1,26 @@ -@weekly sudo /usr/local/bin/gravity.sh +# /etc/crontab: system-wide crontab +# Unlike any other crontab you don't have to run the `crontab' +# command to install the new version when you edit this file +# and files in /etc/cron.d. These files also have username fields, +# that none of the other crontabs do. + +SHELL=/bin/sh +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin + +# m h dom mon dow user command +17 * * * * root cd / && run-parts --report /etc/cron.hourly +25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) +47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) +52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) + +# Pi-hole: Update the ad sources once a week on Sunday at 01:59 +# Download any updates from the ad lists +59 1 * * 7 root /usr/local/bin/gravity.sh + +# Pi-hole: Parse the log file before it is flushed and save the stats to a database +# This will be used for a historical view of your Pi-hole's performance +#50 11 * * * root /usr/local/bin/dailyLog.sh + +# Pi-hole: Flush the log daily at 11:58 so it doesn't get out of control +# Stats will be viewable in the Web interface thanks to the cron job above +58 11 * * * root /usr/local/bin/piholeLogFlush.sh From 763aa6aa5c6c3fc194fa8c2df6a258c4a7adf41e Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 11 Nov 2015 00:43:00 -0800 Subject: [PATCH 02/50] Change shebang to environment Find bash in the environment, not hard coded to path --- gravity.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index 4c191c3..9379319 100755 --- a/gravity.sh +++ b/gravity.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # http://pi-hole.net # Compiles a list of ad-serving domains by downloading them from multiple sources From 4229a3e5e9835a38c3c19b2e4ad483c03706fd11 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Wed, 28 Oct 2015 17:29:34 -0500 Subject: [PATCH 03/50] whiptail revamp of install script This is a large update that helps users install the Pi-hole a bit easier by using some dialog windows and also letting the user set a static IP (I still need to figure out how to actually set the address in the system, but everything else having to do with the install script works). --- automated install/basic-install.sh | 229 +++++++++++++++++++++-------- 1 file changed, 164 insertions(+), 65 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 7c48fdb..416c421 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -1,29 +1,37 @@ #!/bin/bash -# Pi-hole automated install -# Raspberry Pi Ad-blocker +# Pi-hole: A black hole for Internet advertisements +# by Jacob Salmela +# Network-wide ad blocking via your Raspberry Pi # -# Install with this command (from the Pi): +# pi-hole.net/donate # -# curl -s "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/automated%20install/basic-install.sh" | bash +# Install with this command (from your Pi): # -# Or run the commands below in order +# curl -L install.pi-hole.net | bash -clear -echo " _____ _ _ _ " -echo " | __ (_) | | | | " -echo " | |__) | __ | |__ ___ | | ___ " -echo " | ___/ | |__| | '_ \ / _ \| |/ _ \ " -echo " | | | | | | | | (_) | | __/ " -echo " |_| |_| |_| |_|\___/|_|\___| " -echo " " -echo " Raspberry Pi Ad-blocker " -echo " " -echo "Set a static IP before running this!" -echo " " -echo " Press Enter when ready " -echo " " -read +######## VARIABLES ######### +# Get the screen size in case we need a full-screen message and so we can display a dialog that is sized nicely +screenSize=$(stty -a | tr \; \\012 | egrep 'rows|columns' | cut '-d ' -f3) +# Find the rows and columns +rows=$(stty -a | tr \; \\012 | egrep 'rows' | cut -d' ' -f3) +columns=$(stty -a | tr \; \\012 | egrep 'columns' | cut -d' ' -f3) + +# Divide by two so the dialogs take up half of the screen, which looks nice. +r=$(( rows / 2 )) +c=$(( columns / 2 )) + +# Get the current network settings +IPv4addr=$(ip -4 addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1") +IPv4mask=$(ifconfig | awk -F':' '/inet addr/ && !/127.0.0.1/ {print $4}') +IPv4gw=$(ip route show | awk '/default\ via/ {print $3}') + +# IPv6 support to be added later +IPv6addr=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/' -f1) + +####### FUCNTIONS ########## +backupLegacyPihole() +{ if [[ -f /etc/dnsmasq.d/adList.conf ]];then echo "Original Pi-hole detected. Initiating sub space transport..." sudo mkdir -p /etc/pihole/original/ @@ -36,58 +44,149 @@ if [[ -f /etc/dnsmasq.d/adList.conf ]];then else : fi +} -echo "Updating the Pi..." -sudo apt-get update -sudo apt-get -y upgrade +######## SCRIPT ############ +# Just back up the original Pi-hole right away since it won't take long and it gets it out of the way +backupLegacyPihole -echo "Installing tools..." -sudo apt-get -y install dnsutils -sudo apt-get -y install bc -sudo apt-get -y install toilet +# 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 -echo "Installing DNS..." -sudo apt-get -y install dnsmasq -sudo update-rc.d dnsmasq enable +# 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. -echo "Installing a Web server" -sudo apt-get -y install lighttpd php5-common php5-cgi php5 -sudo mkdir /var/www/html -sudo chown www-data:www-data /var/www/html -sudo chmod 775 /var/www/html -sudo usermod -a -G www-data pi +In the next section, you can choose to use your current network settings (DHCP) or to manually edit them." $r $c -echo "Stopping services to modify them..." -sudo service dnsmasq stop -sudo service lighttpd stop +# Ask if the user wannts to use DHCP settings as their static IP +if (whiptail --title "Static IP Address" --yesno "Do you want to use your current network settings as a static address? -echo "Backing up original config files and downloading Pi-hole ones..." -sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig -sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig -sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig -sudo curl -o /etc/dnsmasq.conf "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf" -sudo curl -o /etc/lighttpd/lighttpd.conf "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf" -sudo lighty-enable-mod fastcgi fastcgi-php -sudo mkdir /var/www/html/pihole -sudo curl -o /var/www/html/pihole/index.html "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html" + IP address: $IPv4addr + Subnet mask: $IPv4mask + Gateway: $IPv4gw" $r $c) then + # If they choose yes, let the user know that the IP address will not be available via DHCP and may cause a conflict. + whiptail --msgbox --backtitle "IP information..." --title "FYI: IP Conflict" "It is possible your router could still try to assign this IP to a device, which would cause a conflict. But in most cases the router is smart enough to not do that. -echo "Installing the Web interface..." -sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip -sudo unzip /var/www/master.zip -d /var/www/html/ -sudo mv /var/www/html/AdminLTE-master /var/www/html/admin -sudo rm /var/www/master.zip 2>/dev/null -sudo touch /var/log/pihole.log -sudo chmod 644 /var/log/pihole.log -sudo chown dnsmasq:root /var/log/pihole.log +If you are worried, either manually set the address, or modify the DHCP reservation pool so it does not include the IP you want. -echo "Locating the Pi-hole..." -sudo curl -o /usr/local/bin/gravity.sh "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh" -sudo curl -o /usr/local/bin/chronometer.sh "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh" -sudo chmod 755 /usr/local/bin/gravity.sh -sudo chmod 755 /usr/local/bin/chronometer.sh +It is also possible to use a DHCP reservation, but if you are going to do that, you might as well set a static address." $r $c + # Nothing else to do since the variables are already set above +else + # Otherwise, we need to ask the user to input their desired settings. + # Start by getting the IPv4 address (pre-filling it with info gathered from DHCP) + # Start a loop to let the user enter their information with the chance to go back and edit it if necessary + until [[ $ipSettingsCorrect = True ]] + do + # Ask for the IPv4 address + IPv4addr=$(whiptail --backtitle "Calibrating network interface..." --title "IPv4 address" --inputbox "Enter your desired IPv4 address" $r $c $IPv4addr 3>&1 1>&2 2>&3) + if [[ $? = 0 ]];then + echo "Your static IPv4 address: $IPv4addr" + # Ask for the subnet mask + IPv4mask=$(whiptail --backtitle "Calibrating network interface..." --title "IPv4 netmask" --inputbox "Enter your desired IPv4 subnet mask" $r $c $IPv4mask 3>&1 1>&2 2>&3) + if [[ $? = 0 ]];then + echo "Your static IPv4 netmask: $IPv4mask" + # Ask for the gateway + IPv4gw=$(whiptail --backtitle "Calibrating network interface..." --title "IPv4 gateway (router)" --inputbox "Enter your desired IPv4 default gateway" $r $c $IPv4gw 3>&1 1>&2 2>&3) + if [[ $? = 0 ]];then + echo "Your static IPv4 gateway: $IPv4gw" + # Give the user a chance to review their settings before moving on + if (whiptail --title "Static IP Address" --yesno "Are these settings correct? + IP address: $IPv4addr + Subnet mask: $IPv4mask + Gateway: $IPv4gw" $r $c)then + # If the settings are correct, then we need to set the piholeIP + # Saving it to a temporary file us to retrieve it later when we run the gravity.sh script + echo $IPv4addr > /tmp/piholeIP + # After that's done, the loop ends and we move on + ipSettingsCorrect=True -echo "Entering the event horizon..." -sudo /usr/local/bin/gravity.sh + else + # If the settings are wrong, the loop continues + ipSettingsCorrect=False + fi + else + # Cancelling gateway settings window + ipSettingsCorrect=False + echo "User canceled." + exit + fi + else + # Cancelling subnet mask settings window + ipSettingsCorrect=False + echo "User canceled." + exit + fi + else + # Cancelling IPv4 settings window + ipSettingsCorrect=False + echo "User canceled." + exit + fi + done +# End the if statement for DHCP vs. static +fi -echo "Restarting..." -sudo reboot +# These are the commands to actually install the Pi-hole +# Create an associative array so we can display text to the user but run the associated command in the background. +declare -A cmdsAndEchoes=([sudo apt-get update]='Updating...' +[sudo apt-get -y upgrade]='Upgrading...' +[sudo apt-get -y install dnsutils bc toilet]='Installing chronomoter tools...' +[sudo apt-get -y install dnsmasq]='Installing a DNS server...' +[sudo apt-get -y install lighttpd php5-common php5-cgi php5]='Instaling a Web server and PHP...' +[sudo mkdir /var/www/html]='Making an HTML folder...' +[sudo chown www-data:www-data /var/www/html]='Setting permissions for the Web server...' +[sudo chmod 775 /var/www/html]='Setting permissions for the Web server...' +[sudo usermod -a -G www-data pi]='Setting permissions for the Web server...' +[sudo service dnsmasq stop]='Stopping dnsmasq to modify it...' +[sudo service lighttpd stop]='Stopping lighttpd to modify it...' +[sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig]='Backing up the dnsmasq config file...' +[sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig]='Backing up the lighttpd config file...' +[sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig]='Backing up the default Web page...' +[sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf]='Installing the dnsmasq config file...' +[sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf]='Installing the lighttpd config file...' +[sudo lighty-enable-mod fastcgi fastcgi-php]='Enabling PHP...' +[sudo mkdir /var/www/html/pihole]='Making a directory for the Web interface...' +[sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html]='Installing a blank HTML page to take place of ads...' +[sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip]='Downloading the Pi-hole dashboard...' +[sudo unzip /var/www/master.zip -d /var/www/html/]='Unpacking the dashboard...' +[sudo mv /var/www/html/AdminLTE-master /var/www/html/admin]='Renaming the dashboard...' +[sudo rm /var/www/master.zip 2>/dev/null]='Cleaning up the dashboard temp files...' +[sudo touch /var/log/pihole.log]='Creating a log file for the Pi-hole...' +[sudo chmod 644 /var/log/pihole.log]='Making sure the log is readable...' +[sudo chown dnsmasq:root /var/log/pihole.log]='Letting dnsmasq see the log file so stats can be displayed...' +[sudo curl -o /usr/local/bin/gravity.sh "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh"]='Initating sub-space transport...' +[sudo curl -o /usr/local/bin/chronometer.sh "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh"]='Initating sub-space transport...' +[sudo chmod 755 /usr/local/bin/gravity.sh]='Making the scripts executable...' +[sudo chmod 755 /usr/local/bin/chronometer.sh]='Making the scripts executable...' +[sudo /usr/local/bin/gravity.sh]='Entering the event horizion...' +[sudo reboot]='Restarting...') + +# Everything in the parentheses is part of displaying the progress bar +( +# Get total number of commands to be run from the array +n=${#cmdsAndEchoes[*]}; + +# Set counter to increase every time a loop completes +i=0 + +# For each key in the array +for key in "${!cmdsAndEchoes[@]}" +do + +# Calculate the overall progress +percent=$(( 100*(++i)/n )) + +# Update dialog box using the value of each key in the array +# Show the percentage and the echo messages from the array +cat < Date: Thu, 29 Oct 2015 20:10:30 -0500 Subject: [PATCH 04/50] progress dialog working The ellipses cause errors, so they were removed. I was on the right track with the associate array, but it would previously execute the commands out of order. Following directions from the URL in the comments, I made another array that helps keep the array in the order. --- automated install/basic-install.sh | 96 ++++++++++++++++-------------- 1 file changed, 50 insertions(+), 46 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 416c421..56beee8 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -33,7 +33,7 @@ IPv6addr=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/ backupLegacyPihole() { if [[ -f /etc/dnsmasq.d/adList.conf ]];then - echo "Original Pi-hole detected. Initiating sub space transport..." + echo "Original Pi-hole detected. Initiating sub space transport" sudo mkdir -p /etc/pihole/original/ 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") @@ -51,10 +51,10 @@ fi backupLegacyPihole # 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 +whiptail --msgbox --backtitle "Welcome" --title "Pi-hole automated installer" "This installer will transform your Raspberry Pi into a network-wide ad blocker!" $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 @@ -65,7 +65,7 @@ if (whiptail --title "Static IP Address" --yesno "Do you want to use your curren Subnet mask: $IPv4mask Gateway: $IPv4gw" $r $c) then # If they choose yes, let the user know that the IP address will not be available via DHCP and may cause a conflict. - whiptail --msgbox --backtitle "IP information..." --title "FYI: IP Conflict" "It is possible your router could still try to assign this IP to a device, which would cause a conflict. But in most cases the router is smart enough to not do that. + whiptail --msgbox --backtitle "IP information" --title "FYI: IP Conflict" "It is possible your router could still try to assign this IP to a device, which would cause a conflict. But in most cases the router is smart enough to not do that. If you are worried, either manually set the address, or modify the DHCP reservation pool so it does not include the IP you want. @@ -78,15 +78,15 @@ else until [[ $ipSettingsCorrect = True ]] do # Ask for the IPv4 address - IPv4addr=$(whiptail --backtitle "Calibrating network interface..." --title "IPv4 address" --inputbox "Enter your desired IPv4 address" $r $c $IPv4addr 3>&1 1>&2 2>&3) + IPv4addr=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 address" --inputbox "Enter your desired IPv4 address" $r $c $IPv4addr 3>&1 1>&2 2>&3) if [[ $? = 0 ]];then echo "Your static IPv4 address: $IPv4addr" # Ask for the subnet mask - IPv4mask=$(whiptail --backtitle "Calibrating network interface..." --title "IPv4 netmask" --inputbox "Enter your desired IPv4 subnet mask" $r $c $IPv4mask 3>&1 1>&2 2>&3) + IPv4mask=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 netmask" --inputbox "Enter your desired IPv4 subnet mask" $r $c $IPv4mask 3>&1 1>&2 2>&3) if [[ $? = 0 ]];then echo "Your static IPv4 netmask: $IPv4mask" # Ask for the gateway - IPv4gw=$(whiptail --backtitle "Calibrating network interface..." --title "IPv4 gateway (router)" --inputbox "Enter your desired IPv4 default gateway" $r $c $IPv4gw 3>&1 1>&2 2>&3) + IPv4gw=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 gateway (router)" --inputbox "Enter your desired IPv4 default gateway" $r $c $IPv4gw 3>&1 1>&2 2>&3) if [[ $? = 0 ]];then echo "Your static IPv4 gateway: $IPv4gw" # Give the user a chance to review their settings before moving on @@ -127,50 +127,52 @@ else fi # These are the commands to actually install the Pi-hole -# Create an associative array so we can display text to the user but run the associated command in the background. -declare -A cmdsAndEchoes=([sudo apt-get update]='Updating...' -[sudo apt-get -y upgrade]='Upgrading...' -[sudo apt-get -y install dnsutils bc toilet]='Installing chronomoter tools...' -[sudo apt-get -y install dnsmasq]='Installing a DNS server...' -[sudo apt-get -y install lighttpd php5-common php5-cgi php5]='Instaling a Web server and PHP...' -[sudo mkdir /var/www/html]='Making an HTML folder...' -[sudo chown www-data:www-data /var/www/html]='Setting permissions for the Web server...' -[sudo chmod 775 /var/www/html]='Setting permissions for the Web server...' -[sudo usermod -a -G www-data pi]='Setting permissions for the Web server...' -[sudo service dnsmasq stop]='Stopping dnsmasq to modify it...' -[sudo service lighttpd stop]='Stopping lighttpd to modify it...' -[sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig]='Backing up the dnsmasq config file...' -[sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig]='Backing up the lighttpd config file...' -[sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig]='Backing up the default Web page...' -[sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf]='Installing the dnsmasq config file...' -[sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf]='Installing the lighttpd config file...' -[sudo lighty-enable-mod fastcgi fastcgi-php]='Enabling PHP...' -[sudo mkdir /var/www/html/pihole]='Making a directory for the Web interface...' -[sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html]='Installing a blank HTML page to take place of ads...' -[sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip]='Downloading the Pi-hole dashboard...' -[sudo unzip /var/www/master.zip -d /var/www/html/]='Unpacking the dashboard...' -[sudo mv /var/www/html/AdminLTE-master /var/www/html/admin]='Renaming the dashboard...' -[sudo rm /var/www/master.zip 2>/dev/null]='Cleaning up the dashboard temp files...' -[sudo touch /var/log/pihole.log]='Creating a log file for the Pi-hole...' -[sudo chmod 644 /var/log/pihole.log]='Making sure the log is readable...' -[sudo chown dnsmasq:root /var/log/pihole.log]='Letting dnsmasq see the log file so stats can be displayed...' -[sudo curl -o /usr/local/bin/gravity.sh "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh"]='Initating sub-space transport...' -[sudo curl -o /usr/local/bin/chronometer.sh "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh"]='Initating sub-space transport...' -[sudo chmod 755 /usr/local/bin/gravity.sh]='Making the scripts executable...' -[sudo chmod 755 /usr/local/bin/chronometer.sh]='Making the scripts executable...' -[sudo /usr/local/bin/gravity.sh]='Entering the event horizion...' -[sudo reboot]='Restarting...') +# This is pretty ugly, but it works to present a nice front-end +# http://stackoverflow.com/questions/29161323/how-to-keep-associative-array-order-in-bash +# Maybe it would be better to just show the command output instead of the progress bar +declare -A commands; declare -a echoes; +commands["Updating"]="sudo apt-get update"; echoes+=( "Updating" ) +commands["Upgrading"]="sudo apt-get -y upgrade"; echoes+=( "Upgrading" ) +commands["Installing chronomoter tools"]="sudo apt-get -y install dnsutils bc toilet"; echoes+=( "Installing chronomoter tools" ) +commands["Installing a DNS server"]="sudo apt-get -y install dnsmasq"; echoes+=( "Installing a DNS server" ) +commands["Instaling a Web server and PHP"]="sudo apt-get -y install lighttpd php5-common php5-cgi php5"; echoes+=( "Instaling a Web server and PHP" ) +commands["Making an HTML folder"]="sudo mkdir /var/www/html"; echoes+=( "Making an HTML folder" ) +commands["chowning the Web server"]="sudo chown www-data:www-data /var/www/html"; echoes+=( "chowning the Web server" ) +commands["chmodding the Web server"]="sudo chmod 775 /var/www/html"; echoes+=( "chmodding the Web server" ) +commands["Giving pi access to the Web server"]="sudo usermod -a -G www-data pi"; echoes+=( "Giving pi access to the Web server" ) +commands["Stopping dnsmasq to modify it"]="sudo service dnsmasq stop"; echoes+=( "Stopping dnsmasq to modify it" ) +commands["Stopping lighttpd to modify it"]="sudo service lighttpd stop"; echoes+=( "Stopping lighttpd to modify it" ) +commands["Backing up the dnsmasq config file"]="sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig"; echoes+=( "Backing up the dnsmasq config file" ) +commands["Backing up the lighttpd config file"]="sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig"; echoes+=( "Backing up the lighttpd config file" ) +commands["Backing up the default Web page"]="sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig"; echoes+=( "Backing up the default Web page" ) +commands["Installing the dnsmasq config file"]="sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf"; echoes+=( "Installing the dnsmasq config file" ) +commands["Installing the lighttpd config file"]="sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf"; echoes+=( "Installing the lighttpd config file" ) +commands["Enabling PHP"]="sudo lighty-enable-mod fastcgi fastcgi-php"; echoes+=( "Enabling PHP" ) +commands["Making a directory for the Web interface"]="sudo mkdir /var/www/html/pihole"; echoes+=( "Making a directory for the Web interface" ) +commands["Installing a blank HTML page to take place of ads"]="sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html"; echoes+=( "Installing a blank HTML page to take place of ads" ) +commands["Downloading the Pi-hole dashboard"]="sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip"; echoes+=( "Downloading the Pi-hole dashboard" ) +commands["Unpacking the dashboard"]="sudo unzip /var/www/master.zip -d /var/www/html/"; echoes+=( "Unpacking the dashboard" ) +commands["Renaming the dashboard"]="sudo mv /var/www/html/AdminLTE-master /var/www/html/admin"; echoes+=( "Renaming the dashboard" ) +commands["Cleaning up the dashboard temp files"]="sudo rm /var/www/master.zip 2>/dev/null"; echoes+=( "Cleaning up the dashboard temp files" ) +commands["Creating a log file for the Pi-hole"]="sudo touch /var/log/pihole.log"; echoes+=( "Creating a log file for the Pi-hole" ) +commands["chmodding the log file"]="sudo chmod 644 /var/log/pihole.log"; echoes+=( "chmodding the log file" ) +commands["chowning the log file so stats can be displayed"]="sudo chown dnsmasq:root /var/log/pihole.log"; echoes+=( "chowning the log file so stats can be displayed" ) +commands["Initating sub-space transport of gravity"]="sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh"; echoes+=( "Initating sub-space transport of gravity" ) +commands["Initating sub-space transport of chronometer"]="sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh"; echoes+=( "Initating sub-space transport of chronometer" ) +commands["chmodding gravity"]="sudo chmod 755 /usr/local/bin/gravity.sh"; echoes+=( "chmodding gravity" ) +commands["chmodding the chronometer"]="sudo chmod 755 /usr/local/bin/chronometer.sh"; echoes+=( "chmodding the chronometer" ) +commands["Entering the event horizion"]="sudo /usr/local/bin/gravity.sh"; echoes+=( "Entering the event horizion" ) +commands["Rebooting"]="sudo reboot"; echoes+=( "Rebooting" ) # Everything in the parentheses is part of displaying the progress bar ( # Get total number of commands to be run from the array -n=${#cmdsAndEchoes[*]}; - +n=${#commands[*]}; # Set counter to increase every time a loop completes i=0 -# For each key in the array -for key in "${!cmdsAndEchoes[@]}" +# For each item in the array +for k in "${!echoes[@]}" do # Calculate the overall progress @@ -181,11 +183,13 @@ percent=$(( 100*(++i)/n )) cat < Date: Sat, 31 Oct 2015 09:11:29 -0500 Subject: [PATCH 05/50] set static ip and suppress more output Created a function to set a static IP address. I also sent STDOUT and STDERR to /dev/null so it doesn't mangle the progress bar. When the device reboots, it still gets mangled a bit (via ssh). --- automated install/basic-install.sh | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 56beee8..ea51306 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -27,7 +27,10 @@ IPv4mask=$(ifconfig | awk -F':' '/inet addr/ && !/127.0.0.1/ {print $4}') IPv4gw=$(ip route show | awk '/default\ via/ {print $3}') # IPv6 support to be added later -IPv6addr=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/' -f1) +#IPv6addr=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/' -f1) + +ethernetDevice="eth0" +dhcpcdFile=/etc/dhcpcd.conf ####### FUCNTIONS ########## backupLegacyPihole() @@ -46,6 +49,15 @@ else fi } +set_static_ip() +{ +# Append these lines to /etc/dhcpcd.conf to enable a static IP +echo "interface $ethernetDevice +static ip_address=$IPv4addr/24 +static routers=$IPv4gw +static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null +} + ######## SCRIPT ############ # Just back up the original Pi-hole right away since it won't take long and it gets it out of the way backupLegacyPihole @@ -59,7 +71,7 @@ whiptail --msgbox --backtitle "Initating network interface" --title "Static IP N In the next section, you can choose to use your current network settings (DHCP) or to manually edit them." $r $c # Ask if the user wannts to use DHCP settings as their static IP -if (whiptail --title "Static IP Address" --yesno "Do you want to use your current network settings as a static address? +if (whiptail --backtitle "Calibrating network interface" --title "Static IP Address" --yesno "Do you want to use your current network settings as a static address? IP address: $IPv4addr Subnet mask: $IPv4mask @@ -90,7 +102,7 @@ else if [[ $? = 0 ]];then echo "Your static IPv4 gateway: $IPv4gw" # Give the user a chance to review their settings before moving on - if (whiptail --title "Static IP Address" --yesno "Are these settings correct? + if (whiptail --backtitle "Calibrating network interface" --title "Static IP Address" --yesno "Are these settings correct? IP address: $IPv4addr Subnet mask: $IPv4mask Gateway: $IPv4gw" $r $c)then @@ -125,6 +137,8 @@ else done # End the if statement for DHCP vs. static fi +# Set the static address +set_static_ip # These are the commands to actually install the Pi-hole # This is pretty ugly, but it works to present a nice front-end @@ -186,11 +200,11 @@ $percent Step $i of $n: ${echoes[$k]} XXX EOF + # Execute the command in the background (hidden from the user, not actually a background process) -#${echoes[$k]} -${commands[${echoes[$k]}]} -sleep 1 +${commands[${echoes[$k]}]} > /dev/null 2>&1 done + # As the loop is progressing, the output is sent to whiptail to be displayed to the user ) | whiptail --title "Opening your Pi-hole..." --gauge "Please wait..." $r $c 0 From 37f255d761be78b9682eb4f28991fb5e198caadd Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 31 Oct 2015 09:15:57 -0500 Subject: [PATCH 06/50] save output to log file instead Since the progress bar hides the output now. Instead of destroying it, send it to a log file instead so users who want to see it still can. --- automated install/basic-install.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index ea51306..98935a8 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -10,6 +10,8 @@ # curl -L install.pi-hole.net | bash ######## VARIABLES ######### +instalLogLoc=/etc/pihole/install.log + # Get the screen size in case we need a full-screen message and so we can display a dialog that is sized nicely screenSize=$(stty -a | tr \; \\012 | egrep 'rows|columns' | cut '-d ' -f3) @@ -202,7 +204,7 @@ XXX EOF # Execute the command in the background (hidden from the user, not actually a background process) -${commands[${echoes[$k]}]} > /dev/null 2>&1 +${commands[${echoes[$k]}]} > $instalLogLoc 2>&1 done # As the loop is progressing, the output is sent to whiptail to be displayed to the user From a44591ca6be363d40d6c4c13f38021765ce2ce30 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 31 Oct 2015 09:19:57 -0500 Subject: [PATCH 07/50] fix permission denied for log file Just use a temporary file and then move it over once the install is complete. --- 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 98935a8..9e36448 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -10,6 +10,7 @@ # curl -L install.pi-hole.net | bash ######## VARIABLES ######### +tmpLog=/tmp/pihole-install.log instalLogLoc=/etc/pihole/install.log # Get the screen size in case we need a full-screen message and so we can display a dialog that is sized nicely @@ -206,6 +207,7 @@ EOF # Execute the command in the background (hidden from the user, not actually a background process) ${commands[${echoes[$k]}]} > $instalLogLoc 2>&1 done +sudo mv $tmpLog $instalLogLoc$instalLogLoc # As the loop is progressing, the output is sent to whiptail to be displayed to the user ) | From f37990351e7f9c5e47072450bcabb1dfca099cae Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 31 Oct 2015 09:21:19 -0500 Subject: [PATCH 08/50] dumb mistake fixed the variable name --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 9e36448..f39009b 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -205,7 +205,7 @@ XXX EOF # Execute the command in the background (hidden from the user, not actually a background process) -${commands[${echoes[$k]}]} > $instalLogLoc 2>&1 +${commands[${echoes[$k]}]} > $tmpLog 2>&1 done sudo mv $tmpLog $instalLogLoc$instalLogLoc From 6d989f9160c451e56f64c37728ccf3b18d941f24 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sun, 1 Nov 2015 12:54:19 -0600 Subject: [PATCH 09/50] overwrite html folder If the files already exist, the installer stalls out because it asks if you want to replace the existing files. the -o option forces an overwrite. --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index f39009b..0db4c02 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -168,7 +168,7 @@ commands["Enabling PHP"]="sudo lighty-enable-mod fastcgi fastcgi-php"; echoes+=( commands["Making a directory for the Web interface"]="sudo mkdir /var/www/html/pihole"; echoes+=( "Making a directory for the Web interface" ) commands["Installing a blank HTML page to take place of ads"]="sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html"; echoes+=( "Installing a blank HTML page to take place of ads" ) commands["Downloading the Pi-hole dashboard"]="sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip"; echoes+=( "Downloading the Pi-hole dashboard" ) -commands["Unpacking the dashboard"]="sudo unzip /var/www/master.zip -d /var/www/html/"; echoes+=( "Unpacking the dashboard" ) +commands["Unpacking the dashboard"]="sudo unzip -o /var/www/master.zip -d /var/www/html/"; echoes+=( "Unpacking the dashboard" ) commands["Renaming the dashboard"]="sudo mv /var/www/html/AdminLTE-master /var/www/html/admin"; echoes+=( "Renaming the dashboard" ) commands["Cleaning up the dashboard temp files"]="sudo rm /var/www/master.zip 2>/dev/null"; echoes+=( "Cleaning up the dashboard temp files" ) commands["Creating a log file for the Pi-hole"]="sudo touch /var/log/pihole.log"; echoes+=( "Creating a log file for the Pi-hole" ) From 1482b9563c594e5b9ee3a6c08264f816fc5644c5 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sun, 1 Nov 2015 13:00:55 -0600 Subject: [PATCH 10/50] does gravity use static IP? The changes to the gravity script check for a temp file containing the static address set during the install. I need to verify it works so I have to change the URL. I will change it back before merging with master. --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 0db4c02..79d6409 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -174,7 +174,7 @@ commands["Cleaning up the dashboard temp files"]="sudo rm /var/www/master.zip 2> commands["Creating a log file for the Pi-hole"]="sudo touch /var/log/pihole.log"; echoes+=( "Creating a log file for the Pi-hole" ) commands["chmodding the log file"]="sudo chmod 644 /var/log/pihole.log"; echoes+=( "chmodding the log file" ) commands["chowning the log file so stats can be displayed"]="sudo chown dnsmasq:root /var/log/pihole.log"; echoes+=( "chowning the log file so stats can be displayed" ) -commands["Initating sub-space transport of gravity"]="sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh"; echoes+=( "Initating sub-space transport of gravity" ) +commands["Initating sub-space transport of gravity"]="sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/installation/gravity.sh"; echoes+=( "Initating sub-space transport of gravity" ) commands["Initating sub-space transport of chronometer"]="sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh"; echoes+=( "Initating sub-space transport of chronometer" ) commands["chmodding gravity"]="sudo chmod 755 /usr/local/bin/gravity.sh"; echoes+=( "chmodding gravity" ) commands["chmodding the chronometer"]="sudo chmod 755 /usr/local/bin/chronometer.sh"; echoes+=( "chmodding the chronometer" ) From fb3fde3d19a1a5d44c1df0b480fb7209e239f2f9 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Fri, 6 Nov 2015 17:45:00 -0600 Subject: [PATCH 11/50] testing with no reboot --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 79d6409..68fe9fc 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -179,7 +179,7 @@ commands["Initating sub-space transport of chronometer"]="sudo curl -o /usr/loca commands["chmodding gravity"]="sudo chmod 755 /usr/local/bin/gravity.sh"; echoes+=( "chmodding gravity" ) commands["chmodding the chronometer"]="sudo chmod 755 /usr/local/bin/chronometer.sh"; echoes+=( "chmodding the chronometer" ) commands["Entering the event horizion"]="sudo /usr/local/bin/gravity.sh"; echoes+=( "Entering the event horizion" ) -commands["Rebooting"]="sudo reboot"; echoes+=( "Rebooting" ) +commands["Rebooting"]="sudo service networking restart"; echoes+=( "Restarting networking..." ) # Everything in the parentheses is part of displaying the progress bar ( From eec0a31216287b1b81172e3287ddfa788f153678 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 7 Nov 2015 09:43:04 -0600 Subject: [PATCH 12/50] trying text output I commented out the whiptail dialog at the end in place of text so you can see what is going on. I also install the crontab. --- automated install/basic-install.sh | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 68fe9fc..9fdd055 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -24,7 +24,6 @@ columns=$(stty -a | tr \; \\012 | egrep 'columns' | cut -d' ' -f3) r=$(( rows / 2 )) c=$(( columns / 2 )) -# Get the current network settings IPv4addr=$(ip -4 addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1") IPv4mask=$(ifconfig | awk -F':' '/inet addr/ && !/127.0.0.1/ {print $4}') IPv4gw=$(ip route show | awk '/default\ via/ {print $3}') @@ -164,6 +163,8 @@ commands["Backing up the lighttpd config file"]="sudo mv /etc/lighttpd/lighttpd. commands["Backing up the default Web page"]="sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig"; echoes+=( "Backing up the default Web page" ) commands["Installing the dnsmasq config file"]="sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf"; echoes+=( "Installing the dnsmasq config file" ) commands["Installing the lighttpd config file"]="sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf"; echoes+=( "Installing the lighttpd config file" ) +commands["Initating auto-pilot"]="sudo mv /etc/crontab /etc/crontab.orig"; echoes+=( "Initiating auto-pilot" ) +commands["Engaging auto-pilot"]="curl -o /etc/crontab https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron"; echoes+=( "Engaging auto-pilot" ) commands["Enabling PHP"]="sudo lighty-enable-mod fastcgi fastcgi-php"; echoes+=( "Enabling PHP" ) commands["Making a directory for the Web interface"]="sudo mkdir /var/www/html/pihole"; echoes+=( "Making a directory for the Web interface" ) commands["Installing a blank HTML page to take place of ads"]="sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html"; echoes+=( "Installing a blank HTML page to take place of ads" ) @@ -182,7 +183,7 @@ commands["Entering the event horizion"]="sudo /usr/local/bin/gravity.sh"; echoes commands["Rebooting"]="sudo service networking restart"; echoes+=( "Restarting networking..." ) # Everything in the parentheses is part of displaying the progress bar -( +#( # Get total number of commands to be run from the array n=${#commands[*]}; # Set counter to increase every time a loop completes @@ -205,10 +206,10 @@ XXX EOF # Execute the command in the background (hidden from the user, not actually a background process) -${commands[${echoes[$k]}]} > $tmpLog 2>&1 +${commands[${echoes[$k]}]} | tee $tmpLog +clear done sudo mv $tmpLog $instalLogLoc$instalLogLoc # As the loop is progressing, the output is sent to whiptail to be displayed to the user -) | -whiptail --title "Opening your Pi-hole..." --gauge "Please wait..." $r $c 0 +#) |whiptail --title "Opening your Pi-hole..." --gauge "Please wait..." $r $c 0 From 8df376860cdd6ec5a5382aed5181a56cc0311a40 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 7 Nov 2015 12:07:50 -0600 Subject: [PATCH 13/50] simple function to run install commands The arrays were cool, but I think this just works easier. --- automated install/basic-install.sh | 113 +++++++++++------------------ 1 file changed, 43 insertions(+), 70 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 9fdd055..938cc31 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -60,6 +60,44 @@ static routers=$IPv4gw static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null } +installPihole() +{ +sudo apt-get update +sudo apt-get -y upgrade +sudo apt-get -y install dnsutils bc toilet +sudo apt-get -y install dnsmasq +sudo apt-get -y install lighttpd php5-common php5-cgi php5 +sudo mkdir /var/www/html +sudo chown www-data:www-data /var/www/html +sudo chmod 775 /var/www/html +sudo usermod -a -G www-data pi +sudo service dnsmasq stop +sudo service lighttpd stop +sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig +sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig +sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig +sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf +sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf +sudo mv /etc/crontab /etc/crontab.orig +sudo curl -o /etc/crontab https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron +sudo lighty-enable-mod fastcgi fastcgi-php +sudo mkdir /var/www/html/pihole +sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html +sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip +sudo unzip -o /var/www/master.zip -d /var/www/html/ +sudo mv /var/www/html/AdminLTE-master /var/www/html/admin +sudo rm /var/www/master.zip 2>/dev/null +sudo touch /var/log/pihole.log +sudo chmod 644 /var/log/pihole.log +sudo chown dnsmasq:root /var/log/pihole.log +sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/installation/gravity.sh +sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh +sudo chmod 755 /usr/local/bin/gravity.sh +sudo chmod 755 /usr/local/bin/chronometer.sh +sudo /usr/local/bin/gravity.sh +sudo service networking restart +} + ######## SCRIPT ############ # Just back up the original Pi-hole right away since it won't take long and it gets it out of the way backupLegacyPihole @@ -139,77 +177,12 @@ else done # End the if statement for DHCP vs. static fi + # Set the static address set_static_ip -# These are the commands to actually install the Pi-hole -# This is pretty ugly, but it works to present a nice front-end -# http://stackoverflow.com/questions/29161323/how-to-keep-associative-array-order-in-bash -# Maybe it would be better to just show the command output instead of the progress bar -declare -A commands; declare -a echoes; -commands["Updating"]="sudo apt-get update"; echoes+=( "Updating" ) -commands["Upgrading"]="sudo apt-get -y upgrade"; echoes+=( "Upgrading" ) -commands["Installing chronomoter tools"]="sudo apt-get -y install dnsutils bc toilet"; echoes+=( "Installing chronomoter tools" ) -commands["Installing a DNS server"]="sudo apt-get -y install dnsmasq"; echoes+=( "Installing a DNS server" ) -commands["Instaling a Web server and PHP"]="sudo apt-get -y install lighttpd php5-common php5-cgi php5"; echoes+=( "Instaling a Web server and PHP" ) -commands["Making an HTML folder"]="sudo mkdir /var/www/html"; echoes+=( "Making an HTML folder" ) -commands["chowning the Web server"]="sudo chown www-data:www-data /var/www/html"; echoes+=( "chowning the Web server" ) -commands["chmodding the Web server"]="sudo chmod 775 /var/www/html"; echoes+=( "chmodding the Web server" ) -commands["Giving pi access to the Web server"]="sudo usermod -a -G www-data pi"; echoes+=( "Giving pi access to the Web server" ) -commands["Stopping dnsmasq to modify it"]="sudo service dnsmasq stop"; echoes+=( "Stopping dnsmasq to modify it" ) -commands["Stopping lighttpd to modify it"]="sudo service lighttpd stop"; echoes+=( "Stopping lighttpd to modify it" ) -commands["Backing up the dnsmasq config file"]="sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig"; echoes+=( "Backing up the dnsmasq config file" ) -commands["Backing up the lighttpd config file"]="sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig"; echoes+=( "Backing up the lighttpd config file" ) -commands["Backing up the default Web page"]="sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig"; echoes+=( "Backing up the default Web page" ) -commands["Installing the dnsmasq config file"]="sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf"; echoes+=( "Installing the dnsmasq config file" ) -commands["Installing the lighttpd config file"]="sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf"; echoes+=( "Installing the lighttpd config file" ) -commands["Initating auto-pilot"]="sudo mv /etc/crontab /etc/crontab.orig"; echoes+=( "Initiating auto-pilot" ) -commands["Engaging auto-pilot"]="curl -o /etc/crontab https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron"; echoes+=( "Engaging auto-pilot" ) -commands["Enabling PHP"]="sudo lighty-enable-mod fastcgi fastcgi-php"; echoes+=( "Enabling PHP" ) -commands["Making a directory for the Web interface"]="sudo mkdir /var/www/html/pihole"; echoes+=( "Making a directory for the Web interface" ) -commands["Installing a blank HTML page to take place of ads"]="sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html"; echoes+=( "Installing a blank HTML page to take place of ads" ) -commands["Downloading the Pi-hole dashboard"]="sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip"; echoes+=( "Downloading the Pi-hole dashboard" ) -commands["Unpacking the dashboard"]="sudo unzip -o /var/www/master.zip -d /var/www/html/"; echoes+=( "Unpacking the dashboard" ) -commands["Renaming the dashboard"]="sudo mv /var/www/html/AdminLTE-master /var/www/html/admin"; echoes+=( "Renaming the dashboard" ) -commands["Cleaning up the dashboard temp files"]="sudo rm /var/www/master.zip 2>/dev/null"; echoes+=( "Cleaning up the dashboard temp files" ) -commands["Creating a log file for the Pi-hole"]="sudo touch /var/log/pihole.log"; echoes+=( "Creating a log file for the Pi-hole" ) -commands["chmodding the log file"]="sudo chmod 644 /var/log/pihole.log"; echoes+=( "chmodding the log file" ) -commands["chowning the log file so stats can be displayed"]="sudo chown dnsmasq:root /var/log/pihole.log"; echoes+=( "chowning the log file so stats can be displayed" ) -commands["Initating sub-space transport of gravity"]="sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/installation/gravity.sh"; echoes+=( "Initating sub-space transport of gravity" ) -commands["Initating sub-space transport of chronometer"]="sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh"; echoes+=( "Initating sub-space transport of chronometer" ) -commands["chmodding gravity"]="sudo chmod 755 /usr/local/bin/gravity.sh"; echoes+=( "chmodding gravity" ) -commands["chmodding the chronometer"]="sudo chmod 755 /usr/local/bin/chronometer.sh"; echoes+=( "chmodding the chronometer" ) -commands["Entering the event horizion"]="sudo /usr/local/bin/gravity.sh"; echoes+=( "Entering the event horizion" ) -commands["Rebooting"]="sudo service networking restart"; echoes+=( "Restarting networking..." ) +# Install and log everything to a file +installPihole | tee $tmpLog -# Everything in the parentheses is part of displaying the progress bar -#( -# Get total number of commands to be run from the array -n=${#commands[*]}; -# Set counter to increase every time a loop completes -i=0 - -# For each item in the array -for k in "${!echoes[@]}" -do - -# Calculate the overall progress -percent=$(( 100*(++i)/n )) - -# Update dialog box using the value of each key in the array -# Show the percentage and the echo messages from the array -cat < Date: Sat, 7 Nov 2015 12:35:08 -0600 Subject: [PATCH 14/50] Closing dialog Also starting the Pi-hole and restarting networking. --- automated install/basic-install.sh | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 938cc31..34a5d24 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -186,3 +186,12 @@ installPihole | tee $tmpLog # Move the log file into /etc/pihole for storage sudo mv $tmpLog $instalLogLoc + +whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using this IP: $IPv4addr. + +The networking service will restart after you close this dialog. If you are using SSH, you may need to reconnect." $r $c + +# Start the services and restart networking +sudo service dnsmasq start +sudo service lighttpd start +sudo ifdown eth0;sudo ifup eth0 From 46b4000e75882e339f5b80b4f509aaaf32daba4a Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 7 Nov 2015 13:09:23 -0600 Subject: [PATCH 15/50] reboot works better --- automated install/basic-install.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 34a5d24..83361cb 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -189,9 +189,9 @@ sudo mv $tmpLog $instalLogLoc whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using this IP: $IPv4addr. -The networking service will restart after you close this dialog. If you are using SSH, you may need to reconnect." $r $c +Your Pi will restart when you close this dialog. If you are using SSH, reconnect using the IP address above. -# Start the services and restart networking -sudo service dnsmasq start -sudo service lighttpd start -sudo ifdown eth0;sudo ifup eth0 +The install log is in /etc/phole." $r $c + + +sudo reboot From 76c217d9cc4ad1952d0f02f63452c4084a4b9384 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sun, 8 Nov 2015 17:21:02 -0600 Subject: [PATCH 16/50] moving to functions Also download the whitelist script. Ask for donations for IPv6 support. --- automated install/basic-install.sh | 214 ++++++++++++++++++----------- 1 file changed, 137 insertions(+), 77 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 83361cb..73e7f1f 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -29,9 +29,10 @@ IPv4mask=$(ifconfig | awk -F':' '/inet addr/ && !/127.0.0.1/ {print $4}') IPv4gw=$(ip route show | awk '/default\ via/ {print $3}') # IPv6 support to be added later -#IPv6addr=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/' -f1) +#IPv6eui64=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/' -f1) +#IPv6linkLocal=$(ip addr show | awk '/inet/ && /scope\ link/ && /fe80/ {print $2}' | cut -d'/' -f1) -ethernetDevice="eth0" +availableInterfaces=$(ip link show | awk -F' ' '/[0-9]: [a-z]/ {print $2}' | grep -v "lo" | cut -d':' -f1) dhcpcdFile=/etc/dhcpcd.conf ####### FUCNTIONS ########## @@ -51,7 +52,113 @@ else fi } -set_static_ip() +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 + +# 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. + +In the next section, you can choose to use your current network settings (DHCP) or to manually edit them." $r $c +} + +use4andor6() +{ +# Let use select IPv4 and/or IPv6 +cmd=(whiptail --separate-output --checklist "Select Protocols" $r $c 2) +options=(IPv4 "Block ads over IPv4" on + IPv6 "Block ads over IPv4" off) +choices=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty) +clear +for choice in $choices +do + case $choice in + IPv4) + echo "IPv4 selected." + useIPv4=true + ;; + IPv6) + echo "IPv6 selected." + useIPv6=true + ;; + esac +done +} + + +getStaticIPv4Settings() +{ +# Ask if the user wannts to use DHCP settings as their static IP +if (whiptail --backtitle "Calibrating network interface" --title "Static IP Address" --yesno "Do you want to use your current network settings as a static address? + + IP address: $IPv4addr + Subnet mask: $IPv4mask + Gateway: $IPv4gw" $r $c) then + # If they choose yes, let the user know that the IP address will not be available via DHCP and may cause a conflict. + whiptail --msgbox --backtitle "IP information" --title "FYI: IP Conflict" "It is possible your router could still try to assign this IP to a device, which would cause a conflict. But in most cases the router is smart enough to not do that. + + If you are worried, either manually set the address, or modify the DHCP reservation pool so it does not include the IP you want. + + It is also possible to use a DHCP reservation, but if you are going to do that, you might as well set a static address." $r $c + # Nothing else to do since the variables are already set above +else + # Otherwise, we need to ask the user to input their desired settings. + # Start by getting the IPv4 address (pre-filling it with info gathered from DHCP) + # Start a loop to let the user enter their information with the chance to go back and edit it if necessary + until [[ $ipSettingsCorrect = True ]] + do + # Ask for the IPv4 address + IPv4addr=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 address" --inputbox "Enter your desired IPv4 address" $r $c $IPv4addr 3>&1 1>&2 2>&3) + if [[ $? = 0 ]];then + echo "Your static IPv4 address: $IPv4addr" + # Ask for the subnet mask + IPv4mask=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 netmask" --inputbox "Enter your desired IPv4 subnet mask" $r $c $IPv4mask 3>&1 1>&2 2>&3) + if [[ $? = 0 ]];then + echo "Your static IPv4 netmask: $IPv4mask" + # Ask for the gateway + IPv4gw=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 gateway (router)" --inputbox "Enter your desired IPv4 default gateway" $r $c $IPv4gw 3>&1 1>&2 2>&3) + if [[ $? = 0 ]];then + echo "Your static IPv4 gateway: $IPv4gw" + # Give the user a chance to review their settings before moving on + if (whiptail --backtitle "Calibrating network interface" --title "Static IP Address" --yesno "Are these settings correct? + IP address: $IPv4addr + Subnet mask: $IPv4mask + Gateway: $IPv4gw" $r $c)then + # If the settings are correct, then we need to set the piholeIP + # Saving it to a temporary file us to retrieve it later when we run the gravity.sh script + echo $IPv4addr > /tmp/piholeIP + # After that's done, the loop ends and we move on + ipSettingsCorrect=True + else + # If the settings are wrong, the loop continues + ipSettingsCorrect=False + fi + else + # Cancelling gateway settings window + ipSettingsCorrect=False + echo "User canceled." + exit + fi + else + # Cancelling subnet mask settings window + ipSettingsCorrect=False + echo "User canceled." + exit + fi + else + # Cancelling IPv4 settings window + ipSettingsCorrect=False + echo "User canceled." + exit + fi +done +# End the if statement for DHCP vs. static +fi +} + + +setStaticIPv4() { # Append these lines to /etc/dhcpcd.conf to enable a static IP echo "interface $ethernetDevice @@ -76,6 +183,7 @@ sudo service lighttpd stop sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig +sudo mv /etc/crontab /etc/crontab.orig sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf sudo mv /etc/crontab /etc/crontab.orig @@ -92,94 +200,46 @@ sudo chmod 644 /var/log/pihole.log sudo chown dnsmasq:root /var/log/pihole.log sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/installation/gravity.sh sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh +sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh sudo chmod 755 /usr/local/bin/gravity.sh sudo chmod 755 /usr/local/bin/chronometer.sh +sudo chmod 755 /usr/local/bin/whitelist.sh sudo /usr/local/bin/gravity.sh sudo service networking restart } ######## SCRIPT ############ +# Start the installer +welcomeDialogs + # Just back up the original Pi-hole right away since it won't take long and it gets it out of the way backupLegacyPihole -# 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 +# Let the user decide if they want to block ads over IPv4 and/or IPv6 +use4andor6 -# 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. - -In the next section, you can choose to use your current network settings (DHCP) or to manually edit them." $r $c - -# Ask if the user wannts to use DHCP settings as their static IP -if (whiptail --backtitle "Calibrating network interface" --title "Static IP Address" --yesno "Do you want to use your current network settings as a static address? - - IP address: $IPv4addr - Subnet mask: $IPv4mask - Gateway: $IPv4gw" $r $c) then - # If they choose yes, let the user know that the IP address will not be available via DHCP and may cause a conflict. - whiptail --msgbox --backtitle "IP information" --title "FYI: IP Conflict" "It is possible your router could still try to assign this IP to a device, which would cause a conflict. But in most cases the router is smart enough to not do that. - -If you are worried, either manually set the address, or modify the DHCP reservation pool so it does not include the IP you want. - -It is also possible to use a DHCP reservation, but if you are going to do that, you might as well set a static address." $r $c - # Nothing else to do since the variables are already set above +# Decide is IPv4 will be used +if [[ "$useIPv4" = true ]];then + echo "Using IPv4" + getStaticIPv4Settings + setStaticIPv4 else - # Otherwise, we need to ask the user to input their desired settings. - # Start by getting the IPv4 address (pre-filling it with info gathered from DHCP) - # Start a loop to let the user enter their information with the chance to go back and edit it if necessary - until [[ $ipSettingsCorrect = True ]] - do - # Ask for the IPv4 address - IPv4addr=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 address" --inputbox "Enter your desired IPv4 address" $r $c $IPv4addr 3>&1 1>&2 2>&3) - if [[ $? = 0 ]];then - echo "Your static IPv4 address: $IPv4addr" - # Ask for the subnet mask - IPv4mask=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 netmask" --inputbox "Enter your desired IPv4 subnet mask" $r $c $IPv4mask 3>&1 1>&2 2>&3) - if [[ $? = 0 ]];then - echo "Your static IPv4 netmask: $IPv4mask" - # Ask for the gateway - IPv4gw=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 gateway (router)" --inputbox "Enter your desired IPv4 default gateway" $r $c $IPv4gw 3>&1 1>&2 2>&3) - if [[ $? = 0 ]];then - echo "Your static IPv4 gateway: $IPv4gw" - # Give the user a chance to review their settings before moving on - if (whiptail --backtitle "Calibrating network interface" --title "Static IP Address" --yesno "Are these settings correct? - IP address: $IPv4addr - Subnet mask: $IPv4mask - Gateway: $IPv4gw" $r $c)then - # If the settings are correct, then we need to set the piholeIP - # Saving it to a temporary file us to retrieve it later when we run the gravity.sh script - echo $IPv4addr > /tmp/piholeIP - # After that's done, the loop ends and we move on - ipSettingsCorrect=True - - else - # If the settings are wrong, the loop continues - ipSettingsCorrect=False - fi - else - # Cancelling gateway settings window - ipSettingsCorrect=False - echo "User canceled." - exit - fi - else - # Cancelling subnet mask settings window - ipSettingsCorrect=False - echo "User canceled." - exit - fi - else - # Cancelling IPv4 settings window - ipSettingsCorrect=False - echo "User canceled." - exit - fi - done -# End the if statement for DHCP vs. static + echo "IPv4 will NOT be used." +fi + +# Decide is IPv6 will be used +if [[ "$useIPv6" = true ]];then + whiptail --msgbox --backtitle "Coming soon..." --title "IPv6 not yet supported" "I need your help. Consider donating at: + + http://pi-hole.net/donate" $r $c + echo "Using IPv6" +else + whiptail --msgbox --backtitle "Coming soon..." --title "IPv6 not yet supported" "I need your help. Consider donating at: + + http://pi-hole.net/donate" $r $c + echo "IPv6 will NOT be used." fi -# Set the static address -set_static_ip # Install and log everything to a file installPihole | tee $tmpLog From ad91eb44fbac32f0e1efa41b42e669168293d076 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Mon, 9 Nov 2015 18:33:32 -0600 Subject: [PATCH 17/50] choose an interface also fixing ipv6 logic --- automated install/basic-install.sh | 60 +++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 9 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 73e7f1f..d171bf8 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -63,6 +63,40 @@ whiptail --msgbox --backtitle "Initating network interface" --title "Static IP N In the next section, you can choose to use your current network settings (DHCP) or to manually edit them." $r $c } +chooseInterface() +{ +# Turn the available interfaces into an array so it can be used with a whiptail dialog +interfacesArray=() +while read -r line +do +interfacesArray+=("$line" "available" "OFF") +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 + # case $chooseInterfaceOptions in + # eth0) + # echo "Ethernet" + # useIPv4=true + # ;; + # IPv6) + # echo "IPv6 selected." + # useIPv6=true + # ;; + # esac + # chosenInterface="$desiredInterface" + # echo "$desiredInterface" + echo "Chosen: $piholeInterface" +done + + +} + use4andor6() { # Let use select IPv4 and/or IPv6 @@ -79,13 +113,18 @@ do useIPv4=true ;; IPv6) - echo "IPv6 selected." + echo "IPv6 selected." useIPv6=true ;; esac done } +useIPv6dialog() +{ +whiptail --msgbox --backtitle "Coming soon..." --title "IPv6 not yet supported" "I need your help for IPv6. Consider donating at: http://pi-hole.net/donate" $r $c +} + getStaticIPv4Settings() { @@ -215,6 +254,8 @@ welcomeDialogs # Just back up the original Pi-hole right away since it won't take long and it gets it out of the way backupLegacyPihole +chooseInterface + # Let the user decide if they want to block ads over IPv4 and/or IPv6 use4andor6 @@ -224,23 +265,24 @@ if [[ "$useIPv4" = true ]];then getStaticIPv4Settings setStaticIPv4 else + useIPv4=false echo "IPv4 will NOT be used." fi # Decide is IPv6 will be used if [[ "$useIPv6" = true ]];then - whiptail --msgbox --backtitle "Coming soon..." --title "IPv6 not yet supported" "I need your help. Consider donating at: - - http://pi-hole.net/donate" $r $c - echo "Using IPv6" + # If only IPv6 is selected, exit because it is not supported yet + if [[ "$useIPv6" = true ]] && [[ "$useIPv4" = false ]];then + useIPv6dialog + exit + else + useIPv6dialog + fi else - whiptail --msgbox --backtitle "Coming soon..." --title "IPv6 not yet supported" "I need your help. Consider donating at: - - http://pi-hole.net/donate" $r $c + useIPv6=false echo "IPv6 will NOT be used." fi - # Install and log everything to a file installPihole | tee $tmpLog From 0936e394d48f12fb0ee5cf19e33467c9c2697785 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Tue, 10 Nov 2015 08:12:24 -0600 Subject: [PATCH 18/50] reboot only if new IP was set --- automated install/basic-install.sh | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index d171bf8..2963dfc 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -200,7 +200,7 @@ fi setStaticIPv4() { # Append these lines to /etc/dhcpcd.conf to enable a static IP -echo "interface $ethernetDevice +echo "interface $piholeInterface static ip_address=$IPv4addr/24 static routers=$IPv4gw static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null @@ -295,5 +295,12 @@ Your Pi will restart when you close this dialog. If you are using SSH, reconnec The install log is in /etc/phole." $r $c - -sudo reboot +# If the current IP address equals the desired address, no change is needed +if [[ $IPv4addr = "$(cat /tmp/piholeIP)" ]];then + # So just start the services + echo "sudo service dnsmasq start" + echo "sudo service lighttpd start" +else + # Restart to apply the new static IP address + echo "sudo reboot" +fi From 814873c6430054211a098c88e0b9b05230d2e38b Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Tue, 10 Nov 2015 17:28:05 -0600 Subject: [PATCH 19/50] reboot logic --- automated install/basic-install.sh | 41 +++++++++++------------------- 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 2963dfc..a5cef6b 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -69,7 +69,7 @@ chooseInterface() interfacesArray=() while read -r line do -interfacesArray+=("$line" "available" "OFF") +interfacesArray+=("$line" "available" "ON") done <<< "$availableInterfaces" # Find out how many interfaces are available to choose from @@ -79,22 +79,8 @@ chooseInterfaceOptions=$("${chooseInterfaceCmd[@]}" "${interfacesArray[@]}" 2>&1 for desiredInterface in $chooseInterfaceOptions do piholeInterface=$desiredInterface - # case $chooseInterfaceOptions in - # eth0) - # echo "Ethernet" - # useIPv4=true - # ;; - # IPv6) - # echo "IPv6 selected." - # useIPv6=true - # ;; - # esac - # chosenInterface="$desiredInterface" - # echo "$desiredInterface" - echo "Chosen: $piholeInterface" + echo "Using interface: $piholeInterface" done - - } use4andor6() @@ -125,7 +111,6 @@ useIPv6dialog() whiptail --msgbox --backtitle "Coming soon..." --title "IPv6 not yet supported" "I need your help for IPv6. Consider donating at: http://pi-hole.net/donate" $r $c } - getStaticIPv4Settings() { # Ask if the user wannts to use DHCP settings as their static IP @@ -142,6 +127,8 @@ if (whiptail --backtitle "Calibrating network interface" --title "Static IP Addr It is also possible to use a DHCP reservation, but if you are going to do that, you might as well set a static address." $r $c # Nothing else to do since the variables are already set above else + # Since a custom address will be used, restart at the end of the script to apply the new changes + rebootNeeded=true # Otherwise, we need to ask the user to input their desired settings. # Start by getting the IPv4 address (pre-filling it with info gathered from DHCP) # Start a loop to let the user enter their information with the chance to go back and edit it if necessary @@ -240,6 +227,7 @@ sudo chown dnsmasq:root /var/log/pihole.log sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/installation/gravity.sh sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh +sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh sudo chmod 755 /usr/local/bin/gravity.sh sudo chmod 755 /usr/local/bin/chronometer.sh sudo chmod 755 /usr/local/bin/whitelist.sh @@ -254,6 +242,7 @@ welcomeDialogs # Just back up the original Pi-hole right away since it won't take long and it gets it out of the way backupLegacyPihole +# Find interfaces and let the user choose one chooseInterface # Let the user decide if they want to block ads over IPv4 and/or IPv6 @@ -280,7 +269,7 @@ if [[ "$useIPv6" = true ]];then fi else useIPv6=false - echo "IPv6 will NOT be used." + echo "IPv6 will NOT be used. Consider a donation at pi-hole.net/donate" fi # Install and log everything to a file @@ -291,16 +280,16 @@ sudo mv $tmpLog $instalLogLoc whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using this IP: $IPv4addr. -Your Pi will restart when you close this dialog. If you are using SSH, reconnect using the IP address above. +If you didn't use DHCP settings as your new static address, the Pi will restart after this dialog. If you are using SSH, you may need to reconnect using the IP address above. The install log is in /etc/phole." $r $c -# If the current IP address equals the desired address, no change is needed -if [[ $IPv4addr = "$(cat /tmp/piholeIP)" ]];then - # So just start the services - echo "sudo service dnsmasq start" - echo "sudo service lighttpd start" -else +# If a custom address was set, restart +if [[ "$rebootNeeded" = true ]];then # Restart to apply the new static IP address - echo "sudo reboot" + sudo reboot +else + # If not, just start the services since the address will stay the same + sudo service dnsmasq start + sudo service lighttpd start fi From dee3df4e1195c1ae45c61240640e14bc04548845 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Tue, 10 Nov 2015 17:28:53 -0600 Subject: [PATCH 20/50] download master gravity --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index a5cef6b..85f79e5 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -224,7 +224,7 @@ sudo rm /var/www/master.zip 2>/dev/null sudo touch /var/log/pihole.log sudo chmod 644 /var/log/pihole.log sudo chown dnsmasq:root /var/log/pihole.log -sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/installation/gravity.sh +sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh From 0cb20fc080afdc95dcf6484cd66d2bfeb8c329e3 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Tue, 10 Nov 2015 17:34:25 -0600 Subject: [PATCH 21/50] typo --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 85f79e5..2a2b88d 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -282,7 +282,7 @@ whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Co If you didn't use DHCP settings as your new static address, the Pi will restart after this dialog. If you are using SSH, you may need to reconnect using the IP address above. -The install log is in /etc/phole." $r $c +The install log is in /etc/pihole." $r $c # If a custom address was set, restart if [[ "$rebootNeeded" = true ]];then From d0d165ad165e1ba873df73bd97691de7c9bf7afa Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Tue, 10 Nov 2015 21:27:53 -0600 Subject: [PATCH 22/50] chmod the log flusher --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 2a2b88d..f0a7d13 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -231,8 +231,8 @@ sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/ sudo chmod 755 /usr/local/bin/gravity.sh sudo chmod 755 /usr/local/bin/chronometer.sh sudo chmod 755 /usr/local/bin/whitelist.sh +sudo chmod 755 /usr/local/bin/piholeLogFlush.sh sudo /usr/local/bin/gravity.sh -sudo service networking restart } ######## SCRIPT ############ From 689426180a7ed7540bec4e529e4db206903f40ee Mon Sep 17 00:00:00 2001 From: dschaper Date: Sun, 15 Nov 2015 13:59:51 +0000 Subject: [PATCH 23/50] Resolve merge conflicts --- gravity.sh | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/gravity.sh b/gravity.sh index 9379319..c6405c7 100755 --- a/gravity.sh +++ b/gravity.sh @@ -1,11 +1,18 @@ #!/usr/bin/env bash # http://pi-hole.net # Compiles a list of ad-serving domains by downloading them from multiple sources - -# This script should only be run after you have a static IP address set on the Pi -piholeIP=$(hostname -I) +piholeIPfile=/tmp/piholeIP +if [[ -f $piholeIPfile ]];then + # If the file exists, it means it was exported from the installation script and we should use that value instead of detecting it in this script + piholeIP=$(cat $piholeIPfile) + rm $piholeIPfile +else + # Otherwise, the IP address can be taken directly from the machine, which will happen when the script is run by the user and not the installation script + piholeIP=$(ip -4 addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1") +fi # Ad-list sources--one per line in single quotes +# The mahakala source is commented out due to many users having issues with it blocking legitimate domains. Uncomment at your own risk sources=('https://adaway.org/hosts.txt' 'http://adblock.gjtech.net/?format=unix-hosts' #'http://adblock.mahakala.is/' @@ -129,8 +136,7 @@ function gravity_advanced() { # Format domain list as "192.168.x.x domain.com" echo "** Formatting domains into a HOSTS file..." - awk '{print "'"$piholeIP"'" $1}' $origin/$eventHorizon > $origin/$accretionDisc - + cat $origin/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIP"' " $0}' > $origin/$accretionDisc # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it sudo cp $origin/$accretionDisc $adList kill -HUP $(pidof dnsmasq) From b005da395f21ffdabd3459867b28621a0d778039 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sun, 15 Nov 2015 20:54:15 -0600 Subject: [PATCH 24/50] Updated install instructions Also a screenshot of the dialog-based installer --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 09b8852..3e02f0d 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@ # Automated Install 1. Install Raspbian -2. Set a **static** IP address -3. Run the command below +2. Run the command below -```curl -L install.pi-hole.net | bash``` +### ```curl -L install.pi-hole.net | bash``` + +![Pi-hole automated installation](http://i.imgur.com/Un7lBlj.png) Once installed, **configure any device to use the Raspberry Pi as its DNS server and the ads will be blocked**. You can also configure your router's DHCP options to assign the Pi as clients DNS server so they do not need to do it manually. From 1578a28363ec2bef64556b46427e04ea21b6f7bf Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Thu, 19 Nov 2015 19:36:34 -0600 Subject: [PATCH 25/50] pihole in the cloud link --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3e02f0d..258168c 100644 --- a/README.md +++ b/README.md @@ -63,5 +63,6 @@ This script will work for other UNIX-like systems with some slight **modificatio ### Examples Of The Pi-hole On Other Operating Systems - [Sky-Hole](http://dlaa.me/blog/post/skyhole) +- [Pi-hole in the Cloud!](http://blog.codybunch.com/2015/07/28/Pi-Hole-in-the-cloud/) [![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif "AdminLTE Presentation")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY "Donate") From d0e9e90ebeaf4638231d78470dd638d38542a0ac Mon Sep 17 00:00:00 2001 From: Cole Turner Date: Fri, 20 Nov 2015 22:53:43 -0500 Subject: [PATCH 26/50] pinholeIP should only use one IP Updated piholeIP because if there are multiple network adapters, the gravity list will populate incorrectly with both IP addresses. Only one address should be used. --- gravity.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index c6405c7..c2d1ff9 100755 --- a/gravity.sh +++ b/gravity.sh @@ -8,7 +8,7 @@ if [[ -f $piholeIPfile ]];then rm $piholeIPfile else # Otherwise, the IP address can be taken directly from the machine, which will happen when the script is run by the user and not the installation script - piholeIP=$(ip -4 addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1") + piholeIP=$(ip -4 addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1" | (head -n1)) fi # Ad-list sources--one per line in single quotes From 4e50a03dfc6169bf691fae25f61e9fc3365272b3 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 21 Nov 2015 13:29:03 -0600 Subject: [PATCH 27/50] uninstall script This should remove the Pi-hole. --- automated install/uninstall.sh | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 automated install/uninstall.sh diff --git a/automated install/uninstall.sh b/automated install/uninstall.sh new file mode 100644 index 0000000..b0dd336 --- /dev/null +++ b/automated install/uninstall.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# Completely uninstalls the Pi-hole + +######### SCRIPT ########### +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 rm -rf /var/www/html +sudo rm /etc/dnsmasq.conf /etc/dnsmasq.conf.orig +sudo rm /etc/crontab +sudo mv /etc/crontab.orig /etc/crontab +sudo rm /etc/dnsmasq.conf +sudo rm -rf /etc/lighttpd/ +sudo rm /var/log/pihole.log +sudo rm /usr/local/bin/gravity.sh +sudo rm /usr/local/bin/chronometer.sh +sudo rm /usr/local/bin/whitelist.sh +sudo rm /usr/local/bin/piholeLogFlush.sh +sudo rm -rf /etc/pihole/ From 04f6c478ccd1f3d651dd858d9cb77339217eef2f Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sun, 15 Nov 2015 20:54:15 -0600 Subject: [PATCH 28/50] Updated install instructions Also a screenshot of the dialog-based installer --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 09b8852..3e02f0d 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@ # Automated Install 1. Install Raspbian -2. Set a **static** IP address -3. Run the command below +2. Run the command below -```curl -L install.pi-hole.net | bash``` +### ```curl -L install.pi-hole.net | bash``` + +![Pi-hole automated installation](http://i.imgur.com/Un7lBlj.png) Once installed, **configure any device to use the Raspberry Pi as its DNS server and the ads will be blocked**. You can also configure your router's DHCP options to assign the Pi as clients DNS server so they do not need to do it manually. From ecb514dd0a206176876b6cba59b4b8ae9a1001be Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Thu, 19 Nov 2015 19:36:34 -0600 Subject: [PATCH 29/50] pihole in the cloud link --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3e02f0d..258168c 100644 --- a/README.md +++ b/README.md @@ -63,5 +63,6 @@ This script will work for other UNIX-like systems with some slight **modificatio ### Examples Of The Pi-hole On Other Operating Systems - [Sky-Hole](http://dlaa.me/blog/post/skyhole) +- [Pi-hole in the Cloud!](http://blog.codybunch.com/2015/07/28/Pi-Hole-in-the-cloud/) [![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif "AdminLTE Presentation")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY "Donate") From 03bbef07b5ef08c7005bade5b634d303149c5f58 Mon Sep 17 00:00:00 2001 From: Cole Turner Date: Fri, 20 Nov 2015 22:53:43 -0500 Subject: [PATCH 30/50] pinholeIP should only use one IP Updated piholeIP because if there are multiple network adapters, the gravity list will populate incorrectly with both IP addresses. Only one address should be used. --- gravity.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index c6405c7..c2d1ff9 100755 --- a/gravity.sh +++ b/gravity.sh @@ -8,7 +8,7 @@ if [[ -f $piholeIPfile ]];then rm $piholeIPfile else # Otherwise, the IP address can be taken directly from the machine, which will happen when the script is run by the user and not the installation script - piholeIP=$(ip -4 addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1") + piholeIP=$(ip -4 addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1" | (head -n1)) fi # Ad-list sources--one per line in single quotes From 464003d6741c81a6bc969db90eb4b34bb9932413 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 21 Nov 2015 13:29:03 -0600 Subject: [PATCH 31/50] uninstall script This should remove the Pi-hole. --- automated install/uninstall.sh | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 automated install/uninstall.sh diff --git a/automated install/uninstall.sh b/automated install/uninstall.sh new file mode 100644 index 0000000..b0dd336 --- /dev/null +++ b/automated install/uninstall.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# Completely uninstalls the Pi-hole + +######### SCRIPT ########### +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 rm -rf /var/www/html +sudo rm /etc/dnsmasq.conf /etc/dnsmasq.conf.orig +sudo rm /etc/crontab +sudo mv /etc/crontab.orig /etc/crontab +sudo rm /etc/dnsmasq.conf +sudo rm -rf /etc/lighttpd/ +sudo rm /var/log/pihole.log +sudo rm /usr/local/bin/gravity.sh +sudo rm /usr/local/bin/chronometer.sh +sudo rm /usr/local/bin/whitelist.sh +sudo rm /usr/local/bin/piholeLogFlush.sh +sudo rm -rf /etc/pihole/ From 29ae66c6db1d8748ba54fc79a9ec12dc56211afb Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 25 Nov 2015 13:43:59 -0800 Subject: [PATCH 32/50] Check IP info for outgoing interface --- automated install/basic-install.sh | 46 ++++++++++++------------------ 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index f0a7d13..2609973 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Pi-hole: A black hole for Internet advertisements # by Jacob Salmela # Network-wide ad blocking via your Raspberry Pi @@ -24,9 +24,11 @@ columns=$(stty -a | tr \; \\012 | egrep 'columns' | cut -d' ' -f3) r=$(( rows / 2 )) c=$(( columns / 2 )) -IPv4addr=$(ip -4 addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1") -IPv4mask=$(ifconfig | awk -F':' '/inet addr/ && !/127.0.0.1/ {print $4}') -IPv4gw=$(ip route show | awk '/default\ via/ {print $3}') +# Find IP used to route to outside world +IPv4info=$(ip route get 8.8.8.8) +IPv4dev=$(echo $IPv4info| awk '{print $5}') +IPv4addr=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}') +IPv4gw=$(echo $IPv4info | awk '{print $3}') # IPv6 support to be added later #IPv6eui64=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/' -f1) @@ -117,7 +119,6 @@ getStaticIPv4Settings() if (whiptail --backtitle "Calibrating network interface" --title "Static IP Address" --yesno "Do you want to use your current network settings as a static address? IP address: $IPv4addr - Subnet mask: $IPv4mask Gateway: $IPv4gw" $r $c) then # If they choose yes, let the user know that the IP address will not be available via DHCP and may cause a conflict. whiptail --msgbox --backtitle "IP information" --title "FYI: IP Conflict" "It is possible your router could still try to assign this IP to a device, which would cause a conflict. But in most cases the router is smart enough to not do that. @@ -138,22 +139,17 @@ else IPv4addr=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 address" --inputbox "Enter your desired IPv4 address" $r $c $IPv4addr 3>&1 1>&2 2>&3) if [[ $? = 0 ]];then echo "Your static IPv4 address: $IPv4addr" - # Ask for the subnet mask - IPv4mask=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 netmask" --inputbox "Enter your desired IPv4 subnet mask" $r $c $IPv4mask 3>&1 1>&2 2>&3) - if [[ $? = 0 ]];then - echo "Your static IPv4 netmask: $IPv4mask" - # Ask for the gateway + # Ask for the gateway IPv4gw=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 gateway (router)" --inputbox "Enter your desired IPv4 default gateway" $r $c $IPv4gw 3>&1 1>&2 2>&3) if [[ $? = 0 ]];then echo "Your static IPv4 gateway: $IPv4gw" # Give the user a chance to review their settings before moving on if (whiptail --backtitle "Calibrating network interface" --title "Static IP Address" --yesno "Are these settings correct? IP address: $IPv4addr - Subnet mask: $IPv4mask Gateway: $IPv4gw" $r $c)then # If the settings are correct, then we need to set the piholeIP # Saving it to a temporary file us to retrieve it later when we run the gravity.sh script - echo $IPv4addr > /tmp/piholeIP + echo ${IPv4addr%/*} > /tmp/piholeIP # After that's done, the loop ends and we move on ipSettingsCorrect=True else @@ -167,12 +163,6 @@ else exit fi else - # Cancelling subnet mask settings window - ipSettingsCorrect=False - echo "User canceled." - exit - fi - else # Cancelling IPv4 settings window ipSettingsCorrect=False echo "User canceled." @@ -188,7 +178,7 @@ setStaticIPv4() { # Append these lines to /etc/dhcpcd.conf to enable a static IP echo "interface $piholeInterface -static ip_address=$IPv4addr/24 +static ip_address=$IPv4addr static routers=$IPv4gw static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null } @@ -224,15 +214,15 @@ sudo rm /var/www/master.zip 2>/dev/null sudo touch /var/log/pihole.log sudo chmod 644 /var/log/pihole.log sudo chown dnsmasq:root /var/log/pihole.log -sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh -sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh -sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh -sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh -sudo chmod 755 /usr/local/bin/gravity.sh -sudo chmod 755 /usr/local/bin/chronometer.sh -sudo chmod 755 /usr/local/bin/whitelist.sh -sudo chmod 755 /usr/local/bin/piholeLogFlush.sh -sudo /usr/local/bin/gravity.sh +sudo curl -o /usr/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh +sudo curl -o /usr/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh +sudo curl -o /usr/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh +sudo curl -o /usr/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh +sudo chmod 755 /usr/bin/gravity.sh +sudo chmod 755 /usr/bin/chronometer.sh +sudo chmod 755 /usr/bin/whitelist.sh +sudo chmod 755 /usr/bin/piholeLogFlush.sh +sudo /usr/bin/gravity.sh } ######## SCRIPT ############ From 6e13134328c779375b74b2a2f6d00ee39e67f578 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 25 Nov 2015 13:51:11 -0800 Subject: [PATCH 33/50] Revert FHS change until merged --- automated install/basic-install.sh | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 2609973..f2a98fb 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -214,15 +214,15 @@ sudo rm /var/www/master.zip 2>/dev/null sudo touch /var/log/pihole.log sudo chmod 644 /var/log/pihole.log sudo chown dnsmasq:root /var/log/pihole.log -sudo curl -o /usr/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh -sudo curl -o /usr/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh -sudo curl -o /usr/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh -sudo curl -o /usr/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh -sudo chmod 755 /usr/bin/gravity.sh -sudo chmod 755 /usr/bin/chronometer.sh -sudo chmod 755 /usr/bin/whitelist.sh -sudo chmod 755 /usr/bin/piholeLogFlush.sh -sudo /usr/bin/gravity.sh +sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh +sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh +sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh +sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh +sudo chmod 755 /usr/local/bin/gravity.sh +sudo chmod 755 /usr/local/bin/chronometer.sh +sudo chmod 755 /usr/local/bin/whitelist.sh +sudo chmod 755 /usr/local/bin/piholeLogFlush.sh +sudo /usr/local/bin/gravity.sh } ######## SCRIPT ############ From 21ee63b7fb77da949eca5aca710afade971a0236 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 25 Nov 2015 14:08:13 -0800 Subject: [PATCH 34/50] Get IP info from outgoing interface Use IP to get interface information from outgoing interface. Use CIDR notation to make things easier. --- automated install/basic-install.sh | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index f0a7d13..f2a98fb 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Pi-hole: A black hole for Internet advertisements # by Jacob Salmela # Network-wide ad blocking via your Raspberry Pi @@ -24,9 +24,11 @@ columns=$(stty -a | tr \; \\012 | egrep 'columns' | cut -d' ' -f3) r=$(( rows / 2 )) c=$(( columns / 2 )) -IPv4addr=$(ip -4 addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1") -IPv4mask=$(ifconfig | awk -F':' '/inet addr/ && !/127.0.0.1/ {print $4}') -IPv4gw=$(ip route show | awk '/default\ via/ {print $3}') +# Find IP used to route to outside world +IPv4info=$(ip route get 8.8.8.8) +IPv4dev=$(echo $IPv4info| awk '{print $5}') +IPv4addr=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}') +IPv4gw=$(echo $IPv4info | awk '{print $3}') # IPv6 support to be added later #IPv6eui64=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/' -f1) @@ -117,7 +119,6 @@ getStaticIPv4Settings() if (whiptail --backtitle "Calibrating network interface" --title "Static IP Address" --yesno "Do you want to use your current network settings as a static address? IP address: $IPv4addr - Subnet mask: $IPv4mask Gateway: $IPv4gw" $r $c) then # If they choose yes, let the user know that the IP address will not be available via DHCP and may cause a conflict. whiptail --msgbox --backtitle "IP information" --title "FYI: IP Conflict" "It is possible your router could still try to assign this IP to a device, which would cause a conflict. But in most cases the router is smart enough to not do that. @@ -138,22 +139,17 @@ else IPv4addr=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 address" --inputbox "Enter your desired IPv4 address" $r $c $IPv4addr 3>&1 1>&2 2>&3) if [[ $? = 0 ]];then echo "Your static IPv4 address: $IPv4addr" - # Ask for the subnet mask - IPv4mask=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 netmask" --inputbox "Enter your desired IPv4 subnet mask" $r $c $IPv4mask 3>&1 1>&2 2>&3) - if [[ $? = 0 ]];then - echo "Your static IPv4 netmask: $IPv4mask" - # Ask for the gateway + # Ask for the gateway IPv4gw=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 gateway (router)" --inputbox "Enter your desired IPv4 default gateway" $r $c $IPv4gw 3>&1 1>&2 2>&3) if [[ $? = 0 ]];then echo "Your static IPv4 gateway: $IPv4gw" # Give the user a chance to review their settings before moving on if (whiptail --backtitle "Calibrating network interface" --title "Static IP Address" --yesno "Are these settings correct? IP address: $IPv4addr - Subnet mask: $IPv4mask Gateway: $IPv4gw" $r $c)then # If the settings are correct, then we need to set the piholeIP # Saving it to a temporary file us to retrieve it later when we run the gravity.sh script - echo $IPv4addr > /tmp/piholeIP + echo ${IPv4addr%/*} > /tmp/piholeIP # After that's done, the loop ends and we move on ipSettingsCorrect=True else @@ -167,12 +163,6 @@ else exit fi else - # Cancelling subnet mask settings window - ipSettingsCorrect=False - echo "User canceled." - exit - fi - else # Cancelling IPv4 settings window ipSettingsCorrect=False echo "User canceled." @@ -188,7 +178,7 @@ setStaticIPv4() { # Append these lines to /etc/dhcpcd.conf to enable a static IP echo "interface $piholeInterface -static ip_address=$IPv4addr/24 +static ip_address=$IPv4addr static routers=$IPv4gw static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null } From b011fe28d9ba095f6f6a057dc3a08bc0749f305b Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 25 Nov 2015 14:34:06 -0800 Subject: [PATCH 35/50] No longer need a reboot --- automated install/basic-install.sh | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index f2a98fb..47c402f 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -128,8 +128,6 @@ if (whiptail --backtitle "Calibrating network interface" --title "Static IP Addr It is also possible to use a DHCP reservation, but if you are going to do that, you might as well set a static address." $r $c # Nothing else to do since the variables are already set above else - # Since a custom address will be used, restart at the end of the script to apply the new changes - rebootNeeded=true # Otherwise, we need to ask the user to input their desired settings. # Start by getting the IPv4 address (pre-filling it with info gathered from DHCP) # Start a loop to let the user enter their information with the chance to go back and edit it if necessary @@ -180,7 +178,8 @@ setStaticIPv4() echo "interface $piholeInterface static ip_address=$IPv4addr static routers=$IPv4gw -static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null +static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null +sudo ip addr replace dev $piholeInterface $IPv4addr } installPihole() @@ -274,12 +273,5 @@ If you didn't use DHCP settings as your new static address, the Pi will restart The install log is in /etc/pihole." $r $c -# If a custom address was set, restart -if [[ "$rebootNeeded" = true ]];then - # Restart to apply the new static IP address - sudo reboot -else - # If not, just start the services since the address will stay the same - sudo service dnsmasq start - sudo service lighttpd start -fi +sudo service dnsmasq start +sudo service lighttpd start From bc0a8e7733925799d0401c40fc1132a30ed516de Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Wed, 25 Nov 2015 18:08:17 -0600 Subject: [PATCH 36/50] final dialog verbiage Updating dialog to reflect changes in #90 --- automated install/basic-install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 47c402f..3c6d14f 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -178,7 +178,7 @@ setStaticIPv4() echo "interface $piholeInterface static ip_address=$IPv4addr static routers=$IPv4gw -static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null +static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null sudo ip addr replace dev $piholeInterface $IPv4addr } @@ -269,7 +269,7 @@ sudo mv $tmpLog $instalLogLoc whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using this IP: $IPv4addr. -If you didn't use DHCP settings as your new static address, the Pi will restart after this dialog. If you are using SSH, you may need to reconnect using the IP address above. +If you set a new IP address, it should work fine, but you may want to reboot the Pi at some point. The install log is in /etc/pihole." $r $c From 23856d65e21bb0b960882eecff48cdb932c586af Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 25 Nov 2015 16:35:36 -0800 Subject: [PATCH 37/50] IP address detection update --- gravity.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index c2d1ff9..4952054 100755 --- a/gravity.sh +++ b/gravity.sh @@ -8,7 +8,9 @@ if [[ -f $piholeIPfile ]];then rm $piholeIPfile else # Otherwise, the IP address can be taken directly from the machine, which will happen when the script is run by the user and not the installation script - piholeIP=$(ip -4 addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1" | (head -n1)) + IPv4dev=$(ip route get 8.8.8.8 | awk '{print $5}') + piholeIPCIDR=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}') + piholeIP=${piholeIPCIDR%/*} fi # Ad-list sources--one per line in single quotes From 29ae57465bbbf06606894278cda84ad8df08f15f Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 25 Nov 2015 19:51:07 -0800 Subject: [PATCH 38/50] Bug Fix - Cleanup Files --- gravity.sh | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/gravity.sh b/gravity.sh index ae20d43..d70f0dc 100755 --- a/gravity.sh +++ b/gravity.sh @@ -145,7 +145,7 @@ function gravity_Schwarzchild() { echo "** Aggregating list of domains..." truncate -s 0 $piholeDir/$matter for i in "${activeDomains[@]}" -do +do cat $i |tr -d '\r' >> $piholeDir/$matter done @@ -199,6 +199,16 @@ function gravity_hostFormat() { # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it cp $piholeDir/$accretionDisc $adList } +function gravity_blackbody() { + for file in $piholeDir/*.$justDomainsExtension + do + if [[ " ${activeDomains[@]} " =~ " ${file} " ]]; then + : + else + rm -f $file + fi + done +} function gravity_advanced() { # Remove comments and print only the domain name @@ -221,4 +231,4 @@ gravity_Schwarzchild gravity_pulsar gravity_hostFormat gravity_advanced - +gravity_blackbody From c45dc277b6117aae69e1e60cbe2d7e77ab2e4525 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Thu, 26 Nov 2015 15:29:13 -0800 Subject: [PATCH 39/50] Tighten themeatics --- gravity.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gravity.sh b/gravity.sh index d70f0dc..018989c 100755 --- a/gravity.sh +++ b/gravity.sh @@ -73,10 +73,10 @@ function gravity_patternCheck() { # and stored as is. They can be processed for content after they # have been saved. cp $patternBuffer $saveLocation - echo "Done." + echo "List updated, transport successful..." else # curl didn't download any host files, probably because of the date check - echo "Transporter logic detected no changes, pattern skipped..." + echo "No changes detected, transport skipped..." fi } @@ -117,7 +117,7 @@ do agent="Mozilla/10.0" - echo -n "Getting $domain list... " + echo -n " Getting $domain list: " # Use a case statement to download lists that need special cURL commands # to complete properly and reset the user agent when required From d1e475da89154fe2ad83e03391137ca1fae0e99e Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Thu, 26 Nov 2015 15:48:52 -0800 Subject: [PATCH 40/50] Move black/white list check to pulsar --- gravity.sh | 144 ++++++++++++++++++++++++++++------------------------- 1 file changed, 77 insertions(+), 67 deletions(-) diff --git a/gravity.sh b/gravity.sh index 018989c..27f5d82 100755 --- a/gravity.sh +++ b/gravity.sh @@ -4,6 +4,7 @@ # Network-wide ad blocking via your Raspberry Pi # http://pi-hole.net # Compiles a list of ad-serving domains by downloading them from multiple sources + piholeIPfile=/tmp/piholeIP if [[ -f $piholeIPfile ]];then # If the file exists, it means it was exported from the installation script and we should use that value instead of detecting it in this script @@ -15,7 +16,8 @@ else fi # Ad-list sources--one per line in single quotes -# The mahakala source is commented out due to many users having issues with it blocking legitimate domains. Uncomment at your own risk +# The mahakala source is commented out due to many users having issues with it blocking legitimate domains. +# Uncomment at your own risk sources=('https://adaway.org/hosts.txt' 'http://adblock.gjtech.net/?format=unix-hosts' #'http://adblock.mahakala.is/' @@ -45,62 +47,65 @@ if [[ -r $piholeDir/pihole.conf ]];then echo "** Local calibration requested..." . $piholeDir/pihole.conf fi + ########################### # collapse - begin formation of pihole function gravity_collapse() { echo "** Neutrino emissions detected..." -# Create the pihole resource directory if it doesn't exist. Future files will be stored here -if [[ -d $piholeDir ]];then + # Create the pihole resource directory if it doesn't exist. Future files will be stored here + if [[ -d $piholeDir ]];then # Temporary hack to allow non-root access to pihole directory # Will update later, needed for existing installs, new installs should # create this directory as non-root sudo chmod 777 $piholeDir find "$piholeDir" -type f -exec sudo chmod 666 {} \; -else + else echo "** Creating pihole directory..." mkdir $piholeDir -fi + fi } # patternCheck - check to see if curl downloaded any new files, and then process those # files so they are in host format. function gravity_patternCheck() { - patternBuffer=$1 - # check if the patternbuffer is a non-zero length file - if [[ -s "$patternBuffer" ]];then - # Some of the blocklists are copyright, they need to be downloaded - # and stored as is. They can be processed for content after they - # have been saved. - cp $patternBuffer $saveLocation - echo "List updated, transport successful..." - else - # curl didn't download any host files, probably because of the date check - echo "No changes detected, transport skipped..." - fi + patternBuffer=$1 + # check if the patternbuffer is a non-zero length file + if [[ -s "$patternBuffer" ]];then + # Some of the blocklists are copyright, they need to be downloaded + # and stored as is. They can be processed for content after they + # have been saved. + cp $patternBuffer $saveLocation + echo "List updated, transport successful..." + else + # curl didn't download any host files, probably because of the date check + echo "No changes detected, transport skipped..." + fi } # transport - curl the specified url with any needed command extentions, then patternCheck function gravity_transport() { - url=$1 - cmd_ext=$2 - agent=$3 - # tmp file, so we don't have to store the (long!) lists in RAM - patternBuffer=$(mktemp) - heisenbergCompensator="" - if [[ -r $saveLocation ]]; then - # if domain has been saved, add file for date check to only download newer - heisenbergCompensator="-z $saveLocation" - fi - # Silently curl url - curl -s $cmd_ext $heisenbergCompensator -A "$agent" $url > $patternBuffer + url=$1 + cmd_ext=$2 + agent=$3 + + # tmp file, so we don't have to store the (long!) lists in RAM + patternBuffer=$(mktemp) + heisenbergCompensator="" + if [[ -r $saveLocation ]]; then + # if domain has been saved, add file for date check to only download newer + heisenbergCompensator="-z $saveLocation" + fi - gravity_patternCheck $patternBuffer - - # Cleanup - rm -f $patternBuffer + # Silently curl url + curl -s $cmd_ext $heisenbergCompensator -A "$agent" $url > $patternBuffer + # Check for list updates + gravity_patternCheck $patternBuffer + # Cleanup + rm -f $patternBuffer } + # spinup - main gravity function function gravity_spinup() { @@ -141,26 +146,26 @@ done # Schwarzchild - aggregate domains to one list and add blacklisted domains function gravity_Schwarzchild() { -# Find all active domains and compile them into one file and remove CRs -echo "** Aggregating list of domains..." -truncate -s 0 $piholeDir/$matter -for i in "${activeDomains[@]}" -do - cat $i |tr -d '\r' >> $piholeDir/$matter -done - -# Append blacklist entries if they exist -if [[ -r $blacklist ]];then - numberOf=$(cat $blacklist | sed '/^\s*$/d' | wc -l) - echo "** Blacklisting $numberOf domain(s)..." - cat $blacklist >> $piholeDir/$matter -fi + # Find all active domains and compile them into one file and remove CRs + echo "** Aggregating list of domains..." + truncate -s 0 $piholeDir/$matter + for i in "${activeDomains[@]}" + do + cat $i |tr -d '\r' >> $piholeDir/$matter + done } function gravity_pulsar() { + + # Append blacklist entries if they exist + if [[ -r $blacklist ]];then + numberOf=$(cat $blacklist | sed '/^\s*$/d' | wc -l) + echo "** Blacklisting $numberOf domain(s)..." + cat $blacklist >> $piholeDir/$matter + fi -# Whitelist (if applicable) domains -if [[ -r $whitelist ]];then + # Whitelist (if applicable) domains + if [[ -r $whitelist ]];then # Remove whitelist entries numberOf=$(cat $whitelist | sed '/^\s*$/d' | wc -l) plural=; [[ "$numberOf" != "1" ]] && plural=s @@ -170,20 +175,20 @@ if [[ -r $whitelist ]];then # replace "." with "\." of each line to turn each entry into a # regexp so it can be parsed out with grep -x awk -F '[# \t]' 'NF>0&&$1!="" {print "^"$1"$"}' $whitelist | sed 's/\./\\./g' > $latentWhitelist -else + else rm $latentWhitelist -fi + fi -# Prevent our sources from being pulled into the hole -plural=; [[ "${#sources[@]}" != "1" ]] && plural=s -echo "** Whitelisting ${#sources[@]} ad list source${plural}..." -for url in ${sources[@]} -do + # Prevent our sources from being pulled into the hole + plural=; [[ "${#sources[@]}" != "1" ]] && plural=s + echo "** Whitelisting ${#sources[@]} ad list source${plural}..." + for url in ${sources[@]} + do echo "$url" | awk -F '/' '{print "^"$3"$"}' | sed 's/\./\\./g' >> $latentWhitelist -done + done -# Remove whitelist entries from list -grep -vxf $latentWhitelist $piholeDir/$matter > $piholeDir/$andLight + # Remove whitelist entries from list + grep -vxf $latentWhitelist $piholeDir/$matter > $piholeDir/$andLight } function gravity_unique() { @@ -192,6 +197,7 @@ function gravity_unique() { numberOf=$(wc -l < $piholeDir/$eventHorizon) echo "** $numberOf unique domains trapped in the event horizon." } + function gravity_hostFormat() { # Format domain list as "192.168.x.x domain.com" echo "** Formatting domains into a HOSTS file..." @@ -199,16 +205,20 @@ function gravity_hostFormat() { # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it cp $piholeDir/$accretionDisc $adList } + function gravity_blackbody() { - for file in $piholeDir/*.$justDomainsExtension - do - if [[ " ${activeDomains[@]} " =~ " ${file} " ]]; then - : - else - rm -f $file - fi - done + # Loop through list files + for file in $piholeDir/*.$justDomainsExtension + do + # If list is active then leave it (noop) else rm the list + if [[ " ${activeDomains[@]} " =~ " ${file} " ]]; then + : + else + rm -f $file + fi + done } + function gravity_advanced() { # Remove comments and print only the domain name From 9892d06c0db96ad090061778049e765d05283007 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Thu, 26 Nov 2015 15:56:37 -0800 Subject: [PATCH 41/50] Code format cleanups --- gravity.sh | 61 +++++++++++++++++++++++++++--------------------------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/gravity.sh b/gravity.sh index 27f5d82..f34ce80 100755 --- a/gravity.sh +++ b/gravity.sh @@ -51,7 +51,7 @@ fi ########################### # collapse - begin formation of pihole function gravity_collapse() { -echo "** Neutrino emissions detected..." + echo "** Neutrino emissions detected..." # Create the pihole resource directory if it doesn't exist. Future files will be stored here if [[ -d $piholeDir ]];then @@ -66,8 +66,7 @@ echo "** Neutrino emissions detected..." fi } -# patternCheck - check to see if curl downloaded any new files, and then process those -# files so they are in host format. +# patternCheck - check to see if curl downloaded any new files. function gravity_patternCheck() { patternBuffer=$1 # check if the patternbuffer is a non-zero length file @@ -83,7 +82,7 @@ function gravity_patternCheck() { fi } -# transport - curl the specified url with any needed command extentions, then patternCheck +# transport - curl the specified url with any needed command extentions function gravity_transport() { url=$1 cmd_ext=$2 @@ -109,9 +108,9 @@ function gravity_transport() { # spinup - main gravity function function gravity_spinup() { -# Loop through domain list. Download each one and remove commented lines (lines beginning with '# 'or '/') and blank lines -for ((i = 0; i < "${#sources[@]}"; i++)) -do + # Loop through domain list. Download each one and remove commented lines (lines beginning with '# 'or '/') and # blank lines + for ((i = 0; i < "${#sources[@]}"; i++)) + do url=${sources[$i]} # Get just the domain from the URL domain=$(echo "$url" | cut -d'/' -f3) @@ -139,8 +138,8 @@ do # Default is a simple request *) cmd_ext="" esac - gravity_transport $url $cmd_ext $agent -done + gravity_transport $url $cmd_ext $agent + done } # Schwarzchild - aggregate domains to one list and add blacklisted domains @@ -155,6 +154,7 @@ function gravity_Schwarzchild() { done } +# Pulsar - White/blacklist application function gravity_pulsar() { # Append blacklist entries if they exist @@ -192,25 +192,26 @@ function gravity_pulsar() { } function gravity_unique() { - # Sort and remove duplicates - sort -u $piholeDir/$supernova > $piholeDir/$eventHorizon - numberOf=$(wc -l < $piholeDir/$eventHorizon) - echo "** $numberOf unique domains trapped in the event horizon." + # Sort and remove duplicates + sort -u $piholeDir/$supernova > $piholeDir/$eventHorizon + numberOf=$(wc -l < $piholeDir/$eventHorizon) + echo "** $numberOf unique domains trapped in the event horizon." } function gravity_hostFormat() { - # Format domain list as "192.168.x.x domain.com" - echo "** Formatting domains into a HOSTS file..." - cat $piholeDir/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIP"' " $0}' > $piholeDir/$accretionDisc - # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it - cp $piholeDir/$accretionDisc $adList + # Format domain list as "192.168.x.x domain.com" + echo "** Formatting domains into a HOSTS file..." + cat $piholeDir/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIP"' " $0}' > $piholeDir/$accretionDisc + # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it + cp $piholeDir/$accretionDisc $adList } +# blackbody - remove any remnant files from script processes function gravity_blackbody() { # Loop through list files for file in $piholeDir/*.$justDomainsExtension do - # If list is active then leave it (noop) else rm the list + # If list is in active array then leave it (noop) else rm the list if [[ " ${activeDomains[@]} " =~ " ${file} " ]]; then : else @@ -220,19 +221,19 @@ function gravity_blackbody() { } function gravity_advanced() { + # Remove comments and print only the domain name + # Most of the lists downloaded are already in hosts file format but the spacing/formating is not contigious + # This helps with that and makes it easier to read + # It also helps with debugging so each stage of the script can be researched more in depth + awk '($1 !~ /^#/) { if (NF>1) {print $2} else {print $1}}' $piholeDir/$andLight | \ + sed -nr -e 's/\.{2,}/./g' -e '/\./p' > $piholeDir/$supernova - # Remove comments and print only the domain name - # Most of the lists downloaded are already in hosts file format but the spacing/formating is not contigious - # This helps with that and makes it easier to read - # It also helps with debugging so each stage of the script can be researched more in depth - awk '($1 !~ /^#/) { if (NF>1) {print $2} else {print $1}}' $piholeDir/$andLight | \ - sed -nr -e 's/\.{2,}/./g' -e '/\./p' > $piholeDir/$supernova + numberOf=$(wc -l < $piholeDir/$supernova) + echo "** $numberOf domains being pulled in by gravity..." - numberOf=$(wc -l < $piholeDir/$supernova) - echo "** $numberOf domains being pulled in by gravity..." - gravity_unique - - sudo kill -HUP $(pidof dnsmasq) + gravity_unique + + sudo kill -HUP $(pidof dnsmasq) } gravity_collapse From a2cddda590ad983dc7ae8915646130559eb1e947 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Fri, 27 Nov 2015 18:29:44 -0600 Subject: [PATCH 42/50] if whitelist.txt doesn't exist, create it --- advanced/Scripts/whitelist.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/advanced/Scripts/whitelist.sh b/advanced/Scripts/whitelist.sh index d610d0a..97385c9 100755 --- a/advanced/Scripts/whitelist.sh +++ b/advanced/Scripts/whitelist.sh @@ -1,5 +1,9 @@ #!/bin/bash +if [[ ! -f /etc/pihole/whitelist.txt ]];then + touch /etc/pihole/whitelist.txt +fi + if [ $# = 0 ]; then echo "Immediately whitelists one or more domains." echo "Usage: whitelist.sh domain1 [domain2 ...]" @@ -29,7 +33,7 @@ done # Now report on and remove matched domains if [ "$combopattern" != "" ]; then echo "Modifying hosts file..." - + # Construct pattern to match entry in hosts file. # This consists of one or more IP addresses followed by the domain name. pattern=$(echo $combopattern | awk -F '[# \t]' '{printf "%s", "^(([0-9]+\.){3}[0-9]+ +)+("$1")$"}') From 573c1ef94f1baa0da7ec53dd9221ddf7c03957bc Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Fri, 27 Nov 2015 18:34:02 -0600 Subject: [PATCH 43/50] double bracket notation --- advanced/Scripts/whitelist.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/advanced/Scripts/whitelist.sh b/advanced/Scripts/whitelist.sh index 97385c9..ea06cc8 100755 --- a/advanced/Scripts/whitelist.sh +++ b/advanced/Scripts/whitelist.sh @@ -4,7 +4,7 @@ if [[ ! -f /etc/pihole/whitelist.txt ]];then touch /etc/pihole/whitelist.txt fi -if [ $# = 0 ]; then +if [[ $# = 0 ]]; then echo "Immediately whitelists one or more domains." echo "Usage: whitelist.sh domain1 [domain2 ...]" fi @@ -19,9 +19,9 @@ do # Construct basic pattern to match domain name. basicpattern=$(echo $var | awk -F '[# \t]' 'NF>0&&$1!="" {print ""$1""}' | sed 's/\./\\./g') - if [ "$basicpattern" != "" ]; then + if [[ "$basicpattern" != "" ]]; then # Add to the combination pattern that will be used below - if [ "$combopattern" != "" ]; then combopattern="$combopattern|"; fi + if [[ "$combopattern" != "" ]]; then combopattern="$combopattern|"; fi combopattern="$combopattern$basicpattern" # Also add the domain to the whitelist but only if it's not already present @@ -31,7 +31,7 @@ do done # Now report on and remove matched domains -if [ "$combopattern" != "" ]; then +if [[ "$combopattern" != "" ]]; then echo "Modifying hosts file..." # Construct pattern to match entry in hosts file. From 831322b8b2d6faa07b3951cd1973dab4d6ebaf62 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Fri, 27 Nov 2015 18:38:33 -0600 Subject: [PATCH 44/50] replace file paths with variables --- advanced/Scripts/whitelist.sh | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/advanced/Scripts/whitelist.sh b/advanced/Scripts/whitelist.sh index ea06cc8..cda557c 100755 --- a/advanced/Scripts/whitelist.sh +++ b/advanced/Scripts/whitelist.sh @@ -1,7 +1,8 @@ #!/bin/bash - -if [[ ! -f /etc/pihole/whitelist.txt ]];then - touch /etc/pihole/whitelist.txt +whitelist=/etc/pihole/whitelist.txt +adList=/etc/pihole/gravity.list +if [[ ! -f $whitelist ]];then + touch $whitelist fi if [[ $# = 0 ]]; then @@ -25,8 +26,8 @@ do combopattern="$combopattern$basicpattern" # Also add the domain to the whitelist but only if it's not already present - grep -E -q "^$basicpattern$" /etc/pihole/whitelist.txt \ - || echo "$var" >> /etc/pihole/whitelist.txt + grep -E -q "^$basicpattern$" $whitelist \ + || echo "$var" >> $whitelist fi done @@ -39,8 +40,8 @@ if [[ "$combopattern" != "" ]]; then pattern=$(echo $combopattern | awk -F '[# \t]' '{printf "%s", "^(([0-9]+\.){3}[0-9]+ +)+("$1")$"}') # Output what will be removed and then actually remove - sed -r -n 's/'"$pattern"'/ Removed: \3/p' /etc/pihole/gravity.list - sed -r -i '/'"$pattern"'/d' /etc/pihole/gravity.list + sed -r -n 's/'"$pattern"'/ Removed: \3/p' $adList + sed -r -i '/'"$pattern"'/d' $adList echo "** $# domain(s) whitelisted." # Force dnsmasq to reload /etc/pihole/gravity.list From 1eb7f879f07b8c2b856bb9aaf0ae57c56ca02f30 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Tue, 1 Dec 2015 15:12:16 -0600 Subject: [PATCH 45/50] fixes #101 the line url.access-deny caused the error. --- advanced/lighttpd.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/advanced/lighttpd.conf b/advanced/lighttpd.conf index a4253a0..31cb47b 100644 --- a/advanced/lighttpd.conf +++ b/advanced/lighttpd.conf @@ -1,4 +1,5 @@ server.modules = ( + "mod_access", "mod_expire", "mod_compress", "mod_redirect", From c34cc1608baf2c7c1450c19a9922107d91e57d29 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Tue, 1 Dec 2015 16:04:07 -0600 Subject: [PATCH 46/50] for use with logstalgia This seems to show the domain queried and the path requested. --- advanced/lighttpd.conf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/advanced/lighttpd.conf b/advanced/lighttpd.conf index 31cb47b..3998269 100644 --- a/advanced/lighttpd.conf +++ b/advanced/lighttpd.conf @@ -1,5 +1,6 @@ server.modules = ( "mod_access", + "mod_accesslog", "mod_expire", "mod_compress", "mod_redirect", @@ -15,6 +16,8 @@ server.pid-file = "/var/run/lighttpd.pid" server.username = "www-data" server.groupname = "www-data" server.port = 80 +accesslog.filename = "/var/log/lighttpd/access.log" +accesslog.format = "%{%s}t|%V|%r|%s|%b" index-file.names = ( "index.php", "index.html", "index.lighttpd.html" ) From 2193d6a81fcc65732d606ee294aa756e3530b65f Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Thu, 3 Dec 2015 01:29:26 -0800 Subject: [PATCH 47/50] Document dnsmasq.conf config --- advanced/dnsmasq.conf | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/advanced/dnsmasq.conf b/advanced/dnsmasq.conf index 25b2138..30d7238 100644 --- a/advanced/dnsmasq.conf +++ b/advanced/dnsmasq.conf @@ -1,12 +1,47 @@ +# If you want dnsmasq to read another file, as well as /etc/hosts, use +# this. addn-hosts=/etc/pihole/gravity.list + +# The following two options make you a better netizen, since they +# tell dnsmasq to filter out queries which the public DNS cannot +# answer, and which load the servers (especially the root servers) +# unnecessarily. If you have a dial-on-demand link they also stop +# these requests from bringing up the link unnecessarily. + +# Never forward plain names (without a dot or domain part) domain-needed +# Never forward addresses in the non-routed address spaces. bogus-priv + +# If you don't want dnsmasq to read /etc/resolv.conf or any other +# file, getting its servers from this file instead (see below), then +# uncomment this. no-resolv + +# Add other name servers here, with domain specs if they are for +# non-public domains. server=8.8.8.8 server=8.8.4.4 + +# If you want dnsmasq to listen for DHCP and DNS requests only on +# specified interfaces (and the loopback) give the name of the +# interface (eg eth0) here. interface=eth0 +# Or which to listen on by address (remember to include 127.0.0.1 if +# you use this.) listen-address=127.0.0.1 + +# Set the cachesize here. cache-size=10000 + +# For debugging purposes, log each DNS query as it passes through +# dnsmasq. log-queries log-facility=/var/log/pihole.log + +# Normally responses which come from /etc/hosts and the DHCP lease +# file have Time-To-Live set as zero, which conventionally means +# do not cache further. If you are happy to trade lower load on the +# server for potentially stale date, you can set a time-to-live (in +# seconds) here. local-ttl=300 From 7a82d1ff17af9d17139bd0714746303a75f07514 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Thu, 3 Dec 2015 09:26:43 -0800 Subject: [PATCH 48/50] Breakout basic-install.sh into functions --- automated install/basic-install.sh | 82 ++++++++++++++++++++---------- 1 file changed, 54 insertions(+), 28 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 3c6d14f..f59214b 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -182,45 +182,71 @@ static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null sudo ip addr replace dev $piholeInterface $IPv4addr } -installPihole() -{ +installScripts(){ +sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh +sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh +sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh +sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh +sudo chmod 755 /usr/local/bin/{gravity,chronometer,whitelist,piholeLogFlush}.sh +} + +installConfigs(){ +sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig +sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig +sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf +sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf +} + +stopServices(){ +sudo service dnsmasq stop || true +sudo service lighttpd stop || true +} + +installDependencies(){ sudo apt-get update sudo apt-get -y upgrade sudo apt-get -y install dnsutils bc toilet sudo apt-get -y install dnsmasq sudo apt-get -y install lighttpd php5-common php5-cgi php5 -sudo mkdir /var/www/html -sudo chown www-data:www-data /var/www/html -sudo chmod 775 /var/www/html -sudo usermod -a -G www-data pi -sudo service dnsmasq stop -sudo service lighttpd stop -sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig -sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig -sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig -sudo mv /etc/crontab /etc/crontab.orig -sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf -sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf -sudo mv /etc/crontab /etc/crontab.orig -sudo curl -o /etc/crontab https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron -sudo lighty-enable-mod fastcgi fastcgi-php -sudo mkdir /var/www/html/pihole -sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html +} + +installWebAdmin(){ sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip -sudo unzip -o /var/www/master.zip -d /var/www/html/ +sudo unzip -oq /var/www/master.zip -d /var/www/html/ sudo mv /var/www/html/AdminLTE-master /var/www/html/admin sudo rm /var/www/master.zip 2>/dev/null +} + +installPiholeWeb(){ +sudo mkdir /var/www/html/pihole +sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig +sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html +} + +installCron(){ +sudo mv /etc/crontab /etc/crontab.orig +sudo curl -o /etc/crontab https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron +} + +installPiLog(){ sudo touch /var/log/pihole.log sudo chmod 644 /var/log/pihole.log sudo chown dnsmasq:root /var/log/pihole.log -sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh -sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh -sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh -sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh -sudo chmod 755 /usr/local/bin/gravity.sh -sudo chmod 755 /usr/local/bin/chronometer.sh -sudo chmod 755 /usr/local/bin/whitelist.sh -sudo chmod 755 /usr/local/bin/piholeLogFlush.sh +} +installPihole() +{ +installDependencies +stopServices +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 +installScripts +installConfigs +installWebAdmin +installPiholeWeb +installCron +installPiLog sudo /usr/local/bin/gravity.sh } From 3651ee5480a434435d8800d98b759353709c1a08 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Thu, 3 Dec 2015 09:56:27 -0800 Subject: [PATCH 49/50] Bugfix for hardcoded dnsmasq.conf interface Add target to dnsmasq.conf for sed Replace dnsmasq.conf target with selected interface --- advanced/dnsmasq.conf | 2 +- automated install/basic-install.sh | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/advanced/dnsmasq.conf b/advanced/dnsmasq.conf index 30d7238..c426916 100644 --- a/advanced/dnsmasq.conf +++ b/advanced/dnsmasq.conf @@ -26,7 +26,7 @@ server=8.8.4.4 # If you want dnsmasq to listen for DHCP and DNS requests only on # specified interfaces (and the loopback) give the name of the # interface (eg eth0) here. -interface=eth0 +interface=@INT@ # Or which to listen on by address (remember to include 127.0.0.1 if # you use this.) listen-address=127.0.0.1 diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index f59214b..04f1b39 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -82,6 +82,7 @@ for desiredInterface in $chooseInterfaceOptions do piholeInterface=$desiredInterface echo "Using interface: $piholeInterface" + echo ${piholeInterface} > /tmp/piholeINT done } @@ -195,6 +196,7 @@ sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf +sudo sed -i "s/@INT@/$piholeInterface/" /etc/dnsmasq.conf } stopServices(){ From b9a5ca60b2f63a3ea27ea77a1ef9edb164d158e0 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Thu, 3 Dec 2015 20:34:45 -0800 Subject: [PATCH 50/50] Oneline ip link call, tighten awk call --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index f59214b..55292ad 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -34,7 +34,7 @@ IPv4gw=$(echo $IPv4info | awk '{print $3}') #IPv6eui64=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/' -f1) #IPv6linkLocal=$(ip addr show | awk '/inet/ && /scope\ link/ && /fe80/ {print $2}' | cut -d'/' -f1) -availableInterfaces=$(ip link show | awk -F' ' '/[0-9]: [a-z]/ {print $2}' | grep -v "lo" | cut -d':' -f1) +availableInterfaces=$(ip -o link | awk '{print $2}' | grep -v "lo" | cut -d':' -f1) dhcpcdFile=/etc/dhcpcd.conf ####### FUCNTIONS ##########