コード例 #1
0
    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,
            }
コード例 #2
0
ファイル: xmpp.py プロジェクト: feczo/splashmon
    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")
コード例 #3
0
    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,
            }
コード例 #4
0
ファイル: xmpp.py プロジェクト: feczo/splashmon
    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")
コード例 #5
0
ファイル: xmpp.py プロジェクト: feczo/splashmon
    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)
コード例 #6
0
ファイル: xmpp.py プロジェクト: feczo/splashmon
    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)
コード例 #7
0
ファイル: site.py プロジェクト: azenk/stashboard
    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}
コード例 #8
0
ファイル: api.py プロジェクト: kyleconroy/stashboard
 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)
コード例 #9
0
ファイル: api.py プロジェクト: kyleconroy/stashboard
 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)
コード例 #10
0
ファイル: admin.py プロジェクト: Homefinder/stashboard
    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')
コード例 #11
0
    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')
コード例 #12
0
ファイル: site.py プロジェクト: johnclarkemills/stashboard
    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)
コード例 #13
0
ファイル: site.py プロジェクト: johnclarkemills/stashboard
    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')
コード例 #14
0
ファイル: site.py プロジェクト: Cdub1704/stashboard
    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')
コード例 #15
0
ファイル: xmpp.py プロジェクト: feczo/splashmon
    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)
コード例 #16
0
    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() }
コード例 #17
0
ファイル: api.py プロジェクト: johnclarkemills/stashboard
    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)
コード例 #18
0
ファイル: api.py プロジェクト: johnclarkemills/stashboard
    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)
コード例 #19
0
ファイル: xmpp.py プロジェクト: feczo/splashmon
    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)
コード例 #20
0
ファイル: api.py プロジェクト: samn/stashboard
    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)
コード例 #21
0
ファイル: site.py プロジェクト: Cdub1704/stashboard
    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')
コード例 #22
0
ファイル: site.py プロジェクト: johnclarkemills/stashboard
    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')
コード例 #23
0
ファイル: site.py プロジェクト: johnclarkemills/stashboard
    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()
コード例 #24
0
    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)))
コード例 #25
0
ファイル: api.py プロジェクト: Tradeshift/stashboard
    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)))
コード例 #26
0
    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,
            }
コード例 #27
0
ファイル: site.py プロジェクト: samn/stashboard
    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')
コード例 #28
0
ファイル: admin.py プロジェクト: kyleconroy/stashboard
 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')
コード例 #29
0
ファイル: main.py プロジェクト: e911miri/adroid
 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))
コード例 #30
0
ファイル: api.py プロジェクト: e911miri/adroid
 def get(self):
     svc_list = []
     for x in Service.all():
         svc_list.append(x.to_dict())
     self.response.out.write(simplejson.dumps(svc_list))
コード例 #31
0
ファイル: admin.py プロジェクト: kyleconroy/stashboard
 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')
コード例 #32
0
ファイル: serverchecks.py プロジェクト: beanbaginc/stashboard
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))