You'd run this out of cron, like, every few hours:
#!/usr/bin/python import RPi.GPIO as GPIO import sys import time import subprocess import os import random hosts = ["220.127.116.11", "18.104.22.168", "22.214.171.124"] random.shuffle(hosts) FNULL = open(os.devnull) for host in hosts: res = subprocess.call(["ping", "-c", "3", "-W", "5", host], stdout=FNULL, stderr=FNULL) if (res == 0): sys.exit(0) # it worked. Bail print "All hosts unreachable - resetting router" reset_pin = 18 # Perform the reset operation GPIO.setmode(GPIO.BCM) GPIO.setup(reset_pin, GPIO.OUT, initial=GPIO.LOW) time.sleep(2) GPIO.cleanup() sys.exit(1)
This assumes you're using GPIO pin 18, but you can select any free one you like.
It's probably not entirely kosher to just ping those hosts, so to insure that you don't wind up in hot water, you should only run this script VERY sparingly. And it wouldn't be a bad idea to maybe pick different hosts - hosts close enough to be a good test for whether your router is up or not.