Skip to content

Instantly share code, notes, and snippets.

@nathan-osman
Last active December 26, 2015 17:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nathan-osman/7191607 to your computer and use it in GitHub Desktop.
Save nathan-osman/7191607 to your computer and use it in GitHub Desktop.
Monitors a list of websites, providing notifications when something goes wrong.
ledcontrol>=0.2
twitter
#!/usr/bin/env python
from argparse import ArgumentParser
from logging import basicConfig, getLogger
from time import sleep
from urllib2 import urlopen
from ledcontrol.enumerator import Enumerator
from twitter import OAuth, Twitter
class SiteMonitor(object):
"""
Monitors a list of websites.
"""
def __init__(self, args):
"""
Initializes the monitor.
"""
self._args = args
if self._args.led:
self._led = iter(Enumerator()).next()
self._led.color = 'black'
if self._args.twitter:
self._twitter = Twitter(auth=OAuth(
consumer_key=self._args.consumer_key,
consumer_secret=self._args.consumer_secret,
token=self._args.token,
token_secret=self._args.token_secret,
))
self._logger = getLogger('sitemon')
self._fault = False
def _down(self, website):
"""
Take action when a website goes down.
"""
try:
if self._args.twitter:
self._twitter.statuses.update(status='%s is down!' % website)
if self._args.led:
self._led.pulse('red', count=4, interval=0.5)
self._led.color = 'red'
except Exception as e:
self._logger.critical(e)
def _up(self):
"""
Take action when a website comes back up.
"""
try:
if self._args.twitter:
self._twitter.statuses.update(status='All sites are back up.')
if self._args.led:
self._led.interpolate('green', 'black', duration=10)
except Exception as e:
self._logger.critical(e)
def run(self):
"""
Enters a loop that monitors all websites.
"""
while True:
self._logger.info('Performing scheduled update...')
try:
for website in self._args.websites:
urlopen('http://%s' % website).read()
if self._fault:
self._logger.info('All sites are back up')
self._up()
self._fault = False
except Exception as e:
if not self._fault:
self._logger.error('%s: %s' % (website, e))
self._down(website)
self._fault = True
sleep(self._args.interval)
if __name__ == '__main__':
basicConfig(format='[%(levelname)s] %(asctime)s - %(message)s')
parser = ArgumentParser(description='Monitors a list of websites')
parser.add_argument(
'--interval',
metavar='SECONDS',
type=int,
default=300,
help='number of seconds between updates',
)
parser.add_argument(
'--led',
action='store_true',
help='cause an LED device to light for errors',
)
parser.add_argument(
'--twitter',
action='store_true',
help='post a tweet for errors',
)
parser.add_argument('--consumer-key')
parser.add_argument('--consumer-secret')
parser.add_argument('--token')
parser.add_argument('--token-secret')
parser.add_argument(
'websites',
metavar='WEBSITES',
nargs='+',
type=str,
help='list of websites to check',
)
SiteMonitor(parser.parse_args()).run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment