diff --git a/README.md b/README.md index cc58b154..19ab0241 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ Once installed, [configure your router to have **DHCP clients use the Pi as thei - [Minibian Pi-hole](http://munkjensen.net/wiki/index.php/See_my_Pi-Hole#Minibian_Pi-hole) ## Coverage +- [The Defrag Show - MSDN/Channel 9](https://channel9.msdn.com/Shows/The-Defrag-Show/Defrag-Endoscope-USB-Camera-The-Final-HoloLens-Vote-Adblock-Pi-and-more?WT.mc_id=dlvr_twitter_ch9#time=20m39s) - [MacObserver Podcast 585](http://www.macobserver.com/tmo/podcast/macgeekgab-585) - [Medium: Block All Ads For $53](https://medium.com/@robleathern/block-ads-on-all-home-devices-for-53-18-a5f1ec139693#.gj1xpgr5d) - [MakeUseOf: Adblock Everywhere, The Pi-hole Way](http://www.makeuseof.com/tag/adblock-everywhere-raspberry-pi-hole-way/) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 5af79a24..f3771764 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -63,33 +63,32 @@ else fi fi + if [ -d "/etc/pihole" ]; then - #Likely an existing install + # Likely an existing install upgrade=true else - upgrade=false + upgrade=false fi ####### FUNCTIONS ########## ###All credit for the below function goes to http://fitnr.com/showing-a-bash-spinner.html -spinner(){ - local pid=$1 +spinner() { + local pid=$1 - spin='-\|/' - i=0 - while $SUDO kill -0 $pid 2>/dev/null - do - i=$(( (i+1) %4 )) - printf "\b${spin:$i:1}" - sleep .1 - done - printf "\b" + spin='-\|/' + i=0 + while $SUDO kill -0 $pid 2>/dev/null + do + i=$(( (i+1) %4 )) + printf "\b${spin:$i:1}" + sleep .1 + done + printf "\b" } - - - -backupLegacyPihole(){ +backupLegacyPihole() { + # This function detects and backups the pi-hole v1 files. It will not do anything to the current version files. if [[ -f /etc/dnsmasq.d/adList.conf ]];then echo "Original Pi-hole detected. Initiating sub space transport" $SUDO mkdir -p /etc/pihole/original/ @@ -104,23 +103,23 @@ backupLegacyPihole(){ fi } -welcomeDialogs(){ +welcomeDialogs() { # Display the welcome dialog whiptail --msgbox --backtitle "Welcome" --title "Pi-hole automated installer" "This installer will transform your Raspberry Pi into a network-wide ad blocker!" $r $c - + # Support for a part-time dev whiptail --msgbox --backtitle "Plea" --title "Free and open source" "The Pi-hole is free, but powered by your donations: http://pi-hole.net/donate" $r $c - + # Explain the need for a static address whiptail --msgbox --backtitle "Initating network interface" --title "Static IP Needed" "The Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly. 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 +chooseInterface() { + # Turn the available interfaces into an array so it can be used with a whiptail dialog interfacesArray=() firstloop=1 - + while read -r line do mode="OFF" @@ -130,12 +129,12 @@ chooseInterface(){ fi interfacesArray+=("$line" "available" "$mode") done <<< "$availableInterfaces" - + # Find out how many interfaces are available to choose from interfaceCount=$(echo "$availableInterfaces" | wc -l) chooseInterfaceCmd=(whiptail --separate-output --radiolist "Choose An Interface" $r $c $interfaceCount) chooseInterfaceOptions=$("${chooseInterfaceCmd[@]}" "${interfacesArray[@]}" 2>&1 >/dev/tty) - + for desiredInterface in $chooseInterfaceOptions do piholeInterface=$desiredInterface @@ -145,7 +144,7 @@ chooseInterface(){ } -use4andor6(){ +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 @@ -183,14 +182,15 @@ use4andor6(){ fi } -useIPv6dialog(){ +useIPv6dialog() { + # Show the IPv6 address used for blocking piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }') whiptail --msgbox --backtitle "IPv6..." --title "IPv6 Supported" "$piholeIPv6 will be used to block ads." $r $c - + $SUDO touch /etc/pihole/.useIPv6 } -getStaticIPv4Settings(){ +getStaticIPv4Settings() { # Ask if the user wants 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 @@ -245,15 +245,16 @@ getStaticIPv4Settings(){ fi } -setDHCPCD(){ - #Append these lines to dhcpcd.conf to enable a static IP +setDHCPCD() { + # Append these lines to dhcpcd.conf to enable a static IP echo "interface $piholeInterface static ip_address=$IPv4addr static routers=$IPv4gw static domain_name_servers=$IPv4gw" | $SUDO tee -a $dhcpcdFile >/dev/null } -setStaticIPv4(){ +setStaticIPv4() { + # Tries to set the IPv4 address if grep -q $IPv4addr $dhcpcdFile; then # address already set, noop : @@ -266,129 +267,127 @@ setStaticIPv4(){ fi } -installScripts(){ +installScripts() { + # Install the scripts from /etc/.pihole to their various locations $SUDO echo ":::" $SUDO echo -n "::: Installing scripts..." - $SUDO cp /etc/.pihole/gravity.sh /usr/local/bin/gravity.sh + $SUDO cp /etc/.pihole/gravity.sh /usr/local/bin/gravity.sh $SUDO cp /etc/.pihole/advanced/Scripts/chronometer.sh /usr/local/bin/chronometer.sh - $SUDO cp /etc/.pihole/advanced/Scripts/whitelist.sh /usr/local/bin/whitelist.sh - $SUDO cp /etc/.pihole/advanced/Scripts/blacklist.sh /usr/local/bin/blacklist.sh - $SUDO cp /etc/.pihole/advanced/Scripts/piholeLogFlush.sh /usr/local/bin/piholeLogFlush.sh - $SUDO cp /etc/.pihole/advanced/Scripts/updateDashboard.sh /usr/local/bin/updateDashboard.sh - $SUDO chmod 755 /usr/local/bin/{gravity,chronometer,whitelist,blacklist,piholeLogFlush,updateDashboard}.sh + $SUDO cp /etc/.pihole/advanced/Scripts/whitelist.sh /usr/local/bin/whitelist.sh + $SUDO cp /etc/.pihole/advanced/Scripts/blacklist.sh /usr/local/bin/blacklist.sh + $SUDO cp /etc/.pihole/advanced/Scripts/piholeLogFlush.sh /usr/local/bin/piholeLogFlush.sh + $SUDO cp /etc/.pihole/advanced/Scripts/updateDashboard.sh /usr/local/bin/updateDashboard.sh + $SUDO chmod 755 /usr/local/bin/{gravity,chronometer,whitelist,blacklist,piholeLogFlush,updateDashboard}.sh $SUDO echo " done." } -installConfigs(){ +installConfigs() { + # Install the configs from /etc/.pihole to their various locations $SUDO echo ":::" $SUDO echo -n "::: Installing configs..." $SUDO mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig $SUDO mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig +<<<<<<< HEAD $SUDO cp /etc/.pihole/advanced/dnsmasq.conf /etc/dnsmasq.conf +======= + $SUDO cp /etc/.pihole/advanced/dnsmasq.conf /etc/dnsmasq.conf +>>>>>>> CBH/Bugfix/Formatting $SUDO cp /etc/.pihole/advanced/lighttpd.conf /etc/lighttpd/lighttpd.conf $SUDO sed -i "s/@INT@/$piholeInterface/" /etc/dnsmasq.conf $SUDO echo " done." } -stopServices(){ +stopServices() { + # Stop dnsmasq and lighttpd $SUDO echo ":::" $SUDO echo -n "::: Stopping services..." - $SUDO service dnsmasq stop & spinner $! || true - $SUDO service lighttpd stop & spinner $! || true + $SUDO service dnsmasq stop & spinner $! || true + $SUDO service lighttpd stop & spinner $! || true $SUDO echo " done." } -checkForDependencies(){ - - #Running apt-get update/upgrade with minimal output can cause some issues with - #requiring user input (e.g password for phpmyadmin see #218) - #We'll change the logic up here, to check to see if there are any updates availible and - # if so, advise the user to run apt-get update/upgrade at their own discretion - - - #Check to see if apt-get update has already been run today - # it needs to have been run at least once on new installs! - - timestamp=$(stat -c %Y /var/cache/apt/) - timestampAsDate=$(date -d @$timestamp "+%b %e") - today=$(date "+%b %e") - - if [ ! "$today" == "$timestampAsDate" ]; then +checkForDependencies() { + #Running apt-get update/upgrade with minimal output can cause some issues with + #requiring user input (e.g password for phpmyadmin see #218) + #We'll change the logic up here, to check to see if there are any updates availible and + # if so, advise the user to run apt-get update/upgrade at their own discretion + + #Check to see if apt-get update has already been run today + # it needs to have been run at least once on new installs! + + timestamp=$(stat -c %Y /var/cache/apt/) + timestampAsDate=$(date -d @$timestamp "+%b %e") + today=$(date "+%b %e") + + if [ ! "$today" == "$timestampAsDate" ]; then #update package lists echo ":::" echo -n "::: apt-get update has not been run today. Running now..." $SUDO apt-get -qq update & spinner $! echo " done!" - fi - - echo ":::" - echo -n "::: Checking apt-get for upgraded packages...." - updatesToInstall=$(sudo apt-get -s -o Debug::NoLocking=true upgrade | grep -c ^Inst) - echo " done!" - + fi + echo ":::" + echo -n "::: Checking apt-get for upgraded packages...." + updatesToInstall=$(sudo apt-get -s -o Debug::NoLocking=true upgrade | grep -c ^Inst) + echo " done!" echo ":::" if [[ $updatesToInstall -eq "0" ]]; then echo "::: Your pi is up to date! Continuing with pi-hole installation..." - else + else echo "::: There are $updatesToInstall updates availible for your pi!" - echo "::: We recommend you run 'sudo apt-get upgrade' after installing Pi-Hole! " + echo "::: We recommend you run 'sudo apt-get upgrade' after installing Pi-Hole! " echo ":::" - fi - - echo ":::" + fi + echo ":::" echo "::: Checking dependencies:" - dependencies=( dnsutils bc toilet figlet dnsmasq lighttpd php5-common php5-cgi php5 git curl unzip wget ) - for i in "${dependencies[@]}" - do - : - echo -n "::: Checking for $i..." - if [ $(dpkg-query -W -f='${Status}' $i 2>/dev/null | grep -c "ok installed") -eq 0 ]; then - echo -n " Not found! Installing...." - $SUDO apt-get -y -qq install $i > /dev/null & spinner $! - echo " done!" - else - echo " already installed!" - fi - done + dependencies=( dnsutils bc toilet figlet dnsmasq lighttpd php5-common php5-cgi php5 git curl unzip wget ) + for i in "${dependencies[@]}" + do + : + echo -n "::: Checking for $i..." + if [ $(dpkg-query -W -f='${Status}' $i 2>/dev/null | grep -c "ok installed") -eq 0 ]; then + echo -n " Not found! Installing...." + $SUDO apt-get -y -qq install $i > /dev/null & spinner $! + echo " done!" + else + echo " already installed!" + fi + done } -getGitFiles(){ - - echo ":::" +getGitFiles() { + # Setup git repos for base files and web admin + echo ":::" echo "::: Checking for existing base files..." - if is_repo $piholeFilesDir; then - make_repo $piholeFilesDir $piholeGitUrl - else - update_repo $piholeFilesDir - fi - - echo ":::" - echo "::: Checking for existing web interface..." - if is_repo $webInterfaceDir; then - make_repo $webInterfaceDir $webInterfaceGitUrl - else - update_repo $webInterfaceDir - - fi + if is_repo $piholeFilesDir; then + make_repo $piholeFilesDir $piholeGitUrl + else + update_repo $piholeFilesDir + fi + echo ":::" + echo "::: Checking for existing web interface..." + if is_repo $webInterfaceDir; then + make_repo $webInterfaceDir $webInterfaceGitUrl + else + update_repo $webInterfaceDir + fi } is_repo() { - echo -n "::: Checking $1 is a repo..." - # if the directory does not have a .git folder - # it is not a repo + # If the directory does not have a .git folder it is not a repo + echo -n "::: Checking $1 is a repo..." if [ -d "$1/.git" ]; then echo " OK!" return 1 fi echo " not found!!" return 0 - } make_repo() { - # remove the non-repod interface and clone the interface + # Remove the non-repod interface and clone the interface echo -n "::: Cloning $2 into $1..." $SUDO rm -rf $1 $SUDO git clone -q "$2" "$1" > /dev/null & spinner $! @@ -396,7 +395,7 @@ make_repo() { } update_repo() { - # pull the latest commits + # Pull the latest commits echo -n "::: Updating repo in $1..." cd "$1" $SUDO git pull -q > /dev/null & spinner $! @@ -404,7 +403,8 @@ update_repo() { } -CreateLogFile(){ +CreateLogFile() { + # Create logfiles if necessary echo ":::" $SUDO echo -n "::: Creating log file and changing owner to dnsmasq..." if [ ! -f /var/log/pihole.log ]; then @@ -415,10 +415,10 @@ CreateLogFile(){ else $SUDO echo " already exists!" fi - } -installPiholeWeb(){ +installPiholeWeb() { + # Install the web interface $SUDO echo ":::" $SUDO echo -n "::: Installing pihole custom index page..." if [ -d "/var/www/html/pihole" ]; then @@ -429,17 +429,18 @@ installPiholeWeb(){ $SUDO cp /etc/.pihole/advanced/index.html /var/www/html/pihole/index.html $SUDO echo " done!" fi - } -installCron(){ +installCron() { + # Install the cron job $SUDO echo ":::" $SUDO echo -n "::: Installing latest Cron script..." $SUDO cp /etc/.pihole/advanced/pihole.cron /etc/cron.d/pihole $SUDO echo " done!" } -runGravity(){ +runGravity() { + # Rub gravity.sh to build blacklists $SUDO echo ":::" $SUDO echo "::: Preparing to run gravity.sh to refresh hosts..." if ls /etc/pihole/list* 1> /dev/null 2>&1; then @@ -449,13 +450,13 @@ runGravity(){ #Don't run as SUDO, this was causing issues echo "::: Running gravity.sh" echo ":::" - + /usr/local/bin/gravity.sh - } -installPihole(){ +installPihole() { + # Install base files and web interface checkForDependencies # done stopServices $SUDO mkdir -p /etc/pihole/ @@ -463,8 +464,8 @@ installPihole(){ $SUDO chmod 775 /var/www/html $SUDO usermod -a -G www-data pi $SUDO lighty-enable-mod fastcgi fastcgi-php > /dev/null - - getGitFiles + + getGitFiles installScripts installConfigs #installWebAdmin @@ -474,8 +475,9 @@ installPihole(){ runGravity } -displayFinalMessage(){ -whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using: +displayFinalMessage() { + # Final completion message to user + whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using: $IPv4addr $piholeIPv6 @@ -504,5 +506,7 @@ installPihole | tee $tmpLog $SUDO mv $tmpLog $instalLogLoc displayFinalMessage + +# Start services $SUDO service dnsmasq start $SUDO service lighttpd start