Created
January 25, 2024 12:14
-
-
Save ibrahimhajjaj/77a36ee163b3eef368c9a4d8fbba3c58 to your computer and use it in GitHub Desktop.
A handy Bash script to monitor your internet connection, log downtimes, and notify you of changes in connectivity status.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| # Default Configurations | |
| DEFAULT_PING_HOSTS=("8.8.8.8" "1.1.1.1") | |
| DEFAULT_CHECK_INTERVAL=10 | |
| DEFAULT_LOG_FILE="$(dirname "$0")/internet_downtime.log" | |
| # Initialize Configurations | |
| PING_HOSTS=("${DEFAULT_PING_HOSTS[@]}") | |
| CHECK_INTERVAL=$DEFAULT_CHECK_INTERVAL | |
| LOG_FILE=$DEFAULT_LOG_FILE | |
| # Parse Command Line Arguments | |
| while getopts "h:i:l:" opt; do | |
| case $opt in | |
| h) IFS=',' read -r -a PING_HOSTS <<< "$OPTARG";; | |
| i) CHECK_INTERVAL="$OPTARG";; | |
| l) LOG_FILE="$OPTARG";; | |
| *) echo "Usage: $0 [-h hosts] [-i interval] [-l logfile]"; exit 1;; | |
| esac | |
| done | |
| # Function Definitions | |
| check_internet() { | |
| for host in "${PING_HOSTS[@]}"; do | |
| if /sbin/ping -c 1 "$host" &>/dev/null; then | |
| return 0 | |
| fi | |
| done | |
| return 1 | |
| } | |
| log_message() { | |
| echo "$(date) - $1" | tee -a "$LOG_FILE" | |
| } | |
| send_notification() { | |
| local message=$1 | |
| if [ "$(uname)" == "Darwin" ]; then | |
| /usr/bin/osascript -e "Display notification \"$message\" with title \"Connectivity Alert\"" | |
| elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then | |
| notify-send "Connectivity Alert" "$message" | |
| fi | |
| } | |
| handle_exit() { | |
| log_message "Internet connectivity checker stopped." | |
| exit 0 | |
| } | |
| # Trap SIGINT for graceful termination | |
| trap handle_exit SIGINT | |
| # Main Loop | |
| log_message "Internet connectivity checker started." | |
| notification_sent=0 | |
| down_times=0 | |
| longest_duration=0 | |
| downtime_start=0 | |
| while true; do | |
| if check_internet; then | |
| if [ "$notification_sent" -eq 1 ]; then | |
| send_notification "Internet is reconnected" | |
| notification_sent=0 | |
| downtime_end=$(date +%s) | |
| duration=$((downtime_end - downtime_start)) | |
| down_times=$((down_times + 1)) | |
| longest_duration=$(($duration > $longest_duration ? $duration : $longest_duration)) | |
| fi | |
| echo -ne "\rDowntimes: $down_times | Longest Duration: ${longest_duration}s | Status: \033[32mONLINE\033[0m" | |
| else | |
| if [ "$notification_sent" -eq 0 ]; then | |
| send_notification "Internet is disconnected" | |
| notification_sent=1 | |
| downtime_start=$(date +%s) | |
| log_message "Internet down" | |
| fi | |
| echo -ne "\rDowntimes: $down_times | Longest Duration: ${longest_duration}s | Status: \033[31mOFFLINE\033[0m" | |
| fi | |
| sleep "$CHECK_INTERVAL" | |
| done |
Unfortunately the for loop doing pings only ever uses the first host.
This will be the last note. This script gives the appearance of working by happy accident. Function return values are not evaluated properly. You don't test the function by name after a call, you test $?. The value of the function name as a right hand side is itself (the spelling of the function).
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Chat GPT5 sent me here when I asked for "best Linux script for monitoring internet connection". You might imagine my surprise when I ran it on Ubuntu 20.04 and it reported the connection was down and never changed its opinion. I'm in the "extremely skeptical " camp in regards to LLMs, so this was another juicy data point.
Then I scrolled down and read the note from Chris above. As you haven't acted on this in the three weeks since Chris posted, I guess your attention is elsewhere. But IMO you are famous.
As Chris implied, the wrong path is a trivial problem to correct and I'm proceeding to add uplink and downlink quality judgments and appreciate the help your code has provided.
Best Regards,
Pete