1179 lines
30 KiB
Bash
Executable file
1179 lines
30 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:${PATH}"
|
|
|
|
################################################################################
|
|
#
|
|
# CUSTOM PLUGIN SECTION
|
|
#
|
|
################################################################################
|
|
|
|
############################################################
|
|
# Variables
|
|
############################################################
|
|
|
|
###
|
|
### Custom Defines
|
|
###
|
|
appname="wifi"
|
|
|
|
if [ -n "${BLOCK_INSTANCE:-}" ]; then
|
|
iface="${BLOCK_INSTANCE}"
|
|
else
|
|
iface="$( tail -1 /proc/net/wireless | awk '{print $1}' | sed 's/://g' )"
|
|
fi
|
|
|
|
format=" {status_or_ip} ({ssid} {quality}%)"
|
|
|
|
|
|
###
|
|
### Thresholds
|
|
###
|
|
|
|
# Enable
|
|
has_threshold=1
|
|
|
|
# Depending on the conditions in your custom_action()
|
|
# you can force the output to be critical or warning
|
|
# Set these vars to 1 (in custom_action)
|
|
force_crit=0
|
|
force_warn=0
|
|
force_good=0
|
|
|
|
|
|
###
|
|
### Additional arguments
|
|
###
|
|
arg_params=(
|
|
"-i"
|
|
)
|
|
arg_vars=(
|
|
"iface"
|
|
)
|
|
arg_desc_val=(
|
|
"<iface>"
|
|
)
|
|
arg_desc_long=(
|
|
"Specify the network interface"
|
|
)
|
|
|
|
|
|
###
|
|
### Format placeholders
|
|
###
|
|
|
|
# bash variable names
|
|
format_vars=(
|
|
"ip"
|
|
"ip_nm"
|
|
"ip6"
|
|
"ip6_nm"
|
|
"mac"
|
|
"mtu"
|
|
"iface"
|
|
"status"
|
|
"status_or_ip"
|
|
"status_or_ip6"
|
|
"ssid"
|
|
"freq"
|
|
"freq_unit"
|
|
"tx_power"
|
|
"tx_power_unit"
|
|
"quality"
|
|
"signal"
|
|
"signal_unit"
|
|
"noise"
|
|
"bit_rate"
|
|
"bit_rate_unit"
|
|
)
|
|
|
|
# Format placeholders
|
|
format_nodes=(
|
|
"{ip}"
|
|
"{ip_nm}"
|
|
"{ip6}"
|
|
"{ip6_nm}"
|
|
"{mac}"
|
|
"{mtu}"
|
|
"{iface}"
|
|
"{status}"
|
|
"{status_or_ip}"
|
|
"{status_or_ip6}"
|
|
"{ssid}"
|
|
"{freq}"
|
|
"{freq_unit}"
|
|
"{tx_power}"
|
|
"{tx_power_unit}"
|
|
"{quality}"
|
|
"{signal}"
|
|
"{signal_unit}"
|
|
"{noise}"
|
|
"{bit_rate}"
|
|
"{bit_rate_unit}"
|
|
)
|
|
|
|
# Format description (for help display)
|
|
format_descs=(
|
|
"IPv4 address"
|
|
"IPv4 address including netmask"
|
|
"IPv6 address"
|
|
"IPv6 address including netmask"
|
|
"MAC address"
|
|
"MTU value"
|
|
"Network interface"
|
|
"Status (up, down, unknown, absent)"
|
|
"Status text if not up or IPv4 address"
|
|
"Status text if not up or IPv6 address"
|
|
"Wireless Network SSID name"
|
|
"Wireless frequency"
|
|
"Wireless requency unit"
|
|
"Wireless tx power"
|
|
"Wireless tx power unit"
|
|
"Wireless quality in percent"
|
|
"Wireless signal"
|
|
"Wireless signal unit"
|
|
"Wireless noise"
|
|
"Bit Rate"
|
|
"Bit Rate unit"
|
|
)
|
|
|
|
# Format examples (for help display)
|
|
format_examples=(
|
|
"-f \" {status}: {ip} {ssid}\""
|
|
"-f \" {iface}: {status_or_ip6} {quality}\""
|
|
)
|
|
|
|
|
|
############################################################
|
|
# custom_actio function
|
|
############################################################
|
|
|
|
###
|
|
### Evaluate disk space
|
|
###
|
|
custom_action() {
|
|
if ! command -v ip > /dev/null 2>&1; then
|
|
echo "Error, ip binary not found, but required"
|
|
exit 1
|
|
fi
|
|
if ! command -v iwconfig > /dev/null 2>&1; then
|
|
echo "Error, iwconfig binary not found, but required"
|
|
exit 1
|
|
fi
|
|
|
|
local _ip
|
|
local _iwconfig
|
|
|
|
ip=
|
|
ip_nm=
|
|
ip6=
|
|
ip6_nm=
|
|
mac=
|
|
mtu=
|
|
status="unknown"
|
|
status_or_ip="${status}"
|
|
status_or_ip6="${status}"
|
|
|
|
ssid=
|
|
freq=
|
|
freq_unit=
|
|
tx_power=
|
|
tx_power_unit=
|
|
quality=
|
|
signal=
|
|
signal_unit=
|
|
noise=
|
|
bit_rate=
|
|
bit_rate_unit=
|
|
|
|
if [ ! -d "/sys/class/net/${iface}/" ] || [ ! -f "/sys/class/net/${iface}/operstate" ]; then
|
|
|
|
status="absent"
|
|
status_or_ip="${status}"
|
|
status_or_ip6="${status}"
|
|
force_crit=1
|
|
|
|
else
|
|
|
|
_ip="$( ip addr show "${iface}" 2>/dev/null )"
|
|
|
|
# No WIFI device
|
|
if ! _iwconfig="$( iwconfig "${iface}" 2>/dev/null )"; then
|
|
status="absent"
|
|
status_or_ip="${status}"
|
|
status_or_ip6="${status}"
|
|
force_crit=1
|
|
|
|
# WIFI device
|
|
else
|
|
# Has WIFI, but is Not connected
|
|
if echo "${_iwconfig}" | grep -iq 'Not-Associated'; then
|
|
status="down"
|
|
status_or_ip="${status}"
|
|
status_or_ip6="${status}"
|
|
force_crit=1
|
|
|
|
# Has WIFI and is connected
|
|
else
|
|
ip="$( echo "${_ip}" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | head -1 )"
|
|
ip_nm="$( echo "${_ip}" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/[0-9]+' | head -1 )"
|
|
ip6="$( echo "${_ip}" | grep -oE 'inet6' | grep -oE '[0-9a-fA-F]*::.*/[0-9]+' | sed 's/\/.*//g' )"
|
|
ip6_nm="$( echo "${_ip}" | grep -oE 'inet6' | grep -oE '[0-9a-fA-F]*::.*/[0-9]+' || true)"
|
|
mac="$( echo "${_ip}" | grep 'link/' | grep -oE '([0-9a-fA-F]{2}:)+[0-9a-fA-F]{2}' | head -1 )"
|
|
mtu="$( echo "${_ip}" | grep -oE 'mtu\s*[0-9]+' | sed 's/mtu\s//g' )"
|
|
|
|
status="up"
|
|
status_or_ip="${ip}"
|
|
status_or_ip6="${ip6}"
|
|
|
|
ssid="$( echo "${_iwconfig}" | grep -oE 'ESSID:".*"' | sed 's/ESSID://g' | sed 's/"//g' )"
|
|
freq="$( echo "${_iwconfig}" | grep -ioE 'Frequency:[.0-9]+' | grep -oE '[.0-9]+' )"
|
|
freq_unit="Ghz"
|
|
tx_power="$( echo "${_iwconfig}" | grep -oE 'Tx-Power=[0-9]+' | sed 's/.*=//g' )"
|
|
tx_power_unit="dBm"
|
|
quality="$( awk -v cur="$(echo "${_iwconfig}"|grep -oE 'Link Quality=[/0-9]+'|grep -oE '[0-9]+'|head -1)" -v max="$(echo "${_iwconfig}"|grep -oE 'Link Quality=[/0-9]+'|grep -oE '[0-9]+'|tail -1)" 'BEGIN{printf("%0.f", cur*100/max)}')"
|
|
signal="$( echo "${_iwconfig}" | grep -ioE 'Signal level=[-0-9]+' | sed 's/.*=//g' )"
|
|
signal_unit="dBm"
|
|
noise="$( grep "${iface}" /proc/net/wireless | awk '{print $5}' )"
|
|
bit_rate="$( echo "${_iwconfig}" | grep -ioE 'Bit Rate=[0-9\.]+' | sed 's/.*=//g' | awk '{printf "%.0f", $1}' )"
|
|
bit_rate_unit="$( echo "${_iwconfig}" | grep -ioE 'Bit Rate=[0-9\.]+ [A-Z/]+' | sed 's/.*=//g' | grep -ioE '[A-Z/]+' )"
|
|
|
|
force_good=1
|
|
|
|
fi
|
|
fi
|
|
fi
|
|
}
|
|
|
|
|
|
|
|
|
|
###
|
|
###
|
|
###
|
|
### D O N O T E D I T A F T E R H E R E
|
|
###
|
|
###
|
|
###
|
|
|
|
|
|
|
|
################################################################################
|
|
#
|
|
# BUILT-IN VARIABLES
|
|
#
|
|
################################################################################
|
|
|
|
###
|
|
### General default values
|
|
###
|
|
color_def="#666666" # gray
|
|
color_good="#88b090" # green
|
|
color_warn="#ccdc90" # yellow
|
|
color_crit="#e89393" # red
|
|
color_info="#fce94f" # bright yellow
|
|
|
|
###
|
|
### Extended format arrays
|
|
###
|
|
fe_placeholder=()
|
|
fe_sign=()
|
|
fe_value=()
|
|
fe_format=()
|
|
|
|
|
|
###
|
|
### Threshold arrays
|
|
###
|
|
tg_placeholder=()
|
|
tg_sign=()
|
|
tg_value=()
|
|
|
|
ti_placeholder=()
|
|
ti_sign=()
|
|
ti_value=()
|
|
|
|
tw_placeholder=()
|
|
tw_sign=()
|
|
tw_value=()
|
|
|
|
tc_placeholder=()
|
|
tc_sign=()
|
|
tc_value=()
|
|
|
|
|
|
###
|
|
### Use of pango markup?
|
|
###
|
|
pango=1
|
|
|
|
|
|
###
|
|
### source configuration file if it exists
|
|
###
|
|
if [ -f "${HOME}/.config/i3blocks-modules/conf" ]; then
|
|
# shellcheck disable=SC1090
|
|
. "${HOME}/.config/i3blocks-modules/conf"
|
|
fi
|
|
|
|
|
|
###
|
|
### i3blocks vars info
|
|
### https://vivien.github.io/i3blocks/
|
|
###
|
|
# name= ${BLOCK_NAME}
|
|
# instace= ${BLOCK_INSTANCE}
|
|
# button= ${BLOCK_BUTTON}
|
|
# x-coor ${BLOCK_X}
|
|
# y-coor ${BLOCK_Y}
|
|
|
|
|
|
################################################################################
|
|
#
|
|
# BUILT-IN FUNCTIONS
|
|
#
|
|
################################################################################
|
|
|
|
###
|
|
### System functions
|
|
###
|
|
print_usage() {
|
|
custom_args=""
|
|
|
|
# program specific arguments
|
|
for (( i=0; i<${#arg_params[@]}; i++ )); do
|
|
custom_args="${custom_args}[${arg_params[$i]} ${arg_desc_val[$i]}] "
|
|
done
|
|
|
|
# Show/Hide threshold
|
|
if [ "${has_threshold}" = "1" ]; then
|
|
custom_args="${custom_args}[-tg|-ti|-tw|-tc <p> <s> <int|str>] "
|
|
fi
|
|
|
|
echo "Usage: ${appname} [-f <format>] [-fe <p> <s> <int|str> <f>] ${custom_args}[-np] [-cd|-cg|-cw|-cc|-ci <code>]"
|
|
echo " ${appname} -h"
|
|
echo " ${appname} -v"
|
|
echo
|
|
|
|
if [ "${#custom_args}" -gt "0" ]; then
|
|
echo "Optional variables:"
|
|
echo "--------------------------------------------------------------------------------"
|
|
|
|
for (( i=0; i<${#arg_params[@]}; i++ )); do
|
|
printf " %-13s%s\\n" "${arg_params[$i]} ${arg_desc_val[$i]}" "${arg_desc_long[$i]}"
|
|
done
|
|
echo
|
|
fi
|
|
|
|
if [ "${has_threshold}" = "1" ]; then
|
|
echo "Optional threshold arguments:"
|
|
echo "--------------------------------------------------------------------------------"
|
|
echo "You can optionally enable threshold checking against any placeholder value."
|
|
echo "This enables the colorizing of the final output depending on any met"
|
|
echo "conditions specified."
|
|
echo "Default is not to use any threshold"
|
|
echo "You can use unlimited number of threshold for each type."
|
|
echo
|
|
|
|
echo " -tg <p> <s> <int|str> Enable threshold for 'good status'"
|
|
echo " -ti <p> <s> <int|str> Enable threshold for 'info status'"
|
|
echo " -tw <p> <s> <int|str> Enable threshold for 'warn status'"
|
|
echo " -tc <p> <s> <int|str> Enable threshold for 'crit status'"
|
|
echo
|
|
echo " Explanation:"
|
|
echo " <p> is the placeholder value you want to check against."
|
|
printf " valid placeholders: "
|
|
for (( i=0; i<${#format_nodes[@]}; i++ )); do
|
|
printf "%s" "${format_nodes[$i]} "
|
|
done
|
|
printf "\\n"
|
|
echo " Note 1: placeholder values will be converted to integers"
|
|
echo " Any decimal places will simply be cut off."
|
|
echo " Note 2: In equal mode (<s> '=') is a string regex comparison and"
|
|
echo " no placeholder will be converted."
|
|
echo " Note 3: In unequal mode (<s> '!=') is a string comparison and"
|
|
echo " no placeholder will be converted."
|
|
echo " Note 3: In equal mode (<s> '=') regex is allowed :-)"
|
|
echo " <s> must either be '<', '>', '=' or '!=' depending on what direction"
|
|
echo " you want to check the threshold placeholder against."
|
|
echo " <int> The integer number you want to check against the placeholder."
|
|
echo " <str> The string you want to check against the placeholder."
|
|
echo " You can only use a string when in equal mode '='."
|
|
echo " You can also use regex here."
|
|
echo
|
|
echo " Examples:"
|
|
echo " 1. Check if value of ${format_nodes[0]} < 50, then format using the good color"
|
|
echo " -tg '${format_nodes[0]}' '<' 50"
|
|
echo
|
|
echo " 2. Check if value of ${format_nodes[0]} > 90, then format using the warn color"
|
|
echo " -tw '${format_nodes[0]}' '>' 90"
|
|
echo
|
|
echo " 3. Check if value of ${format_nodes[0]} equals the string 'foo', then format using the info color"
|
|
echo " -ti '${format_nodes[0]}' '=' 'foo'"
|
|
echo
|
|
echo " 4. Check if value of ${format_nodes[0]} equals the regex '^[0-9]+\$', then format using the info color"
|
|
echo " -ti '${format_nodes[0]}' '=' '^[0-9]+\$'"
|
|
echo
|
|
fi
|
|
|
|
echo "Optional markup (pango):"
|
|
echo "--------------------------------------------------------------------------------"
|
|
echo " -np Disable pango markup"
|
|
echo
|
|
|
|
echo "Optional color arguments:"
|
|
echo "--------------------------------------------------------------------------------"
|
|
echo "If not specified, script default colors are used"
|
|
echo "If config file with color codes is present in:"
|
|
echo "'${HOME}/.config/i3blocks-modules/conf', these colors will be used."
|
|
echo
|
|
echo " -cd <code> Default color (hexadecimal color code)"
|
|
echo " Default value is: ${color_def}"
|
|
echo " -cg <code> Good color (hexadecimal color code)"
|
|
echo " Default value is: ${color_good}"
|
|
echo " -cw <code> Warning color (hexadecimal color code)"
|
|
echo " Default value is: ${color_warn}"
|
|
echo " -cc <code> Critical color (hexadecimal color code)"
|
|
echo " Default value is: ${color_crit}"
|
|
echo " -ci <code> Info color (hexadecimal color code)"
|
|
echo " Default value is: ${color_info}"
|
|
echo
|
|
|
|
echo "Optional Format placeholders:"
|
|
echo "--------------------------------------------------------------------------------"
|
|
echo " Available color placeholders:"
|
|
echo " (Use with pango disabled for custom markup) building"
|
|
echo " {color} Current active color depending on thresholds"
|
|
echo " {color_def} Default color"
|
|
echo " {color_good} Good color"
|
|
echo " {color_warn} Warning color"
|
|
echo " {color_crit} Critical color"
|
|
echo " {color_info} Info color"
|
|
echo " Format example:"
|
|
echo " -np -f \"<span color='{color}'>Colored text</span>\""
|
|
echo
|
|
|
|
echo " Available specific placeholders:"
|
|
for (( i=0; i<${#format_nodes[@]}; i++ )); do
|
|
printf " %-15s%s\\n" "${format_nodes[$i]}" "${format_descs[$i]}"
|
|
done
|
|
|
|
echo " Format example:"
|
|
for (( i=0; i<${#format_examples[@]}; i++ )); do
|
|
printf " %s\\n" "${format_examples[$i]}"
|
|
done
|
|
echo " Default:"
|
|
echo " -f \"${format}\""
|
|
echo
|
|
|
|
echo "Optional extended Format output:"
|
|
echo "--------------------------------------------------------------------------------"
|
|
echo "You can conditionally set your output text depending on the value of any placeholder."
|
|
echo "For example, If you have a placeholder {status} that either is 'up' or 'down', you"
|
|
echo "can specify different outputs for 'up' and for 'down'."
|
|
echo "Usage"
|
|
echo " -fe <p> <s> <v> <f>"
|
|
echo
|
|
echo " Format example:"
|
|
echo " -fe '{status}' '=' 'up' 'It works ;-)' -fe '{status}' '!=' 'up' 'status is: {status}'"
|
|
echo " Explanation:"
|
|
echo " <p> is the placeholder value you want to check against."
|
|
printf " valid placeholders: "
|
|
for (( i=0; i<${#format_nodes[@]}; i++ )); do
|
|
printf "%s" "${format_nodes[$i]} "
|
|
done
|
|
printf "\\n"
|
|
echo " Note 1: placeholder values will be converted to integers"
|
|
echo " Any decimal places will simply be cut off."
|
|
echo " Note 2: In equal mode (<s> '=') is a string regex comparison and"
|
|
echo " no placeholder will be converted."
|
|
echo " Note 3: In unequal mode (<s> '!=') is a string comparison and"
|
|
echo " no placeholder will be converted."
|
|
echo " Note 3: In equal mode (<s> '=') regex is allowed :-)"
|
|
echo " <s> must either be '<', '>', '=' or '!=' depending on what direction"
|
|
echo " you want to check the threshold placeholder against."
|
|
echo " <int> The integer number you want to check against the placeholder."
|
|
echo " <str> The string you want to check against the placeholder."
|
|
echo " You can only use a string when in equal mode '='."
|
|
echo " You can also use regex here."
|
|
echo " <f> Is the format string that should be displayed under the above condition."
|
|
echo " Of course you can also use placeholders here ;-)."
|
|
}
|
|
|
|
print_version() {
|
|
echo "${appname} v1.8 by cytopia"
|
|
echo "https://github.com/cytopia/i3blocks-modules"
|
|
}
|
|
|
|
###
|
|
### Decide about final output color color
|
|
###
|
|
get_status_color() {
|
|
local _color_def="${1}"
|
|
local _color_good="${2}"
|
|
local _color_warn="${3}"
|
|
local _color_crit="${4}"
|
|
local _color_info="${5}"
|
|
|
|
# final color
|
|
local _color="${_color_def}"
|
|
|
|
local pval
|
|
|
|
# has custom critical color?
|
|
if [ "${force_crit}" = "1" ]; then
|
|
_color="${_color_crit}"
|
|
echo "${_color}"
|
|
return
|
|
fi
|
|
# has custom warning color?
|
|
if [ "${force_warn}" = "1" ]; then
|
|
_color="${_color_warn}"
|
|
echo "${_color}"
|
|
return
|
|
fi
|
|
|
|
|
|
# has custom good color?
|
|
if [ "${force_good}" = "1" ]; then
|
|
_color="${_color_good}"
|
|
fi
|
|
|
|
# has good color?
|
|
for (( i=0; i < ${#tg_placeholder[@]}; i++ )); do
|
|
|
|
if [ "${tg_sign[$i]}" = "=" ] || [ "${tg_sign[$i]}" = "!=" ]; then
|
|
pval="${!tg_placeholder[$i]}"
|
|
else
|
|
pval="$( echo "${!tg_placeholder[$i]}" | grep -oE '[0-9]*' | head -1 )"
|
|
fi
|
|
|
|
if [ "${tg_sign[$i]}" = "<" ]; then
|
|
if [ "${pval}" -lt "${tg_value[$i]}" ]; then
|
|
_color="${_color_good}"
|
|
fi
|
|
elif [ "${tg_sign[$i]}" = "=" ]; then
|
|
if [[ "${pval}" =~ ${tg_value[$i]} ]]; then
|
|
_color="${_color_good}"
|
|
fi
|
|
elif [ "${tg_sign[$i]}" = "!=" ]; then
|
|
if [[ "${pval}" != "${tg_value[$i]}" ]]; then
|
|
_color="${_color_good}"
|
|
fi
|
|
elif [ "${tg_sign[$i]}" = ">" ]; then
|
|
if [ "${pval}" -gt "${tg_value[$i]}" ]; then
|
|
_color="${_color_good}"
|
|
fi
|
|
fi
|
|
done
|
|
# has info color?
|
|
for (( i=0; i < ${#ti_placeholder[@]}; i++ )); do
|
|
|
|
if [ "${ti_sign[$i]}" = "=" ] || [ "${ti_sign[$i]}" = "!=" ]; then
|
|
pval="${!ti_placeholder[$i]}"
|
|
else
|
|
pval="$( echo "${!ti_placeholder[$i]}" | grep -oE '[0-9]*' | head -1 )"
|
|
fi
|
|
|
|
if [ "${ti_sign[$i]}" = "<" ]; then
|
|
if [ "${pval}" -lt "${ti_value[$i]}" ]; then
|
|
_color="${_color_info}"
|
|
fi
|
|
elif [ "${ti_sign[$i]}" = "=" ]; then
|
|
if [[ "${pval}" =~ ${ti_value[$i]} ]]; then
|
|
_color="${_color_info}"
|
|
fi
|
|
elif [ "${ti_sign[$i]}" = "!=" ]; then
|
|
if [[ "${pval}" != "${ti_value[$i]}" ]]; then
|
|
_color="${_color_info}"
|
|
fi
|
|
elif [ "${ti_sign[$i]}" = ">" ]; then
|
|
if [ "${pval}" -gt "${ti_value[$i]}" ]; then
|
|
_color="${_color_info}"
|
|
fi
|
|
fi
|
|
done
|
|
# has warning color?
|
|
for (( i=0; i < ${#tw_placeholder[@]}; i++ )); do
|
|
|
|
if [ "${tw_sign[$i]}" = "=" ] || [ "${tw_sign[$i]}" = "!=" ]; then
|
|
pval="${!tw_placeholder[$i]}"
|
|
else
|
|
pval="$( echo "${!tw_placeholder[$i]}" | grep -oE '[0-9]*' | head -1 )"
|
|
fi
|
|
|
|
if [ "${tw_sign[$i]}" = "<" ]; then
|
|
if [ "${pval}" -lt "${tw_value[$i]}" ]; then
|
|
_color="${color_warn}"
|
|
fi
|
|
elif [ "${tw_sign[$i]}" = "=" ]; then
|
|
if [[ "${pval}" =~ ${tw_value[$i]} ]]; then
|
|
_color="${_color_warn}"
|
|
fi
|
|
elif [ "${tw_sign[$i]}" = "!=" ]; then
|
|
if [[ "${pval}" != "${tw_value[$i]}" ]]; then
|
|
_color="${_color_warn}"
|
|
fi
|
|
elif [ "${tw_sign[$i]}" = ">" ]; then
|
|
if [ "${pval}" -gt "${tw_value[$i]}" ]; then
|
|
_color="${_color_warn}"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
|
|
# has critical color?
|
|
for (( i=0; i < ${#tc_placeholder[@]}; i++ )); do
|
|
|
|
if [ "${tc_sign[$i]}" = "=" ] || [ "${tc_sign[$i]}" = "!=" ]; then
|
|
pval="${!tc_placeholder[$i]}"
|
|
else
|
|
pval="$( echo "${!tc_placeholder[$i]}" | grep -oE '[0-9]*' | head -1 )"
|
|
fi
|
|
|
|
if [ "${tc_sign[$i]}" = "<" ]; then
|
|
if [ "${pval}" -lt "${tc_value[$i]}" ]; then
|
|
_color="${_color_crit}"
|
|
fi
|
|
elif [ "${tc_sign[$i]}" = "=" ]; then
|
|
if [[ "${pval}" =~ ${tc_value[$i]} ]]; then
|
|
_color="${_color_crit}"
|
|
fi
|
|
elif [ "${tc_sign[$i]}" = "!=" ]; then
|
|
if [[ "${pval}" != "${tc_value[$i]}" ]]; then
|
|
_color="${_color_crit}"
|
|
fi
|
|
elif [ "${tc_sign[$i]}" = ">" ]; then
|
|
if [ "${pval}" -gt "${tc_value[$i]}" ]; then
|
|
_color="${_color_crit}"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
|
|
echo "${_color}"
|
|
}
|
|
|
|
|
|
###
|
|
### Replace custom stuff in format string
|
|
###
|
|
replace_placeholders() {
|
|
local _format="${1}"
|
|
local _search
|
|
local _replace
|
|
|
|
# Select format based on extended placeholders
|
|
for (( i=0; i < ${#fe_placeholder[@]}; i++ )); do
|
|
|
|
if [ "${fe_sign[$i]}" = "=" ] || [ "${fe_sign[$i]}" = "!=" ]; then
|
|
pval="${!fe_placeholder[$i]}"
|
|
else
|
|
pval="$( echo "${!fe_placeholder[$i]}" | grep -oE '[0-9]*' | head -1 )"
|
|
fi
|
|
|
|
if [ "${fe_sign[$i]}" = "<" ]; then
|
|
if [ "${pval}" -lt "${fe_value[$i]}" ]; then
|
|
_format="${fe_format[$i]}"
|
|
fi
|
|
elif [ "${fe_sign[$i]}" = "=" ]; then
|
|
if [[ "${pval}" =~ ${fe_value[$i]} ]]; then
|
|
_format="${fe_format[$i]}"
|
|
fi
|
|
elif [ "${fe_sign[$i]}" = "!=" ]; then
|
|
if [[ "${pval}" != "${fe_value[$i]}" ]]; then
|
|
_format="${fe_format[$i]}"
|
|
fi
|
|
elif [ "${fe_sign[$i]}" = ">" ]; then
|
|
if [ "${pval}" -gt "${fe_value[$i]}" ]; then
|
|
_format="${fe_format[$i]}"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
|
|
|
|
# Replace placeholders in $format
|
|
for (( i=0; i < ${#format_nodes[@]}; i++ )); do
|
|
_search="${format_nodes[$i]}"
|
|
_replace="${!format_vars[$i]}"
|
|
_format="${_format/${_search}/${_replace}}"
|
|
done
|
|
echo "${_format}"
|
|
}
|
|
|
|
|
|
###
|
|
### Replace colors in format string
|
|
###
|
|
replace_colors() {
|
|
local _format="${1}"
|
|
local _color="${2}"
|
|
local _color_def="${3}"
|
|
local _color_good="${4}"
|
|
local _color_warn="${5}"
|
|
local _color_crit="${6}"
|
|
local _color_info="${7}"
|
|
|
|
_format="${_format/'{color}'/${_color}}"
|
|
_format="${_format/'{color_def}'/${_color_def}}"
|
|
_format="${_format/'{color_good}'/${_color_good}}"
|
|
_format="${_format/'{color_warn}'/${_color_warn}}"
|
|
_format="${_format/'{color_crit}'/${_color_crit}}"
|
|
_format="${_format/'{color_info}'/${_color_info}}"
|
|
|
|
echo "${_format}"
|
|
}
|
|
|
|
|
|
|
|
################################################################################
|
|
#
|
|
# MAIN ENTRY POINT
|
|
#
|
|
################################################################################
|
|
|
|
# Enable/Disable threshold argument
|
|
if [ "${has_threshold}" = "1" ]; then
|
|
th_chk=""
|
|
else
|
|
th_chk="__THRESHOLD_DISABLED__"
|
|
fi
|
|
|
|
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
###
|
|
### Extended formats
|
|
###
|
|
-fe)
|
|
# 1/4 Check placeholder
|
|
shift
|
|
if [ "${1}" = "" ]; then
|
|
echo "Error, -fe <p> - no placeholder specified."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
f=0
|
|
for (( i=0; i < ${#format_nodes[@]}; i++ )); do
|
|
if [ "${format_nodes[$i]}" = "${1}" ]; then
|
|
f=1
|
|
break
|
|
fi
|
|
done
|
|
if [ "${f}" = "0" ]; then
|
|
echo "Error, -fe '${1}' no such placeholder."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
fe_placeholder+=("${format_vars[$i]}")
|
|
|
|
# 2/4 Check sign
|
|
shift
|
|
if [ "${1}" = "" ]; then
|
|
echo "Error, -fe '{${fe_placeholder[${#fe_placeholder[@]}-1]}}' '${1}' - sign argyment is empty."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
if [ "${1}" != "<" ] && [ "${1}" != ">" ] && [ "${1}" != "=" ] && [ "${1}" != "!=" ]; then
|
|
echo "Error, -fe '{${fe_placeholder[${#fe_placeholder[@]}-1]}}' '${1}' - invalid sign: '${1}'."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
fe_sign+=("${1}")
|
|
|
|
# 3/4 Check value
|
|
shift
|
|
if [ "${1}" = "" ]; then
|
|
echo "Error, -fe '{${fe_placeholder[${#fe_placeholder[@]}-1]}}' '${fe_sign[${#fe_sign[@]}-1]}' '${1}' - value argument is empty."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
if [ "${fe_sign[${#fe_sign[@]}-1]}" = ">" ] || [ "${fe_sign[${#fe_sign[@]}-1]}" = "<" ]; then
|
|
if ! printf "%d" "${1}" >/dev/null 2>&1; then
|
|
echo "Error, -fe '{${fe_placeholder[${#fe_placeholder[@]}-1]}}' '${fe_sign[${#fe_sign[@]}-1]}' '${1}' - value argument is not a number."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
fi
|
|
fe_value+=("${1}")
|
|
|
|
# 4/4 Check placeholder string
|
|
shift
|
|
fe_format+=("${1}")
|
|
;;
|
|
###
|
|
### Threshold good
|
|
###
|
|
"-tg${th_chk}")
|
|
# 1/3 Check placeholder
|
|
shift
|
|
if [ "${1}" = "" ]; then
|
|
echo "Error, -tg <p> - no placeholder specified."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
f=0
|
|
for (( i=0; i < ${#format_nodes[@]}; i++ )); do
|
|
if [ "${format_nodes[$i]}" = "${1}" ]; then
|
|
f=1
|
|
break
|
|
fi
|
|
done
|
|
if [ "${f}" = "0" ]; then
|
|
echo "Error, -tg '${1}' no such placeholder."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
tg_placeholder+=("${format_vars[$i]}")
|
|
|
|
# 2/3 Check sign
|
|
shift
|
|
if [ "${1}" = "" ]; then
|
|
echo "Error, -tg '{${tg_placeholder[${#tg_placeholder[@]}-1]}}' '${1}' - sign argument is empty."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
if [ "${1}" != "<" ] && [ "${1}" != ">" ] && [ "${1}" != "=" ] && [ "${1}" != "!=" ]; then
|
|
echo "Error, -tg '{${tg_placeholder[${#tg_placeholder[@]}-1]}}' '${1}' - invalid sign: '${1}'."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
tg_sign+=("${1}")
|
|
|
|
# 3/3 Check value
|
|
shift
|
|
if [ "${1}" = "" ]; then
|
|
echo "Error, -tg '{${tg_placeholder[${#tg_placeholder[@]}-1]}}' '${tg_sign[${#tg_sign[@]}-1]}' '${1}' - value argyment is empty."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
if [ "${tg_sign[${#tg_sign[@]}-1]}" = ">" ] || [ "${tg_sign[${#tg_sign[@]}-1]}" = "<" ]; then
|
|
if ! printf "%d" "${1}" >/dev/null 2>&1; then
|
|
echo "Error, -tg '{${tg_placeholder[${#tg_placeholder[@]}-1]}}' '${tg_sign[${#tg_sign[@]}-1]}' '${1}' - value argument is not a number."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
fi
|
|
tg_value+=("${1}")
|
|
;;
|
|
###
|
|
### Threshold info
|
|
###
|
|
"-ti${th_chk}")
|
|
# 1/3 Check placeholder
|
|
shift
|
|
if [ "${1}" = "" ]; then
|
|
echo "Error, -ti <p> - no placeholder specified."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
f=0
|
|
for (( i=0; i < ${#format_nodes[@]}; i++ )); do
|
|
if [ "${format_nodes[$i]}" = "${1}" ]; then
|
|
f=1
|
|
break
|
|
fi
|
|
done
|
|
if [ "${f}" = "0" ]; then
|
|
echo "Error, -ti '${1}' no such placeholder."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
ti_placeholder+=("${format_vars[$i]}")
|
|
|
|
# 2/3 Check sign
|
|
shift
|
|
if [ "${1}" = "" ]; then
|
|
echo "Error, -ti '{${ti_placeholder[${#ti_placeholder[@]}-1]}}' '${1}' - sign argument is empty."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
if [ "${1}" != "<" ] && [ "${1}" != ">" ] && [ "${1}" != "=" ] && [ "${1}" != "!=" ]; then
|
|
echo "Error, -ti '{${ti_placeholder[${#ti_placeholder[@]}-1]}}' '${1}' - invalid sign: '${1}'."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
ti_sign+=("${1}")
|
|
|
|
# 3/3 Check value
|
|
shift
|
|
if [ "${1}" = "" ]; then
|
|
echo "Error, -ti '{${ti_placeholder[${#ti_placeholder[@]}-1]}}' '${ti_sign[${#ti_sign[@]}-1]}' '${1}' - value argyment is empty."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
if [ "${ti_sign[${#ti_sign[@]}-1]}" = ">" ] || [ "${ti_sign[${#ti_sign[@]}-1]}" = "<" ]; then
|
|
if ! printf "%d" "${1}" >/dev/null 2>&1; then
|
|
echo "Error, -ti '{${ti_placeholder[${#ti_placeholder[@]}-1]}}' '${ti_sign[${#ti_sign[@]}-1]}' '${1}' - value argument is not a number."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
fi
|
|
ti_value+=("${1}")
|
|
;;
|
|
###
|
|
### Threshold warning
|
|
###
|
|
"-tw${th_chk}")
|
|
# 1/3 Check placeholder
|
|
shift
|
|
if [ "${1}" = "" ]; then
|
|
echo "Error, -tw <p> - no placeholder specified."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
f=0
|
|
for (( i=0; i < ${#format_nodes[@]}; i++ )); do
|
|
if [ "${format_nodes[$i]}" = "${1}" ]; then
|
|
f=1
|
|
break
|
|
fi
|
|
done
|
|
if [ "${f}" = "0" ]; then
|
|
echo "Error, -tw '${1}' no such placeholder."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
tw_placeholder+=("${format_vars[$i]}")
|
|
|
|
# 2/3 Check sign
|
|
shift
|
|
if [ "${1}" = "" ]; then
|
|
echo "Error, -tw '{${tw_placeholder[${#tw_placeholder[@]}-1]}}' '${1}' - sign argument is empty."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
if [ "${1}" != "<" ] && [ "${1}" != ">" ] && [ "${1}" != "=" ] && [ "${1}" != "!=" ]; then
|
|
echo "Error, -tw '{${tw_placeholder[${#tw_placeholder[@]}-1]}}' '${1}' - invalid sign: '${1}'."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
tw_sign+=("${1}")
|
|
|
|
# 3/3 Check value
|
|
shift
|
|
if [ "${1}" = "" ]; then
|
|
echo "Error, -tw '{${tw_placeholder[${#tw_placeholder[@]}-1]}}' '${tw_sign[${#tw_sign[@]}-1]}' '${1}' - value argyment is empty."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
if [ "${tw_sign[${#tw_sign[@]}-1]}" = ">" ] || [ "${tw_sign[${#tw_sign[@]}-1]}" = "<" ]; then
|
|
if ! printf "%d" "${1}" >/dev/null 2>&1; then
|
|
echo "Error, -tw '{${tw_placeholder[${#tw_placeholder[@]}-1]}}' '${tw_sign[${#tw_sign[@]}-1]}' '${1}' - value argument is not a number."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
fi
|
|
tw_value+=("${1}")
|
|
;;
|
|
###
|
|
### Threshold critical
|
|
###
|
|
"-tc${th_chk}")
|
|
# 1/3 Check placeholder
|
|
shift
|
|
if [ "${1}" = "" ]; then
|
|
echo "Error, -tc <p> - no placeholder specified."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
f=0
|
|
for (( i=0; i < ${#format_nodes[@]}; i++ )); do
|
|
if [ "${format_nodes[$i]}" = "${1}" ]; then
|
|
f=1
|
|
break
|
|
fi
|
|
done
|
|
if [ "${f}" = "0" ]; then
|
|
echo "Error, -tc '${1}' no such placeholder."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
tc_placeholder+=("${format_vars[$i]}")
|
|
|
|
# 2/3 Check sign
|
|
shift
|
|
if [ "${1}" = "" ]; then
|
|
echo "Error, -tc '{${tc_placeholder[${#tc_placeholder[@]}-1]}}' '${1}' - sign argument is empty."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
if [ "${1}" != "<" ] && [ "${1}" != ">" ] && [ "${1}" != "=" ] && [ "${1}" != "!=" ]; then
|
|
echo "Error, -tc '{${tc_placeholder[${#tc_placeholder[@]}-1]}}' '${1}' - invalid sign: '${1}'."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
tc_sign+=("${1}")
|
|
|
|
# 3/3 Check value
|
|
shift
|
|
if [ "${1}" = "" ]; then
|
|
echo "Error, -tc '{${tc_placeholder[${#tc_placeholder[@]}-1]}}' '${tc_sign[${#tc_sign[@]}-1]}' '${1}' - value argyment is empty."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
if [ "${tc_sign[${#tc_sign[@]}-1]}" = ">" ] || [ "${tc_sign[${#tc_sign[@]}-1]}" = "<" ]; then
|
|
if ! printf "%d" "${1}" >/dev/null 2>&1; then
|
|
echo "Error, -tc '{${tc_placeholder[${#tc_placeholder[@]}-1]}}' '${tc_sign[${#tc_sign[@]}-1]}' '${1}' - value argument is not a number."
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
fi
|
|
tc_value+=("${1}")
|
|
;;
|
|
###
|
|
### Format overwrite
|
|
###
|
|
-f)
|
|
shift
|
|
if [ "${1}" = "" ]; then
|
|
echo "Error, -f requires a string"
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
format="${1}"
|
|
;;
|
|
###
|
|
### Disable pango markup output
|
|
###
|
|
-np)
|
|
pango=0
|
|
;;
|
|
###
|
|
### Color overwrites
|
|
###
|
|
-cd)
|
|
# default color
|
|
shift
|
|
if ! echo "${1}" | grep -qE '#[0-9a-fA-F]{6}' >/dev/null 2>&1; then
|
|
echo "Error, invalid color string: ${1}"
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
color_def="${1}"
|
|
;;
|
|
-cg)
|
|
# good color
|
|
shift
|
|
if ! echo "${1}" | grep -qE '#[0-9a-fA-F]{6}' >/dev/null 2>&1; then
|
|
echo "Error, invalid color string: ${1}"
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
color_good="${1}"
|
|
;;
|
|
-cw)
|
|
# warning color
|
|
shift
|
|
if ! echo "${1}" | grep -qE '#[0-9a-fA-F]{6}' >/dev/null 2>&1; then
|
|
echo "Error, invalid color string: ${1}"
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
color_warn="${1}"
|
|
;;
|
|
-cc)
|
|
# critical color
|
|
shift
|
|
if ! echo "${1}" | grep -qE '#[0-9a-fA-F]{6}' >/dev/null 2>&1; then
|
|
echo "Error, invalid color string: ${1}"
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
color_crit="${1}"
|
|
;;
|
|
-ci)
|
|
# info color
|
|
shift
|
|
if ! echo "${1}" | grep -qE '#[0-9a-fA-F]{6}' >/dev/null 2>&1; then
|
|
echo "Error, invalid color string: ${1}"
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
color_info="${1}"
|
|
;;
|
|
###
|
|
### System options
|
|
###
|
|
-h)
|
|
print_usage
|
|
exit 0
|
|
;;
|
|
-v)
|
|
print_version
|
|
exit 0
|
|
;;
|
|
###
|
|
### Unknown/Custom option
|
|
###
|
|
*)
|
|
|
|
###
|
|
### Evaluate user-specified arguments
|
|
###
|
|
found=0
|
|
if [ "${#arg_params}" -gt "0" ]; then
|
|
for (( i=0; i<${#arg_params[@]}; i++ )); do
|
|
if [ "${arg_params[$i]}" = "${1}" ]; then
|
|
shift
|
|
var_name="${arg_vars[$i]}"
|
|
eval "${var_name}=\"${1}\""
|
|
found=1
|
|
break;
|
|
fi
|
|
done
|
|
fi
|
|
|
|
###
|
|
### Unknown option
|
|
###
|
|
if [ "${found}" = "0" ]; then
|
|
echo "Invalid argument: '${1}'"
|
|
echo "Type ${appname} -h for help"
|
|
exit 1
|
|
fi
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
|
|
|
|
|
|
###
|
|
### Call custom function
|
|
###
|
|
custom_action
|
|
|
|
###
|
|
### Get final output color (based on custom specs)
|
|
###
|
|
color="$( get_status_color "${color_def}" "${color_good}" "${color_warn}" "${color_crit}" "${color_info}" )"
|
|
|
|
###
|
|
### Format (colors)
|
|
###
|
|
format="$( replace_colors "${format}" "${color}" "${color_def}" "${color_good}" "${color_warn}" "${color_crit}" "${color_info}" )"
|
|
|
|
###
|
|
### Format (custom)
|
|
###
|
|
format="$( replace_placeholders "${format}" )"
|
|
|
|
|
|
###
|
|
### Output pango or plain style?
|
|
###
|
|
if [ "${pango}" = "1" ]; then
|
|
if [ "${format}" != "" ]; then
|
|
echo "<span color=\"${color}\">${format}</span>"
|
|
fi
|
|
else
|
|
echo "${format}" # Long output
|
|
echo "${format}" # short output
|
|
echo "\\${color}" # color code '\#RRGGBB'
|
|
fi
|
|
|
|
exit 0
|