def data(self): services = [] dstatus = Status.default() for s in Service.all().order("name").fetch(100): event = s.current_event() if event is not None: status = event.status else: status = dstatus service = { "slug": s.slug, "name": s.name, "url": s.url(), "status": status, "history": s.history(5, dstatus) } services.append(service) return { "days": get_past_days(5), "statuses": Status.all().fetch(100), "services": services, }
def unsms_command(self, message=None): """Unsubscribe the user from a service""" plist = message.body.split(' ') if len(plist)==2: user = message.sender.split('/')[0] service_name = plist[1] service = Service.all().filter('name = ', service_name).get() if service: subscription = Subscription.all().filter('address =', user).filter('service = ', service).get() if subscription: mobile = Mobile.all().filter('subscription = ', subscription).get() if mobile: message.reply("Unsubscribed user %s from backup mobile %s for service %s" % (user, mobile.number,service_name)) mobile.delete() else: message.reply("No backup mobile for user %s on %s service" % (user,service_name)) else: message.reply("User %s is not subscribed to service %s" % (user, service.name)) else: message.reply("Sorry, I couldn't find a service called " "%s" % service_name) else: message.reply("Usege: unsms SERVICE +6112345678")
def data(self): services = [] default_status = Status.get_default() query = Service.all().filter("list =", self.list).order("name") for service in query.fetch(100): event = service.current_event() if event is not None: status = event.status else: status = default_status today = date.today() + timedelta(days=1) current, = service.history(1, default_status, start=today) has_issues = (current["information"] and status.key() == default_status.key()) service_dict = { "slug": service.slug, "name": service.name, "url": service.url(), "status": status, "has_issues": has_issues, "history": service.history(5, default_status), } services.append(service_dict) return { "days": get_past_days(5), "statuses": Status.all().fetch(100), "services": services, }
def sms_command(self, message=None): """Subscribe the user to a offline SMS""" plist = message.body.split(' ') if len(plist)==3: user = message.sender.split('/')[0] service_name = plist[1] number = plist[2] service = Service.all().filter('name = ', service_name).get() if service: subscription = Subscription.all().filter('address =', user).filter('service = ', service).get() if subscription: mobile = Mobile.all().filter('number =', number).get() if mobile: message.reply("user %s is already registered backup mobile %s for service %s" % (user, mobile.number,service_name)) else: mobile = Mobile(number=number, subscription = subscription) mobile.put() message.reply("Subscribed user %s to backup mobile %s for service %s" % (user, number,service_name)) else: message.reply("Sorry, I couldn't find a subscription on %s for %s" % (service_name,user)) else: message.reply("Sorry, I couldn't find a service called " "%s" % service_name) else: message.reply("Usage: sms SERVICE +61412345678")
def sub_command(self, message=None): """Subscribe the user to XMPP or SMS""" user = message.sender.split('/')[0] plist = message.body.split(' ' ) service_name = plist[1] if len(plist)>2: type = "sms" user = plist[2] else: type = "xmpp" service = Service.all().filter('name = ', service_name).get() if service: subscription = Subscription.all().filter('address =', user).filter('service = ', service).get() if subscription: message.reply("user %s is already subscribed to service %s" % (user, service.name)) else: subscription = Subscription(key_name=hashlib.sha1(user).hexdigest(), type=type, address=user, service=service) subscription.put() message.reply("Subscribed %s to service %s" % (user, service.name)) else: message.reply("Sorry, I couldn't find a service called " "%s" % service_name)
def unsub_command(self, message=None): """Unsubscribe the user from a service""" user = message.sender.split('/')[0] plist = message.body.split(' ' ) service_name = plist[1] if len(plist)>2: type = "sms" user = plist[2] else: type = "xmpp" service = Service.all().filter('name = ', service_name).get() if service: subscription = Subscription.all().filter('address =', user).filter('service = ', service).filter('type =', type).get() if subscription: subscription.delete() if type == "xmpp": mobile = Mobile.all().filter('subscription = ', subscription).get() if mobile: mobile.delete() message.reply("Unsubscribed %s from service %s" % (user, service.name)) else: message.reply("user %s is not subscribed to service %s" % (user, service.name)) else: message.reply("Sorry, I couldn't find a service called " "%s" % service_name)
def data(self): services = [] default_status = Status.get_default() lists = [] for list in self.lists: l = List.get_by_slug(list) if l is not None: lists.append(l) for service in Service.all().filter("list IN", lists).order("name").fetch(100): event = service.current_event() if event is not None: status = event.status else: status = default_status if len(self.statuses) and not status.slug in self.statuses: continue today = date.today() + timedelta(days=1) current, = service.history(1, default_status, start=today) has_issues = current["information"] and status.key() == default_status.key() service_dict = { "slug": service.slug, "name": service.name, "url": service.url(), "status": status, "has_issues": has_issues, "history": service.history(5, default_status), } services.append(service_dict) return {"days": get_past_days(5), "statuses": Status.all().fetch(100), "services": services}
def get(self, version): if self.valid_version(version): query = Service.all().order("name") data = [s.rest(self.base_url(version)) for s in query] data = {"services": data} self.json(data) else: self.error(404, "API Version %s not supported" % version)
def get(self, version): if (self.valid_version(version)): query = Service.all().order('name') data = [s.rest(self.base_url(version)) for s in query] data = {"services": data} self.json(data) else: self.error(404, "API Version %s not supported" % version)
def get(self): if not setup_occurred(): self.redirect("/admin/setup") td = default_template_data() td["services_selected"] = True td["services"] = Service.all().order("name").fetch(1000) self.render(td, 'admin/services.html')
def get(self): ERROR_COUNT_THRESHOLD = 3 SENDER_ADDRESS = config.SITE["author"]+" <"+config.SITE["email"]+">" services = Service.all().fetch(100) recipient_addresses = config.SITE["recipients"] send_notification = False failures = [] for service in services: error_count = 0 prev_error_count = 0 body = "Here's a listing of the site statuses for the last ten minutes:\n" # search through recent 5 events. for event in Event.all().filter("service =", service).order("-start").fetch(5): self.response.out.write(service.name+": "+event.status.name+"<br/>") body += service.name+" "+event.start.strftime("%m/%d %H:%M")+" - "+event.status.name+": "+event.status.description+"\n" if event.status.name == "Up": error_count = 0 continue error_count += 1 if error_count == ERROR_COUNT_THRESHOLD: break for event in Event.all().filter("service =", service).order("-start").fetch(limit=5, offset=5): self.response.out.write(service.name+": "+event.status.name+"<br/>") body += service.name+" "+event.start.strftime("%m/%d %H:%M")+" - "+event.status.name+": "+event.status.description+"\n" if event.status.name == "Up": prev_error_count = 0 continue prev_error_count += 1 if prev_error_count == ERROR_COUNT_THRESHOLD: break body += "\n\n" if service.serviceurl: body += "This message is in reference to this URL: "+service.serviceurl+"\n" body += "Stashboard: http://" + os.environ.get('APPLICATION_ID') + ".appspot.com/\n" body += "GAE system status: http://code.google.com/status/appengine\n" self.response.out.write("prev: "+str(prev_error_count)+" curr: "+str(error_count)+"<br/><br/>") self.response.out.write("\n\n"+body+"<br/><br/>") # TODO: do we need to notified about failures across multiple services? if error_count >= ERROR_COUNT_THRESHOLD or prev_error_count >= ERROR_COUNT_THRESHOLD: if error_count == prev_error_count: continue elif error_count > prev_error_count: subject = "BBF Status - ERROR system report for "+service.name self.response.out.write("ERROR NOTIFICATION SENT\n") result = mail.send_mail(SENDER_ADDRESS, recipient_addresses, subject, body) elif error_count < prev_error_count: subject = "BBF Status - RESTORED system report for "+service.name self.response.out.write("RESTORED NOTIFICATION SENT\n") result = mail.send_mail(SENDER_ADDRESS, recipient_addresses, subject, body)
def get(self): user = users.get_current_user() logging.debug("RootHandler#get") q = Service.all() q.order("name") td = default_template_data() td["past"] = get_past_days(5) self.render(td, 'index.html')
def services_command(self, message=None): """List all services""" return_msg = [] for service in Service.all(): event = service.current_event() if event: return_msg.append("%s: %s: %s" % ( service.name, event.status.name, event.message)) else: return_msg.append("%s has no events" % service.name) return_msg = '\n'.join(return_msg) message.reply(return_msg)
def data(self): lists = {} default_status = Status.get_default() for service in Service.all().order("list").fetch(100): event = service.current_event() if event is not None: status = event.status else: status = default_status if service.list and not lists.has_key(service.list.slug) or \ lists[service.list.slug]["status"].name < status.name: lists[service.list.slug] = {"list": service.list, "status": status} return { "lists": lists.items() }
def get(self, version): logging.debug("ServicesListHandler#get") if (self.valid_version(version)): query = Service.all().order('name') data = [] for s in query: data.append(s.rest(self.base_url(version))) data = {"services": data} self.json(data) else: self.error(404, "API Version %s not supported" % version)
def get(self, version): logging.debug("ServicesListHandler#get") if (self.valid_version(version)): query = Service.all().order('name') data = [] for s in query: data.append(s.rest(self.base_url(version))) data = { "services": data } self.json(data) else: self.error(404, "API Version %s not supported" % version)
def service_command(self, message=None): """Change status of a service""" _, service_name = message.body.split(' ', 1) service = Service.all().filter('name = ', service_name).get() if service: return_msg =["Name: %s" % service.name] return_msg.append("Description: %s" % service.description) return_msg.append("Recent events:") events = service.events.order('-start').run(limit=3) for event in events: return_msg.append("%s: %s: %s" % ( event.start, event.status.name, event.message)) else: return_msg = ["Cannot find service with name: %s" % service_name] return_msg = "\n".join(return_msg) message.reply(return_msg)
def get(self, version): logging.debug("ServicesListHandler#get") if (self.valid_version(version)): region = self.request.get('region', default_value=None) query = Service.all().order('name') if region: r = Region.get_by_name(region) query.filter("region = ", r) data = [] for s in query: data.append(s.rest(self.base_url(version))) data = { "services": data } self.json(data) else: self.error(404, "API Version %s not supported" % version)
def get(self): user = users.get_current_user() logging.debug("BasicRootHandler#get") q = Service.all() q.order("name") services = q.fetch(100) p = Status.all() p.order("severity") past = get_past_days(5) td = default_template_data() td["services"] = q.fetch(100) td["statuses"] = p.fetch(100) td["past"] = past td["default"] = Status.default() self.render(td, 'basic','index.html')
def get(self): services = Service.all().fetch(50) statuses = Status.all().fetch(10) now = datetime.datetime.now() for loop_no, service in enumerate(services): if service.serviceurl == None: continue query = Event.all().filter('service =', service).order("-start").fetch(1) if len(query) > 0 and (now - query.pop().start < timedelta(minutes=service.freq)): continue res = None for i in range(3): try: # TODO: move to using async, so we can handle lots of pings... res = urlfetch.fetch(service.serviceurl) break except: logging.error('fetch num %d failed', i) sleep(1) if not res: event = Event(service = service, status = statuses[0], message = "Failed page load.") event.put() continue if res.status_code == 200: if service.pattern: result = re.search(service.pattern, res.content) if result: event = Event(service = service, status = statuses[1], message = "Passed. Page loaded. Regex found.") event.put() else: event = Event(service = service, status = statuses[0], message = "Failed regex.") event.put() else: event = Event(service = service, status = statuses[1], message = "Passed. Page loaded.") event.put() else: event = Event(service = service, status = statuses[0], message = "Failed page load.") event.put()
def delete(self, version, list_slug): if not self.valid_version(version): self.error(404, "API Version %s not supported" % version) return list = List.get_by_slug(list_slug) if not list: self.error(404, "List %s not found" % list_slug) return query = Service.all() query.filter('list =', list) if query: for s in query: s.list = None s.put() invalidate_cache() list.delete() self.json(list.rest(self.base_url(version)))
def data(self): services = [] default_status = Status.get_default() lists = [] for list in self.lists: l = List.get_by_slug(list) if l is not None: lists.append(l) for service in Service.all().filter("list IN", lists).order("name").fetch(100): event = service.current_event() if event is not None: status = event.status else: status = default_status if len(self.statuses) and not status.slug in self.statuses: continue today = date.today() + timedelta(days=1) current, = service.history(1, default_status, start=today) has_issues = (current["information"] and status.key() == default_status.key()) service_dict = { "slug": service.slug, "name": service.name, "url": service.url(), "status": status, "has_issues": has_issues, "history": service.history(5, default_status), } services.append(service_dict) return { "days": get_past_days(5), "statuses": Status.all().fetch(100), "services": services, }
def get(self): user = users.get_current_user() logging.debug("BasicRootHandler#get") today = datetime.datetime.today() end = today start = end - timedelta(days=+5) start_date = dateparser.parse(self.request.get('start', default_value=str(start))) end_date = dateparser.parse(self.request.get('end', default_value=str(end))) history_size = config.SITE['history_size'] if end_date > today or start_date > end_date or \ today.toordinal() - history_size > start_date.toordinal(): end_date = today start_date = end_date - timedelta(days=5) q = Service.all() q.order("name") services = [] for service in q.fetch(100): events = service.events_for_days(start_date, end_date) services.append((service, events)) p = Status.all() p.order("severity") past = get_past_days(5, end_date) td = default_template_data() td["start_date"] = start_date td["end_date"] = end_date td["services"] = services td["statuses"] = p.fetch(100) td["past"] = past td["default"] = Status.default() self.render(td, 'basic','index.html')
def get(self): td = default_template_data() td["services_selected"] = True td["services"] = Service.all().order("name").fetch(1000) self.render(td, 'admin/services.html')
def get(self): template_values = {} template_path = os.path.join(os.path.dirname(__file__), "templates/index.html") template_values['svc'] = Service.all() template_values['cat'] = Category.all() self.response.out.write(template.render(template_path, template_values))
def get(self): svc_list = [] for x in Service.all(): svc_list.append(x.to_dict()) self.response.out.write(simplejson.dumps(svc_list))
def serverisdown(service): update_status(service, 'down', 'The server could not be reached.') def check(service,url): print "Checking " + service + " (" + url + ")..." try: results[service] = urlfetch.fetch(url, headers={ 'Cache-Control': 'max-age=30' }, deadline=30) except urlfetch.Error: serverisdown(service) except DownloadError: serverisdown(service) else: if results[service].status_code == 500: serverisdown(service) else: serverisup(service) for service in Service.all(): description = service.description m = URL_RE.search(description) if m: check(service.slug, m.group(1))