126 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
		
		
			
		
	
	
			126 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
|  | #!/bin/bash
 | ||
|  | 
 | ||
|  | # Mullvad_VPN_Check | ||
|  | # A script that checks for a Mullvad VPN connection, logs the status, | ||
|  | # and sends alerts if the VPN status changes. | ||
|  | 
 | ||
|  | # Set Discord webhook | ||
|  | WEBHOOK_URL="DISCORD_WEBHOOK_URL" | ||
|  | 
 | ||
|  | # Temp file to store the VPN connection status | ||
|  | STATUS_FILE="/tmp/vpn_status.log" | ||
|  | 
 | ||
|  | # Function to send VPN down alert | ||
|  | vpn_down_alert() { | ||
|  | curl -H "Content-Type: application/json" -X POST --data @- "$WEBHOOK_URL" <<EOF | ||
|  | { | ||
|  |   "content": null, | ||
|  |   "embeds": [ | ||
|  |     { | ||
|  |       "title": "VPN Connectivity - WARNING", | ||
|  |       "description": "\"$(hostname)\" is not going through a Mullvad VPN connection", | ||
|  |       "color": 13238272, | ||
|  |       "fields": [ | ||
|  |         { | ||
|  |           "name": "Date and Time of Test:", | ||
|  |           "value": "$(date +'%Y-%m-%d %H:%M:%S')" | ||
|  |         }, | ||
|  |         { | ||
|  |           "name": "Current ISP", | ||
|  |           "value": "$ORG" | ||
|  |         }, | ||
|  |         { | ||
|  |           "name": "Current IP", | ||
|  |           "value": "$IP" | ||
|  |         } | ||
|  |       ] | ||
|  |     } | ||
|  |   ], | ||
|  |   "attachments": [] | ||
|  | } | ||
|  | EOF | ||
|  | } | ||
|  | 
 | ||
|  | # Function to send VPN restored alert | ||
|  | vpn_up_alert() { | ||
|  | curl -H "Content-Type: application/json" -X POST --data @- "$WEBHOOK_URL" <<EOF | ||
|  | { | ||
|  |   "content": null, | ||
|  |   "embeds": [ | ||
|  |     { | ||
|  |       "title": "VPN Connectivity - RESTORED", | ||
|  |       "description": "\"$(hostname)\" is now going through a Mullvad VPN connection", | ||
|  |       "color": 3066993, | ||
|  |       "fields": [ | ||
|  |         { | ||
|  |           "name": "Date and Time of Test:", | ||
|  |           "value": "$(date +'%Y-%m-%d %H:%M:%S')" | ||
|  |         }, | ||
|  |         { | ||
|  |           "name": "Current ISP", | ||
|  |           "value": "$ORG" | ||
|  |         }, | ||
|  |         { | ||
|  |           "name": "Current IP", | ||
|  |           "value": "$IP" | ||
|  |         } | ||
|  |       ] | ||
|  |     } | ||
|  |   ], | ||
|  |   "attachments": [] | ||
|  | } | ||
|  | EOF | ||
|  | } | ||
|  | 
 | ||
|  | # Function to check the VPN status and act accordingly | ||
|  | check_vpn_status() { | ||
|  |     mullvad_exit_ip="$1" | ||
|  | 
 | ||
|  |     # Check the current status (true for VPN, false for no VPN) | ||
|  |     if [ "$mullvad_exit_ip" = "false" ]; then | ||
|  |         echo "VPN not connected, sending alert..." | ||
|  |          | ||
|  |         # Send alert if VPN was connected last time | ||
|  |         if [ "$previous_status" = "true" ]; then | ||
|  |             vpn_down_alert | ||
|  |             echo "VPN down alert sent!" | ||
|  |         fi | ||
|  | 
 | ||
|  |         # Log the current status | ||
|  |         echo "false" > "$STATUS_FILE" | ||
|  |     else | ||
|  |         echo "VPN connected." | ||
|  | 
 | ||
|  |         # Send a "VPN restored" alert if VPN was not connected last time | ||
|  |         if [ "$previous_status" = "false" ]; then | ||
|  |             vpn_up_alert | ||
|  |             echo "VPN restored alert sent!" | ||
|  |         fi | ||
|  | 
 | ||
|  |         # Log the current status | ||
|  |         echo "true" > "$STATUS_FILE" | ||
|  |     fi | ||
|  | } | ||
|  | 
 | ||
|  | # Fetch JSON data from Mullvad API | ||
|  | json=$(curl -s https://ipv4.am.i.mullvad.net/json) | ||
|  | 
 | ||
|  | # Get Reported IP and ISP | ||
|  | IP=$(echo "$json" | grep -oE '"ip":\s*"[^"]+"' | grep -oE '[0-9.]+') | ||
|  | ORG=$(echo "$json" | grep -oP '(?<="organization":")[^"]+') | ||
|  | 
 | ||
|  | # Parse JSON and extract "mullvad_exit_ip" (true if VPN, false if not) | ||
|  | mullvad_exit_ip=$(jq -r '.mullvad_exit_ip' <<< "$json") | ||
|  | 
 | ||
|  | # Check if the status log file exists, if not create it with a default value (false) | ||
|  | if [ ! -f "$STATUS_FILE" ]; then | ||
|  |     echo "false" > "$STATUS_FILE" | ||
|  | fi | ||
|  | 
 | ||
|  | # Read the previous VPN status from the log file | ||
|  | previous_status=$(cat "$STATUS_FILE") | ||
|  | 
 | ||
|  | # Check the current VPN status and take action | ||
|  | check_vpn_status "$mullvad_exit_ip" | ||
|  | 
 |