"""Celery tasks. """ from datetime import timedelta from celery.task import PeriodicTask import subprocess import urllib2 from PIL import Image, ImageOps from StringIO import StringIO from django.conf import settings import os import sublab_monitor class NetworkStatus(PeriodicTask): """Periodic task for getting sublab network status """ hosts = { 'taifun': '172.22.83.5', 'trieste': '172.22.80.4', 'nautilus': '172.22.80.7', } run_every = timedelta(minutes=2) ignore_result = True def __init__(self, *args, **kwargs): PeriodicTask.__init__(self, *args, **kwargs) @staticmethod def host_alive(host): rc = subprocess.call(['ping', '-c', '2', '-W', '1', host]) if rc == 0: return True else: return False def run(self, **kwargs): """Ping all the hosts. """ self.logger = self.get_logger(**kwargs) results = {} for host, target in self.hosts.items(): results[host] = self.host_alive(target) storage = sublab_monitor.Storage('network_status') for host, status in results.items(): storage.set(host, status) return repr(results) class ImageFetcher(object): """ A task mixin which downloads, processes and stores an Image """ @property def fetch_url(self): """ The location from which the image should be fetched """ raise NotImplementedError @property def store_name(self): """ The name under which the image should be stored """ raise NotImplementedError def process_image(self, image): """ This method may be overwritten to perform some processing on the image """ raise NotImplementedError def run(self, **kwargs): upstream = urllib2.urlopen(self.fetch_url).read() image = Image.open(StringIO(upstream)) try: image = self.process_image(image) except NotImplementedError: pass fn = os.path.join(settings.MEDIA_ROOT, self.store_name) fn_new = os.path.join(settings.MEDIA_ROOT, 'new-%s' % self.store_name) image.save(fn_new) os.rename(fn_new, fn) class EnhancingImageFetcher(ImageFetcher): def process_image(self, image): rv = ImageOps.autocontrast(image) rv.im = ImageOps.unsharp_mask(rv, 10.0, 40, 7) return rv class KarlHeineCamFetcher(EnhancingImageFetcher, PeriodicTask): run_every = timedelta(minutes=5) fetch_url = 'http://taifun.local.sublab.org/webcam.jpg' store_name = 'karlheine_cam.jpg' class TempGraphFetcher(ImageFetcher, PeriodicTask): run_every = timedelta(minutes=5) fetch_url = 'http://taifun.local.sublab.org/temperature/temp-2hour.png' store_name = 'tempgraph.png'