mirror of
https://github.com/pi-hole/pi-hole.git
synced 2024-11-21 21:53:43 +00:00
Remove Chronometer
Signed-off-by: Christian König <ckoenig@posteo.de>
This commit is contained in:
parent
96640ea2c8
commit
46ff257344
5 changed files with 5 additions and 594 deletions
|
@ -1,569 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
# shellcheck disable=SC1090,SC1091
|
|
||||||
# Pi-hole: A black hole for Internet advertisements
|
|
||||||
# (c) 2017 Pi-hole, LLC (https://pi-hole.net)
|
|
||||||
# Network-wide ad blocking via your own hardware.
|
|
||||||
#
|
|
||||||
# Calculates stats and displays to an LCD
|
|
||||||
#
|
|
||||||
# This file is copyright under the latest version of the EUPL.
|
|
||||||
# Please see LICENSE file for your rights under this license.
|
|
||||||
LC_ALL=C
|
|
||||||
LC_NUMERIC=C
|
|
||||||
|
|
||||||
# Retrieve stats from FTL engine
|
|
||||||
pihole-FTL() {
|
|
||||||
local ftl_port LINE
|
|
||||||
# shellcheck disable=SC1091
|
|
||||||
. /opt/pihole/utils.sh
|
|
||||||
ftl_port=$(getFTLConfigValue dns.port)
|
|
||||||
if [[ -n "$ftl_port" ]]; then
|
|
||||||
# Open connection to FTL
|
|
||||||
exec 3<>"/dev/tcp/127.0.0.1/$ftl_port"
|
|
||||||
|
|
||||||
# Test if connection is open
|
|
||||||
if { "true" >&3; } 2> /dev/null; then
|
|
||||||
# Send command to FTL and ask to quit when finished
|
|
||||||
echo -e ">$1 >quit" >&3
|
|
||||||
|
|
||||||
# Read input until we received an empty string and the connection is
|
|
||||||
# closed
|
|
||||||
read -r -t 1 LINE <&3
|
|
||||||
until [[ -z "${LINE}" ]] && [[ ! -t 3 ]]; do
|
|
||||||
echo "$LINE" >&1
|
|
||||||
read -r -t 1 LINE <&3
|
|
||||||
done
|
|
||||||
|
|
||||||
# Close connection
|
|
||||||
exec 3>&-
|
|
||||||
exec 3<&-
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "0"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Print spaces to align right-side additional text
|
|
||||||
printFunc() {
|
|
||||||
local text_last
|
|
||||||
|
|
||||||
title="$1"
|
|
||||||
title_len="${#title}"
|
|
||||||
|
|
||||||
text_main="$2"
|
|
||||||
text_main_nocol="$text_main"
|
|
||||||
if [[ "${text_main:0:1}" == "" ]]; then
|
|
||||||
text_main_nocol=$(sed 's/\[[0-9;]\{1,5\}m//g' <<< "$text_main")
|
|
||||||
fi
|
|
||||||
text_main_len="${#text_main_nocol}"
|
|
||||||
|
|
||||||
text_addn="$3"
|
|
||||||
if [[ "$text_addn" == "last" ]]; then
|
|
||||||
text_addn=""
|
|
||||||
text_last="true"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# If there is additional text, define max length of text_main
|
|
||||||
if [[ -n "$text_addn" ]]; then
|
|
||||||
case "$scr_cols" in
|
|
||||||
[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-4]) text_main_max_len="9";;
|
|
||||||
4[5-9]) text_main_max_len="14";;
|
|
||||||
*) text_main_max_len="19";;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
[[ -z "$text_addn" ]] && text_main_max_len="$(( scr_cols - title_len ))"
|
|
||||||
|
|
||||||
# Remove excess characters from main text
|
|
||||||
if [[ "$text_main_len" -gt "$text_main_max_len" ]]; then
|
|
||||||
# Trim text without colors
|
|
||||||
text_main_trim="${text_main_nocol:0:$text_main_max_len}"
|
|
||||||
# Replace with trimmed text
|
|
||||||
text_main="${text_main/$text_main_nocol/$text_main_trim}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Determine amount of spaces for each line
|
|
||||||
if [[ -n "$text_last" ]]; then
|
|
||||||
# Move cursor to end of screen
|
|
||||||
spc_num=$(( scr_cols - ( title_len + text_main_len ) ))
|
|
||||||
else
|
|
||||||
spc_num=$(( text_main_max_len - text_main_len ))
|
|
||||||
fi
|
|
||||||
|
|
||||||
[[ "$spc_num" -le 0 ]] && spc_num="0"
|
|
||||||
spc=$(printf "%${spc_num}s")
|
|
||||||
#spc="${spc// /.}" # Debug: Visualize spaces
|
|
||||||
|
|
||||||
printf "%s%s$spc" "$title" "$text_main"
|
|
||||||
|
|
||||||
if [[ -n "$text_addn" ]]; then
|
|
||||||
printf "%s(%s)%s\\n" "$COL_NC$COL_DARK_GRAY" "$text_addn" "$COL_NC"
|
|
||||||
else
|
|
||||||
# Do not print trailing newline on final line
|
|
||||||
[[ -z "$text_last" ]] && printf "%s\\n" "$COL_NC"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Perform on first Chrono run (not for JSON formatted string)
|
|
||||||
get_init_stats() {
|
|
||||||
calcFunc(){ awk "BEGIN {print $*}" 2> /dev/null; }
|
|
||||||
|
|
||||||
# Convert bytes to human-readable format
|
|
||||||
hrBytes() {
|
|
||||||
awk '{
|
|
||||||
num=$1;
|
|
||||||
if(num==0) {
|
|
||||||
print "0 B"
|
|
||||||
} else {
|
|
||||||
xxx=(num<0?-num:num)
|
|
||||||
sss=(num<0?-1:1)
|
|
||||||
split("B KB MB GB TB PB",type)
|
|
||||||
for(i=5;yyy < 1;i--) {
|
|
||||||
yyy=xxx / (2^(10*i))
|
|
||||||
}
|
|
||||||
printf "%.0f " type[i+2], yyy*sss
|
|
||||||
}
|
|
||||||
}' <<< "$1";
|
|
||||||
}
|
|
||||||
|
|
||||||
# Convert seconds to human-readable format
|
|
||||||
hrSecs() {
|
|
||||||
day=$(( $1/60/60/24 )); hrs=$(( $1/3600%24 ))
|
|
||||||
mins=$(( ($1%3600)/60 )); secs=$(( $1%60 ))
|
|
||||||
[[ "$day" -ge "2" ]] && plu="s"
|
|
||||||
[[ "$day" -ge "1" ]] && days="$day day${plu}, " || days=""
|
|
||||||
printf "%s%02d:%02d:%02d\\n" "$days" "$hrs" "$mins" "$secs"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Set Color Codes
|
|
||||||
coltable="/opt/pihole/COL_TABLE"
|
|
||||||
if [[ -f "${coltable}" ]]; then
|
|
||||||
source ${coltable}
|
|
||||||
else
|
|
||||||
COL_NC="[0m"
|
|
||||||
COL_DARK_GRAY="[1;30m"
|
|
||||||
COL_LIGHT_GREEN="[1;32m"
|
|
||||||
COL_LIGHT_BLUE="[1;34m"
|
|
||||||
COL_LIGHT_RED="[1;31m"
|
|
||||||
COL_YELLOW="[1;33m"
|
|
||||||
COL_LIGHT_RED="[1;31m"
|
|
||||||
COL_URG_RED="[39;41m"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Get RPi throttle state (RPi 3B only) & model number, or OS distro info
|
|
||||||
if command -v vcgencmd &> /dev/null; then
|
|
||||||
local sys_throttle_raw
|
|
||||||
local sys_rev_raw
|
|
||||||
|
|
||||||
sys_throttle_raw=$(vgt=$(sudo vcgencmd get_throttled); echo "${vgt##*x}")
|
|
||||||
|
|
||||||
# Active Throttle Notice: https://bit.ly/2gnunOo
|
|
||||||
if [[ "$sys_throttle_raw" != "0" ]]; then
|
|
||||||
case "$sys_throttle_raw" in
|
|
||||||
*0001) thr_type="${COL_YELLOW}Under Voltage";;
|
|
||||||
*0002) thr_type="${COL_LIGHT_BLUE}Arm Freq Cap";;
|
|
||||||
*0003) thr_type="${COL_YELLOW}UV${COL_DARK_GRAY},${COL_NC} ${COL_LIGHT_BLUE}AFC";;
|
|
||||||
*0004) thr_type="${COL_LIGHT_RED}Throttled";;
|
|
||||||
*0005) thr_type="${COL_YELLOW}UV${COL_DARK_GRAY},${COL_NC} ${COL_LIGHT_RED}TT";;
|
|
||||||
*0006) thr_type="${COL_LIGHT_BLUE}AFC${COL_DARK_GRAY},${COL_NC} ${COL_LIGHT_RED}TT";;
|
|
||||||
*0007) thr_type="${COL_YELLOW}UV${COL_DARK_GRAY},${COL_NC} ${COL_LIGHT_BLUE}AFC${COL_DARK_GRAY},${COL_NC} ${COL_LIGHT_RED}TT";;
|
|
||||||
esac
|
|
||||||
[[ -n "$thr_type" ]] && sys_throttle="$thr_type${COL_DARK_GRAY}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
sys_rev_raw=$(awk '/Revision/ {print $3}' < /proc/cpuinfo)
|
|
||||||
case "$sys_rev_raw" in
|
|
||||||
000[2-6]) sys_model=" 1, Model B";; # 256MB
|
|
||||||
000[7-9]) sys_model=" 1, Model A";; # 256MB
|
|
||||||
000d|000e|000f) sys_model=" 1, Model B";; # 512MB
|
|
||||||
0010|0013) sys_model=" 1, Model B+";; # 512MB
|
|
||||||
0012|0015) sys_model=" 1, Model A+";; # 256MB
|
|
||||||
a0104[0-1]|a21041|a22042) sys_model=" 2, Model B";; # 1GB
|
|
||||||
900021) sys_model=" 1, Model A+";; # 512MB
|
|
||||||
900032) sys_model=" 1, Model B+";; # 512MB
|
|
||||||
90009[2-3]|920093) sys_model=" Zero";; # 512MB
|
|
||||||
9000c1) sys_model=" Zero W";; # 512MB
|
|
||||||
a02082|a[2-3]2082) sys_model=" 3, Model B";; # 1GB
|
|
||||||
a020d3) sys_model=" 3, Model B+";; # 1GB
|
|
||||||
*) sys_model="";;
|
|
||||||
esac
|
|
||||||
sys_type="Raspberry Pi$sys_model"
|
|
||||||
else
|
|
||||||
source "/etc/os-release"
|
|
||||||
CODENAME=$(sed 's/[()]//g' <<< "${VERSION/* /}")
|
|
||||||
sys_type="${NAME/ */} ${CODENAME^} $VERSION_ID"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Get core count
|
|
||||||
sys_cores=$(grep -c "^processor" /proc/cpuinfo)
|
|
||||||
|
|
||||||
# Test existence of clock speed file for ARM CPU
|
|
||||||
if [[ -f "/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq" ]]; then
|
|
||||||
scaling_freq_file="/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test existence of temperature file
|
|
||||||
if [[ -f "/sys/class/thermal/thermal_zone0/temp" ]]; then
|
|
||||||
temp_file="/sys/class/thermal/thermal_zone0/temp"
|
|
||||||
elif [[ -f "/sys/class/hwmon/hwmon0/temp1_input" ]]; then
|
|
||||||
temp_file="/sys/class/hwmon/hwmon0/temp1_input"
|
|
||||||
else
|
|
||||||
temp_file=""
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
get_sys_stats() {
|
|
||||||
local ph_ver_raw
|
|
||||||
local cpu_raw
|
|
||||||
local ram_raw
|
|
||||||
local disk_raw
|
|
||||||
|
|
||||||
# Update every 12 refreshes (Def: every 60s)
|
|
||||||
count=$((count+1))
|
|
||||||
if [[ "$count" == "1" ]] || (( "$count" % 12 == 0 )); then
|
|
||||||
mapfile -t ph_ver_raw < <(pihole -v -c 2> /dev/null | sed -n 's/^.* v/v/p')
|
|
||||||
if [[ -n "${ph_ver_raw[0]}" ]]; then
|
|
||||||
ph_core_ver="${ph_ver_raw[0]}"
|
|
||||||
if [[ ${#ph_ver_raw[@]} -eq 2 ]]; then
|
|
||||||
# web not installed
|
|
||||||
ph_lte_ver="(not installed)"
|
|
||||||
ph_ftl_ver="${ph_ver_raw[1]}"
|
|
||||||
else
|
|
||||||
ph_lte_ver="${ph_ver_raw[1]}"
|
|
||||||
ph_ftl_ver="${ph_ver_raw[2]}"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
ph_core_ver="-1"
|
|
||||||
fi
|
|
||||||
|
|
||||||
sys_name=$(hostname)
|
|
||||||
|
|
||||||
[[ -n "$TEMPERATUREUNIT" ]] && temp_unit="${TEMPERATUREUNIT^^}" || temp_unit="C"
|
|
||||||
|
|
||||||
# Get storage stats for partition mounted on /
|
|
||||||
read -r -a disk_raw <<< "$(df -B1 / 2> /dev/null | awk 'END{ print $3,$2,$5 }')"
|
|
||||||
disk_used="${disk_raw[0]}"
|
|
||||||
disk_total="${disk_raw[1]}"
|
|
||||||
disk_perc="${disk_raw[2]}"
|
|
||||||
|
|
||||||
net_gateway=$(ip route | grep default | cut -d ' ' -f 3 | head -n 1)
|
|
||||||
|
|
||||||
# Get DHCP stats, if feature is enabled
|
|
||||||
if [[ "$DHCP_ACTIVE" == "true" ]]; then
|
|
||||||
ph_dhcp_max=$(( ${DHCP_END##*.} - ${DHCP_START##*.} + 1 ))
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Get DNS server count
|
|
||||||
dns_count="0"
|
|
||||||
[[ -n "${PIHOLE_DNS_1}" ]] && dns_count=$((dns_count+1))
|
|
||||||
[[ -n "${PIHOLE_DNS_2}" ]] && dns_count=$((dns_count+1))
|
|
||||||
[[ -n "${PIHOLE_DNS_3}" ]] && dns_count=$((dns_count+1))
|
|
||||||
[[ -n "${PIHOLE_DNS_4}" ]] && dns_count=$((dns_count+1))
|
|
||||||
[[ -n "${PIHOLE_DNS_5}" ]] && dns_count=$((dns_count+1))
|
|
||||||
[[ -n "${PIHOLE_DNS_6}" ]] && dns_count=$((dns_count+1))
|
|
||||||
[[ -n "${PIHOLE_DNS_7}" ]] && dns_count=$((dns_count+1))
|
|
||||||
[[ -n "${PIHOLE_DNS_8}" ]] && dns_count=$((dns_count+1))
|
|
||||||
[[ -n "${PIHOLE_DNS_9}" ]] && dns_count="$dns_count+"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Get screen size
|
|
||||||
read -r -a scr_size <<< "$(stty size 2>/dev/null || echo 24 80)"
|
|
||||||
scr_lines="${scr_size[0]}"
|
|
||||||
scr_cols="${scr_size[1]}"
|
|
||||||
|
|
||||||
# Determine Chronometer size behavior
|
|
||||||
if [[ "$scr_cols" -ge 58 ]]; then
|
|
||||||
chrono_width="large"
|
|
||||||
elif [[ "$scr_cols" -gt 40 ]]; then
|
|
||||||
chrono_width="medium"
|
|
||||||
else
|
|
||||||
chrono_width="small"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Determine max length of divider string
|
|
||||||
scr_line_len=$(( scr_cols - 2 ))
|
|
||||||
[[ "$scr_line_len" -ge 58 ]] && scr_line_len="58"
|
|
||||||
scr_line_str=$(printf "%${scr_line_len}s")
|
|
||||||
scr_line_str="${scr_line_str// /—}"
|
|
||||||
|
|
||||||
sys_uptime=$(hrSecs "$(cut -d. -f1 /proc/uptime)")
|
|
||||||
sys_loadavg=$(cut -d " " -f1,2,3 /proc/loadavg)
|
|
||||||
|
|
||||||
# Get CPU usage, only counting processes over 1% as active
|
|
||||||
# shellcheck disable=SC2009
|
|
||||||
cpu_raw=$(ps -eo pcpu,rss --no-headers | grep -E -v " 0")
|
|
||||||
cpu_tasks=$(wc -l <<< "$cpu_raw")
|
|
||||||
cpu_taskact=$(sed -r "/(^ 0.)/d" <<< "$cpu_raw" | wc -l)
|
|
||||||
cpu_perc=$(awk '{sum+=$1} END {printf "%.0f\n", sum/'"$sys_cores"'}' <<< "$cpu_raw")
|
|
||||||
|
|
||||||
# Get CPU clock speed
|
|
||||||
if [[ -n "$scaling_freq_file" ]]; then
|
|
||||||
cpu_mhz=$(( $(< /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq) / 1000 ))
|
|
||||||
else
|
|
||||||
cpu_mhz=$(lscpu | awk -F ":" '/MHz/ {print $2;exit}')
|
|
||||||
cpu_mhz=$(printf "%.0f" "${cpu_mhz//[[:space:]]/}")
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Determine whether to display CPU clock speed as MHz or GHz
|
|
||||||
if [[ -n "$cpu_mhz" ]]; then
|
|
||||||
[[ "$cpu_mhz" -le "999" ]] && cpu_freq="$cpu_mhz MHz" || cpu_freq="$(printf "%.1f" $(calcFunc "$cpu_mhz"/1000)) GHz"
|
|
||||||
[[ "${cpu_freq}" == *".0"* ]] && cpu_freq="${cpu_freq/.0/}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Determine color for temperature
|
|
||||||
if [[ -n "$temp_file" ]]; then
|
|
||||||
if [[ "$temp_unit" == "C" ]]; then
|
|
||||||
cpu_temp=$(printf "%.0fc\\n" "$(calcFunc "$(< $temp_file) / 1000")")
|
|
||||||
|
|
||||||
case "${cpu_temp::-1}" in
|
|
||||||
-*|[0-9]|[1-3][0-9]) cpu_col="$COL_LIGHT_BLUE";;
|
|
||||||
4[0-9]) cpu_col="";;
|
|
||||||
5[0-9]) cpu_col="$COL_YELLOW";;
|
|
||||||
6[0-9]) cpu_col="$COL_LIGHT_RED";;
|
|
||||||
*) cpu_col="$COL_URG_RED";;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# $COL_NC$COL_DARK_GRAY is needed for $COL_URG_RED
|
|
||||||
cpu_temp_str=" @ $cpu_col$cpu_temp$COL_NC$COL_DARK_GRAY"
|
|
||||||
|
|
||||||
elif [[ "$temp_unit" == "F" ]]; then
|
|
||||||
cpu_temp=$(printf "%.0ff\\n" "$(calcFunc "($(< $temp_file) / 1000) * 9 / 5 + 32")")
|
|
||||||
|
|
||||||
case "${cpu_temp::-1}" in
|
|
||||||
-*|[0-9]|[0-9][0-9]) cpu_col="$COL_LIGHT_BLUE";;
|
|
||||||
1[0-1][0-9]) cpu_col="";;
|
|
||||||
1[2-3][0-9]) cpu_col="$COL_YELLOW";;
|
|
||||||
1[4-5][0-9]) cpu_col="$COL_LIGHT_RED";;
|
|
||||||
*) cpu_col="$COL_URG_RED";;
|
|
||||||
esac
|
|
||||||
|
|
||||||
cpu_temp_str=" @ $cpu_col$cpu_temp$COL_NC$COL_DARK_GRAY"
|
|
||||||
|
|
||||||
else
|
|
||||||
cpu_temp_str=$(printf " @ %.0fk\\n" "$(calcFunc "($(< $temp_file) / 1000) + 273.15")")
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
cpu_temp_str=""
|
|
||||||
fi
|
|
||||||
|
|
||||||
read -r -a ram_raw <<< "$(awk '/MemTotal:/{total=$2} /MemFree:/{free=$2} /Buffers:/{buffers=$2} /^Cached:/{cached=$2} END {printf "%.0f %.0f %.0f", (total-free-buffers-cached)*100/total, (total-free-buffers-cached)*1024, total*1024}' /proc/meminfo)"
|
|
||||||
ram_perc="${ram_raw[0]}"
|
|
||||||
ram_used="${ram_raw[1]}"
|
|
||||||
ram_total="${ram_raw[2]}"
|
|
||||||
|
|
||||||
if [[ "$(pihole status web 2> /dev/null)" -ge "1" ]]; then
|
|
||||||
ph_status="${COL_LIGHT_GREEN}Active"
|
|
||||||
else
|
|
||||||
ph_status="${COL_LIGHT_RED}Offline"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$DHCP_ACTIVE" == "true" ]]; then
|
|
||||||
local ph_dhcp_range
|
|
||||||
|
|
||||||
ph_dhcp_range=$(seq -s "|" -f "${DHCP_START%.*}.%g" "${DHCP_START##*.}" "${DHCP_END##*.}")
|
|
||||||
|
|
||||||
# Count dynamic leases from available range, and not static leases
|
|
||||||
ph_dhcp_num=$(grep -cE "$ph_dhcp_range" "/etc/pihole/dhcp.leases")
|
|
||||||
ph_dhcp_percent=$(( ph_dhcp_num * 100 / ph_dhcp_max ))
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
get_ftl_stats() {
|
|
||||||
local stats_raw
|
|
||||||
|
|
||||||
mapfile -t stats_raw < <(pihole-FTL "stats")
|
|
||||||
domains_being_blocked_raw="${stats_raw[0]#* }"
|
|
||||||
dns_queries_today_raw="${stats_raw[1]#* }"
|
|
||||||
ads_blocked_today_raw="${stats_raw[2]#* }"
|
|
||||||
ads_percentage_today_raw="${stats_raw[3]#* }"
|
|
||||||
queries_forwarded_raw="${stats_raw[5]#* }"
|
|
||||||
queries_cached_raw="${stats_raw[6]#* }"
|
|
||||||
|
|
||||||
# Only retrieve these stats when not called from jsonFunc
|
|
||||||
if [[ -z "$1" ]]; then
|
|
||||||
local top_ad_raw
|
|
||||||
local top_domain_raw
|
|
||||||
local top_client_raw
|
|
||||||
|
|
||||||
domains_being_blocked=$(printf "%.0f\\n" "${domains_being_blocked_raw}" 2> /dev/null)
|
|
||||||
dns_queries_today=$(printf "%.0f\\n" "${dns_queries_today_raw}")
|
|
||||||
ads_blocked_today=$(printf "%.0f\\n" "${ads_blocked_today_raw}")
|
|
||||||
ads_percentage_today=$(printf "%'.0f\\n" "${ads_percentage_today_raw}")
|
|
||||||
queries_cached_percentage=$(printf "%.0f\\n" "$(calcFunc "$queries_cached_raw * 100 / ( $queries_forwarded_raw + $queries_cached_raw )")")
|
|
||||||
recent_blocked=$(pihole-FTL recentBlocked)
|
|
||||||
read -r -a top_ad_raw <<< "$(pihole-FTL "top-ads (1)")"
|
|
||||||
read -r -a top_domain_raw <<< "$(pihole-FTL "top-domains (1)")"
|
|
||||||
read -r -a top_client_raw <<< "$(pihole-FTL "top-clients (1)")"
|
|
||||||
|
|
||||||
top_ad="${top_ad_raw[2]}"
|
|
||||||
top_domain="${top_domain_raw[2]}"
|
|
||||||
if [[ "${top_client_raw[3]}" ]]; then
|
|
||||||
top_client="${top_client_raw[3]}"
|
|
||||||
else
|
|
||||||
top_client="${top_client_raw[2]}"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
get_strings() {
|
|
||||||
# Expand or contract strings depending on screen size
|
|
||||||
if [[ "$chrono_width" == "large" ]]; then
|
|
||||||
phc_str=" ${COL_DARK_GRAY}Core"
|
|
||||||
lte_str=" ${COL_DARK_GRAY}Web"
|
|
||||||
ftl_str=" ${COL_DARK_GRAY}FTL"
|
|
||||||
api_str="${COL_LIGHT_RED}API Offline"
|
|
||||||
|
|
||||||
host_info="$sys_type"
|
|
||||||
sys_info="$sys_throttle"
|
|
||||||
sys_info2="Active: $cpu_taskact of $cpu_tasks tasks"
|
|
||||||
used_str="Used: "
|
|
||||||
leased_str="Leased: "
|
|
||||||
domains_being_blocked=$(printf "%'.0f" "$domains_being_blocked")
|
|
||||||
ads_blocked_today=$(printf "%'.0f" "$ads_blocked_today")
|
|
||||||
dns_queries_today=$(printf "%'.0f" "$dns_queries_today")
|
|
||||||
ph_info="Blocking: $domains_being_blocked sites"
|
|
||||||
total_str="Total: "
|
|
||||||
else
|
|
||||||
phc_str=" ${COL_DARK_GRAY}Core"
|
|
||||||
lte_str=" ${COL_DARK_GRAY}Web"
|
|
||||||
ftl_str=" ${COL_DARK_GRAY}FTL"
|
|
||||||
api_str="${COL_LIGHT_RED}API Down"
|
|
||||||
ph_info="$domains_being_blocked blocked"
|
|
||||||
fi
|
|
||||||
|
|
||||||
[[ "$sys_cores" -ne 1 ]] && sys_cores_txt="${sys_cores}x "
|
|
||||||
cpu_info="$sys_cores_txt$cpu_freq$cpu_temp_str"
|
|
||||||
ram_info="$used_str$(hrBytes "$ram_used") of $(hrBytes "$ram_total")"
|
|
||||||
disk_info="$used_str$(hrBytes "$disk_used") of $(hrBytes "$disk_total")"
|
|
||||||
|
|
||||||
lan_info="Gateway: $net_gateway"
|
|
||||||
dhcp_info="$leased_str$ph_dhcp_num of $ph_dhcp_max"
|
|
||||||
|
|
||||||
ads_info="$total_str$ads_blocked_today of $dns_queries_today"
|
|
||||||
dns_info="$dns_count DNS servers"
|
|
||||||
|
|
||||||
[[ "$recent_blocked" == "0" ]] && recent_blocked="${COL_LIGHT_RED}FTL offline${COL_NC}"
|
|
||||||
}
|
|
||||||
|
|
||||||
chronoFunc() {
|
|
||||||
local extra_arg="$1"
|
|
||||||
local extra_value="$2"
|
|
||||||
|
|
||||||
get_init_stats
|
|
||||||
|
|
||||||
for (( ; ; )); do
|
|
||||||
get_sys_stats
|
|
||||||
get_ftl_stats
|
|
||||||
get_strings
|
|
||||||
|
|
||||||
# Strip excess development version numbers
|
|
||||||
if [[ "$ph_core_ver" != "-1" ]]; then
|
|
||||||
phc_ver_str="$phc_str: ${ph_core_ver%-*}${COL_NC}"
|
|
||||||
lte_ver_str="$lte_str: ${ph_lte_ver%-*}${COL_NC}"
|
|
||||||
ftl_ver_str="$ftl_str: ${ph_ftl_ver%-*}${COL_NC}"
|
|
||||||
else
|
|
||||||
phc_ver_str="$phc_str: $api_str${COL_NC}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Get refresh number
|
|
||||||
if [[ "${extra_arg}" = "refresh" ]]; then
|
|
||||||
num="${extra_value}"
|
|
||||||
num_str="Refresh set for every $num seconds"
|
|
||||||
else
|
|
||||||
num_str=""
|
|
||||||
fi
|
|
||||||
|
|
||||||
clear
|
|
||||||
|
|
||||||
# Remove exit message heading on third refresh
|
|
||||||
if [[ "$count" -le 2 ]] && [[ "${extra_arg}" != "exit" ]]; then
|
|
||||||
echo -e " ${COL_LIGHT_GREEN}Pi-hole Chronometer${COL_NC}
|
|
||||||
$num_str
|
|
||||||
${COL_LIGHT_RED}Press Ctrl-C to exit${COL_NC}
|
|
||||||
${COL_DARK_GRAY}$scr_line_str${COL_NC}"
|
|
||||||
else
|
|
||||||
echo -e "[0;1;31;91m|¯[0;1;33;93m¯[0;1;32;92m¯[0;1;32;92m(¯[0;1;36;96m)[0;1;34;94m_[0;1;35;95m|[0;1;33;93m¯[0;1;31;91m|_ [0;1;32;92m__[0;1;36;96m_|[0;1;31;91m¯[0;1;34;94m|[0;1;35;95m__[0;1;31;91m_[0m$phc_ver_str\\n[0;1;33;93m| ¯[0;1;32;92m_[0;1;36;96m/¯[0;1;34;94m|[0;1;35;95m_[0;1;31;91m| [0;1;33;93m' [0;1;32;92m\\/ [0;1;36;96m_ [0;1;34;94m\\ [0;1;35;95m/ [0;1;31;91m-[0;1;33;93m_)[0m$lte_ver_str\\n[0;1;32;92m|_[0;1;36;96m| [0;1;34;94m|_[0;1;35;95m| [0;1;33;93m|_[0;1;32;92m||[0;1;36;96m_\\[0;1;34;94m__[0;1;35;95m_/[0;1;31;91m_\\[0;1;33;93m__[0;1;32;92m_|[0m$ftl_ver_str\\n ${COL_DARK_GRAY}$scr_line_str${COL_NC}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
printFunc " Hostname: " "$sys_name" "$host_info"
|
|
||||||
printFunc " Uptime: " "$sys_uptime" "$sys_info"
|
|
||||||
printFunc " Task Load: " "$sys_loadavg" "$sys_info2"
|
|
||||||
printFunc " CPU usage: " "$cpu_perc%" "$cpu_info"
|
|
||||||
printFunc " RAM usage: " "$ram_perc%" "$ram_info"
|
|
||||||
printFunc " HDD usage: " "$disk_perc" "$disk_info"
|
|
||||||
|
|
||||||
if [[ "$DHCP_ACTIVE" == "true" ]]; then
|
|
||||||
printFunc "DHCP usage: " "$ph_dhcp_percent%" "$dhcp_info"
|
|
||||||
fi
|
|
||||||
|
|
||||||
printFunc " Pi-hole: " "$ph_status" "$ph_info"
|
|
||||||
printFunc " Blocked: " "$ads_percentage_today%" "$ads_info"
|
|
||||||
printFunc "Local Qrys: " "$queries_cached_percentage%" "$dns_info"
|
|
||||||
|
|
||||||
printFunc "Last Block: " "$recent_blocked"
|
|
||||||
printFunc " Top Block: " "$top_ad"
|
|
||||||
|
|
||||||
# Provide more stats on screens with more lines
|
|
||||||
if [[ "$scr_lines" -eq 17 ]]; then
|
|
||||||
if [[ "$DHCP_ACTIVE" == "true" ]]; then
|
|
||||||
printFunc "Top Domain: " "$top_domain" "last"
|
|
||||||
else
|
|
||||||
print_client="true"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
print_client="true"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -n "$print_client" ]]; then
|
|
||||||
printFunc "Top Domain: " "$top_domain"
|
|
||||||
printFunc "Top Client: " "$top_client" "last"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Handle exit/refresh options
|
|
||||||
if [[ "${extra_arg}" == "exit" ]]; then
|
|
||||||
exit 0
|
|
||||||
else
|
|
||||||
if [[ "${extra_arg}" == "refresh" ]]; then
|
|
||||||
sleep "$num"
|
|
||||||
else
|
|
||||||
sleep 5
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
jsonFunc() {
|
|
||||||
get_ftl_stats "json"
|
|
||||||
echo "{\"domains_being_blocked\":${domains_being_blocked_raw},\"dns_queries_today\":${dns_queries_today_raw},\"ads_blocked_today\":${ads_blocked_today_raw},\"ads_percentage_today\":${ads_percentage_today_raw}}"
|
|
||||||
}
|
|
||||||
|
|
||||||
helpFunc() {
|
|
||||||
if [[ "$1" == "?" ]]; then
|
|
||||||
echo "Unknown option. Please view 'pihole -c --help' for more information"
|
|
||||||
else
|
|
||||||
echo "Usage: pihole -c [options]
|
|
||||||
Example: 'pihole -c -j'
|
|
||||||
Calculates stats and displays to an LCD
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-j, --json Output stats as JSON formatted string
|
|
||||||
-r, --refresh Set update frequency (in seconds)
|
|
||||||
-e, --exit Output stats and exit without refreshing
|
|
||||||
-h, --help Display this help text"
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
}
|
|
||||||
|
|
||||||
if [[ $# = 0 ]]; then
|
|
||||||
chronoFunc
|
|
||||||
fi
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
"-j" | "--json" ) jsonFunc;;
|
|
||||||
"-h" | "--help" ) helpFunc;;
|
|
||||||
"-r" | "--refresh" ) chronoFunc refresh "$2";;
|
|
||||||
"-e" | "--exit" ) chronoFunc exit;;
|
|
||||||
* ) helpFunc "?";;
|
|
||||||
esac
|
|
|
@ -1,5 +1,5 @@
|
||||||
_pihole() {
|
_pihole() {
|
||||||
local cur prev opts opts_admin opts_checkout opts_chronometer opts_debug opts_interface opts_logging opts_privacy opts_query opts_update opts_version
|
local cur prev opts opts_admin opts_checkout opts_debug opts_interface opts_logging opts_privacy opts_query opts_update opts_version
|
||||||
COMPREPLY=()
|
COMPREPLY=()
|
||||||
cur="${COMP_WORDS[COMP_CWORD]}"
|
cur="${COMP_WORDS[COMP_CWORD]}"
|
||||||
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||||
|
@ -7,7 +7,7 @@ _pihole() {
|
||||||
|
|
||||||
case "${prev}" in
|
case "${prev}" in
|
||||||
"pihole")
|
"pihole")
|
||||||
opts="admin blacklist checkout chronometer debug disable enable flush help logging query reconfigure regex restartdns status tail uninstall updateGravity updatePihole version wildcard whitelist arpflush"
|
opts="admin blacklist checkout debug disable enable flush help logging query reconfigure regex restartdns status tail uninstall updateGravity updatePihole version wildcard whitelist arpflush"
|
||||||
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
||||||
;;
|
;;
|
||||||
"whitelist"|"blacklist"|"wildcard"|"regex")
|
"whitelist"|"blacklist"|"wildcard"|"regex")
|
||||||
|
@ -22,10 +22,6 @@ _pihole() {
|
||||||
opts_checkout="core ftl web master dev"
|
opts_checkout="core ftl web master dev"
|
||||||
COMPREPLY=( $(compgen -W "${opts_checkout}" -- ${cur}) )
|
COMPREPLY=( $(compgen -W "${opts_checkout}" -- ${cur}) )
|
||||||
;;
|
;;
|
||||||
"chronometer")
|
|
||||||
opts_chronometer="\--exit \--json \--refresh"
|
|
||||||
COMPREPLY=( $(compgen -W "${opts_chronometer}" -- ${cur}) )
|
|
||||||
;;
|
|
||||||
"debug")
|
"debug")
|
||||||
opts_debug="-a"
|
opts_debug="-a"
|
||||||
COMPREPLY=( $(compgen -W "${opts_debug}" -- ${cur}) )
|
COMPREPLY=( $(compgen -W "${opts_debug}" -- ${cur}) )
|
||||||
|
|
|
@ -73,7 +73,7 @@ webInterfaceDir="${webroot}/admin"
|
||||||
piholeGitUrl="https://github.com/pi-hole/pi-hole.git"
|
piholeGitUrl="https://github.com/pi-hole/pi-hole.git"
|
||||||
PI_HOLE_LOCAL_REPO="/etc/.pihole"
|
PI_HOLE_LOCAL_REPO="/etc/.pihole"
|
||||||
# List of pihole scripts, stored in an array
|
# List of pihole scripts, stored in an array
|
||||||
PI_HOLE_FILES=(chronometer list piholeDebug piholeLogFlush setupLCD update version gravity uninstall webpage)
|
PI_HOLE_FILES=(list piholeDebug piholeLogFlush setupLCD update version gravity uninstall webpage)
|
||||||
# This directory is where the Pi-hole scripts will be installed
|
# This directory is where the Pi-hole scripts will be installed
|
||||||
PI_HOLE_INSTALL_DIR="/opt/pihole"
|
PI_HOLE_INSTALL_DIR="/opt/pihole"
|
||||||
PI_HOLE_CONFIG_DIR="/etc/pihole"
|
PI_HOLE_CONFIG_DIR="/etc/pihole"
|
||||||
|
|
|
@ -141,20 +141,6 @@ Available commands and options:
|
||||||
(0 = lowest, 3 = highest)
|
(0 = lowest, 3 = highest)
|
||||||
.br
|
.br
|
||||||
|
|
||||||
\fB-c, chronometer\fR [options]
|
|
||||||
.br
|
|
||||||
Calculates stats and displays to an LCD
|
|
||||||
.br
|
|
||||||
|
|
||||||
(Chronometer Options):
|
|
||||||
.br
|
|
||||||
-j, --json Output stats as JSON formatted string
|
|
||||||
.br
|
|
||||||
-r, --refresh Set update frequency (in seconds)
|
|
||||||
.br
|
|
||||||
-e, --exit Output stats and exit without refreshing
|
|
||||||
.br
|
|
||||||
|
|
||||||
\fB-g, updateGravity\fR
|
\fB-g, updateGravity\fR
|
||||||
.br
|
.br
|
||||||
Update the list of ad-serving domains
|
Update the list of ad-serving domains
|
||||||
|
|
6
pihole
6
pihole
|
@ -125,8 +125,7 @@ queryFunc() {
|
||||||
}
|
}
|
||||||
|
|
||||||
chronometerFunc() {
|
chronometerFunc() {
|
||||||
shift
|
echo "Chronometer is gone, use PADD (https://github.com/pi-hole/PADD)"
|
||||||
"${PI_HOLE_SCRIPT_DIR}"/chronometer.sh "$@"
|
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -497,8 +496,7 @@ Debugging Options:
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
setpassword set the password for the web interface
|
setpassword set the password for the web interface
|
||||||
-c, chronometer Calculates stats and displays to an LCD
|
-c, chronometer Chronometer is gone, use PADD
|
||||||
Add '-h' for more info on chronometer usage
|
|
||||||
-g, updateGravity Update the list of ad-serving domains
|
-g, updateGravity Update the list of ad-serving domains
|
||||||
-h, --help, help Show this help dialog
|
-h, --help, help Show this help dialog
|
||||||
-l, logging Specify whether the Pi-hole log should be used
|
-l, logging Specify whether the Pi-hole log should be used
|
||||||
|
|
Loading…
Reference in a new issue