Bandwidth-Aid: A VPN disconnect reminder script

Do you often forget to disconnect from a VPN connection? Try this out for a handy reminder!

VPNs are great for allowing you to do certain things that require being on your company's network while you're on an external internet connection. At Viget, we use a VPN for a number of activities: connecting to internal servers, viewing secure internal websites, deploying the latest code to certain servers, etc.

Recently, while working from home, I kept noticing that my internet felt slow. I'd hop on over to speedtest.net and see much lower than expected results. Before calling up my ISP, I noticed that I had forgotten to disconnect from the VPN! Connected for 8-15 hours, routing all of my traffic through our company's private network! :(

So, I came up with a solution: a small ruby script that runs every 10 minutes to check whether I'm connected to the VPN, and if I have been for more than 10 minutes, yell at me.

Note: my solution will only work on OSX, as it uses say and osascript for creating a dialog box notification

Steps to using it:

  • 1. Install Ruby (I recommend homebrew or rbenv)
  • 2. Save the contents of the script (found below) in a file in your home directory: /home/username/vpn_status_reminder.rb
    • Script contents:

# /home/username/vpn_status_reminder.rb

if connected_to_vpn?
 if already_connected?
   send_notification
 else
   set_connected_status
 end
else
 if already_connected?
   set_disconnected_status
 end
end

BEGIN {
 require 'fileutils'

 VPN_CONNECTED_FILENAME = "./VPN_CONNECTED.txt"

 def ifconfig_output
   @ifconfig_output ||= `/sbin/ifconfig`.strip
 end

 def connected_to_vpn?
   ifconfig_output.include?("ppp0")
 end

 def set_connected_status
   FileUtils.touch(VPN_CONNECTED_FILENAME)
 end

 def already_connected?
  File.exist?(VPN_CONNECTED_FILENAME)
 end

 def set_disconnected_status
   File.delete(VPN_CONNECTED_FILENAME)
 end

 def send_notification
   `say -v Zarvox "You are connected to the VPN"`
   `osascript -e 'tell app "Finder" to display dialog "\u{203C}\u{1F6A8}\u{203C} Connected to VPN \u{203C}\u{1F6A8}\u{203C}"'`
 end
}
  • 3. In your terminal, modify your cron scheduled jobs:
    • a. Determine where your ruby executable is: which ruby
    • b. Write down or store this value excluding the last /ruby part. example: if your output is /usr/bin/ruby the result would be /usr/bin
    • c. Update your cron jobs: EDITOR=nano crontab -e hit Enter and paste the following content: */10 * * * * /bin/bash -c 'export PATH=INSERT_HERE:$PATH; cd $HOME/; ruby vpn_status_reminder.rb', followed by ctrl+xYEnter. Where INSERT_HERE should be replaced with the result of step 3.b.

Do you like this solution or have any ideas for making it better? Let me know in the comments below!

Mike is a developer who uses his computer and electrical engineering degrees to craft complex but streamlined back-end systems for clients such as Shure and Privia Medical Group.

More posts by Mike