#!/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
# Calculates stats and displays to an LCD
#
# 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.


#Functions##############################################################################################################
piLog="/var/log/pihole.log"
gravity="/etc/pihole/gravity.list"

today=$(date "+%b %e")

CalcBlockedDomains() {
	CheckIPv6
	if [ -e "${gravity}" ]; then
		#Are we IPV6 or IPV4?
		if [[ -n ${piholeIPv6} ]]; then
			#We are IPV6
			blockedDomainsTotal=$(wc -l /etc/pihole/gravity.list | awk '{print $1/2}')
		else
			#We are IPV4
			blockedDomainsTotal=$(wc -l /etc/pihole/gravity.list | awk '{print $1}')
		fi
	else
		blockedDomainsTotal="Err."
	fi
}

CalcQueriesToday() {
	if [ -e "${piLog}" ]; then
		queriesToday=$(cat "${piLog}" | grep "${today}" | awk '/query/ {print $6}' | wc -l)
	else
		queriesToday="Err."
	fi
}

CalcblockedToday() {
	if [ -e "${piLog}" ] && [ -e "${gravity}" ];then
		blockedToday=$(cat ${piLog} | awk '/\/etc\/pihole\/gravity.list/ && !/address/ {print $6}' | wc -l)
	else
		blockedToday="Err."
	fi
}

CalcPercentBlockedToday() {
	if [ "${queriesToday}" != "Err." ] && [ "${blockedToday}" != "Err." ]; then
		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
			percentBlockedToday=$(echo "scale=4; ${blockedToday}/${queriesToday}*100" | bc)
			percentBlockedToday=$(sed 's/.\{2\}$//' <<< "${percentBlockedToday}")
		else
			percentBlockedToday=0
		fi
	fi
}

CheckIPv6() {
	piholeIPv6file="/etc/pihole/.useIPv6"
	if [[ -f ${piholeIPv6file} ]];then
		# If the file exists, then the user previously chose to use IPv6 in the automated installer
		piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }')
	fi
}

outputJSON() {
	CalcQueriesToday
	CalcblockedToday
	CalcPercentBlockedToday

	CalcBlockedDomains

	printf '{"domains_being_blocked":"%s","dns_queries_today":"%s","ads_blocked_today":"%s","ads_percentage_today":"%s"}\n' "$blockedDomainsTotal" "$queriesToday" "$blockedToday" "$percentBlockedToday"
}

normalChrono() {
	for (( ; ; )); do
		clear
		# Displays a colorful Pi-hole logo
		echo " ___ _     _        _"
		echo "| _ (_)___| |_  ___| |___"
		echo "|  _/ |___| ' \/ _ \ / -_)"
		echo "|_| |_|   |_||_\___/_\___|"
		echo ""
		echo "        $(ifconfig eth0 | awk '/inet addr/ {print $2}' | cut -d':' -f2)"
		echo ""
		uptime | cut -d' ' -f11-
		#uptime -p	#Doesn't work on all versions of uptime
		uptime | awk -F'( |,|:)+' '{if ($7=="min") m=$6; else {if ($7~/^day/) {d=$6;h=$8;m=$9} else {h=$6;m=$7}}} {print d+0,"days,",h+0,"hours,",m+0,"minutes."}'
		echo "-------------------------------"
		# Uncomment to continually read the log file and display the current domain being blocked
		#tail -f /var/log/pihole.log | awk '/\/etc\/pihole\/gravity.list/ {if ($7 != "address" && $7 != "name" && $7 != "/etc/pihole/gravity.list") print $7; else;}'

		#uncomment next 4 lines to use original query count calculation
		#today=$(date "+%b %e")
		#todaysQueryCount=$(cat /var/log/pihole.log | grep "$today" | awk '/query/ {print $7}' | wc -l)
		#todaysQueryCountV4=$(cat /var/log/pihole.log | grep "$today" | awk '/query/ && /\[A\]/ {print $7}' | wc -l)
		#todaysQueryCountV6=$(cat /var/log/pihole.log | grep "$today" | awk '/query/ && /\[AAAA\]/ {print $7}' | wc -l)


		CalcQueriesToday
		CalcblockedToday
		CalcPercentBlockedToday

		CalcBlockedDomains

		echo "Blocking:      ${blockedDomainsTotal}"
		#below commented line does not add up to todaysQueryCount
		#echo "Queries:       $todaysQueryCountV4 / $todaysQueryCountV6"
		echo "Queries:       ${queriesToday}" #same total calculation as dashboard
	  echo "Pi-holed:      ${blockedToday} (${percentBlockedToday}%)"

		sleep 5
	done
}

displayHelp() {
	cat << EOM
::: Displays stats about your piHole!
:::
::: Usage: sudo pihole -c [optional:-j]
::: Note: If no option is passed, then stats are displayed on screen, updated every 5 seconds
:::
::: Options:
:::  -j, --json		output stats as JSON formatted string
:::  -h, --help		display this help text
EOM
    exit 1
}

if [[ $# = 0 ]]; then
	normalChrono
fi

for var in "$@"; do
	case "$var" in
		"-j" | "--json"  ) outputJSON;;
		"-h" | "--help"  ) displayHelp;;
		*                ) exit 1;;
	esac
done