Merge branch 'feature/defensiveTweaks' of https://github.com/pi-hole/pi-hole into feature/defensiveTweaks

# Conflicts:
#	advanced/Scripts/update.sh
#	automated install/basic-install.sh
This commit is contained in:
Dan Schaper 2016-11-02 06:57:33 -07:00
commit 8b9f0487c0
4 changed files with 210 additions and 127 deletions

View file

@ -57,12 +57,14 @@ update_repo() {
getGitFiles() { getGitFiles() {
# Setup git repos for directory and repository passed # Setup git repos for directory and repository passed
# as arguments 1 and 2 # as arguments 1 and 2
local directory="${1}"
local remoteRepo="{$2}"
echo ":::" echo ":::"
echo "::: Checking for existing repository..." echo "::: Checking for existing repository..."
if is_repo "${1}"; then if is_repo "${directory}"; then
update_repo "${1}" update_repo "${directory}"
else else
make_repo "${1}" "${2}" make_repo "${directory}" "${remoteRepo}"
fi fi
} }

View file

@ -29,8 +29,9 @@ PI_HOLE_LOCAL_REPO="/etc/.pihole"
PI_HOLE_FILES=(chronometer list piholeDebug piholeLogFlush setupLCD update version) PI_HOLE_FILES=(chronometer list piholeDebug piholeLogFlush setupLCD update version)
useUpdateVars=false useUpdateVars=false
IPv4_address="" IPV4_ADDRESS=""
IPv6_address="" IPV6_ADDRESS=""
QUERY_LOGGING=true
# Find the rows and columns will default to 80x24 is it can not be detected # Find the rows and columns will default to 80x24 is it can not be detected
screen_size=$(stty size 2>/dev/null || echo 24 80) screen_size=$(stty size 2>/dev/null || echo 24 80)
@ -149,24 +150,27 @@ spinner() {
} }
is_repo() { is_repo() {
# Use git to check if directory is currently under VCS # Use git to check if directory is currently under VCS, return the value
echo -n "::: Checking $1 is a repo..." local directory="${1}"
cd "${1}" &> /dev/null || return 1 git -C "${directory}" status --short &> /dev/null
git status &> /dev/null && (echo " OK!"; true) || (echo " not found!"; false) return
} }
make_repo() { make_repo() {
local directory="${1}"
local remoteRepo="${2}"
# 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 $remoteRepo into $directory..."
rm -rf "${1}" rm -rf "${directory}"
git clone -q --depth 1 "${2}" "${1}" > /dev/null & spinner $! git clone -q --depth 1 "${remoteRepo}" "${directory}" > /dev/null & spinner $!
echo " done!" echo " done!"
} }
update_repo() { update_repo() {
local directory="${1}"
# Pull the latest commits # Pull the latest commits
echo -n "::: Updating repo in $1..." echo -n "::: Updating repo in $1..."
cd "${1}" || exit 1 cd "${directory}" || exit 1
git stash -q > /dev/null & spinner $! git stash -q > /dev/null & spinner $!
git pull -q > /dev/null & spinner $! git pull -q > /dev/null & spinner $!
echo " done!" echo " done!"
@ -175,19 +179,21 @@ update_repo() {
getGitFiles() { getGitFiles() {
# Setup git repos for directory and repository passed # Setup git repos for directory and repository passed
# as arguments 1 and 2 # as arguments 1 and 2
local directory="${1}"
local remoteRepo="${2}"
echo ":::" echo ":::"
echo "::: Checking for existing repository..." echo "::: Checking for existing repository..."
if is_repo "${1}"; then if is_repo "${directory}"; then
update_repo "${1}" update_repo "${directory}"
else else
make_repo "${1}" "${2}" make_repo "${directory}" "${remoteRepo}"
fi fi
} }
find_IPv4_information() { 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)}')
IPv4_address=$(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}')
} }
@ -269,8 +275,8 @@ chooseInterface() {
chooseInterfaceOptions=$("${chooseInterfaceCmd[@]}" "${interfacesArray[@]}" 2>&1 >/dev/tty) chooseInterfaceOptions=$("${chooseInterfaceCmd[@]}" "${interfacesArray[@]}" 2>&1 >/dev/tty)
if [[ $? = 0 ]]; then if [[ $? = 0 ]]; then
for desiredInterface in ${chooseInterfaceOptions}; do for desiredInterface in ${chooseInterfaceOptions}; do
piholeInterface=${desiredInterface} PIHOLE_INTERFACE=${desiredInterface}
echo "::: Using interface: $piholeInterface" echo "::: Using interface: $PIHOLE_INTERFACE"
done done
else else
echo "::: Cancel selected, exiting...." echo "::: Cancel selected, exiting...."
@ -280,8 +286,8 @@ chooseInterface() {
useIPv6dialog() { useIPv6dialog() {
# Show the IPv6 address used for blocking # 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) }') 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} whiptail --msgbox --backtitle "IPv6..." --title "IPv6 Supported" "$IPV6_ADDRESS will be used to block ads." ${r} ${c}
} }
@ -309,8 +315,8 @@ use4andor6() {
if [[ ${useIPv6} ]]; then if [[ ${useIPv6} ]]; then
useIPv6dialog useIPv6dialog
fi fi
echo "::: IPv4 address: ${IPv4_address}" echo "::: IPv4 address: ${IPV4_ADDRESS}"
echo "::: IPv6 address: ${IPv6_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"
@ -325,7 +331,7 @@ use4andor6() {
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: ${IPv4_address} 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.
@ -338,16 +344,16 @@ It is also possible to use a DHCP reservation, but if you are going to do that,
# Start a loop to let the user enter their information with the chance to go back and edit it if necessary # Start a loop to let the user enter their information with the chance to go back and edit it if necessary
until [[ ${ipSettingsCorrect} = True ]]; do until [[ ${ipSettingsCorrect} = True ]]; do
# Ask for the IPv4 address # Ask for the IPv4 address
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) 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: ${IPv4_address}" 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: ${IPv4_address} 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
@ -374,8 +380,8 @@ 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 ${PIHOLE_INTERFACE}
static ip_address=${IPv4_address} 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
} }
@ -386,45 +392,45 @@ setStaticIPv4() {
local CIDR local CIDR
if [[ -f /etc/dhcpcd.conf ]]; then if [[ -f /etc/dhcpcd.conf ]]; then
# Debian Family # Debian Family
if grep -q "${IPv4_address}" /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}" "${IPv4_address}" ip addr replace dev "${PIHOLE_INTERFACE}" "${IPV4_ADDRESS}"
echo ":::" echo ":::"
echo "::: Setting IP to ${IPv4_address}. 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-${PIHOLE_INTERFACE} ]];then
# Fedora Family # Fedora Family
IFCFG_FILE=/etc/sysconfig/network-scripts/ifcfg-${piholeInterface} IFCFG_FILE=/etc/sysconfig/network-scripts/ifcfg-${PIHOLE_INTERFACE}
if grep -q "${IPv4_address}" "${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 "${IPv4_address}" | cut -f1 -d/) IPADDR=$(echo "${IPV4_ADDRESS}" | cut -f1 -d/)
CIDR=$(echo "${IPv4_address}" | cut -f2 -d/) CIDR=$(echo "${IPV4_ADDRESS}" | cut -f2 -d/)
# Backup existing interface configuration: # Backup existing interface configuration:
cp "${IFCFG_FILE}" "${IFCFG_FILE}".pihole.orig cp "${IFCFG_FILE}" "${IFCFG_FILE}".pihole.orig
# Build Interface configuration file: # Build Interface configuration file:
{ {
echo "# Configured via Pi-Hole installer" echo "# Configured via Pi-Hole installer"
echo "DEVICE=$piholeInterface" echo "DEVICE=$PIHOLE_INTERFACE"
echo "BOOTPROTO=none" echo "BOOTPROTO=none"
echo "ONBOOT=yes" echo "ONBOOT=yes"
echo "IPADDR=$IPADDR" echo "IPADDR=$IPADDR"
echo "PREFIX=$CIDR" echo "PREFIX=$CIDR"
echo "GATEWAY=$IPv4gw" echo "GATEWAY=$IPv4gw"
echo "DNS1=$piholeDNS1" echo "DNS1=$PIHOLE_DNS_1"
echo "DNS2=$piholeDNS2" echo "DNS2=$PIHOLE_DNS_2"
echo "USERCTL=no" echo "USERCTL=no"
}>> "${IFCFG_FILE}" }>> "${IFCFG_FILE}"
ip addr replace dev "${piholeInterface}" "${IPv4_address}" ip addr replace dev "${PIHOLE_INTERFACE}" "${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 ${IPv4_address}. 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
@ -462,70 +468,70 @@ setDNS() {
case ${DNSchoices} in case ${DNSchoices} in
Google) Google)
echo "::: Using Google DNS servers." echo "::: Using Google DNS servers."
piholeDNS1="8.8.8.8" PIHOLE_DNS_1="8.8.8.8"
piholeDNS2="8.8.4.4" PIHOLE_DNS_2="8.8.4.4"
;; ;;
OpenDNS) OpenDNS)
echo "::: Using OpenDNS servers." echo "::: Using OpenDNS servers."
piholeDNS1="208.67.222.222" PIHOLE_DNS_1="208.67.222.222"
piholeDNS2="208.67.220.220" PIHOLE_DNS_2="208.67.220.220"
;; ;;
Level3) Level3)
echo "::: Using Level3 servers." echo "::: Using Level3 servers."
piholeDNS1="4.2.2.1" PIHOLE_DNS_1="4.2.2.1"
piholeDNS2="4.2.2.2" PIHOLE_DNS_2="4.2.2.2"
;; ;;
Norton) Norton)
echo "::: Using Norton ConnectSafe servers." echo "::: Using Norton ConnectSafe servers."
piholeDNS1="199.85.126.10" PIHOLE_DNS_1="199.85.126.10"
piholeDNS2="199.85.127.10" PIHOLE_DNS_2="199.85.127.10"
;; ;;
Comodo) Comodo)
echo "::: Using Comodo Secure servers." echo "::: Using Comodo Secure servers."
piholeDNS1="8.26.56.26" PIHOLE_DNS_1="8.26.56.26"
piholeDNS2="8.20.247.20" PIHOLE_DNS_2="8.20.247.20"
;; ;;
Custom) Custom)
until [[ ${DNSSettingsCorrect} = True ]]; do until [[ ${DNSSettingsCorrect} = True ]]; do
strInvalid="Invalid" strInvalid="Invalid"
if [ ! ${piholeDNS1} ]; then if [ ! ${PIHOLE_DNS_1} ]; then
if [ ! ${piholeDNS2} ]; then if [ ! ${PIHOLE_DNS_2} ]; then
prePopulate="" prePopulate=""
else else
prePopulate=", ${piholeDNS2}" prePopulate=", ${PIHOLE_DNS_2}"
fi fi
elif [ ${piholeDNS1} ] && [ ! ${piholeDNS2} ]; then elif [ ${PIHOLE_DNS_1} ] && [ ! ${PIHOLE_DNS_2} ]; then
prePopulate="${piholeDNS1}" prePopulate="${PIHOLE_DNS_1}"
elif [ ${piholeDNS1} ] && [ ${piholeDNS2} ]; then elif [ ${PIHOLE_DNS_1} ] && [ ${PIHOLE_DNS_2} ]; then
prePopulate="${piholeDNS1}, ${piholeDNS2}" prePopulate="${PIHOLE_DNS_1}, ${PIHOLE_DNS_2}"
fi fi
piholeDNS=$(whiptail --backtitle "Specify Upstream DNS Provider(s)" --inputbox "Enter your desired upstream DNS provider(s), seperated by a comma.\n\nFor example '8.8.8.8, 8.8.4.4'" ${r} ${c} "${prePopulate}" 3>&1 1>&2 2>&3) piholeDNS=$(whiptail --backtitle "Specify Upstream DNS Provider(s)" --inputbox "Enter your desired upstream DNS provider(s), seperated by a comma.\n\nFor example '8.8.8.8, 8.8.4.4'" ${r} ${c} "${prePopulate}" 3>&1 1>&2 2>&3)
if [[ $? = 0 ]]; then if [[ $? = 0 ]]; then
piholeDNS1=$(echo "${piholeDNS}" | sed 's/[, \t]\+/,/g' | awk -F, '{print$1}') PIHOLE_DNS_1=$(echo "${piholeDNS}" | sed 's/[, \t]\+/,/g' | awk -F, '{print$1}')
piholeDNS2=$(echo "${piholeDNS}" | sed 's/[, \t]\+/,/g' | awk -F, '{print$2}') PIHOLE_DNS_2=$(echo "${piholeDNS}" | sed 's/[, \t]\+/,/g' | awk -F, '{print$2}')
if ! valid_ip "${piholeDNS1}" || [ ! "${piholeDNS1}" ]; then if ! valid_ip "${PIHOLE_DNS_1}" || [ ! "${PIHOLE_DNS_1}" ]; then
piholeDNS1=${strInvalid} PIHOLE_DNS_1=${strInvalid}
fi fi
if ! valid_ip "${piholeDNS2}" && [ "${piholeDNS2}" ]; then if ! valid_ip "${PIHOLE_DNS_2}" && [ "${PIHOLE_DNS_2}" ]; then
piholeDNS2=${strInvalid} PIHOLE_DNS_2=${strInvalid}
fi fi
else else
echo "::: Cancel selected, exiting...." echo "::: Cancel selected, exiting...."
exit 1 exit 1
fi fi
if [[ ${piholeDNS1} == "${strInvalid}" ]] || [[ ${piholeDNS2} == "${strInvalid}" ]]; then if [[ ${PIHOLE_DNS_1} == "${strInvalid}" ]] || [[ ${PIHOLE_DNS_2} == "${strInvalid}" ]]; then
whiptail --msgbox --backtitle "Invalid IP" --title "Invalid IP" "One or both entered IP addresses were invalid. Please try again.\n\n DNS Server 1: $piholeDNS1\n DNS Server 2: ${piholeDNS2}" ${r} ${c} whiptail --msgbox --backtitle "Invalid IP" --title "Invalid IP" "One or both entered IP addresses were invalid. Please try again.\n\n DNS Server 1: $PIHOLE_DNS_1\n DNS Server 2: ${PIHOLE_DNS_2}" ${r} ${c}
if [[ ${piholeDNS1} == "${strInvalid}" ]]; then if [[ ${PIHOLE_DNS_1} == "${strInvalid}" ]]; then
piholeDNS1="" PIHOLE_DNS_1=""
fi fi
if [[ ${piholeDNS2} == "${strInvalid}" ]]; then if [[ ${PIHOLE_DNS_2} == "${strInvalid}" ]]; then
piholeDNS2="" PIHOLE_DNS_2=""
fi fi
DNSSettingsCorrect=False DNSSettingsCorrect=False
else else
if (whiptail --backtitle "Specify Upstream DNS Provider(s)" --title "Upstream DNS Provider(s)" --yesno "Are these settings correct?\n DNS Server 1: $piholeDNS1\n DNS Server 2: ${piholeDNS2}" ${r} ${c}); then if (whiptail --backtitle "Specify Upstream DNS Provider(s)" --title "Upstream DNS Provider(s)" --yesno "Are these settings correct?\n DNS Server 1: $PIHOLE_DNS_1\n DNS Server 2: ${PIHOLE_DNS_2}" ${r} ${c}); then
DNSSettingsCorrect=True DNSSettingsCorrect=True
else else
# If the settings are wrong, the loop continues # If the settings are wrong, the loop continues
@ -541,6 +547,28 @@ setDNS() {
fi fi
} }
setLogging() {
local LogToggleCommand
local LogChooseOptions
local LogChoices
LogToggleCommand=(whiptail --separate-output --radiolist "Do you want to log queries?\n (Disabling will render graphs on the Admin page useless):" ${r} ${c} 6)
LogChooseOptions=("On (Reccomended)" "" on
Off "" off)
LogChoices=$("${LogToggleCommand[@]}" "${LogChooseOptions[@]}" 2>&1 >/dev/tty) || (echo "::: Cancel selected. Exiting..." && exit 1)
case ${LogChoices} in
"On (Recommended)")
echo "::: Logging On."
QUERY_LOGGING=true
;;
Off)
echo "::: Logging Off."
QUERY_LOGGING=false
;;
esac
}
version_check_dnsmasq() { 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
local dnsmasq_conf="/etc/dnsmasq.conf" local dnsmasq_conf="/etc/dnsmasq.conf"
@ -572,14 +600,14 @@ version_check_dnsmasq() {
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 ${dnsmasq_pihole_01_snippet} ${dnsmasq_pihole_01_location} cp ${dnsmasq_pihole_01_snippet} ${dnsmasq_pihole_01_location}
echo " done." echo " done."
sed -i "s/@INT@/$piholeInterface/" ${dnsmasq_pihole_01_location} sed -i "s/@INT@/$PIHOLE_INTERFACE/" ${dnsmasq_pihole_01_location}
if [[ "${piholeDNS1}" != "" ]]; then if [[ "${PIHOLE_DNS_1}" != "" ]]; then
sed -i "s/@DNS1@/$piholeDNS1/" ${dnsmasq_pihole_01_location} sed -i "s/@DNS1@/$PIHOLE_DNS_1/" ${dnsmasq_pihole_01_location}
else else
sed -i '/^server=@DNS1@/d' ${dnsmasq_pihole_01_location} sed -i '/^server=@DNS1@/d' ${dnsmasq_pihole_01_location}
fi fi
if [[ "${piholeDNS2}" != "" ]]; then if [[ "${PIHOLE_DNS_2}" != "" ]]; then
sed -i "s/@DNS2@/$piholeDNS2/" ${dnsmasq_pihole_01_location} sed -i "s/@DNS2@/$PIHOLE_DNS_2/" ${dnsmasq_pihole_01_location}
else else
sed -i '/^server=@DNS2@/d' ${dnsmasq_pihole_01_location} sed -i '/^server=@DNS2@/d' ${dnsmasq_pihole_01_location}
fi fi
@ -593,16 +621,16 @@ version_check_dnsmasq() {
fi fi
#Replace IPv4 and IPv6 tokens in 01-pihole.conf for pi.hole resolution. #Replace IPv4 and IPv6 tokens in 01-pihole.conf for pi.hole resolution.
if [[ "${IPv4_address}" != "" ]]; then if [[ "${IPV4_ADDRESS}" != "" ]]; then
tmp=${IPv4_address%/*} tmp=${IPV4_ADDRESS%/*}
sed -i "s/@IPv4@/$tmp/" ${dnsmasq_pihole_01_location} sed -i "s/@IPv4@/$tmp/" ${dnsmasq_pihole_01_location}
else else
sed -i '/^address=\/pi.hole\/@IPv4@/d' ${dnsmasq_pihole_01_location} sed -i '/^address=\/pi.hole\/@IPv4@/d' ${dnsmasq_pihole_01_location}
sed -i '/^address=\/@HOSTNAME@\/@IPv4@/d' ${dnsmasq_pihole_01_location} sed -i '/^address=\/@HOSTNAME@\/@IPv4@/d' ${dnsmasq_pihole_01_location}
fi fi
if [[ "${IPv6_address}" != "" ]]; then if [[ "${IPV6_ADDRESS}" != "" ]]; then
sed -i "s/@IPv6@/$IPv6_address/" ${dnsmasq_pihole_01_location} sed -i "s/@IPv6@/$IPV6_ADDRESS/" ${dnsmasq_pihole_01_location}
else else
sed -i '/^address=\/pi.hole\/@IPv6@/d' ${dnsmasq_pihole_01_location} sed -i '/^address=\/pi.hole\/@IPv6@/d' ${dnsmasq_pihole_01_location}
sed -i '/^address=\/@HOSTNAME@\/@IPv6@/d' ${dnsmasq_pihole_01_location} sed -i '/^address=\/@HOSTNAME@\/@IPv6@/d' ${dnsmasq_pihole_01_location}
@ -615,6 +643,14 @@ version_check_dnsmasq() {
fi fi
sed -i 's/^#conf-dir=\/etc\/dnsmasq.d$/conf-dir=\/etc\/dnsmasq.d/' ${dnsmasq_conf} sed -i 's/^#conf-dir=\/etc\/dnsmasq.d$/conf-dir=\/etc\/dnsmasq.d/' ${dnsmasq_conf}
if [[ "${QUERY_LOGGING}" == false ]] ; then
#Disable Logging
sed -i 's/^log-queries/#log-queries/' ${dnsmasq_pihole_01_location}
else
#Enable Logging
sed -i 's/^#log-queries/log-queries/' ${dnsmasq_pihole_01_location}
fi
} }
remove_legacy_scripts() { remove_legacy_scripts() {
@ -644,13 +680,13 @@ installScripts() {
readonly install_dir="/opt/pihole/" readonly install_dir="/opt/pihole/"
echo ":::" echo ":::"
echo -n "::: Installing scripts to ${PI_HOLE_LOCAL_REPO}..." echo -n "::: Installing scripts from ${PI_HOLE_LOCAL_REPO}..."
# Clear out script files from Pi-hole scripts directory. # Clear out script files from Pi-hole scripts directory.
clean_existing "${install_dir}" "${PI_HOLE_FILES}" clean_existing "${install_dir}" "${PI_HOLE_FILES}"
# Install files from local core repository # Install files from local core repository
if [[ $(is_repo "${PI_HOLE_LOCAL_REPO}") ]]; then if is_repo "${PI_HOLE_LOCAL_REPO}"; then
cd "${PI_HOLE_LOCAL_REPO}" cd "${PI_HOLE_LOCAL_REPO}"
install -o "${USER}" -Dm755 -t /opt/pihole/ gravity.sh install -o "${USER}" -Dm755 -t /opt/pihole/ gravity.sh
install -o "${USER}" -Dm755 -t /opt/pihole/ ./advanced/Scripts/*.sh install -o "${USER}" -Dm755 -t /opt/pihole/ ./advanced/Scripts/*.sh
@ -854,11 +890,12 @@ finalExports() {
rm ${setupVars} rm ${setupVars}
fi fi
{ {
echo "piholeInterface=${piholeInterface}" echo "PIHOLE_INTERFACE=${PIHOLE_INTERFACE}"
echo "IPv4_address=${IPv4_address}" echo "IPV4_ADDRESS=${IPV4_ADDRESS}"
echo "IPv6_address=${IPv6_address}" echo "IPV6_ADDRESS=${IPV6_ADDRESS}"
echo "piholeDNS1=${piholeDNS1}" echo "PIHOLE_DNS_1=${PIHOLE_DNS_1}"
echo "piholeDNS2=${piholeDNS2}" echo "PIHOLE_DNS_2=${PIHOLE_DNS_2}"
echo "QUERY_LOGGING=${QUERY_LOGGING}"
}>> "${setupVars}" }>> "${setupVars}"
} }
@ -887,10 +924,24 @@ installPihole() {
runGravity runGravity
} }
updatePihole() { accountForRefactor() {
# At some point in the future this list can be pruned, for now we'll need it to ensure updates don't break.
# Refactoring of install script has changed the name of a couple of variables. Sort them out here. # 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/IPv4addr/IPv4_address/g' ${setupVars}
sed -i 's/piholeIPv6/IPv6_address/g' ${setupVars} sed -i 's/piholeIPv6/IPv6_address/g' ${setupVars}
# Account for renaming of global variables.
sed -i 's/piholeInterface/PIHOLE_INTERFACE/g' ${setupVars}
sed -i 's/IPv4_address/IPV4_ADDRESS/g' ${setupVars}
sed -i 's/IPv6_address/IPV6_ADDRESS/g' ${setupVars}
sed -i 's/piholeDNS1/PIHOLE_DNS_1/g' ${setupVars}
sed -i 's/piholeDNS2/PIHOLE_DNS_2/g' ${setupVars}
}
updatePihole() {
accountForRefactor
# Source ${setupVars} for use in the rest of the functions. # Source ${setupVars} for use in the rest of the functions.
. ${setupVars} . ${setupVars}
# Install base files and web interface # Install base files and web interface
@ -901,6 +952,7 @@ updatePihole() {
installPiholeWeb installPiholeWeb
installCron installCron
configureFirewall configureFirewall
finalExports #re-export setupVars.conf to account for any new vars added in new versions
runGravity runGravity
} }
@ -928,13 +980,13 @@ 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: ${IPv4_address%/*} IPv4: ${IPV4_ADDRESS%/*}
IPv6: ${IPv6_address} 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://${IPv4_address%/*}/admin" ${r} ${c} View the web interface at http://pi.hole/admin or http://${IPV4_ADDRESS%/*}/admin" ${r} ${c}
} }
update_dialogs() { update_dialogs() {
@ -1038,6 +1090,12 @@ main() {
use4andor6 use4andor6
# Decide what upstream DNS Servers to use # Decide what upstream DNS Servers to use
setDNS setDNS
# Let the user decide if they want query logging enabled...
setLogging
# Install packages used by the Pi-hole
install_dependent_packages PIHOLE_DEPS[@]
# Install and log everything to a file # Install and log everything to a file
installPihole | tee ${tmpLog} installPihole | tee ${tmpLog}
else else
@ -1062,8 +1120,8 @@ main() {
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 "::: ${IPv4_address%/*}" echo "::: ${IPV4_ADDRESS%/*}"
echo "::: ${IPv6_address}" 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
@ -1072,7 +1130,7 @@ main() {
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://${IPv4_address%/*}/admin" echo "::: View the web interface at http://pi.hole/admin or http://${IPV4_ADDRESS%/*}/admin"
} }
main "$@" main "$@"

View file

@ -44,7 +44,7 @@ else
fi fi
#Remove the /* from the end of the IPv4addr. #Remove the /* from the end of the IPv4addr.
IPv4_address=${IPv4_address%/*} IPV4_ADDRESS=${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
@ -242,22 +242,22 @@ 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..."
# Check vars from setupVars.conf to see if we're using IPv4, IPv6, Or both. # Check vars from setupVars.conf to see if we're using IPv4, IPv6, Or both.
if [[ -n "${IPv4_address}" && -n "${IPv6_address}" ]];then if [[ -n "${IPV4_ADDRESS}" && -n "${IPV6_ADDRESS}" ]];then
# Both IPv4 and IPv6 # Both IPv4 and IPv6
cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPv4_address" -v ipv6addr="$IPv6_address" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc} cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPV4_ADDRESS" -v ipv6addr="$IPV6_ADDRESS" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc}
elif [[ -n "${IPv4_address}" && -z "${IPv6_address}" ]];then elif [[ -n "${IPV4_ADDRESS}" && -z "${IPV6_ADDRESS}" ]];then
# Only IPv4 # Only IPv4
cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPv4_address" '{sub(/\r$/,""); print ipv4addr" "$0}' >> ${piholeDir}/${accretionDisc} cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPV4_ADDRESS" '{sub(/\r$/,""); print ipv4addr" "$0}' >> ${piholeDir}/${accretionDisc}
elif [[ -z "${IPv4_address}" && -n "${IPv6_address}" ]];then elif [[ -z "${IPV4_ADDRESS}" && -n "${IPV6_ADDRESS}" ]];then
# Only IPv6 # Only IPv6
cat ${piholeDir}/${eventHorizon} | awk -v ipv6addr="$IPv6_address" '{sub(/\r$/,""); print ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc} cat ${piholeDir}/${eventHorizon} | awk -v ipv6addr="$IPV6_ADDRESS" '{sub(/\r$/,""); print ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc}
elif [[ -z "${IPv4_address}" && -z "${IPv6_address}" ]];then elif [[ -z "${IPV4_ADDRESS}" && -z "${IPV6_ADDRESS}" ]];then
echo "::: No IP Values found! Please run 'pihole -r' and choose reconfigure to restore values" echo "::: No IP Values found! Please run 'pihole -r' and choose reconfigure to restore values"
exit 1 exit 1
fi fi

23
pihole
View file

@ -125,6 +125,27 @@ piholeEnable() {
restartDNS restartDNS
} }
piholeLogging() {
shift
if [[ "${1}" == "off" ]] ; then
#Disable Logging
sed -i 's/^log-queries/#log-queries/' /etc/dnsmasq.d/01-pihole.conf
sed -i 's/^QUERY_LOGGING=true/QUERY_LOGGING=false/' /etc/pihole/setupVars.conf
pihole -f
echo "::: Logging has been disabled!"
elif [[ "${1}" == "on" ]] ; then
#Enable logging
sed -i 's/^#log-queries/log-queries/' /etc/dnsmasq.d/01-pihole.conf
sed -i 's/^QUERY_LOGGING=false/QUERY_LOGGING=true/' /etc/pihole/setupVars.conf
echo "::: Logging has been enabled!"
else
echo "::: Invalid option passed, please pass 'on' or 'off'"
exit 1
fi
restartDNS
}
piholeStatus() { piholeStatus() {
if [[ $(cat /etc/dnsmasq.d/01-pihole.conf | grep "#addn-hosts=/") ]] ; then if [[ $(cat /etc/dnsmasq.d/01-pihole.conf | grep "#addn-hosts=/") ]] ; then
#list is commented out #list is commented out
@ -173,6 +194,7 @@ helpFunc() {
::: -h, help Show this help dialog ::: -h, help Show this help dialog
::: -v, version Show current versions ::: -v, version Show current versions
::: -q, query Query the adlists for a specific domain ::: -q, query Query the adlists for a specific domain
::: -l, logging Enable or Disable logging (pass 'on' or 'off')
::: uninstall Uninstall Pi-Hole from your system :(! ::: uninstall Uninstall Pi-Hole from your system :(!
::: status Is Pi-Hole Enabled or Disabled ::: status Is Pi-Hole Enabled or Disabled
::: enable Enable Pi-Hole DNS Blocking ::: enable Enable Pi-Hole DNS Blocking
@ -200,6 +222,7 @@ case "${1}" in
"-h" | "help" ) helpFunc;; "-h" | "help" ) helpFunc;;
"-v" | "version" ) versionFunc "$@";; "-v" | "version" ) versionFunc "$@";;
"-q" | "query" ) queryFunc "$@";; "-q" | "query" ) queryFunc "$@";;
"-l" | "logging" ) piholeLogging "$@";;
"uninstall" ) uninstallFunc;; "uninstall" ) uninstallFunc;;
"enable" ) piholeEnable 1;; "enable" ) piholeEnable 1;;
"disable" ) piholeEnable 0;; "disable" ) piholeEnable 0;;