mirror of
https://github.com/pi-hole/pi-hole
synced 2025-01-25 15:30:56 +00:00
Merge remote-tracking branch 'refs/remotes/pi-hole/development' into development
This commit is contained in:
commit
b50584119b
38
.gitattributes
vendored
Normal file
38
.gitattributes
vendored
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# FROM https://github.com/libgit2/libgit2sharp
|
||||||
|
# Text files that should be normalized to LF in odb.
|
||||||
|
*.cs text diff=csharp
|
||||||
|
*.config text
|
||||||
|
|
||||||
|
*.sln text
|
||||||
|
*.csproj text
|
||||||
|
|
||||||
|
*.md text
|
||||||
|
*.sh text
|
||||||
|
*.ps1 text
|
||||||
|
*.cmd text
|
||||||
|
*.bat text
|
||||||
|
*.markdown text
|
||||||
|
*.msbuild text
|
||||||
|
|
||||||
|
Lib/* binary
|
||||||
|
GitHub.Tests.Integration/Resources/* binary
|
||||||
|
|
||||||
|
|
||||||
|
# Binary files that should not be normalized or diffed
|
||||||
|
*.png binary
|
||||||
|
*.jpg binary
|
||||||
|
*.gif binary
|
||||||
|
|
||||||
|
*.pfx binary
|
||||||
|
*.snk binary
|
||||||
|
*.dll binary
|
||||||
|
*.exe binary
|
||||||
|
*.lib binary
|
||||||
|
*.exp binary
|
||||||
|
*.pdb binary
|
||||||
|
*.sdf binary
|
||||||
|
*.7z binary
|
||||||
|
|
||||||
|
|
||||||
|
# Catch all for anything we forgot. Add rules if you get CRLF -> LF warnings.
|
||||||
|
* text=auto
|
@ -9,53 +9,37 @@
|
|||||||
# the Free Software Foundation, either version 2 of the License, or
|
# the Free Software Foundation, either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
|
|
||||||
# If you want dnsmasq to read another file, as well as /etc/hosts, use
|
###############################################################################
|
||||||
# this.
|
# FILE AUTOMATICALLY POPULATED BY PI-HOLE INSTALL/UPDATE PROCEDURE. #
|
||||||
|
# ANY CHANGES MADE TO THIS FILE AFTER INSTALL WILL BE LOST ON THE NEXT UPDATE #
|
||||||
|
# #
|
||||||
|
# IF YOU WISH TO CHANGE THE UPSTREAM SERVERS, CHANGE THEM IN: #
|
||||||
|
# /etc/pihole/setupVars.conf #
|
||||||
|
# #
|
||||||
|
# ANY OTHER CHANGES SHOULD BE MADE IN A SEPERATE CONFIG FILE #
|
||||||
|
# OR IN /etc/dnsmasq.conf #
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
addn-hosts=/etc/pihole/gravity.list
|
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
|
domain-needed
|
||||||
# Never forward addresses in the non-routed address spaces.
|
|
||||||
bogus-priv
|
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
|
no-resolv
|
||||||
|
|
||||||
# Add other name servers here, with domain specs if they are for
|
|
||||||
# non-public domains.
|
|
||||||
server=@DNS1@
|
server=@DNS1@
|
||||||
server=@DNS2@
|
server=@DNS2@
|
||||||
|
|
||||||
# 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=@INT@
|
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
|
listen-address=127.0.0.1
|
||||||
|
|
||||||
# Set the cachesize here.
|
|
||||||
cache-size=10000
|
cache-size=10000
|
||||||
|
|
||||||
# For debugging purposes, log each DNS query as it passes through
|
|
||||||
# dnsmasq.
|
|
||||||
log-queries
|
log-queries
|
||||||
log-facility=/var/log/pihole.log
|
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
|
local-ttl=300
|
||||||
|
|
||||||
# This allows it to continue functioning without being blocked by syslog, and allows syslog to use dnsmasq for DNS queries without risking deadlock
|
|
||||||
log-async
|
log-async
|
||||||
|
@ -10,22 +10,7 @@
|
|||||||
# the Free Software Foundation, either version 2 of the License, or
|
# the Free Software Foundation, either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
|
|
||||||
#rootcheck
|
helpFunc()
|
||||||
if [[ $EUID -eq 0 ]];then
|
|
||||||
echo "::: You are root."
|
|
||||||
else
|
|
||||||
echo "::: sudo will be used."
|
|
||||||
# Check if it is actually installed
|
|
||||||
# If it isn't, exit because the install cannot complete
|
|
||||||
if [ -x "$(command -v sudo)" ];then
|
|
||||||
export SUDO="sudo"
|
|
||||||
else
|
|
||||||
echo "::: Please install sudo or run this script as root."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
function helpFunc()
|
|
||||||
{
|
{
|
||||||
echo "::: Immediately blacklists one or more domains in the hosts file"
|
echo "::: Immediately blacklists one or more domains in the hosts file"
|
||||||
echo ":::"
|
echo ":::"
|
||||||
@ -86,7 +71,7 @@ if [[ -f ${piholeIPv6file} ]];then
|
|||||||
piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }')
|
piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }')
|
||||||
fi
|
fi
|
||||||
|
|
||||||
function HandleOther(){
|
HandleOther(){
|
||||||
#check validity of domain
|
#check validity of domain
|
||||||
validDomain=$(echo "$1" | perl -ne'print if /\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b/')
|
validDomain=$(echo "$1" | perl -ne'print if /\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b/')
|
||||||
if [ -z "$validDomain" ]; then
|
if [ -z "$validDomain" ]; then
|
||||||
@ -96,7 +81,7 @@ function HandleOther(){
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function PopBlacklistFile(){
|
PopBlacklistFile(){
|
||||||
#check blacklist file exists, and if not, create it
|
#check blacklist file exists, and if not, create it
|
||||||
if [[ ! -f ${blacklist} ]];then
|
if [[ ! -f ${blacklist} ]];then
|
||||||
touch ${blacklist}
|
touch ${blacklist}
|
||||||
@ -110,7 +95,7 @@ function PopBlacklistFile(){
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
function AddDomain(){
|
AddDomain(){
|
||||||
#| sed 's/\./\\./g'
|
#| sed 's/\./\\./g'
|
||||||
bool=false
|
bool=false
|
||||||
grep -Ex -q "$1" ${blacklist} || bool=true
|
grep -Ex -q "$1" ${blacklist} || bool=true
|
||||||
@ -129,7 +114,7 @@ function AddDomain(){
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function RemoveDomain(){
|
RemoveDomain(){
|
||||||
|
|
||||||
bool=false
|
bool=false
|
||||||
grep -Ex -q "$1" ${blacklist} || bool=true
|
grep -Ex -q "$1" ${blacklist} || bool=true
|
||||||
@ -148,7 +133,7 @@ function RemoveDomain(){
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function ModifyHostFile(){
|
ModifyHostFile(){
|
||||||
if ${addmode}; then
|
if ${addmode}; then
|
||||||
#add domains to the hosts file
|
#add domains to the hosts file
|
||||||
if [[ -r ${blacklist} ]];then
|
if [[ -r ${blacklist} ]];then
|
||||||
@ -178,7 +163,7 @@ function ModifyHostFile(){
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function Reload() {
|
Reload() {
|
||||||
# Reload hosts file
|
# Reload hosts file
|
||||||
echo ":::"
|
echo ":::"
|
||||||
echo -n "::: Refresh lists in dnsmasq..."
|
echo -n "::: Refresh lists in dnsmasq..."
|
||||||
@ -187,15 +172,23 @@ function Reload() {
|
|||||||
|
|
||||||
if [[ ${dnsmasqPid} ]]; then
|
if [[ ${dnsmasqPid} ]]; then
|
||||||
# service already running - reload config
|
# service already running - reload config
|
||||||
${SUDO} killall -s HUP dnsmasq
|
if [ -x "$(command -v systemctl)" ]; then
|
||||||
|
systemctl restart dnsmasq
|
||||||
|
else
|
||||||
|
service dnsmasq restart
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
# service not running, start it up
|
# service not running, start it up
|
||||||
${SUDO} service dnsmasq start
|
if [ -x "$(command -v systemctl)" ]; then
|
||||||
|
systemctl start dnsmasq
|
||||||
|
else
|
||||||
|
service dnsmasq start
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
echo " done!"
|
echo " done!"
|
||||||
}
|
}
|
||||||
|
|
||||||
function DisplayBlist() {
|
DisplayBlist() {
|
||||||
verbose=false
|
verbose=false
|
||||||
echo -e " Displaying Gravity Affected Domains \n"
|
echo -e " Displaying Gravity Affected Domains \n"
|
||||||
count=1
|
count=1
|
||||||
|
@ -17,7 +17,7 @@ gravity="/etc/pihole/gravity.list"
|
|||||||
|
|
||||||
today=$(date "+%b %e")
|
today=$(date "+%b %e")
|
||||||
|
|
||||||
function CalcBlockedDomains(){
|
CalcBlockedDomains(){
|
||||||
CheckIPv6
|
CheckIPv6
|
||||||
if [ -e "$gravity" ]; then
|
if [ -e "$gravity" ]; then
|
||||||
#Are we IPV6 or IPV4?
|
#Are we IPV6 or IPV4?
|
||||||
@ -33,7 +33,7 @@ function CalcBlockedDomains(){
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function CalcQueriesToday(){
|
CalcQueriesToday(){
|
||||||
if [ -e "$piLog" ];then
|
if [ -e "$piLog" ];then
|
||||||
queriesToday=$(cat "$piLog" | grep "$today" | awk '/query/ {print $6}' | wc -l)
|
queriesToday=$(cat "$piLog" | grep "$today" | awk '/query/ {print $6}' | wc -l)
|
||||||
else
|
else
|
||||||
@ -41,7 +41,7 @@ function CalcQueriesToday(){
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function CalcblockedToday(){
|
CalcblockedToday(){
|
||||||
if [ -e "$piLog" ] && [ -e "$gravity" ];then
|
if [ -e "$piLog" ] && [ -e "$gravity" ];then
|
||||||
blockedToday=$(cat ${piLog} | awk '/\/etc\/pihole\/gravity.list/ && !/address/ {print $6}' | wc -l)
|
blockedToday=$(cat ${piLog} | awk '/\/etc\/pihole\/gravity.list/ && !/address/ {print $6}' | wc -l)
|
||||||
else
|
else
|
||||||
@ -49,7 +49,7 @@ function CalcblockedToday(){
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function CalcPercentBlockedToday(){
|
CalcPercentBlockedToday(){
|
||||||
if [ "$queriesToday" != "Err." ] && [ "$blockedToday" != "Err." ]; then
|
if [ "$queriesToday" != "Err." ] && [ "$blockedToday" != "Err." ]; then
|
||||||
if [ "$queriesToday" != 0 ]; then #Fixes divide by zero error :)
|
if [ "$queriesToday" != 0 ]; then #Fixes divide by zero error :)
|
||||||
#scale 2 rounds the number down, so we'll do scale 4 and then trim the last 2 zeros
|
#scale 2 rounds the number down, so we'll do scale 4 and then trim the last 2 zeros
|
||||||
@ -61,7 +61,7 @@ function CalcPercentBlockedToday(){
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function CheckIPv6(){
|
CheckIPv6(){
|
||||||
piholeIPv6file="/etc/pihole/.useIPv6"
|
piholeIPv6file="/etc/pihole/.useIPv6"
|
||||||
if [[ -f ${piholeIPv6file} ]];then
|
if [[ -f ${piholeIPv6file} ]];then
|
||||||
# If the file exists, then the user previously chose to use IPv6 in the automated installer
|
# If the file exists, then the user previously chose to use IPv6 in the automated installer
|
||||||
@ -69,7 +69,7 @@ function CheckIPv6(){
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function outputJSON(){
|
outputJSON(){
|
||||||
CalcQueriesToday
|
CalcQueriesToday
|
||||||
CalcblockedToday
|
CalcblockedToday
|
||||||
CalcPercentBlockedToday
|
CalcPercentBlockedToday
|
||||||
@ -79,7 +79,7 @@ function outputJSON(){
|
|||||||
printf '{"domains_being_blocked":"%s","dns_queries_today":"%s","ads_blocked_today":"%s","ads_percentage_today":"%s"}\n' "$blockedDomainsTotal" "$queriesToday" "$blockedToday" "$percentBlockedToday"
|
printf '{"domains_being_blocked":"%s","dns_queries_today":"%s","ads_blocked_today":"%s","ads_percentage_today":"%s"}\n' "$blockedDomainsTotal" "$queriesToday" "$blockedToday" "$percentBlockedToday"
|
||||||
}
|
}
|
||||||
|
|
||||||
function normalChrono(){
|
normalChrono(){
|
||||||
for (( ; ; ))
|
for (( ; ; ))
|
||||||
do
|
do
|
||||||
clear
|
clear
|
||||||
@ -121,7 +121,7 @@ function normalChrono(){
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
function displayHelp(){
|
displayHelp(){
|
||||||
echo "::: Displays stats about your piHole!"
|
echo "::: Displays stats about your piHole!"
|
||||||
echo ":::"
|
echo ":::"
|
||||||
echo "::: Usage: sudo pihole -c [optional:-j]"
|
echo "::: Usage: sudo pihole -c [optional:-j]"
|
||||||
|
@ -11,21 +11,6 @@
|
|||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
|
|
||||||
############ FUNCTIONS ###########
|
############ FUNCTIONS ###########
|
||||||
# Run this script as root or under sudo
|
|
||||||
echo ":::"
|
|
||||||
if [[ $EUID -eq 0 ]];then
|
|
||||||
echo "::: You are root."
|
|
||||||
else
|
|
||||||
echo "::: sudo will be used."
|
|
||||||
# Check if it is actually installed
|
|
||||||
# If it isn't, exit because the install cannot complete
|
|
||||||
if [ -x "$(command -v sudo)" ];then
|
|
||||||
export SUDO="sudo"
|
|
||||||
else
|
|
||||||
echo "::: Please install sudo or run this script as root."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Borrowed from adafruit-pitft-helper < borrowed from raspi-config
|
# Borrowed from adafruit-pitft-helper < borrowed from raspi-config
|
||||||
# https://github.com/adafruit/Adafruit-PiTFT-Helper/blob/master/adafruit-pitft-helper#L324-L334
|
# https://github.com/adafruit/Adafruit-PiTFT-Helper/blob/master/adafruit-pitft-helper#L324-L334
|
||||||
@ -45,11 +30,11 @@ getInitSys() {
|
|||||||
autoLoginPiToConsole() {
|
autoLoginPiToConsole() {
|
||||||
if [ -e /etc/init.d/lightdm ]; then
|
if [ -e /etc/init.d/lightdm ]; then
|
||||||
if [ ${SYSTEMD} -eq 1 ]; then
|
if [ ${SYSTEMD} -eq 1 ]; then
|
||||||
${SUDO} systemctl set-default multi-user.target
|
systemctl set-default multi-user.target
|
||||||
${SUDO} ln -fs /etc/systemd/system/autologin@.service /etc/systemd/system/getty.target.wants/getty@tty1.service
|
ln -fs /etc/systemd/system/autologin@.service /etc/systemd/system/getty.target.wants/getty@tty1.service
|
||||||
else
|
else
|
||||||
${SUDO} update-rc.d lightdm disable 2
|
update-rc.d lightdm disable 2
|
||||||
${SUDO} sed /etc/inittab -i -e "s/1:2345:respawn:\/sbin\/getty --noclear 38400 tty1/1:2345:respawn:\/bin\/login -f pi tty1 <\/dev\/tty1 >\/dev\/tty1 2>&1/"
|
sed /etc/inittab -i -e "s/1:2345:respawn:\/sbin\/getty --noclear 38400 tty1/1:2345:respawn:\/bin\/login -f pi tty1 <\/dev\/tty1 >\/dev\/tty1 2>&1/"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@ -66,23 +51,23 @@ echo /usr/local/bin/chronometer.sh >> /home/pi/.bashrc
|
|||||||
|
|
||||||
# Set up the LCD screen based on Adafruits instuctions:
|
# Set up the LCD screen based on Adafruits instuctions:
|
||||||
# https://learn.adafruit.com/adafruit-pitft-28-inch-resistive-touchscreen-display-raspberry-pi/easy-install
|
# https://learn.adafruit.com/adafruit-pitft-28-inch-resistive-touchscreen-display-raspberry-pi/easy-install
|
||||||
curl -SLs https://apt.adafruit.com/add-pin | ${SUDO} bash
|
curl -SLs https://apt.adafruit.com/add-pin | bash
|
||||||
${SUDO} apt-get -y install raspberrypi-bootloader
|
apt-get -y install raspberrypi-bootloader
|
||||||
${SUDO} apt-get -y install adafruit-pitft-helper
|
apt-get -y install adafruit-pitft-helper
|
||||||
${SUDO} adafruit-pitft-helper -t 28r
|
adafruit-pitft-helper -t 28r
|
||||||
|
|
||||||
# Download the cmdline.txt file that prevents the screen from going blank after a period of time
|
# Download the cmdline.txt file that prevents the screen from going blank after a period of time
|
||||||
${SUDO} mv /boot/cmdline.txt /boot/cmdline.orig
|
mv /boot/cmdline.txt /boot/cmdline.orig
|
||||||
${SUDO} curl -o /boot/cmdline.txt https://raw.githubusercontent.com/pi-hole/pi-hole/master/advanced/cmdline.txt
|
curl -o /boot/cmdline.txt https://raw.githubusercontent.com/pi-hole/pi-hole/master/advanced/cmdline.txt
|
||||||
|
|
||||||
# Back up the original file and download the new one
|
# Back up the original file and download the new one
|
||||||
${SUDO} mv /etc/default/console-setup /etc/default/console-setup.orig
|
mv /etc/default/console-setup /etc/default/console-setup.orig
|
||||||
${SUDO} curl -o /etc/default/console-setup https://raw.githubusercontent.com/pi-hole/pi-hole/master/advanced/console-setup
|
curl -o /etc/default/console-setup https://raw.githubusercontent.com/pi-hole/pi-hole/master/advanced/console-setup
|
||||||
|
|
||||||
# Instantly apply the font change to the LCD screen
|
# Instantly apply the font change to the LCD screen
|
||||||
${SUDO} setupcon
|
setupcon
|
||||||
|
|
||||||
${SUDO} reboot
|
reboot
|
||||||
|
|
||||||
# Start showing the stats on the screen by running the command on another tty:
|
# Start showing the stats on the screen by running the command on another tty:
|
||||||
# http://unix.stackexchange.com/questions/170063/start-a-process-on-a-different-tty
|
# http://unix.stackexchange.com/questions/170063/start-a-process-on-a-different-tty
|
||||||
|
145
advanced/Scripts/update.sh
Normal file
145
advanced/Scripts/update.sh
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Pi-hole: A black hole for Internet advertisements
|
||||||
|
# (c) 2015, 2016 by Jacob Salmela
|
||||||
|
# Network-wide ad blocking via your Raspberry Pi
|
||||||
|
# http://pi-hole.net
|
||||||
|
# Whitelists domains
|
||||||
|
#
|
||||||
|
# Pi-hole is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
|
||||||
|
# Variables
|
||||||
|
|
||||||
|
webInterfaceGitUrl="https://github.com/pi-hole/AdminLTE.git"
|
||||||
|
webInterfaceDir="/var/www/html/admin"
|
||||||
|
piholeGitUrl="https://github.com/pi-hole/pi-hole.git"
|
||||||
|
piholeFilesDir="/etc/.pihole"
|
||||||
|
|
||||||
|
spinner()
|
||||||
|
{
|
||||||
|
local pid=$1
|
||||||
|
local delay=0.50
|
||||||
|
local spinstr='/-\|'
|
||||||
|
while [ "$(ps a | awk '{print $1}' | grep "$pid")" ]; do
|
||||||
|
local temp=${spinstr#?}
|
||||||
|
printf " [%c] " "$spinstr"
|
||||||
|
local spinstr=${temp}${spinstr%"$temp"}
|
||||||
|
sleep ${delay}
|
||||||
|
printf "\b\b\b\b\b\b"
|
||||||
|
done
|
||||||
|
printf " \b\b\b\b"
|
||||||
|
}
|
||||||
|
|
||||||
|
getGitFiles() {
|
||||||
|
# Setup git repos for directory and repository passed
|
||||||
|
# as arguments 1 and 2
|
||||||
|
echo ":::"
|
||||||
|
echo "::: Checking for existing repository..."
|
||||||
|
if is_repo "${1}"; then
|
||||||
|
update_repo "${1}"
|
||||||
|
else
|
||||||
|
make_repo "${1}" "${2}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
is_repo() {
|
||||||
|
# Use git to check if directory is currently under VCS
|
||||||
|
echo -n "::: Checking $1 is a repo..."
|
||||||
|
cd "${1}" &> /dev/null || return 1
|
||||||
|
git status &> /dev/null && echo " OK!"; return 0 || echo " not found!"; return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
make_repo() {
|
||||||
|
# Remove the non-repod interface and clone the interface
|
||||||
|
echo -n "::: Cloning $2 into $1..."
|
||||||
|
rm -rf "${1}"
|
||||||
|
git clone -q --depth 1 "${2}" "${1}" > /dev/null & spinner $!
|
||||||
|
echo " done!"
|
||||||
|
}
|
||||||
|
|
||||||
|
update_repo() {
|
||||||
|
# Pull the latest commits
|
||||||
|
echo -n "::: Updating repo in $1..."
|
||||||
|
cd "${1}" || exit 1
|
||||||
|
git stash -q > /dev/null & spinner $!
|
||||||
|
git pull -q > /dev/null & spinner $!
|
||||||
|
echo " done!"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ ! -d "/etc/.pihole" ]; then #This is unlikely
|
||||||
|
echo "::: Critical Error: Pi-Hole repo missing from system!"
|
||||||
|
echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole"
|
||||||
|
exit 1;
|
||||||
|
fi
|
||||||
|
if [ ! -d "/var/www/html/admin" ]; then #This is unlikely
|
||||||
|
echo "::: Critical Error: Pi-Hole repo missing from system!"
|
||||||
|
echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole"
|
||||||
|
exit 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "::: Checking for updates..."
|
||||||
|
piholeVersion=$(pihole -v -p -c)
|
||||||
|
piholeVersionLatest=$(pihole -v -p -l)
|
||||||
|
|
||||||
|
webVersion=$(pihole -v -a -c)
|
||||||
|
webVersionLatest=$(pihole -v -a -l)
|
||||||
|
|
||||||
|
echo ":::"
|
||||||
|
echo "::: Pi-hole version is $piholeVersion (Latest version is $piholeVersionLatest)"
|
||||||
|
echo "::: Web Admin version is $webVersion (Latest version is $webVersionLatest)"
|
||||||
|
echo ":::"
|
||||||
|
|
||||||
|
# Logic
|
||||||
|
# If latest versions are blank - we've probably hit Github rate limit (stop running `pihole -up so often!):
|
||||||
|
# Update anyway
|
||||||
|
# If Core up to date AND web up to date:
|
||||||
|
# Do nothing
|
||||||
|
# If Core up to date AND web NOT up to date:
|
||||||
|
# Pull web repo
|
||||||
|
# If Core NOT up to date AND web up to date:
|
||||||
|
# pull pihole repo, run install --unattended -- reconfigure
|
||||||
|
# if Core NOT up to date AND web NOT up to date:
|
||||||
|
# pull pihole repo run install --unattended
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if [[ ${piholeVersion} == ${piholeVersionLatest} && ${webVersion} == ${webVersionLatest} ]]; then
|
||||||
|
echo "::: Everything is up to date!"
|
||||||
|
echo ""
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
elif [[ ${piholeVersion} == ${piholeVersionLatest} && ${webVersion} != ${webVersionLatest} ]]; then
|
||||||
|
echo "::: Pi-hole Web Admin files out of date"
|
||||||
|
getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl}
|
||||||
|
echo ":::"
|
||||||
|
webVersion=$(pihole -v -a -c)
|
||||||
|
echo "::: Web Admin version is now at ${webVersion}"
|
||||||
|
echo "::: If you had made any changes in '/var/www/html/admin', they have been stashed using 'git stash'"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
elif [[ ${piholeVersion} != ${piholeVersionLatest} && ${webVersion} == ${webVersionLatest} ]]; then
|
||||||
|
echo "::: Pi-hole core files out of date"
|
||||||
|
getGitFiles ${piholeFilesDir} ${piholeGitUrl}
|
||||||
|
/etc/.pihole/automated\ install/basic-install.sh --reconfigure --unattended
|
||||||
|
echo ":::"
|
||||||
|
piholeVersion=$(pihole -v -p -c)
|
||||||
|
echo "::: Pi-hole version is now at ${piholeVersion}"
|
||||||
|
echo "::: If you had made any changes in '/etc/.pihole', they have been stashed using 'git stash'"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
elif [[ ${piholeVersion} != ${piholeVersionLatest} && ${webVersion} != ${webVersionLatest} ]]; then
|
||||||
|
echo "::: Updating Everything"
|
||||||
|
getGitFiles ${piholeFilesDir} ${piholeGitUrl}
|
||||||
|
/etc/.pihole/automated\ install/basic-install.sh --unattended
|
||||||
|
webVersion=$(pihole -v -a -c)
|
||||||
|
piholeVersion=$(pihole -v -p -c)
|
||||||
|
echo ":::"
|
||||||
|
echo "::: Pi-hole version is now at ${piholeVersion}"
|
||||||
|
echo "::: If you had made any changes in '/etc/.pihole', they have been stashed using 'git stash'"
|
||||||
|
echo ":::"
|
||||||
|
echo "::: Pi-hole version is now at ${piholeVersion}"
|
||||||
|
echo "::: If you had made any changes in '/etc/.pihole', they have been stashed using 'git stash'"
|
||||||
|
echo ""
|
||||||
|
fi
|
@ -3,13 +3,18 @@
|
|||||||
# (c) 2015, 2016 by Jacob Salmela
|
# (c) 2015, 2016 by Jacob Salmela
|
||||||
# Network-wide ad blocking via your Raspberry Pi
|
# Network-wide ad blocking via your Raspberry Pi
|
||||||
# http://pi-hole.net
|
# http://pi-hole.net
|
||||||
# Whitelists domains
|
# shows version numbers
|
||||||
#
|
#
|
||||||
# Pi-hole is free software: you can redistribute it and/or modify
|
# Pi-hole is free software: you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation, either version 2 of the License, or
|
# the Free Software Foundation, either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
|
|
||||||
|
# Flags:
|
||||||
|
latest=false
|
||||||
|
current=false
|
||||||
|
|
||||||
|
normalOutput(){
|
||||||
piholeVersion=$(cd /etc/.pihole/ && git describe --tags --abbrev=0)
|
piholeVersion=$(cd /etc/.pihole/ && git describe --tags --abbrev=0)
|
||||||
webVersion=$(cd /var/www/html/admin/ && git describe --tags --abbrev=0)
|
webVersion=$(cd /var/www/html/admin/ && git describe --tags --abbrev=0)
|
||||||
|
|
||||||
@ -18,3 +23,80 @@ webVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/AdminLTE/release
|
|||||||
|
|
||||||
echo "::: Pi-hole version is $piholeVersion (Latest version is $piholeVersionLatest)"
|
echo "::: Pi-hole version is $piholeVersion (Latest version is $piholeVersionLatest)"
|
||||||
echo "::: Web-Admin version is $webVersion (Latest version is $webVersionLatest)"
|
echo "::: Web-Admin version is $webVersion (Latest version is $webVersionLatest)"
|
||||||
|
}
|
||||||
|
|
||||||
|
webOutput(){
|
||||||
|
for var in "$@"
|
||||||
|
do
|
||||||
|
case "$var" in
|
||||||
|
"-l" | "--latest" ) latest=true;;
|
||||||
|
"-c" | "--current" ) current=true;;
|
||||||
|
* ) echo "::: Invalid Option!"; exit 1;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ "${latest}" == true && "${current}" == false ]]; then
|
||||||
|
webVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/AdminLTE/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//')
|
||||||
|
echo ${webVersionLatest}
|
||||||
|
elif [[ "${latest}" == false && "${current}" == true ]]; then
|
||||||
|
webVersion=$(cd /var/www/html/admin/ && git describe --tags --abbrev=0)
|
||||||
|
echo ${webVersion}
|
||||||
|
else
|
||||||
|
webVersion=$(cd /var/www/html/admin/ && git describe --tags --abbrev=0)
|
||||||
|
webVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/AdminLTE/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//')
|
||||||
|
echo "::: Web-Admin version is $webVersion (Latest version is $webVersionLatest)"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
coreOutput(){
|
||||||
|
for var in "$@"
|
||||||
|
do
|
||||||
|
case "$var" in
|
||||||
|
"-l" | "--latest" ) latest=true;;
|
||||||
|
"-c" | "--current" ) current=true;;
|
||||||
|
* ) echo "::: Invalid Option!"; exit 1;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ "${latest}" == true && "${current}" == false ]]; then
|
||||||
|
piholeVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/pi-hole/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//')
|
||||||
|
echo ${piholeVersionLatest}
|
||||||
|
elif [[ "${latest}" == false && "${current}" == true ]]; then
|
||||||
|
piholeVersion=$(cd /etc/.pihole/ && git describe --tags --abbrev=0)
|
||||||
|
echo ${piholeVersion}
|
||||||
|
else
|
||||||
|
piholeVersion=$(cd /etc/.pihole/ && git describe --tags --abbrev=0)
|
||||||
|
piholeVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/pi-hole/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//')
|
||||||
|
echo "::: Pi-hole version is $piholeVersion (Latest version is $piholeVersionLatest)"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
helpFunc()
|
||||||
|
{
|
||||||
|
echo ":::"
|
||||||
|
echo "::: Show Pi-hole/Web Admin versions"
|
||||||
|
echo ":::"
|
||||||
|
echo "::: Usage: pihole -v [ -a | -p ] [ -l | -c ]"
|
||||||
|
echo ":::"
|
||||||
|
echo "::: Options:"
|
||||||
|
echo "::: -a, --admin Show both current and latest versions of web admin"
|
||||||
|
echo "::: -p, --pihole Show both current and latest versions of Pi-hole core files"
|
||||||
|
echo "::: -l, --latest (Only after -a | -p) Return only latest version"
|
||||||
|
echo "::: -c, --current (Only after -a | -p) Return only current version"
|
||||||
|
echo "::: -h, --help Show this help dialog"
|
||||||
|
echo ":::"
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ $# = 0 ]]; then
|
||||||
|
normalOutput
|
||||||
|
fi
|
||||||
|
|
||||||
|
for var in "$@"
|
||||||
|
do
|
||||||
|
case "$var" in
|
||||||
|
"-a" | "--admin" ) shift; webOutput "$@";;
|
||||||
|
"-p" | "--pihole" ) shift; coreOutput "$@" ;;
|
||||||
|
"-h" | "--help" ) helpFunc;;
|
||||||
|
esac
|
||||||
|
done
|
@ -10,22 +10,8 @@
|
|||||||
# the Free Software Foundation, either version 2 of the License, or
|
# the Free Software Foundation, either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
|
|
||||||
#rootcheck
|
|
||||||
if [[ $EUID -eq 0 ]];then
|
|
||||||
echo "::: You are root."
|
|
||||||
else
|
|
||||||
echo "::: sudo will be used."
|
|
||||||
# Check if it is actually installed
|
|
||||||
# If it isn't, exit because the install cannot complete
|
|
||||||
if [ -x "$(command -v sudo)" ];then
|
|
||||||
export SUDO="sudo"
|
|
||||||
else
|
|
||||||
echo "::: Please install sudo or run this script as root."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
function helpFunc()
|
helpFunc()
|
||||||
{
|
{
|
||||||
echo "::: Immediately whitelists one or more domains in the hosts file"
|
echo "::: Immediately whitelists one or more domains in the hosts file"
|
||||||
echo ":::"
|
echo ":::"
|
||||||
@ -85,7 +71,7 @@ if [[ -f ${piholeIPv6file} ]];then
|
|||||||
piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }')
|
piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }')
|
||||||
fi
|
fi
|
||||||
|
|
||||||
function HandleOther(){
|
HandleOther(){
|
||||||
#check validity of domain
|
#check validity of domain
|
||||||
validDomain=$(echo "$1" | perl -ne'print if /\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b/')
|
validDomain=$(echo "$1" | perl -ne'print if /\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b/')
|
||||||
if [ -z "$validDomain" ]; then
|
if [ -z "$validDomain" ]; then
|
||||||
@ -95,7 +81,7 @@ function HandleOther(){
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function PopWhitelistFile(){
|
PopWhitelistFile(){
|
||||||
#check whitelist file exists, and if not, create it
|
#check whitelist file exists, and if not, create it
|
||||||
if [[ ! -f ${whitelist} ]];then
|
if [[ ! -f ${whitelist} ]];then
|
||||||
touch ${whitelist}
|
touch ${whitelist}
|
||||||
@ -110,7 +96,7 @@ function PopWhitelistFile(){
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
function AddDomain(){
|
AddDomain(){
|
||||||
#| sed 's/\./\\./g'
|
#| sed 's/\./\\./g'
|
||||||
bool=false
|
bool=false
|
||||||
|
|
||||||
@ -132,7 +118,7 @@ function AddDomain(){
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function RemoveDomain(){
|
RemoveDomain(){
|
||||||
|
|
||||||
bool=false
|
bool=false
|
||||||
grep -Ex -q "$1" ${whitelist} || bool=true
|
grep -Ex -q "$1" ${whitelist} || bool=true
|
||||||
@ -151,7 +137,7 @@ function RemoveDomain(){
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function ModifyHostFile(){
|
ModifyHostFile(){
|
||||||
if ${addmode}; then
|
if ${addmode}; then
|
||||||
#remove domains in from hosts file
|
#remove domains in from hosts file
|
||||||
if [[ -r ${whitelist} ]];then
|
if [[ -r ${whitelist} ]];then
|
||||||
@ -195,7 +181,7 @@ function ModifyHostFile(){
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function Reload() {
|
Reload() {
|
||||||
# Reload hosts file
|
# Reload hosts file
|
||||||
echo ":::"
|
echo ":::"
|
||||||
echo -n "::: Refresh lists in dnsmasq..."
|
echo -n "::: Refresh lists in dnsmasq..."
|
||||||
@ -203,15 +189,23 @@ function Reload() {
|
|||||||
|
|
||||||
if [[ ${dnsmasqPid} ]]; then
|
if [[ ${dnsmasqPid} ]]; then
|
||||||
# service already running - reload config
|
# service already running - reload config
|
||||||
${SUDO} killall -s HUP dnsmasq
|
if [ -x "$(command -v systemctl)" ]; then
|
||||||
|
systemctl restart dnsmasq
|
||||||
|
else
|
||||||
|
service dnsmasq restart
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
# service not running, start it up
|
# service not running, start it up
|
||||||
${SUDO} service dnsmasq start
|
if [ -x "$(command -v systemctl)" ]; then
|
||||||
|
systemctl start dnsmasq
|
||||||
|
else
|
||||||
|
service dnsmasq start
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
echo " done!"
|
echo " done!"
|
||||||
}
|
}
|
||||||
|
|
||||||
function DisplayWlist() {
|
DisplayWlist() {
|
||||||
verbose=false
|
verbose=false
|
||||||
echo -e " Displaying Gravity Resistant Domains \n"
|
echo -e " Displaying Gravity Resistant Domains \n"
|
||||||
count=1
|
count=1
|
||||||
|
@ -4,7 +4,7 @@ _pihole()
|
|||||||
COMPREPLY=()
|
COMPREPLY=()
|
||||||
cur="${COMP_WORDS[COMP_CWORD]}"
|
cur="${COMP_WORDS[COMP_CWORD]}"
|
||||||
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||||
opts="blacklist chronometer debug flush help query setupLCD uninstall updateDashboard updateGravity updatePihole version whitelist"
|
opts="blacklist chronometer debug flush help query reconfigure setupLCD uninstall updateGravity updatePihole version whitelist"
|
||||||
|
|
||||||
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
||||||
return 0
|
return 0
|
||||||
|
@ -16,10 +16,8 @@
|
|||||||
#
|
#
|
||||||
# curl -L install.pi-hole.net | bash
|
# curl -L install.pi-hole.net | bash
|
||||||
|
|
||||||
|
set -e
|
||||||
######## VARIABLES #########
|
######## VARIABLES #########
|
||||||
|
|
||||||
|
|
||||||
tmpLog=/tmp/pihole-install.log
|
tmpLog=/tmp/pihole-install.log
|
||||||
instalLogLoc=/etc/pihole/install.log
|
instalLogLoc=/etc/pihole/install.log
|
||||||
setupVars=/etc/pihole/setupVars.conf
|
setupVars=/etc/pihole/setupVars.conf
|
||||||
@ -31,6 +29,9 @@ piholeFilesDir="/etc/.pihole"
|
|||||||
|
|
||||||
useUpdateVars=false
|
useUpdateVars=false
|
||||||
|
|
||||||
|
IPv4_address=""
|
||||||
|
IPv6_address=""
|
||||||
|
|
||||||
# Find the rows and columns
|
# Find the rows and columns
|
||||||
rows=$(tput lines)
|
rows=$(tput lines)
|
||||||
columns=$(tput cols)
|
columns=$(tput cols)
|
||||||
@ -39,6 +40,11 @@ columns=$(tput cols)
|
|||||||
r=$(( rows / 2 ))
|
r=$(( rows / 2 ))
|
||||||
c=$(( columns / 2 ))
|
c=$(( columns / 2 ))
|
||||||
|
|
||||||
|
######## Undocumented Flags. Shhh ########
|
||||||
|
skipSpaceCheck=false
|
||||||
|
reconfigure=false
|
||||||
|
runUnattended=false
|
||||||
|
|
||||||
######## FIRST CHECK ########
|
######## FIRST CHECK ########
|
||||||
# Must be root to install
|
# Must be root to install
|
||||||
echo ":::"
|
echo ":::"
|
||||||
@ -52,7 +58,7 @@ else
|
|||||||
echo "::: Detecting the presence of the sudo utility for continuation of this install..."
|
echo "::: Detecting the presence of the sudo utility for continuation of this install..."
|
||||||
if [ -x "$(command -v sudo)" ];then
|
if [ -x "$(command -v sudo)" ];then
|
||||||
echo "::: Utility sudo located."
|
echo "::: Utility sudo located."
|
||||||
exec sudo bash "$0" "$@"
|
exec curl -sSL https://install.pi-hole.net | sudo bash "$@"
|
||||||
exit $?
|
exit $?
|
||||||
else
|
else
|
||||||
echo "::: sudo is needed for the Web interface to run pihole commands. Please run this script as root and it will be automatically installed."
|
echo "::: sudo is needed for the Web interface to run pihole commands. Please run this script as root and it will be automatically installed."
|
||||||
@ -65,25 +71,24 @@ fi
|
|||||||
if [ -x "$(command -v apt-get)" ];then
|
if [ -x "$(command -v apt-get)" ];then
|
||||||
#Debian Family
|
#Debian Family
|
||||||
#Decide if php should be `php5` or just `php` (Fixes issues with Ubuntu 16.04 LTS)
|
#Decide if php should be `php5` or just `php` (Fixes issues with Ubuntu 16.04 LTS)
|
||||||
phpVer="php"
|
|
||||||
apt-get install --dry-run php5 > /dev/null 2>&1
|
|
||||||
if [ $? == 0 ]; then
|
|
||||||
phpVer="php5"
|
phpVer="php5"
|
||||||
fi
|
apt-get install --dry-run php5 > /dev/null 2>&1 || phpVer="php"
|
||||||
#############################################
|
#############################################
|
||||||
PKG_MANAGER="apt-get"
|
PKG_MANAGER="apt-get"
|
||||||
PKG_CACHE="/var/lib/apt/lists/"
|
PKG_CACHE="/var/lib/apt/lists/"
|
||||||
UPDATE_PKG_CACHE="$PKG_MANAGER -qq update"
|
UPDATE_PKG_CACHE="$PKG_MANAGER update"
|
||||||
PKG_UPDATE="$PKG_MANAGER upgrade"
|
PKG_UPDATE="$PKG_MANAGER upgrade"
|
||||||
PKG_INSTALL="$PKG_MANAGER --yes --quiet install"
|
PKG_INSTALL="$PKG_MANAGER --yes --fix-missing install"
|
||||||
PKG_COUNT="$PKG_MANAGER -s -o Debug::NoLocking=true upgrade | grep -c ^Inst"
|
# grep -c will return 1 retVal on 0 matches, block this throwing the set -e with an OR TRUE
|
||||||
INSTALLER_DEPS=( apt-utils whiptail dhcpcd5)
|
PKG_COUNT="$PKG_MANAGER -s -o Debug::NoLocking=true upgrade | grep -c ^Inst || true"
|
||||||
PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd ${phpVer}-common ${phpVer}-cgi git curl unzip wget sudo netcat cron iproute2 )
|
INSTALLER_DEPS=( apt-utils whiptail git dhcpcd5)
|
||||||
|
PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd ${phpVer}-common ${phpVer}-cgi curl unzip wget sudo netcat cron iproute2 )
|
||||||
LIGHTTPD_USER="www-data"
|
LIGHTTPD_USER="www-data"
|
||||||
LIGHTTPD_GROUP="www-data"
|
LIGHTTPD_GROUP="www-data"
|
||||||
LIGHTTPD_CFG="lighttpd.conf.debian"
|
LIGHTTPD_CFG="lighttpd.conf.debian"
|
||||||
package_check() {
|
DNSMASQ_USER="dnsmasq"
|
||||||
dpkg-query -W -f='${Status}' "$1" 2>/dev/null | grep -c "ok installed"
|
package_check_install() {
|
||||||
|
dpkg-query -W -f='${Status}' "$1" 2>/dev/null | grep -c "ok installed" || ${PKG_INSTALL} "$1"
|
||||||
}
|
}
|
||||||
elif [ -x "$(command -v rpm)" ];then
|
elif [ -x "$(command -v rpm)" ];then
|
||||||
# Fedora Family
|
# Fedora Family
|
||||||
@ -93,17 +98,22 @@ elif [ -x "$(command -v rpm)" ];then
|
|||||||
PKG_MANAGER="yum"
|
PKG_MANAGER="yum"
|
||||||
fi
|
fi
|
||||||
PKG_CACHE="/var/cache/$PKG_MANAGER"
|
PKG_CACHE="/var/cache/$PKG_MANAGER"
|
||||||
UPDATE_PKG_CACHE="$PKG_MANAGER check-update -q"
|
UPDATE_PKG_CACHE="$PKG_MANAGER check-update"
|
||||||
PKG_UPDATE="$PKG_MANAGER update -y"
|
PKG_UPDATE="$PKG_MANAGER update -y"
|
||||||
PKG_INSTALL="$PKG_MANAGER install -y"
|
PKG_INSTALL="$PKG_MANAGER install -y"
|
||||||
PKG_COUNT="$PKG_MANAGER check-update | grep -v ^Last | grep -c ^[a-zA-Z0-9]"
|
PKG_COUNT="$PKG_MANAGER check-update | egrep '(.i686|.x86|.noarch|.arm|.src)' | wc -l"
|
||||||
INSTALLER_DEPS=( iproute net-tools procps-ng newt )
|
INSTALLER_DEPS=( iproute net-tools procps-ng newt git )
|
||||||
PIHOLE_DEPS=( epel-release bind-utils bc dnsmasq lighttpd lighttpd-fastcgi php-common php-cli php git curl unzip wget findutils cronie sudo nmap-ncat )
|
PIHOLE_DEPS=( epel-release bind-utils bc dnsmasq lighttpd lighttpd-fastcgi php-common php-cli php curl unzip wget findutils cronie sudo nmap-ncat )
|
||||||
|
if grep -q 'Fedora' /etc/redhat-release; then
|
||||||
|
remove_deps=(epel-release);
|
||||||
|
PIHOLE_DEPS=( ${PIHOLE_DEPS[@]/$remove_deps} );
|
||||||
|
fi
|
||||||
LIGHTTPD_USER="lighttpd"
|
LIGHTTPD_USER="lighttpd"
|
||||||
LIGHTTPD_GROUP="lighttpd"
|
LIGHTTPD_GROUP="lighttpd"
|
||||||
LIGHTTPD_CFG="lighttpd.conf.fedora"
|
LIGHTTPD_CFG="lighttpd.conf.fedora"
|
||||||
package_check() {
|
DNSMASQ_USER="nobody"
|
||||||
rpm -qa | grep ^$1- > /dev/null
|
package_check_install() {
|
||||||
|
rpm -qa | grep ^"$1"- > /dev/null || ${PKG_INSTALL} "$1"
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
echo "OS distribution not supported"
|
echo "OS distribution not supported"
|
||||||
@ -126,24 +136,27 @@ spinner()
|
|||||||
printf " \b\b\b\b"
|
printf " \b\b\b\b"
|
||||||
}
|
}
|
||||||
|
|
||||||
findIPRoute() {
|
find_IPv4_information() {
|
||||||
# Find IP used to route to outside world
|
# Find IP used to route to outside world
|
||||||
IPv4dev=$(ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/dev/)print $(i+1)}')
|
IPv4dev=$(ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/dev/)print $(i+1)}')
|
||||||
IPv4addr=$(ip -o -f inet addr show dev "$IPv4dev" | awk '{print $4}' | awk 'END {print}')
|
IPv4_address=$(ip -o -f inet addr show dev "$IPv4dev" | awk '{print $4}' | awk 'END {print}')
|
||||||
IPv4gw=$(ip route get 8.8.8.8 | awk '{print $3}')
|
IPv4gw=$(ip route get 8.8.8.8 | awk '{print $3}')
|
||||||
|
}
|
||||||
|
|
||||||
|
get_available_interfaces() {
|
||||||
|
# Get available interfaces. Consider only getting UP interfaces in the future, and leaving DOWN interfaces out of list.
|
||||||
availableInterfaces=$(ip -o link | awk '{print $2}' | grep -v "lo" | cut -d':' -f1 | cut -d'@' -f1)
|
availableInterfaces=$(ip -o link | awk '{print $2}' | grep -v "lo" | cut -d':' -f1 | cut -d'@' -f1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
welcomeDialogs() {
|
welcomeDialogs() {
|
||||||
# Display the welcome dialog
|
# 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" "\n\nThis installer will transform your device into a network-wide ad blocker!" ${r} ${c}
|
||||||
|
|
||||||
# Support for a part-time dev
|
# 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}
|
whiptail --msgbox --backtitle "Plea" --title "Free and open source" "\n\nThe Pi-hole is free, but powered by your donations: http://pi-hole.net/donate" ${r} ${c}
|
||||||
|
|
||||||
# Explain the need for a static address
|
# Explain the need for a static address
|
||||||
whiptail --msgbox --backtitle "Initiating 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 "Initiating network interface" --title "Static IP Needed" "\n\nThe 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}
|
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them." ${r} ${c}
|
||||||
}
|
}
|
||||||
@ -184,8 +197,15 @@ verifyFreeDiskSpace() {
|
|||||||
|
|
||||||
chooseInterface() {
|
chooseInterface() {
|
||||||
# Turn the available interfaces into an array so it can be used with a whiptail dialog
|
# Turn the available interfaces into an array so it can be used with a whiptail dialog
|
||||||
interfacesArray=()
|
local interfacesArray=()
|
||||||
firstLoop=1
|
# Number of available interfaces
|
||||||
|
local interfaceCount
|
||||||
|
# Whiptail variable storage
|
||||||
|
local chooseInterfaceCmd
|
||||||
|
# Temporary Whiptail options storage
|
||||||
|
local chooseInterfaceOptions
|
||||||
|
# Loop sentinel variable
|
||||||
|
local firstLoop=1
|
||||||
|
|
||||||
while read -r line
|
while read -r line
|
||||||
do
|
do
|
||||||
@ -211,10 +231,18 @@ chooseInterface() {
|
|||||||
echo "::: Cancel selected, exiting...."
|
echo "::: Cancel selected, exiting...."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
useIPv6dialog() {
|
||||||
|
# Show the IPv6 address used for blocking
|
||||||
|
IPv6_address=$(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" "$IPv6_address will be used to block ads." ${r} ${c}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
use4andor6() {
|
use4andor6() {
|
||||||
|
local useIPv4
|
||||||
|
local useIPv6
|
||||||
# Let use select IPv4 and/or IPv6
|
# Let use select IPv4 and/or IPv6
|
||||||
cmd=(whiptail --separate-output --checklist "Select Protocols (press space to select)" ${r} ${c} 2)
|
cmd=(whiptail --separate-output --checklist "Select Protocols (press space to select)" ${r} ${c} 2)
|
||||||
options=(IPv4 "Block ads over IPv4" on
|
options=(IPv4 "Block ads over IPv4" on
|
||||||
@ -228,47 +256,31 @@ use4andor6() {
|
|||||||
IPv6 ) useIPv6=true;;
|
IPv6 ) useIPv6=true;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
if [[ ${useIPv4} ]]; then
|
||||||
if [ ${useIPv4} ] && [ ! ${useIPv6} ]; then
|
find_IPv4_information
|
||||||
getStaticIPv4Settings
|
getStaticIPv4Settings
|
||||||
setStaticIPv4
|
setStaticIPv4
|
||||||
echo "::: Using IPv4 on $IPv4addr"
|
|
||||||
echo "::: IPv6 will NOT be used."
|
|
||||||
fi
|
fi
|
||||||
if [ ! ${useIPv4} ] && [ ${useIPv6} ]; then
|
if [[ ${useIPv6} ]]; then
|
||||||
useIPv6dialog
|
useIPv6dialog
|
||||||
echo "::: IPv4 will NOT be used."
|
|
||||||
echo "::: Using IPv6 on $piholeIPv6"
|
|
||||||
fi
|
|
||||||
if [ ${useIPv4} ] && [ ${useIPv6} ]; then
|
|
||||||
getStaticIPv4Settings
|
|
||||||
setStaticIPv4
|
|
||||||
useIPv6dialog
|
|
||||||
echo "::: Using IPv4 on $IPv4addr"
|
|
||||||
echo "::: Using IPv6 on $piholeIPv6"
|
|
||||||
fi
|
fi
|
||||||
|
echo "::: IPv4 address: ${IPv4_address}"
|
||||||
|
echo "::: IPv6 address: ${IPv6_address}"
|
||||||
if [ ! ${useIPv4} ] && [ ! ${useIPv6} ]; then
|
if [ ! ${useIPv4} ] && [ ! ${useIPv6} ]; then
|
||||||
echo "::: Cannot continue, neither IPv4 or IPv6 selected"
|
echo "::: Cannot continue, neither IPv4 or IPv6 selected"
|
||||||
echo "::: Exiting"
|
echo "::: Exiting"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
else
|
else
|
||||||
echo "::: Cancel selected. Exiting..."
|
echo "::: Cancel selected. Exiting..."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
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}
|
|
||||||
}
|
|
||||||
|
|
||||||
getStaticIPv4Settings() {
|
getStaticIPv4Settings() {
|
||||||
# Ask if the user wants to use DHCP settings as their static IP
|
# 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?
|
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
|
IP address: $IPv4_address
|
||||||
Gateway: $IPv4gw" ${r} ${c}); then
|
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.
|
# 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.
|
||||||
@ -282,16 +294,16 @@ It is also possible to use a DHCP reservation, but if you are going to do that,
|
|||||||
until [[ ${ipSettingsCorrect} = True ]]
|
until [[ ${ipSettingsCorrect} = True ]]
|
||||||
do
|
do
|
||||||
# Ask for the IPv4 address
|
# 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)
|
IPv4_address=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 address" --inputbox "Enter your desired IPv4 address" ${r} ${c} "$IPv4_address" 3>&1 1>&2 2>&3)
|
||||||
if [[ $? = 0 ]];then
|
if [[ $? = 0 ]];then
|
||||||
echo "::: Your static IPv4 address: $IPv4addr"
|
echo "::: Your static IPv4 address: $IPv4_address"
|
||||||
# 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)
|
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
|
if [[ $? = 0 ]];then
|
||||||
echo "::: Your static IPv4 gateway: $IPv4gw"
|
echo "::: Your static IPv4 gateway: $IPv4gw"
|
||||||
# Give the user a chance to review their settings before moving on
|
# 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?
|
if (whiptail --backtitle "Calibrating network interface" --title "Static IP Address" --yesno "Are these settings correct?
|
||||||
IP address: $IPv4addr
|
IP address: $IPv4_address
|
||||||
Gateway: $IPv4gw" ${r} ${c}); then
|
Gateway: $IPv4gw" ${r} ${c}); then
|
||||||
# After that's done, the loop ends and we move on
|
# After that's done, the loop ends and we move on
|
||||||
ipSettingsCorrect=True
|
ipSettingsCorrect=True
|
||||||
@ -319,53 +331,57 @@ It is also possible to use a DHCP reservation, but if you are going to do that,
|
|||||||
setDHCPCD() {
|
setDHCPCD() {
|
||||||
# Append these lines to dhcpcd.conf to enable a static IP
|
# Append these lines to dhcpcd.conf to enable a static IP
|
||||||
echo "## interface $piholeInterface
|
echo "## interface $piholeInterface
|
||||||
static ip_address=$IPv4addr
|
static ip_address=$IPv4_address
|
||||||
static routers=$IPv4gw
|
static routers=$IPv4gw
|
||||||
static domain_name_servers=$IPv4gw" | tee -a /etc/dhcpcd.conf >/dev/null
|
static domain_name_servers=$IPv4gw" | tee -a /etc/dhcpcd.conf >/dev/null
|
||||||
}
|
}
|
||||||
|
|
||||||
setStaticIPv4() {
|
setStaticIPv4() {
|
||||||
|
local IFCFG_FILE
|
||||||
|
local IPADDR
|
||||||
|
local CIDR
|
||||||
if [[ -f /etc/dhcpcd.conf ]];then
|
if [[ -f /etc/dhcpcd.conf ]];then
|
||||||
# Debian Family
|
# Debian Family
|
||||||
if grep -q "$IPv4addr" /etc/dhcpcd.conf; then
|
if grep -q "$IPv4_address" /etc/dhcpcd.conf; then
|
||||||
echo "::: Static IP already configured"
|
echo "::: Static IP already configured"
|
||||||
else
|
else
|
||||||
setDHCPCD
|
setDHCPCD
|
||||||
ip addr replace dev "$piholeInterface" "$IPv4addr"
|
ip addr replace dev "$piholeInterface" "$IPv4_address"
|
||||||
echo ":::"
|
echo ":::"
|
||||||
echo "::: Setting IP to $IPv4addr. You may need to restart after the install is complete."
|
echo "::: Setting IP to $IPv4_address. You may need to restart after the install is complete."
|
||||||
echo ":::"
|
echo ":::"
|
||||||
fi
|
fi
|
||||||
elif [[ -f /etc/sysconfig/network-scripts/ifcfg-${piholeInterface} ]];then
|
elif [[ -f /etc/sysconfig/network-scripts/ifcfg-${piholeInterface} ]];then
|
||||||
# Fedora Family
|
# Fedora Family
|
||||||
IFCFG_FILE=/etc/sysconfig/network-scripts/ifcfg-${piholeInterface}
|
IFCFG_FILE=/etc/sysconfig/network-scripts/ifcfg-${piholeInterface}
|
||||||
if grep -q "$IPv4addr" ${IFCFG_FILE}; then
|
if grep -q "$IPv4_address" "${IFCFG_FILE}"; then
|
||||||
echo "::: Static IP already configured"
|
echo "::: Static IP already configured"
|
||||||
else
|
else
|
||||||
IPADDR=$(echo ${IPv4addr} | cut -f1 -d/)
|
IPADDR=$(echo "${IPv4_address}" | cut -f1 -d/)
|
||||||
CIDR=$(echo ${IPv4addr} | cut -f2 -d/)
|
CIDR=$(echo "${IPv4_address}" | cut -f2 -d/)
|
||||||
# Backup existing interface configuration:
|
# Backup existing interface configuration:
|
||||||
cp ${IFCFG_FILE} ${IFCFG_FILE}.backup-$(date +%Y-%m-%d-%H%M%S)
|
cp "${IFCFG_FILE}" "${IFCFG_FILE}".pihole.orig
|
||||||
# Build Interface configuration file:
|
# Build Interface configuration file:
|
||||||
echo "# Configured via Pi-Hole installer" > ${IFCFG_FILE}
|
{
|
||||||
echo "DEVICE=$piholeInterface" >> ${IFCFG_FILE}
|
echo "# Configured via Pi-Hole installer"
|
||||||
echo "BOOTPROTO=none" >> ${IFCFG_FILE}
|
echo "DEVICE=$piholeInterface"
|
||||||
echo "ONBOOT=yes" >> ${IFCFG_FILE}
|
echo "BOOTPROTO=none"
|
||||||
echo "IPADDR=$IPADDR" >> ${IFCFG_FILE}
|
echo "ONBOOT=yes"
|
||||||
echo "PREFIX=$CIDR" >> ${IFCFG_FILE}
|
echo "IPADDR=$IPADDR"
|
||||||
echo "GATEWAY=$IPv4gw" >> ${IFCFG_FILE}
|
echo "PREFIX=$CIDR"
|
||||||
echo "DNS1=$piholeDNS1" >> ${IFCFG_FILE}
|
echo "GATEWAY=$IPv4gw"
|
||||||
echo "DNS2=$piholeDNS2" >> ${IFCFG_FILE}
|
echo "DNS1=$piholeDNS1"
|
||||||
echo "USERCTL=no" >> ${IFCFG_FILE}
|
echo "DNS2=$piholeDNS2"
|
||||||
ip addr replace dev "$piholeInterface" "$IPv4addr"
|
echo "USERCTL=no"
|
||||||
|
}>> "${IFCFG_FILE}"
|
||||||
|
ip addr replace dev "$piholeInterface" "$IPv4_address"
|
||||||
if [ -x "$(command -v nmcli)" ];then
|
if [ -x "$(command -v nmcli)" ];then
|
||||||
# Tell NetworkManager to read our new sysconfig file
|
# Tell NetworkManager to read our new sysconfig file
|
||||||
nmcli con load ${IFCFG_FILE} > /dev/null
|
nmcli con load "${IFCFG_FILE}" > /dev/null
|
||||||
fi
|
fi
|
||||||
echo ":::"
|
echo ":::"
|
||||||
echo "::: Setting IP to $IPv4addr. You may need to restart after the install is complete."
|
echo "::: Setting IP to ${IPv4_address}. You may need to restart after the install is complete."
|
||||||
echo ":::"
|
echo ":::"
|
||||||
|
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo "::: Warning: Unable to locate configuration file to set static IPv4 address!"
|
echo "::: Warning: Unable to locate configuration file to set static IPv4 address!"
|
||||||
@ -391,14 +407,14 @@ function valid_ip()
|
|||||||
}
|
}
|
||||||
|
|
||||||
setDNS(){
|
setDNS(){
|
||||||
DNSChoseCmd=(whiptail --separate-output --radiolist "Select Upstream DNS Provider. To use your own, select Custom." ${r} ${c} 6)
|
DNSChooseCmd=(whiptail --separate-output --radiolist "Select Upstream DNS Provider. To use your own, select Custom." ${r} ${c} 6)
|
||||||
DNSChooseOptions=(Google "" on
|
DNSChooseOptions=(Google "" on
|
||||||
OpenDNS "" off
|
OpenDNS "" off
|
||||||
Level3 "" off
|
Level3 "" off
|
||||||
Norton "" off
|
Norton "" off
|
||||||
Comodo "" off
|
Comodo "" off
|
||||||
Custom "" off)
|
Custom "" off)
|
||||||
DNSchoices=$("${DNSChoseCmd[@]}" "${DNSChooseOptions[@]}" 2>&1 >/dev/tty)
|
DNSchoices=$("${DNSChooseCmd[@]}" "${DNSChooseOptions[@]}" 2>&1 >/dev/tty)
|
||||||
if [[ $? = 0 ]];then
|
if [[ $? = 0 ]];then
|
||||||
case ${DNSchoices} in
|
case ${DNSchoices} in
|
||||||
Google)
|
Google)
|
||||||
@ -481,49 +497,59 @@ setDNS(){
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
versionCheckDNSmasq(){
|
version_check_dnsmasq(){
|
||||||
# Check if /etc/dnsmasq.conf is from pihole. If so replace with an original and install new in .d directory
|
# Check if /etc/dnsmasq.conf is from pihole. If so replace with an original and install new in .d directory
|
||||||
dnsFile1="/etc/dnsmasq.conf"
|
local dnsmasq_conf="/etc/dnsmasq.conf"
|
||||||
dnsFile2="/etc/dnsmasq.conf.orig"
|
local dnsmasq_conf_orig="/etc/dnsmasq.conf.orig"
|
||||||
dnsSearch="addn-hosts=/etc/pihole/gravity.list"
|
local dnsmasq_pihole_id_string="addn-hosts=/etc/pihole/gravity.list"
|
||||||
defaultFile="/etc/.pihole/advanced/dnsmasq.conf.original"
|
local dnsmasq_original_config="/etc/.pihole/advanced/dnsmasq.conf.original"
|
||||||
newFileToInstall="/etc/.pihole/advanced/01-pihole.conf"
|
local dnsmasq_pihole_01_snippet="/etc/.pihole/advanced/01-pihole.conf"
|
||||||
newFileFinalLocation="/etc/dnsmasq.d/01-pihole.conf"
|
local dnsmasq_pihole_01_location="/etc/dnsmasq.d/01-pihole.conf"
|
||||||
|
|
||||||
if [ -f ${dnsFile1} ]; then
|
if [ -f ${dnsmasq_conf} ]; then
|
||||||
echo -n "::: Existing dnsmasq.conf found..."
|
echo -n "::: Existing dnsmasq.conf found..."
|
||||||
if grep -q ${dnsSearch} ${dnsFile1}; then
|
if grep -q ${dnsmasq_pihole_id_string} ${dnsmasq_conf}; then
|
||||||
echo " it is from a previous pi-hole install."
|
echo " it is from a previous pi-hole install."
|
||||||
echo -n "::: Backing up dnsmasq.conf to dnsmasq.conf.orig..."
|
echo -n "::: Backing up dnsmasq.conf to dnsmasq.conf.orig..."
|
||||||
mv -f ${dnsFile1} ${dnsFile2}
|
mv -f ${dnsmasq_conf} ${dnsmasq_conf_orig}
|
||||||
echo " done."
|
echo " done."
|
||||||
echo -n "::: Restoring default dnsmasq.conf..."
|
echo -n "::: Restoring default dnsmasq.conf..."
|
||||||
cp ${defaultFile} ${dnsFile1}
|
cp ${dnsmasq_original_config} ${dnsmasq_conf}
|
||||||
echo " done."
|
echo " done."
|
||||||
else
|
else
|
||||||
echo " it is not a pi-hole file, leaving alone!"
|
echo " it is not a pi-hole file, leaving alone!"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo -n "::: No dnsmasq.conf found.. restoring default dnsmasq.conf..."
|
echo -n "::: No dnsmasq.conf found.. restoring default dnsmasq.conf..."
|
||||||
cp ${defaultFile} ${dnsFile1}
|
cp ${dnsmasq_original_config} ${dnsmasq_conf}
|
||||||
echo " done."
|
echo " done."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo -n "::: Copying 01-pihole.conf to /etc/dnsmasq.d/01-pihole.conf..."
|
echo -n "::: Copying 01-pihole.conf to /etc/dnsmasq.d/01-pihole.conf..."
|
||||||
cp ${newFileToInstall} ${newFileFinalLocation}
|
cp ${dnsmasq_pihole_01_snippet} ${dnsmasq_pihole_01_location}
|
||||||
echo " done."
|
echo " done."
|
||||||
sed -i "s/@INT@/$piholeInterface/" ${newFileFinalLocation}
|
sed -i "s/@INT@/$piholeInterface/" ${dnsmasq_pihole_01_location}
|
||||||
if [[ "$piholeDNS1" != "" ]]; then
|
if [[ "$piholeDNS1" != "" ]]; then
|
||||||
sed -i "s/@DNS1@/$piholeDNS1/" ${newFileFinalLocation}
|
sed -i "s/@DNS1@/$piholeDNS1/" ${dnsmasq_pihole_01_location}
|
||||||
else
|
else
|
||||||
sed -i '/^server=@DNS1@/d' ${newFileFinalLocation}
|
sed -i '/^server=@DNS1@/d' ${dnsmasq_pihole_01_location}
|
||||||
fi
|
fi
|
||||||
if [[ "$piholeDNS2" != "" ]]; then
|
if [[ "$piholeDNS2" != "" ]]; then
|
||||||
sed -i "s/@DNS2@/$piholeDNS2/" ${newFileFinalLocation}
|
sed -i "s/@DNS2@/$piholeDNS2/" ${dnsmasq_pihole_01_location}
|
||||||
else
|
else
|
||||||
sed -i '/^server=@DNS2@/d' ${newFileFinalLocation}
|
sed -i '/^server=@DNS2@/d' ${dnsmasq_pihole_01_location}
|
||||||
fi
|
fi
|
||||||
sed -i 's/^#conf-dir=\/etc\/dnsmasq.d$/conf-dir=\/etc\/dnsmasq.d/' ${dnsFile1}
|
sed -i 's/^#conf-dir=\/etc\/dnsmasq.d$/conf-dir=\/etc\/dnsmasq.d/' ${dnsmasq_conf}
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_legacy_scripts(){
|
||||||
|
#Tidy up /usr/local/bin directory if installing over previous install.
|
||||||
|
oldFiles=( gravity chronometer whitelist blacklist piholeLogFlush updateDashboard uninstall setupLCD piholeDebug)
|
||||||
|
for i in "${oldFiles[@]}"; do
|
||||||
|
if [ -f "/usr/local/bin/$i.sh" ]; then
|
||||||
|
rm /usr/local/bin/"$i".sh
|
||||||
|
fi
|
||||||
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
installScripts() {
|
installScripts() {
|
||||||
@ -539,16 +565,6 @@ installScripts() {
|
|||||||
install -o "${USER}" -Dm755 -t /usr/local/bin/ pihole
|
install -o "${USER}" -Dm755 -t /usr/local/bin/ pihole
|
||||||
|
|
||||||
install -Dm644 ./advanced/bash-completion/pihole /etc/bash_completion.d/pihole
|
install -Dm644 ./advanced/bash-completion/pihole /etc/bash_completion.d/pihole
|
||||||
. /etc/bash_completion.d/pihole
|
|
||||||
|
|
||||||
#Tidy up /usr/local/bin directory if installing over previous install.
|
|
||||||
oldFiles=( gravity chronometer whitelist blacklist piholeLogFlush updateDashboard uninstall setupLCD piholeDebug)
|
|
||||||
for i in "${oldFiles[@]}"; do
|
|
||||||
if [ -f "/usr/local/bin/$i.sh" ]; then
|
|
||||||
rm /usr/local/bin/"$i".sh
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo " done."
|
echo " done."
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -556,7 +572,7 @@ installConfigs() {
|
|||||||
# Install the configs from /etc/.pihole to their various locations
|
# Install the configs from /etc/.pihole to their various locations
|
||||||
echo ":::"
|
echo ":::"
|
||||||
echo "::: Installing configs..."
|
echo "::: Installing configs..."
|
||||||
versionCheckDNSmasq
|
version_check_dnsmasq
|
||||||
if [ ! -d "/etc/lighttpd" ]; then
|
if [ ! -d "/etc/lighttpd" ]; then
|
||||||
mkdir /etc/lighttpd
|
mkdir /etc/lighttpd
|
||||||
chown "$USER":root /etc/lighttpd
|
chown "$USER":root /etc/lighttpd
|
||||||
@ -569,24 +585,48 @@ installConfigs() {
|
|||||||
chown ${LIGHTTPD_USER}:${LIGHTTPD_GROUP} /var/cache/lighttpd/compress
|
chown ${LIGHTTPD_USER}:${LIGHTTPD_GROUP} /var/cache/lighttpd/compress
|
||||||
}
|
}
|
||||||
|
|
||||||
stopServices() {
|
stop_service() {
|
||||||
# Stop dnsmasq and lighttpd
|
# Stop service passed in as argument.
|
||||||
|
# Can softfail, as process may not be installed when this is called
|
||||||
echo ":::"
|
echo ":::"
|
||||||
echo -n "::: Stopping services..."
|
echo -n "::: Stopping ${1} service..."
|
||||||
#$SUDO service dnsmasq stop & spinner $! || true
|
|
||||||
if [ -x "$(command -v systemctl)" ]; then
|
if [ -x "$(command -v systemctl)" ]; then
|
||||||
systemctl stop lighttpd & spinner $! || true
|
systemctl stop "${1}" &> /dev/null & spinner $! || true
|
||||||
else
|
else
|
||||||
service lighttpd stop & spinner $! || true
|
service "${1}" stop &> /dev/null & spinner $! || true
|
||||||
fi
|
fi
|
||||||
echo " done."
|
echo " done."
|
||||||
}
|
}
|
||||||
|
|
||||||
installerDependencies() {
|
start_service() {
|
||||||
|
# Start/Restart service passed in as argument
|
||||||
|
# This should not fail, it's an error if it does
|
||||||
|
echo ":::"
|
||||||
|
echo -n "::: Starting ${1} service..."
|
||||||
|
if [ -x "$(command -v systemctl)" ]; then
|
||||||
|
systemctl restart "${1}" &> /dev/null & spinner $!
|
||||||
|
else
|
||||||
|
service "${1}" restart &> /dev/null & spinner $!
|
||||||
|
fi
|
||||||
|
echo " done."
|
||||||
|
}
|
||||||
|
|
||||||
|
enable_service() {
|
||||||
|
# Enable service so that it will start with next reboot
|
||||||
|
echo ":::"
|
||||||
|
echo -n "::: Enabling ${1} service to start on reboot..."
|
||||||
|
if [ -x "$(command -v systemctl)" ]; then
|
||||||
|
systemctl enable "${1}" &> /dev/null & spinner $!
|
||||||
|
else
|
||||||
|
update-rc.d "${1}" defaults &> /dev/null & spinner $!
|
||||||
|
fi
|
||||||
|
echo " done."
|
||||||
|
}
|
||||||
|
|
||||||
|
update_pacakge_cache() {
|
||||||
#Running apt-get update/upgrade with minimal output can cause some issues with
|
#Running apt-get update/upgrade with minimal output can cause some issues with
|
||||||
#requiring user input (e.g password for phpmyadmin see #218)
|
#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
|
#Check to see if apt-get update has already been run today
|
||||||
#it needs to have been run at least once on new installs!
|
#it needs to have been run at least once on new installs!
|
||||||
timestamp=$(stat -c %Y ${PKG_CACHE})
|
timestamp=$(stat -c %Y ${PKG_CACHE})
|
||||||
@ -597,100 +637,76 @@ installerDependencies() {
|
|||||||
#update package lists
|
#update package lists
|
||||||
echo ":::"
|
echo ":::"
|
||||||
echo -n "::: $PKG_MANAGER update has not been run today. Running now..."
|
echo -n "::: $PKG_MANAGER update has not been run today. Running now..."
|
||||||
${UPDATE_PKG_CACHE} > /dev/null 2>&1
|
${UPDATE_PKG_CACHE} &> /dev/null & spinner $!
|
||||||
echo " done!"
|
echo " done!"
|
||||||
fi
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
notify_package_updates_available(){
|
||||||
|
# Let user know if they have outdated packages on their system and
|
||||||
|
# advise them to run a package update at soonest possible.
|
||||||
echo ":::"
|
echo ":::"
|
||||||
echo -n "::: Checking $PKG_MANAGER for upgraded packages...."
|
echo -n "::: Checking $PKG_MANAGER for upgraded packages...."
|
||||||
updatesToInstall=$(eval "${PKG_COUNT}")
|
updatesToInstall=$(eval "${PKG_COUNT}")
|
||||||
echo " done!"
|
echo " done!"
|
||||||
echo ":::"
|
echo ":::"
|
||||||
if [[ ${updatesToInstall} -eq "0" ]]; then
|
if [[ ${updatesToInstall} -eq "0" ]]; then
|
||||||
echo "::: Your pi is up to date! Continuing with pi-hole installation..."
|
echo "::: Your system is up to date! Continuing with Pi-hole installation..."
|
||||||
else
|
else
|
||||||
echo "::: There are $updatesToInstall updates availible for your pi!"
|
echo "::: There are $updatesToInstall updates available for your system!"
|
||||||
echo "::: We recommend you run '$PKG_UPDATE' after installing Pi-Hole! "
|
echo "::: We recommend you run '$PKG_UPDATE' after installing Pi-Hole! "
|
||||||
echo ":::"
|
echo ":::"
|
||||||
fi
|
fi
|
||||||
echo ":::"
|
|
||||||
echo "::: Checking installer dependencies..."
|
|
||||||
for i in "${INSTALLER_DEPS[@]}"; do
|
|
||||||
echo -n "::: Checking for $i..."
|
|
||||||
package_check ${i} > /dev/null
|
|
||||||
if ! [ $? -eq 0 ]; then
|
|
||||||
echo -n " Not found! Installing...."
|
|
||||||
${PKG_INSTALL} "$i" > /dev/null 2>&1
|
|
||||||
echo " done!"
|
|
||||||
else
|
|
||||||
echo " already installed!"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
}
|
||||||
|
|
||||||
checkForDependencies() {
|
install_dependent_packages(){
|
||||||
# Install dependencies for Pi-Hole
|
# Install packages passed in via argument array
|
||||||
echo "::: Checking Pi-Hole dependencies:"
|
# No spinner - conflicts with set -e
|
||||||
|
declare -a argArray1=("${!1}")
|
||||||
|
|
||||||
for i in "${PIHOLE_DEPS[@]}"; do
|
for i in "${argArray1[@]}"; do
|
||||||
echo -n "::: Checking for $i..."
|
echo -n "::: Checking for $i..."
|
||||||
package_check ${i} > /dev/null
|
package_check_install "${i}" &> /dev/null
|
||||||
if ! [ $? -eq 0 ]; then
|
echo " installed!"
|
||||||
echo -n " Not found! Installing...."
|
|
||||||
${PKG_INSTALL} "$i" > /dev/null & spinner $!
|
|
||||||
echo " done!"
|
|
||||||
else
|
|
||||||
echo " already installed!"
|
|
||||||
fi
|
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
getGitFiles() {
|
getGitFiles() {
|
||||||
# Setup git repos for base files and web admin
|
# Setup git repos for directory and repository passed
|
||||||
|
# as arguments 1 and 2
|
||||||
echo ":::"
|
echo ":::"
|
||||||
echo "::: Checking for existing base files..."
|
echo "::: Checking for existing repository..."
|
||||||
if is_repo ${piholeFilesDir}; then
|
if is_repo "${1}"; then
|
||||||
make_repo ${piholeFilesDir} ${piholeGitUrl}
|
update_repo "${1}"
|
||||||
else
|
else
|
||||||
update_repo ${piholeFilesDir}
|
make_repo "${1}" "${2}"
|
||||||
fi
|
|
||||||
|
|
||||||
echo ":::"
|
|
||||||
echo "::: Checking for existing web interface..."
|
|
||||||
if is_repo ${webInterfaceDir}; then
|
|
||||||
make_repo ${webInterfaceDir} ${webInterfaceGitUrl}
|
|
||||||
else
|
|
||||||
update_repo ${webInterfaceDir}
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
is_repo() {
|
is_repo() {
|
||||||
# If the directory does not have a .git folder it is not a repo
|
# Use git to check if directory is currently under VCS
|
||||||
echo -n "::: Checking $1 is a repo..."
|
echo -n "::: Checking $1 is a repo..."
|
||||||
if [ -d "$1/.git" ]; then
|
cd "${1}" &> /dev/null || return 1
|
||||||
echo " OK!"
|
git status &> /dev/null && echo " OK!"; return 0 || echo " not found!"; return 1
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
echo " not found!!"
|
|
||||||
return 0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
make_repo() {
|
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..."
|
echo -n "::: Cloning $2 into $1..."
|
||||||
rm -rf "$1"
|
rm -rf "${1}"
|
||||||
git clone -q "$2" "$1" > /dev/null & spinner $!
|
git clone -q --depth 1 "${2}" "${1}" > /dev/null & spinner $!
|
||||||
echo " done!"
|
echo " done!"
|
||||||
}
|
}
|
||||||
|
|
||||||
update_repo() {
|
update_repo() {
|
||||||
# Pull the latest commits
|
# Pull the latest commits
|
||||||
echo -n "::: Updating repo in $1..."
|
echo -n "::: Updating repo in $1..."
|
||||||
cd "$1" || exit
|
cd "${1}" || exit 1
|
||||||
|
git stash -q > /dev/null & spinner $!
|
||||||
git pull -q > /dev/null & spinner $!
|
git pull -q > /dev/null & spinner $!
|
||||||
echo " done!"
|
echo " done!"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CreateLogFile() {
|
CreateLogFile() {
|
||||||
# Create logfiles if necessary
|
# Create logfiles if necessary
|
||||||
echo ":::"
|
echo ":::"
|
||||||
@ -698,7 +714,7 @@ CreateLogFile() {
|
|||||||
if [ ! -f /var/log/pihole.log ]; then
|
if [ ! -f /var/log/pihole.log ]; then
|
||||||
touch /var/log/pihole.log
|
touch /var/log/pihole.log
|
||||||
chmod 644 /var/log/pihole.log
|
chmod 644 /var/log/pihole.log
|
||||||
chown dnsmasq:root /var/log/pihole.log
|
chown "${DNSMASQ_USER}":root /var/log/pihole.log
|
||||||
echo " done!"
|
echo " done!"
|
||||||
else
|
else
|
||||||
echo " already exists!"
|
echo " already exists!"
|
||||||
@ -738,7 +754,7 @@ installCron() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
runGravity() {
|
runGravity() {
|
||||||
# Rub gravity.sh to build blacklists
|
# Run gravity.sh to build blacklists
|
||||||
echo ":::"
|
echo ":::"
|
||||||
echo "::: Preparing to run gravity.sh to refresh hosts..."
|
echo "::: Preparing to run gravity.sh to refresh hosts..."
|
||||||
if ls /etc/pihole/list* 1> /dev/null 2>&1; then
|
if ls /etc/pihole/list* 1> /dev/null 2>&1; then
|
||||||
@ -749,28 +765,17 @@ runGravity() {
|
|||||||
/opt/pihole/gravity.sh
|
/opt/pihole/gravity.sh
|
||||||
}
|
}
|
||||||
|
|
||||||
setUser(){
|
create_pihole_user(){
|
||||||
# Check if user pihole exists and create if not
|
# Check if user pihole exists and create if not
|
||||||
echo "::: Checking if user 'pihole' exists..."
|
echo "::: Checking if user 'pihole' exists..."
|
||||||
if id -u pihole > /dev/null 2>&1; then
|
id -u pihole &> /dev/null && echo "::: User 'pihole' already exists" || (echo "::: User 'pihole' doesn't exist. Creating..." && useradd -r -s /usr/sbin/nologin pihole)
|
||||||
echo "::: User 'pihole' already exists"
|
|
||||||
else
|
|
||||||
echo "::: User 'pihole' doesn't exist. Creating..."
|
|
||||||
useradd -r -s /usr/sbin/nologin pihole
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
configureFirewall() {
|
configureFirewall() {
|
||||||
# Allow HTTP and DNS traffic
|
# Allow HTTP and DNS traffic
|
||||||
if [ -x "$(command -v firewall-cmd)" ]; then
|
if [ -x "$(command -v firewall-cmd)" ]; then
|
||||||
firewall-cmd --state > /dev/null
|
firewall-cmd --state &> /dev/null && ( echo "::: Configuring firewalld for httpd and dnsmasq.." && firewall-cmd --permanent --add-port=80/tcp && firewall-cmd --permanent --add-port=53/tcp \
|
||||||
if [[ $? -eq 0 ]]; then
|
&& firewall-cmd --permanent --add-port=53/udp && firewall-cmd --reload) || echo "::: FirewallD not enabled"
|
||||||
echo "::: Configuring firewalld for httpd and dnsmasq.."
|
|
||||||
firewall-cmd --permanent --add-port=80/tcp
|
|
||||||
firewall-cmd --permanent --add-port=53/tcp
|
|
||||||
firewall-cmd --permanent --add-port=53/udp
|
|
||||||
firewall-cmd --reload
|
|
||||||
fi
|
|
||||||
elif [ -x "$(command -v iptables)" ]; then
|
elif [ -x "$(command -v iptables)" ]; then
|
||||||
echo "::: Configuring iptables for httpd and dnsmasq.."
|
echo "::: Configuring iptables for httpd and dnsmasq.."
|
||||||
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
|
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
|
||||||
@ -786,19 +791,19 @@ finalExports() {
|
|||||||
if [[ -f ${setupVars} ]];then
|
if [[ -f ${setupVars} ]];then
|
||||||
rm ${setupVars}
|
rm ${setupVars}
|
||||||
fi
|
fi
|
||||||
echo "piholeInterface=${piholeInterface}" >> ${setupVars}
|
{
|
||||||
echo "IPv4addr=${IPv4addr}" >> ${setupVars}
|
echo "piholeInterface=${piholeInterface}"
|
||||||
echo "piholeIPv6=${piholeIPv6}" >> ${setupVars}
|
echo "IPv4_address=${IPv4_address}"
|
||||||
echo "piholeDNS1=${piholeDNS1}" >> ${setupVars}
|
echo "IPv6_address=${IPv6_address}"
|
||||||
echo "piholeDNS2=${piholeDNS2}" >> ${setupVars}
|
echo "piholeDNS1=${piholeDNS1}"
|
||||||
|
echo "piholeDNS2=${piholeDNS2}"
|
||||||
|
}>> "${setupVars}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
installPihole() {
|
installPihole() {
|
||||||
# Install base files and web interface
|
# Install base files and web interface
|
||||||
checkForDependencies # done
|
create_pihole_user
|
||||||
stopServices
|
|
||||||
setUser
|
|
||||||
if [ ! -d "/var/www/html" ]; then
|
if [ ! -d "/var/www/html" ]; then
|
||||||
mkdir -p /var/www/html
|
mkdir -p /var/www/html
|
||||||
fi
|
fi
|
||||||
@ -806,12 +811,10 @@ installPihole() {
|
|||||||
chmod 775 /var/www/html
|
chmod 775 /var/www/html
|
||||||
usermod -a -G ${LIGHTTPD_GROUP} pihole
|
usermod -a -G ${LIGHTTPD_GROUP} pihole
|
||||||
if [ -x "$(command -v lighty-enable-mod)" ]; then
|
if [ -x "$(command -v lighty-enable-mod)" ]; then
|
||||||
lighty-enable-mod fastcgi fastcgi-php > /dev/null
|
lighty-enable-mod fastcgi fastcgi-php > /dev/null || true
|
||||||
else
|
else
|
||||||
printf "\n:::\tWarning: 'lighty-enable-mod' utility not found. Please ensure fastcgi is enabled if you experience issues.\n"
|
printf "\n:::\tWarning: 'lighty-enable-mod' utility not found. Please ensure fastcgi is enabled if you experience issues.\n"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
getGitFiles
|
|
||||||
installScripts
|
installScripts
|
||||||
installConfigs
|
installConfigs
|
||||||
CreateLogFile
|
CreateLogFile
|
||||||
@ -824,10 +827,12 @@ installPihole() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
updatePihole() {
|
updatePihole() {
|
||||||
|
# Refactoring of install script has changed the name of a couple of variables. Sort them out here.
|
||||||
|
sed -i 's/IPv4addr/IPv4_address/g' ${setupVars}
|
||||||
|
sed -i 's/piholeIPv6/IPv6_address/g' ${setupVars}
|
||||||
|
# Source ${setupVars} for use in the rest of the functions.
|
||||||
|
. ${setupVars}
|
||||||
# Install base files and web interface
|
# Install base files and web interface
|
||||||
checkForDependencies # done
|
|
||||||
stopServices
|
|
||||||
getGitFiles
|
|
||||||
installScripts
|
installScripts
|
||||||
installConfigs
|
installConfigs
|
||||||
CreateLogFile
|
CreateLogFile
|
||||||
@ -842,30 +847,19 @@ configureSelinux() {
|
|||||||
if [ -x "$(command -v getenforce)" ]; then
|
if [ -x "$(command -v getenforce)" ]; then
|
||||||
printf "\n::: SELinux Detected\n"
|
printf "\n::: SELinux Detected\n"
|
||||||
printf ":::\tChecking for SELinux policy development packages..."
|
printf ":::\tChecking for SELinux policy development packages..."
|
||||||
package_check "selinux-policy-devel" > /dev/null
|
package_check_install "selinux-policy-devel" > /dev/null
|
||||||
if ! [ $? -eq 0 ]; then
|
echo " installed!"
|
||||||
echo -n " Not found! Installing...."
|
printf ":::\tEnabling httpd server side includes (SSI).. "
|
||||||
${PKG_INSTALL} "selinux-policy-devel" > /dev/null & spinner $!
|
setsebool -P httpd_ssi_exec on &> /dev/null && echo "Success" || echo "SELinux not enabled"
|
||||||
echo " done!"
|
|
||||||
else
|
|
||||||
echo " already installed!"
|
|
||||||
fi
|
|
||||||
printf "::: Enabling httpd server side includes (SSI).. "
|
|
||||||
setsebool -P httpd_ssi_exec on
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
echo -n "Success"
|
|
||||||
fi
|
|
||||||
printf "\n:::\tCompiling Pi-Hole SELinux policy..\n"
|
printf "\n:::\tCompiling Pi-Hole SELinux policy..\n"
|
||||||
|
if ! [ -x "$(command -v systemctl)" ]; then
|
||||||
|
sed -i.bak '/systemd/d' /etc/.pihole/advanced/selinux/pihole.te
|
||||||
|
fi
|
||||||
checkmodule -M -m -o /etc/pihole/pihole.mod /etc/.pihole/advanced/selinux/pihole.te
|
checkmodule -M -m -o /etc/pihole/pihole.mod /etc/.pihole/advanced/selinux/pihole.te
|
||||||
semodule_package -o /etc/pihole/pihole.pp -m /etc/pihole/pihole.mod
|
semodule_package -o /etc/pihole/pihole.pp -m /etc/pihole/pihole.mod
|
||||||
semodule -i /etc/pihole/pihole.pp
|
semodule -i /etc/pihole/pihole.pp
|
||||||
rm -f /etc/pihole/pihole.mod
|
rm -f /etc/pihole/pihole.mod
|
||||||
semodule -l | grep pihole > /dev/null
|
semodule -l | grep pihole &> /dev/null && echo "::: Installed Pi-Hole SELinux policy" || echo "::: Warning: Pi-Hole SELinux policy did not install."
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
printf "::: Successfully installed Pi-Hole SELinux policy\n"
|
|
||||||
else
|
|
||||||
printf "::: Warning: Pi-Hole SELinux policy did not install correctly!\n"
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -873,30 +867,41 @@ displayFinalMessage() {
|
|||||||
# Final completion message to user
|
# 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:
|
whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using:
|
||||||
|
|
||||||
IPv4: ${IPv4addr%/*}
|
IPv4: ${IPv4_address%/*}
|
||||||
IPv6: $piholeIPv6
|
IPv6: $IPv6_address
|
||||||
|
|
||||||
If you set a new IP address, you should restart the Pi.
|
If you set a new IP address, you should restart the Pi.
|
||||||
|
|
||||||
The install log is in /etc/pihole.
|
The install log is in /etc/pihole.
|
||||||
View the web interface at http://pi.hole/admin or http://${IPv4addr%/*}/admin" ${r} ${c}
|
View the web interface at http://pi.hole/admin or http://${IPv4_address%/*}/admin" ${r} ${c}
|
||||||
}
|
}
|
||||||
|
|
||||||
updateDialogs(){
|
update_dialogs(){
|
||||||
|
# reconfigure
|
||||||
|
if [ "$reconfigure" = true ]; then
|
||||||
|
opt1a="Repair"
|
||||||
|
opt1b="This will retain existing settings"
|
||||||
|
strAdd="You will remain on the same version"
|
||||||
|
else
|
||||||
|
opt1a="Update"
|
||||||
|
opt1b="This will retain existing settings."
|
||||||
|
strAdd="You will be updated to the latest version."
|
||||||
|
fi
|
||||||
|
opt2a="Reconfigure"
|
||||||
|
opt2b="This will allow you to enter new settings"
|
||||||
|
|
||||||
UpdateCmd=(whiptail --separate-output --radiolist "We have detected an existing install.\n\n Selecting Update will retain settings from the existing install.\n\n Selecting Install will allow you to enter new settings.\n\n(Highlight desired option, and press space to select!)" ${r} ${c} 2)
|
UpdateCmd=$(whiptail --title "Existing Install Detected!" --menu "\n\nWe have detected an existing install.\n\nPlease choose from the following options: \n($strAdd)" ${r} ${c} 2 \
|
||||||
UpdateChoices=(Update "" on
|
"$opt1a" "$opt1b" \
|
||||||
Install "" off)
|
"$opt2a" "$opt2b" 3>&2 2>&1 1>&3)
|
||||||
UpdateChoice=$("${UpdateCmd[@]}" "${UpdateChoices[@]}" 2>&1 >/dev/tty)
|
|
||||||
|
|
||||||
if [[ $? = 0 ]];then
|
if [[ $? = 0 ]];then
|
||||||
case ${UpdateChoice} in
|
case ${UpdateCmd} in
|
||||||
Update)
|
${opt1a})
|
||||||
echo "::: Updating existing install"
|
echo "::: $opt1a option selected."
|
||||||
useUpdateVars=true
|
useUpdateVars=true
|
||||||
;;
|
;;
|
||||||
Install)
|
${opt2a})
|
||||||
echo "::: Running complete install script"
|
echo "::: $opt2a option selected"
|
||||||
useUpdateVars=false
|
useUpdateVars=false
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@ -908,34 +913,65 @@ updateDialogs(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
main() {
|
main() {
|
||||||
if [[ -f ${setupVars} ]];then
|
# Check arguments for the undocumented flags
|
||||||
. ${setupVars}
|
for var in "$@"
|
||||||
|
do
|
||||||
|
case "$var" in
|
||||||
|
"--reconfigure" ) reconfigure=true;;
|
||||||
|
"--i_do_not_follow_recommendations" ) skipSpaceCheck=false;;
|
||||||
|
"--unattended" ) runUnattended=true;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
if [ "$1" == "pihole" ]; then
|
if [[ -f ${setupVars} ]];then
|
||||||
|
if [[ "${runUnattended}" == true ]]; then
|
||||||
|
echo "::: --unattended passed to install script, no whiptail dialogs will be displayed"
|
||||||
useUpdateVars=true
|
useUpdateVars=true
|
||||||
else
|
else
|
||||||
updateDialogs
|
update_dialogs
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Start the installer
|
# Start the installer
|
||||||
# Verify there is enough disk space for the install
|
# Verify there is enough disk space for the install
|
||||||
if [[ $1 = "--i_do_not_follow_recommendations" ]]; then
|
if [[ "${skipSpaceCheck}" == true ]]; then
|
||||||
echo "::: --i_do_not_follow_recommendations passed to script"
|
echo "::: --i_do_not_follow_recommendations passed to script, skipping free disk space verification!"
|
||||||
echo "::: skipping free disk space verification!"
|
|
||||||
else
|
else
|
||||||
verifyFreeDiskSpace
|
verifyFreeDiskSpace
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Update package cache
|
||||||
|
update_pacakge_cache
|
||||||
|
|
||||||
|
# Notify user of package availability
|
||||||
|
notify_package_updates_available
|
||||||
|
|
||||||
# Install packages used by this installation script
|
# Install packages used by this installation script
|
||||||
installerDependencies
|
install_dependent_packages INSTALLER_DEPS[@]
|
||||||
|
|
||||||
|
# Install packages used by the Pi-hole
|
||||||
|
install_dependent_packages PIHOLE_DEPS[@]
|
||||||
|
|
||||||
|
if [[ "${reconfigure}" == true ]]; then
|
||||||
|
echo "::: --reconfigure passed to install script. Not downloading/updating local repos"
|
||||||
|
else
|
||||||
|
# Get Git files for Core and Admin
|
||||||
|
getGitFiles ${piholeFilesDir} ${piholeGitUrl}
|
||||||
|
getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl}
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ ${useUpdateVars} == false ]]; then
|
if [[ ${useUpdateVars} == false ]]; then
|
||||||
|
# Display welcome dialogs
|
||||||
welcomeDialogs
|
welcomeDialogs
|
||||||
|
# Create directory for Pi-hole storage
|
||||||
mkdir -p /etc/pihole/
|
mkdir -p /etc/pihole/
|
||||||
# Find IP used to route to outside world
|
# Remove legacy scripts from previous storage location
|
||||||
findIPRoute
|
remove_legacy_scripts
|
||||||
|
# Stop resolver and webserver while installing proceses
|
||||||
|
stop_service dnsmasq
|
||||||
|
stop_service lighttpd
|
||||||
|
# Determine available interfaces
|
||||||
|
get_available_interfaces
|
||||||
# Find interfaces and let the user choose one
|
# Find interfaces and let the user choose one
|
||||||
chooseInterface
|
chooseInterface
|
||||||
# Let the user decide if they want to block ads over IPv4 and/or IPv6
|
# Let the user decide if they want to block ads over IPv4 and/or IPv6
|
||||||
@ -951,29 +987,23 @@ fi
|
|||||||
# Move the log file into /etc/pihole for storage
|
# Move the log file into /etc/pihole for storage
|
||||||
mv ${tmpLog} ${instalLogLoc}
|
mv ${tmpLog} ${instalLogLoc}
|
||||||
|
|
||||||
if [[ ${useUpdateVars} == false ]]; then
|
if [[ "${useUpdateVars}" == false ]]; then
|
||||||
displayFinalMessage
|
displayFinalMessage
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo -n "::: Restarting services..."
|
echo "::: Restarting services..."
|
||||||
# Start services
|
# Start services
|
||||||
if [ -x "$(command -v systemctl)" ]; then
|
start_service dnsmasq
|
||||||
systemctl enable dnsmasq
|
enable_service dnsmasq
|
||||||
systemctl restart dnsmasq
|
start_service lighttpd
|
||||||
systemctl enable lighttpd
|
enable_service lighttpd
|
||||||
systemctl start lighttpd
|
echo "::: done."
|
||||||
else
|
|
||||||
service dnsmasq restart
|
|
||||||
service lighttpd start
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo " done."
|
|
||||||
|
|
||||||
echo ":::"
|
echo ":::"
|
||||||
if [[ ${useUpdateVars} == false ]]; then
|
if [[ "${useUpdateVars}" == false ]]; then
|
||||||
echo "::: Installation Complete! Configure your devices to use the Pi-hole as their DNS server using:"
|
echo "::: Installation Complete! Configure your devices to use the Pi-hole as their DNS server using:"
|
||||||
echo "::: ${IPv4addr%/*}"
|
echo "::: ${IPv4_address%/*}"
|
||||||
echo "::: $piholeIPv6"
|
echo "::: $IPv6_address"
|
||||||
echo ":::"
|
echo ":::"
|
||||||
echo "::: If you set a new IP address, you should restart the Pi."
|
echo "::: If you set a new IP address, you should restart the Pi."
|
||||||
else
|
else
|
||||||
@ -982,7 +1012,7 @@ fi
|
|||||||
|
|
||||||
echo ":::"
|
echo ":::"
|
||||||
echo "::: The install log is located at: /etc/pihole/install.log"
|
echo "::: The install log is located at: /etc/pihole/install.log"
|
||||||
echo "::: View the web interface at http://pi.hole/admin or http://${IPv4addr%/*}/admin"
|
echo "::: View the web interface at http://pi.hole/admin or http://${IPv4_address%/*}/admin"
|
||||||
}
|
}
|
||||||
|
|
||||||
main "$@"
|
main "$@"
|
||||||
|
90
gravity.sh
90
gravity.sh
@ -13,21 +13,7 @@
|
|||||||
# Run this script as root or under sudo
|
# Run this script as root or under sudo
|
||||||
echo ":::"
|
echo ":::"
|
||||||
|
|
||||||
if [[ $EUID -eq 0 ]];then
|
helpFunc()
|
||||||
echo "::: You are root."
|
|
||||||
else
|
|
||||||
echo "::: sudo will be used."
|
|
||||||
# Check if it is actually installed
|
|
||||||
# If it isn't, exit because the install cannot complete
|
|
||||||
if [ -x "$(command -v sudo)" ];then
|
|
||||||
export SUDO="sudo"
|
|
||||||
else
|
|
||||||
echo "::: Please install sudo or run this script as root."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
function helpFunc()
|
|
||||||
{
|
{
|
||||||
echo "::: Pull in domains from adlists"
|
echo "::: Pull in domains from adlists"
|
||||||
echo ":::"
|
echo ":::"
|
||||||
@ -46,9 +32,17 @@ whitelistScript=/opt/pihole/whitelist.sh
|
|||||||
blacklistScript=/opt/pihole/blacklist.sh
|
blacklistScript=/opt/pihole/blacklist.sh
|
||||||
|
|
||||||
#Source the setupVars from install script for the IP
|
#Source the setupVars from install script for the IP
|
||||||
|
setupVars=/etc/pihole/setupVars.conf
|
||||||
|
if [[ -f ${setupVars} ]];then
|
||||||
. /etc/pihole/setupVars.conf
|
. /etc/pihole/setupVars.conf
|
||||||
|
else
|
||||||
|
echo "::: WARNING: /etc/pihole/setupVars.conf missing. Possible installation failure."
|
||||||
|
echo "::: Please run 'pihole -r', and choose the 'reconfigure' option to reconfigure."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
#Remove the /* from the end of the IPv4addr.
|
#Remove the /* from the end of the IPv4addr.
|
||||||
IPv4addr=${IPv4addr%/*}
|
IPv4addr=${IPv4_address%/*}
|
||||||
|
|
||||||
# Variables for various stages of downloading and formatting the list
|
# Variables for various stages of downloading and formatting the list
|
||||||
basename=pihole
|
basename=pihole
|
||||||
@ -60,15 +54,14 @@ supernova=${basename}.1.supernova.txt
|
|||||||
eventHorizon=${basename}.2.eventHorizon.txt
|
eventHorizon=${basename}.2.eventHorizon.txt
|
||||||
accretionDisc=${basename}.3.accretionDisc.txt
|
accretionDisc=${basename}.3.accretionDisc.txt
|
||||||
|
|
||||||
# After setting defaults, check if there's local overrides
|
# Warn users still using pihole.conf that it no longer has any effect (I imagine about 2 people use it)
|
||||||
if [[ -r ${piholeDir}/pihole.conf ]];then
|
if [[ -r ${piholeDir}/pihole.conf ]];then
|
||||||
echo "::: Local calibration requested..."
|
echo "::: pihole.conf file no longer supported. Over-rides in this file are ignored."
|
||||||
. ${piholeDir}/pihole.conf
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
###########################
|
###########################
|
||||||
# collapse - begin formation of pihole
|
# collapse - begin formation of pihole
|
||||||
function gravity_collapse() {
|
gravity_collapse() {
|
||||||
echo "::: Neutrino emissions detected..."
|
echo "::: Neutrino emissions detected..."
|
||||||
echo ":::"
|
echo ":::"
|
||||||
#Decide if we're using a custom ad block list, or defaults.
|
#Decide if we're using a custom ad block list, or defaults.
|
||||||
@ -105,18 +98,18 @@ function gravity_collapse() {
|
|||||||
# Temporary hack to allow non-root access to pihole directory
|
# Temporary hack to allow non-root access to pihole directory
|
||||||
# Will update later, needed for existing installs, new installs should
|
# Will update later, needed for existing installs, new installs should
|
||||||
# create this directory as non-root
|
# create this directory as non-root
|
||||||
${SUDO} chmod 777 ${piholeDir}
|
chmod 777 ${piholeDir}
|
||||||
echo ":::"
|
echo ":::"
|
||||||
echo "::: Existing pihole directory found"
|
echo "::: Existing pihole directory found"
|
||||||
else
|
else
|
||||||
echo "::: Creating pihole directory..."
|
echo "::: Creating pihole directory..."
|
||||||
mkdir ${piholeDir}
|
mkdir ${piholeDir}
|
||||||
${SUDO} chmod 777 ${piholeDir}
|
chmod 777 ${piholeDir}
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# patternCheck - check to see if curl downloaded any new files.
|
# patternCheck - check to see if curl downloaded any new files.
|
||||||
function gravity_patternCheck() {
|
gravity_patternCheck() {
|
||||||
patternBuffer=$1
|
patternBuffer=$1
|
||||||
# check if the patternbuffer is a non-zero length file
|
# check if the patternbuffer is a non-zero length file
|
||||||
if [[ -s "$patternBuffer" ]];then
|
if [[ -s "$patternBuffer" ]];then
|
||||||
@ -132,7 +125,7 @@ function gravity_patternCheck() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# transport - curl the specified url with any needed command extentions
|
# transport - curl the specified url with any needed command extentions
|
||||||
function gravity_transport() {
|
gravity_transport() {
|
||||||
url=$1
|
url=$1
|
||||||
cmd_ext=$2
|
cmd_ext=$2
|
||||||
agent=$3
|
agent=$3
|
||||||
@ -154,7 +147,7 @@ function gravity_transport() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# spinup - main gravity function
|
# spinup - main gravity function
|
||||||
function gravity_spinup() {
|
gravity_spinup() {
|
||||||
echo ":::"
|
echo ":::"
|
||||||
# Loop through domain list. Download each one and remove commented lines (lines beginning with '# 'or '/') and # blank lines
|
# Loop through domain list. Download each one and remove commented lines (lines beginning with '# 'or '/') and # blank lines
|
||||||
for ((i = 0; i < "${#sources[@]}"; i++))
|
for ((i = 0; i < "${#sources[@]}"; i++))
|
||||||
@ -191,7 +184,7 @@ function gravity_spinup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Schwarzchild - aggregate domains to one list and add blacklisted domains
|
# Schwarzchild - aggregate domains to one list and add blacklisted domains
|
||||||
function gravity_Schwarzchild() {
|
gravity_Schwarzchild() {
|
||||||
echo "::: "
|
echo "::: "
|
||||||
# Find all active domains and compile them into one file and remove CRs
|
# Find all active domains and compile them into one file and remove CRs
|
||||||
echo -n "::: Aggregating list of domains..."
|
echo -n "::: Aggregating list of domains..."
|
||||||
@ -203,7 +196,7 @@ function gravity_Schwarzchild() {
|
|||||||
echo " done!"
|
echo " done!"
|
||||||
}
|
}
|
||||||
|
|
||||||
function gravity_Blacklist(){
|
gravity_Blacklist(){
|
||||||
# Append blacklist entries if they exist
|
# Append blacklist entries if they exist
|
||||||
echo -n "::: Running blacklist script to update HOSTS file...."
|
echo -n "::: Running blacklist script to update HOSTS file...."
|
||||||
${blacklistScript} -f -nr -q > /dev/null
|
${blacklistScript} -f -nr -q > /dev/null
|
||||||
@ -213,7 +206,7 @@ function gravity_Blacklist(){
|
|||||||
echo " $numBlacklisted domain${plural} blacklisted!"
|
echo " $numBlacklisted domain${plural} blacklisted!"
|
||||||
}
|
}
|
||||||
|
|
||||||
function gravity_Whitelist() {
|
gravity_Whitelist() {
|
||||||
echo ":::"
|
echo ":::"
|
||||||
# Prevent our sources from being pulled into the hole
|
# Prevent our sources from being pulled into the hole
|
||||||
plural=; [[ "${sources[@]}" != "1" ]] && plural=s
|
plural=; [[ "${sources[@]}" != "1" ]] && plural=s
|
||||||
@ -234,7 +227,7 @@ function gravity_Whitelist() {
|
|||||||
echo " $numWhitelisted domain${plural} whitelisted!"
|
echo " $numWhitelisted domain${plural} whitelisted!"
|
||||||
}
|
}
|
||||||
|
|
||||||
function gravity_unique() {
|
gravity_unique() {
|
||||||
# Sort and remove duplicates
|
# Sort and remove duplicates
|
||||||
echo -n "::: Removing duplicate domains...."
|
echo -n "::: Removing duplicate domains...."
|
||||||
sort -u ${piholeDir}/${supernova} > ${piholeDir}/${eventHorizon}
|
sort -u ${piholeDir}/${supernova} > ${piholeDir}/${eventHorizon}
|
||||||
@ -243,7 +236,7 @@ function gravity_unique() {
|
|||||||
echo "::: $numberOf unique domains trapped in the event horizon."
|
echo "::: $numberOf unique domains trapped in the event horizon."
|
||||||
}
|
}
|
||||||
|
|
||||||
function gravity_hostFormat() {
|
gravity_hostFormat() {
|
||||||
# Format domain list as "192.168.x.x domain.com"
|
# Format domain list as "192.168.x.x domain.com"
|
||||||
echo "::: Formatting domains into a HOSTS file..."
|
echo "::: Formatting domains into a HOSTS file..."
|
||||||
if [[ -f /etc/hostname ]]; then
|
if [[ -f /etc/hostname ]]; then
|
||||||
@ -254,10 +247,10 @@ function gravity_hostFormat() {
|
|||||||
echo "::: Error: Unable to determine fully qualified domain name of host"
|
echo "::: Error: Unable to determine fully qualified domain name of host"
|
||||||
fi
|
fi
|
||||||
# If there is a value in the $piholeIPv6, then IPv6 will be used, so the awk command modified to create a line for both protocols
|
# If there is a value in the $piholeIPv6, then IPv6 will be used, so the awk command modified to create a line for both protocols
|
||||||
if [[ -n ${piholeIPv6} ]];then
|
if [[ -n "${IPv6_address}" ]];then
|
||||||
# Add hostname and dummy domain to the top of gravity.list to make ping result return a friendlier looking domain! Also allows for an easy way to access the Pi-hole admin console (pi.hole/admin)
|
# Add hostname and dummy domain to the top of gravity.list to make ping result return a friendlier looking domain! Also allows for an easy way to access the Pi-hole admin console (pi.hole/admin)
|
||||||
echo -e "$IPv4addr $hostname\n$piholeIPv6 $hostname\n$IPv4addr pi.hole\n$piholeIPv6 pi.hole" > ${piholeDir}/${accretionDisc}
|
echo -e "$IPv4addr $hostname\n$IPv6_address $hostname\n$IPv4addr pi.hole\n$IPv6_address pi.hole" > ${piholeDir}/${accretionDisc}
|
||||||
cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPv4addr" -v ipv6addr="$piholeIPv6" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc}
|
cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPv4addr" -v ipv6addr="$IPv6_address" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc}
|
||||||
else
|
else
|
||||||
# Otherwise, just create gravity.list as normal using IPv4
|
# Otherwise, just create gravity.list as normal using IPv4
|
||||||
# Add hostname and dummy domain to the top of gravity.list to make ping result return a friendlier looking domain! Also allows for an easy way to access the Pi-hole admin console (pi.hole/admin)
|
# Add hostname and dummy domain to the top of gravity.list to make ping result return a friendlier looking domain! Also allows for an easy way to access the Pi-hole admin console (pi.hole/admin)
|
||||||
@ -270,7 +263,7 @@ function gravity_hostFormat() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# blackbody - remove any remnant files from script processes
|
# blackbody - remove any remnant files from script processes
|
||||||
function gravity_blackbody() {
|
gravity_blackbody() {
|
||||||
# Loop through list files
|
# Loop through list files
|
||||||
for file in ${piholeDir}/*.${justDomainsExtension}
|
for file in ${piholeDir}/*.${justDomainsExtension}
|
||||||
do
|
do
|
||||||
@ -283,7 +276,7 @@ function gravity_blackbody() {
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
function gravity_advanced() {
|
gravity_advanced() {
|
||||||
# Remove comments and print only the domain name
|
# 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
|
# 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
|
# This helps with that and makes it easier to read
|
||||||
@ -301,11 +294,11 @@ function gravity_advanced() {
|
|||||||
gravity_unique
|
gravity_unique
|
||||||
}
|
}
|
||||||
|
|
||||||
function gravity_reload() {
|
gravity_reload() {
|
||||||
#Clear no longer needed files...
|
#Clear no longer needed files...
|
||||||
echo ":::"
|
echo ":::"
|
||||||
echo -n "::: Cleaning up un-needed files..."
|
echo -n "::: Cleaning up un-needed files..."
|
||||||
${SUDO} rm ${piholeDir}/pihole.*.txt
|
rm ${piholeDir}/pihole.*.txt
|
||||||
echo " done!"
|
echo " done!"
|
||||||
|
|
||||||
# Reload hosts file
|
# Reload hosts file
|
||||||
@ -316,19 +309,26 @@ function gravity_reload() {
|
|||||||
#First escape forward slashes in the path:
|
#First escape forward slashes in the path:
|
||||||
adList=${adList//\//\\\/}
|
adList=${adList//\//\\\/}
|
||||||
#Now replace the line in dnsmasq file
|
#Now replace the line in dnsmasq file
|
||||||
${SUDO} sed -i "s/^addn-hosts.*/addn-hosts=$adList/" /etc/dnsmasq.d/01-pihole.conf
|
sed -i "s/^addn-hosts.*/addn-hosts=$adList/" /etc/dnsmasq.d/01-pihole.conf
|
||||||
dnsmasqPid=$(pidof dnsmasq)
|
find "$piholeDir" -type f -exec chmod 666 {} \;
|
||||||
|
|
||||||
find "$piholeDir" -type f -exec ${SUDO} chmod 666 {} \;
|
dnsmasqPid=$(pidof dnsmasq)
|
||||||
|
|
||||||
if [[ ${dnsmasqPid} ]]; then
|
if [[ ${dnsmasqPid} ]]; then
|
||||||
# service already running - reload config
|
# service already running - reload config
|
||||||
${SUDO} killall -s HUP dnsmasq
|
if [ -x "$(command -v systemctl)" ]; then
|
||||||
|
systemctl restart dnsmasq
|
||||||
|
else
|
||||||
|
service dnsmasq restart
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
# service not running, start it up
|
# service not running, start it up
|
||||||
${SUDO} service dnsmasq start
|
if [ -x "$(command -v systemctl)" ]; then
|
||||||
|
systemctl start dnsmasq
|
||||||
|
else
|
||||||
|
service dnsmasq start
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
echo " done!"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -342,12 +342,12 @@ done
|
|||||||
|
|
||||||
if [[ ${forceGrav} == true ]]; then
|
if [[ ${forceGrav} == true ]]; then
|
||||||
echo -n "::: Deleting exising list cache..."
|
echo -n "::: Deleting exising list cache..."
|
||||||
${SUDO} rm /etc/pihole/list.*
|
rm /etc/pihole/list.*
|
||||||
echo " done!"
|
echo " done!"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#Overwrite adlists.default from /etc/.pihole in case any changes have been made. Changes should be saved in /etc/adlists.list
|
#Overwrite adlists.default from /etc/.pihole in case any changes have been made. Changes should be saved in /etc/adlists.list
|
||||||
${SUDO} cp /etc/.pihole/adlists.default /etc/pihole/adlists.default
|
cp /etc/.pihole/adlists.default /etc/pihole/adlists.default
|
||||||
gravity_collapse
|
gravity_collapse
|
||||||
gravity_spinup
|
gravity_spinup
|
||||||
gravity_Schwarzchild
|
gravity_Schwarzchild
|
||||||
|
150
pihole
150
pihole
@ -12,121 +12,59 @@
|
|||||||
|
|
||||||
# Must be root to use this tool
|
# Must be root to use this tool
|
||||||
if [[ ! $EUID -eq 0 ]];then
|
if [[ ! $EUID -eq 0 ]];then
|
||||||
#echo "::: You are root."
|
|
||||||
#else
|
|
||||||
#echo "::: Sudo will be used for this tool."
|
|
||||||
# Check if it is actually installed
|
|
||||||
# If it isn't, exit because the pihole cannot be invoked without privileges.
|
|
||||||
if [ -x "$(command -v sudo)" ];then
|
if [ -x "$(command -v sudo)" ];then
|
||||||
export SUDO="sudo"
|
exec sudo bash "$0" "$@"
|
||||||
|
exit $?
|
||||||
else
|
else
|
||||||
echo "::: Please install sudo or run this as root."
|
echo "::: sudo is needed to run pihole commands. Please run this script as root or install sudo."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
function whitelistFunc {
|
whitelistFunc() {
|
||||||
shift
|
shift
|
||||||
${SUDO} /opt/pihole/whitelist.sh "$@"
|
/opt/pihole/whitelist.sh "$@"
|
||||||
exit 1
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
function blacklistFunc {
|
blacklistFunc() {
|
||||||
shift
|
shift
|
||||||
${SUDO} /opt/pihole/blacklist.sh "$@"
|
/opt/pihole/blacklist.sh "$@"
|
||||||
exit 1
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
function debugFunc {
|
debugFunc() {
|
||||||
${SUDO} /opt/pihole/piholeDebug.sh
|
/opt/pihole/piholeDebug.sh
|
||||||
exit 1
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
function flushFunc {
|
flushFunc() {
|
||||||
${SUDO} /opt/pihole/piholeLogFlush.sh
|
/opt/pihole/piholeLogFlush.sh
|
||||||
exit 1
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function updatePiholeFunc {
|
updatePiholeFunc() {
|
||||||
|
/opt/pihole/update.sh
|
||||||
if [ ! -d "/etc/.pihole" ]; then #This is unlikely
|
exit 0
|
||||||
echo "::: Critical Error: Pi-Hole repo missing from system!"
|
|
||||||
echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole"
|
|
||||||
exit 1;
|
|
||||||
fi
|
|
||||||
if [ ! -d "/var/www/html/admin" ]; then #This is unlikely
|
|
||||||
echo "::: Critical Error: Pi-Hole repo missing from system!"
|
|
||||||
echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole"
|
|
||||||
exit 1;
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "::: Checking for updates..."
|
|
||||||
piholeVersion=$(cd /etc/.pihole/ && git describe --tags --abbrev=0)
|
|
||||||
piholeVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/pi-hole/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//')
|
|
||||||
|
|
||||||
webVersion=$(cd /var/www/html/admin/ && git describe --tags --abbrev=0)
|
|
||||||
webVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/AdminLTE/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//')
|
|
||||||
|
|
||||||
echo "::: Pi-hole version is $piholeVersion (Latest version is $piholeVersionLatest)"
|
|
||||||
echo "::: Web Admin version is $webVersion (Latest version is $webVersionLatest)"
|
|
||||||
echo ":::"
|
|
||||||
|
|
||||||
if [[ ${piholeVersion} == ${piholeVersionLatest} ]] ; then
|
|
||||||
echo "::: Pi-hole Base files are already up to date! Version: ${piholeVersionLatest}"
|
|
||||||
echo "::: No need to update!"
|
|
||||||
echo ":::"
|
|
||||||
|
|
||||||
if [[ ${webVersion} == ${webVersionLatest} ]] ; then
|
|
||||||
echo "::: Web Admin files are already up to date!"
|
|
||||||
echo "::: No need to update!"
|
|
||||||
echo ":::"
|
|
||||||
else
|
|
||||||
echo "::: An Update is available for the Web Admin!"
|
|
||||||
echo ":::"
|
|
||||||
echo "::: Fetching latest changes from GitHub..."
|
|
||||||
cd /var/www/html/admin
|
|
||||||
${SUDO} git pull origin master
|
|
||||||
echo ":::"
|
|
||||||
echo "::: Pi-hole Web Admin has been updated to ${webVersion}"
|
|
||||||
echo "::: See https://changes.pi-hole.net for details"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo -n "::: An update is available for "
|
|
||||||
if [[ ${webVersion} == ${webVersionLatest} ]] ; then
|
|
||||||
echo " Pi-Hole!"
|
|
||||||
else
|
|
||||||
echo " Pi-Hole base files and the Web Admin. Both will be updated!"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "::: Fetching latest changes from GitHub..."
|
|
||||||
cd /etc/.pihole
|
|
||||||
${SUDO} git pull origin master
|
|
||||||
${SUDO} /etc/.pihole/automated\ install/basic-install.sh pihole
|
|
||||||
|
|
||||||
echo ":::"
|
|
||||||
echo "::: Pi-hole has been updated to version ${piholeVersionLatest}"
|
|
||||||
if [[ ${webVersion} != ${webVersionLatest} ]] ; then
|
|
||||||
echo "::: Web Admin has been updated to version ${webVersionLatest}"
|
|
||||||
fi
|
|
||||||
echo ":::"
|
|
||||||
echo "::: See https://changes.pi-hole.net for details"
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 1
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateGravityFunc {
|
reconfigurePiholeFunc() {
|
||||||
${SUDO} /opt/pihole/gravity.sh "$@"
|
/etc/.pihole/automated\ install/basic-install.sh --reconfigure
|
||||||
exit 1
|
exit 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function setupLCDFunction {
|
updateGravityFunc() {
|
||||||
${SUDO} /opt/pihole/setupLCD.sh
|
/opt/pihole/gravity.sh "$@"
|
||||||
exit 1
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
function queryFunc {
|
setupLCDFunction() {
|
||||||
|
/opt/pihole/setupLCD.sh
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
queryFunc() {
|
||||||
domain=$2
|
domain=$2
|
||||||
for list in /etc/pihole/list.*
|
for list in /etc/pihole/list.*
|
||||||
do
|
do
|
||||||
@ -137,27 +75,28 @@ function queryFunc {
|
|||||||
fi
|
fi
|
||||||
echo ""
|
echo ""
|
||||||
done
|
done
|
||||||
exit 1
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
function chronometerFunc {
|
chronometerFunc() {
|
||||||
shift
|
shift
|
||||||
${SUDO} /opt/pihole/chronometer.sh "$@"
|
/opt/pihole/chronometer.sh "$@"
|
||||||
exit 1
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function uninstallFunc {
|
uninstallFunc() {
|
||||||
${SUDO} /opt/pihole/uninstall.sh
|
/opt/pihole/uninstall.sh
|
||||||
exit 1
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
function versionFunc {
|
versionFunc() {
|
||||||
${SUDO} /opt/pihole/version.sh
|
shift
|
||||||
exit 1
|
/opt/pihole/version.sh "$@"
|
||||||
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
function helpFunc {
|
helpFunc() {
|
||||||
echo "::: Control all PiHole specific functions!"
|
echo "::: Control all PiHole specific functions!"
|
||||||
echo ":::"
|
echo ":::"
|
||||||
echo "::: Usage: pihole [options]"
|
echo "::: Usage: pihole [options]"
|
||||||
@ -176,7 +115,7 @@ function helpFunc {
|
|||||||
echo "::: -v, version Show current versions"
|
echo "::: -v, version Show current versions"
|
||||||
echo "::: -q, query Query the adlists for a specific domain"
|
echo "::: -q, query Query the adlists for a specific domain"
|
||||||
echo "::: uninstall Uninstall Pi-Hole from your system :(!"
|
echo "::: uninstall Uninstall Pi-Hole from your system :(!"
|
||||||
exit 1
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
if [[ $# = 0 ]]; then
|
if [[ $# = 0 ]]; then
|
||||||
@ -190,11 +129,12 @@ case "$1" in
|
|||||||
"-d" | "debug" ) debugFunc;;
|
"-d" | "debug" ) debugFunc;;
|
||||||
"-f" | "flush" ) flushFunc;;
|
"-f" | "flush" ) flushFunc;;
|
||||||
"-up" | "updatePihole" ) updatePiholeFunc;;
|
"-up" | "updatePihole" ) updatePiholeFunc;;
|
||||||
|
"-r" | "reconfigure" ) reconfigurePiholeFunc;;
|
||||||
"-g" | "updateGravity" ) updateGravityFunc "$@";;
|
"-g" | "updateGravity" ) updateGravityFunc "$@";;
|
||||||
"-s" | "setupLCD" ) setupLCDFunction;;
|
"-s" | "setupLCD" ) setupLCDFunction;;
|
||||||
"-c" | "chronometer" ) chronometerFunc "$@";;
|
"-c" | "chronometer" ) chronometerFunc "$@";;
|
||||||
"-h" | "help" ) helpFunc;;
|
"-h" | "help" ) helpFunc;;
|
||||||
"-v" | "version" ) versionFunc;;
|
"-v" | "version" ) versionFunc "$@";;
|
||||||
"-q" | "query" ) queryFunc "$@";;
|
"-q" | "query" ) queryFunc "$@";;
|
||||||
"uninstall" ) uninstallFunc;;
|
"uninstall" ) uninstallFunc;;
|
||||||
* ) helpFunc;;
|
* ) helpFunc;;
|
||||||
|
Loading…
Reference in New Issue
Block a user