#!/bin/bash # Enter your zipcode here for local weather. zipcode=20001 # Add the services you want to monitor here as an array # e.g. ('apache2' 'gitea' 'postfix') servicelist=('apache2' 'gitea' 'postfix') # Disks to check (pls only do one for now) disks=('/dev/sda1') # Colors are nice blk=$(tput setaf 0) red=$(tput setaf 1) grn=$(tput setaf 2) ylw=$(tput setaf 3) blu=$(tput setaf 4) cyn=$(tput setaf 6) wht=$(tput setaf 7) und=$(tput smul) bld=$(tput bold) # Uncoloring is important rst=$(tput sgr0) # Get the number of columns and rows to center the # last updated time on the bottom of the window. cols=$(tput cols) rows=$(tput lines) # trap ctrl-c and call ctrl_c() # https://rimuhosting.com/knowledgebase/linux/misc/trapping-ctrl-c-in-bash trap ctrl_c INT function ctrl_c() { #clear tput cnorm echo "${rst}${red}CTRL+C Detected, exiting.${rst}" exit } function dothething() { # Grab the size of the window again as the window size # may have changed since the script was started. cols=$(tput cols) rows=$(tput lines) clear updatedstring="Last updated: `date \"+%F %X\"`" # Sometimes this may not complete due to wttr.in running # out of available queries to their weather provider. # This should only last for a day or so. curl wttr.in/${zipcode}?1QnuFA # Make sure the updated line is at the bottom of the screen down=$rows # Do some math to center the string horizontally let over="$cols/2-${#updatedstring}/2" # Move the cursor over to the correct starting location tput cup $down $over # Print the last time the weather was updated echo -n "${rst}${ylw}${updatedstring}${rst}" # Reset the cursor back to 0,0 tput cup 0 0 } # Check to see if we need to reboot the server function rebootcheck() { cols=$(tput cols) reboottext_notneeded=" No reboot required" reboottext_needed="A reboot is required" if [ -f /var/run/reboot-required ]; then # Reboot required let over="$cols-${#reboottext_needed}" tput cup 0 $over echo -en "${rst}${bld}${red}${reboottext_needed}${rst}" else # No reboot needed let over="$cols-${#reboottext_notneeded}-1" tput cup 0 $over echo -en "${rst}${grn}${reboottext_notneeded}${rst}" fi } # Disk space check function checkdisks() { _df=`df -h | tr -s [:blank:] | egrep "^${disks[0]} "` disk=`echo $_df | cut -d' ' -f1` # /dev/sda1 size=`echo $_df | cut -d' ' -f2` # 20G used=`echo $_df | cut -d' ' -f3` # 16G left=`echo $_df | cut -d' ' -f4` # 6.1G perc=`echo $_df | cut -d' ' -f5` # 69% mntp=`echo $_df | cut -d' ' -f6` # / rper=`echo $perc | tr -d "%"` # 69 capvalues=(85 90 95) capcolors=("${ylw}" "${bld}${red}" "${red}") capcolor="" if [ $rper -lt ${capvalues[0]} ]; then capcolor="${wht}" elif [ $rper -ge ${capvalues[0]} ] && [ $rper -lt ${capvalues[1]} ]; then capcolor="${capcolors[0]}" elif [ $rper -ge ${capvalues[1]} ] && [ $rper -lt ${capvalues[2]} ]; then capcolor="${capcolors[1]}" elif [ $rper -ge ${capvalues[2]} ]; then capcolor="${capcolors[2]}" fi title="Disk usage" usage="${used}/${size}" cols=$(tput cols) let overt="$cols-${#title}-1" let overd="$cols-${#disk}-1" let overu="$cols-${#usage}-1" tput cup 2 $overt echo -en "${rst}${title}${rst}" tput cup 3 $overd echo -en "${rst}${disk}${rst}" tput cup 4 $overu echo -en "${rst}${capcolor}${usage}${rst}" } # This be where we check the services function servicecheck(){ # If we're not monitoring any services, return [ ${#servicelist[@]} -eq 0 ] && return # These are the allowed rows # TODO? determine lines from after weather print? servicerow=(15 16 17 18 19) # These are the allowed columns # TODO? allow column count instead of static assignments? servicecol=(1 25 50) # Loop over the number of services that we're monitoring # https://askubuntu.com/a/1340735 for index in $(seq 0 $((${#servicelist[@]}-1))); do # Determine the position of the current service # we go across and then down # TODO? allow for variable columns? let echocol="${servicecol[${index}%3]}" let echorow="${servicerow[${index}/3]}" # Put our cursor where we can print tput cup $echorow $echocol # Clear the variables we use #unset echocol echorow # Do the actual service check. is-active returns # active or inactive. Easy peasy servicestatus=`systemctl is-active ${servicelist[${index}]}` # Print out the status, green with a dot (\U25CF) if it's online, # a red with a square (\U25A0) if it's stopped, or a yellow # triangle (\U25BA) if it's starting. case "${servicestatus}" in active) echo -en "${grn}\U25CF ${servicelist[${index}]}${rst}";; activating) echo -en "${ylw}\U25BA ${servicelist[${index}]}${rst}";; inactive) echo -en "${red}\U25A0 ${servicelist[${index}]}${rst}";; failed) echo -en "${red}\U25A0 ${servicelist[${index}]}${rst}";; esac #[ "${servicestatus}" == "active" ] && echo -en "${grn}\U25CF ${servicelist[${index}]}${rst}" || [ "${servicestatus}" == "activating" ] && echo -en "${ylw}\U25BA ${servicelist[${index}]}${rst}" || echo -en "${red}\U25A0 ${servicelist[${index}]}${rst}" done tput cup 0 0 } # Clear the screen and let's get going clear # Make the cursor invisible for the terminal tput civis # Programmers are great at naming things dothething # Check if a reboot is needed rebootcheck # Check the disk capacities checkdisks # Loop forever. Use ctrl+c to exit. while true; do # We want to make sure we only check once per hour # in order to not overwhelm the wttr.in service. # Octal fix: https://stackoverflow.com/a/24777667 if [ `date +%M` -eq "00" ]; then # Don't forget to check the seconds or it'll run # the command every second of the 0th minute. if [ `date +%S` -eq "00" ]; then dothething # Also doing these once per hour because more seems overkill rebootcheck checkdisks fi fi # I don't think checking every second is a problem... yet... servicecheck # Sleep for a second so we're not hammering the system # with date checks. sleep 1 done