Exemplo n.º 1
0
    def post(self):
        keyname = self.request.get('camera')
        if keyname is not None:
            cam = CameraSource.get(db.Key(keyname))
            cam.deleted = True
            cam.put()

        self.response.out.write("deleted")
Exemplo n.º 2
0
    def post(self):
        keyname = self.request.get('camera')
        if keyname is not None:
            cam = CameraSource.get(db.Key(keyname))

        cmd = self.request.get('cmd')
        if cmd == 'get':
            self.response.headers['Content-Type'] = 'text/json'
            self.response.out.write("{")
            # TODO: need to escape unsafe characters
            self.response.out.write(' "key": "%s",' % cam.key())
            self.response.out.write(' "name": "%s",' % cam.name)
            self.response.out.write(' "url": "%s",' % cam.url)
            self.response.out.write(' "enabled": %d,' % cam.enabled)
            self.response.out.write(' "poll_max_fps": %d,' % cam.poll_max_fps)
            self.response.out.write(' "alert_max_fps": %d,' % cam.alert_max_fps)
            self.response.out.write(' "num_secs_after": %f,' % cam.num_secs_after)
            
            if cam.authuser:
                tmpuser = cam.authuser
            else:
                tmpuser = ""
                
            if cam.authpass:
                maskedpass = "******" * len(cam.authpass)
            else:
                maskedpass = ""
                
            self.response.out.write(' "authuser": "******",' % tmpuser)
            self.response.out.write(' "authpass": "******"' % maskedpass)
            self.response.out.write("}")

        elif cmd == 'save':
            cam.name = self.request.get('name')
            cam.url = self.request.get('url')
            cam.enabled = bool(int(self.request.get('enabled')))
            cam.poll_max_fps = int(self.request.get('poll_max_fps'))
            cam.alert_max_fps = int(self.request.get('alert_max_fps'))
            cam.num_secs_after = float(self.request.get('num_secs_after'))
            
            tmpuser = self.request.get('authuser')
            if not tmpuser:
                cam.authuser = None
            else:
                cam.authuser = tmpuser
                
            tmppass = self.request.get('authpass')
            if not tmppass:
                cam.authpass = None
            elif tmppass != '*' * len(tmppass):
                cam.authpass = tmppass
                
            cam.put()
            self.response.out.write("success")

        else:
            self.error(500)
            return
Exemplo n.º 3
0
    def get(self):
        self.response.headers['Content-Type'] = 'text/plain'

        # Iterate through all cameras.
        q = CameraSource.all()
        q.filter("enabled =",True).filter("deleted =",False)

        # capturing an image and detect motion once for all cameras.
        for cam in q.fetch(MAX_CAMERAS):
            self.pollCamera(cam)

        self.response.out.write("done")
Exemplo n.º 4
0
    def get(self):
        self.response.headers['Content-Type'] = 'text/plain'

        # Look for any cameras that have not polled recently.
        q = CameraSource.all()
        q.filter("enabled =",True).filter("deleted =",False)
        clocknow = datetime.now()
        for cam in q.fetch(MAX_CAMERAS):
            lastclock = memcache.get("camera{%s}.lastpoll_time" % cam.key())
            if lastclock is None or (clocknow - lastclock) > timedelta(minutes=5):
                # Queue a task to re-start polling for this camera.
                ImageFetcherTask.queueTask(cam.key())

        self.response.out.write("done")
Exemplo n.º 5
0
    def post(self):
        cam_name = self.request.get('name')
        cam_url = self.request.get('url')
        cam_enabled = bool(int(self.request.get('enabled')))
        cam_poll_max_fps = int(self.request.get('poll_max_fps'))
        cam_alert_max_fps = int(self.request.get('alert_max_fps'))
        cam_num_secs_after = float(self.request.get('num_secs_after'))
        cam_authuser = self.request.get('authuser')
        cam_authpass = self.request.get('authpass')

        cam = CameraSource(name=cam_name,
                           url=cam_url,
                           poll_max_fps = cam_poll_max_fps,
                           alert_max_fps = cam_alert_max_fps,
                           creation_time = datetime.now(),
                           enabled = cam_enabled,
                           deleted = False,
                           num_secs_after = cam_num_secs_after,
                           authuser = cam_authuser,
                           authpass = cam_authpass)
        cam.put()

        self.response.out.write("added=%s" % cam.key())
Exemplo n.º 6
0
    def get(self):
        numDeleted = 0
        try:
            # Look for CameraEvents marked deleted
            q = CameraEvent.all()
            q.filter("deleted =",True)
            for event in q.fetch(10):
                # Delete any frames belonging to this deleted CameraSource.
                q2 = CameraFrame.all()
                q2.filter("event_id =", event.key())
                if q2.count() > 0:
                    for frame in q2.fetch(500):
                        frame.delete()
                        numDeleted += 1
                else:
                    # No more frames belonging to this event, so delete it too.
                    event.delete()
                    numDeleted += 1

            # Look for CameraSources marked deleted
            q = CameraSource.all()
            q.filter("deleted =",True)
            for cam in q.fetch(10):
                # Mark any events belonging to this deleted CameraSource as deleted.
                q2 = CameraEvent.all()
                q2.filter("camera_id =", cam.key()).filter("deleted =",False)
                for event in q2.fetch(100):
                    numDeleted += 1
                    event.deleted = True
                    event.put()

                # Delete any frames belonging to this deleted CameraSource.
                q2 = CameraFrame.all()
                q2.filter("camera_id =", cam.key())
                for frame in q2.fetch(500):
                    frame.delete()
                    numDeleted += 1

                # Only delete the camera itself if nothing else needed to be done.
                if numDeleted == 0:
                    cam.delete()
                    numDeleted += 1

        except DeadlineExceededError:
            pass

        self.response.headers['Content-Type'] = 'text/plain'
        self.response.out.write("Deleted %d objects." % numDeleted)
Exemplo n.º 7
0
    def get(self):
        keyname = self.request.get('camera')
        if keyname is not None:
            cam = CameraSource.get(db.Key(keyname))
        else:
            self.error(500)
            return

        period = self.request.get('period')
        q2 = CameraEvent.all()
        q2.filter("camera_id =", cam.key()).filter("deleted =", False).order("-event_start")
        if period == "today":
            q2.filter("event_start >=", datetime.now().replace(hour=0,minute=0,second=0))
        elif period == "yesterday":
            q2.filter("event_start >=", datetime.now().replace(hour=0,minute=0,second=0) - timedelta(days=1))
            q2.filter("event_start <", datetime.now().replace(hour=0,minute=0,second=0))
        elif period == "week":
            startofweek = datetime.now().replace(hour=0, minute=0, second=0) - timedelta(days=datetime.now().isoweekday() % 7)
            q2.filter("event_start >=", startofweek)
        elif period == "month":
            #startofmonth = datetime.now().replace(day=1,hour=0,minute=0,second=0)
            startofmonth = datetime.now().replace(hour=0, minute=0, second=0) - timedelta(days=30)
            q2.filter("event_start >=", startofmonth)
        elif period == "all":
            pass
        else:
            return

        #cam.total = q2.count()
        results = q2.fetch(1000)

        for event in results:
            event.duration_text = (event.event_end - event.event_start)


        template_values = {
            'user': users.get_current_user(),
            'logout_url': users.create_logout_url('/'),
            'camera': cam,
            'eventlist': results,
            'timenow': datetime.utcnow(),
            }

        path = os.path.join(os.path.dirname(__file__), 'inc/browse.html')
        self.response.out.write(template.render(path, template_values))
Exemplo n.º 8
0
    def get(self):
        q = CameraSource.all()
        q.filter("deleted =", False).order("-creation_time")

        results = q.fetch(MAX_CAMERAS)
        startofweek = datetime.now().replace(hour=0, minute=0, second=0) - timedelta(days=datetime.now().isoweekday() % 7)
        #startofmonth = datetime.now().replace(day=1,hour=0,minute=0,second=0)
        startofmonth = datetime.now().replace(hour=0, minute=0, second=0) - timedelta(days=30)
        startofyesterday = datetime.now().replace(hour=0,minute=0,second=0) - timedelta(days=1)
        startoftoday = datetime.now().replace(hour=0,minute=0,second=0)

        for cam in results:

            # Generate a human-readable status indicator.
            # TODO: cam.enabled, cam.last_poll_time, cam.last_poll_result
            if not cam.enabled:
                cam.status_text = "Disabled"
            else:
                lastimg_time = memcache.get("camera{%s}.lastimg_time" % cam.key())
                if lastimg_time is None:
                    cam.status_text = "Enabled, but not recently polled"
                else:
                    td = (datetime.now() - lastimg_time)
                    cam.status_text = "Enabled, polled %s ago" % td


            # TODO: deleted frames should not be included in these counts.
            qf = CameraFrame.all(keys_only=True)
            qf.filter("camera_id =", cam.key())
            qe = CameraEvent.all(keys_only=True)
            qe.filter("deleted =", False).filter("camera_id =", cam.key())
            cam.ftotal = qf.count()
            cam.etotal = qe.count()

            qf.filter("image_time >=", startofmonth)
            qe.filter("event_start >=", startofmonth)
            cam.fthismonth = qf.count()
            cam.ethismonth = qe.count()

            qf.filter("image_time >=", startofweek)
            qe.filter("event_start >=", startofweek)
            cam.fthisweek = qf.count()
            cam.ethisweek = qe.count()

            qf.filter("image_time >=", startoftoday)
            qe.filter("event_start >=", startoftoday)
            cam.ftoday = qf.count()
            cam.etoday = qe.count()

            qf = CameraFrame.all(keys_only=True)
            qf.filter("camera_id =", cam.key())
            qf.filter("image_time >=", startofyesterday)
            qf.filter("image_time <", startoftoday)
            qe = CameraEvent.all(keys_only=True)
            qe.filter("deleted =", False)
            qe.filter("camera_id =", cam.key())
            qe.filter("event_start >=", startofyesterday)
            qe.filter("event_start <", startoftoday)
            cam.fyesterday = qf.count()
            cam.eyesterday = qe.count()


        template_values = {
            'user': users.get_current_user(),
            'logout_url': users.create_logout_url('/'),
            'camlist': results,
            'timenow': datetime.utcnow(),
            }

        path = os.path.join(os.path.dirname(__file__), 'inc/summary.html')
        self.response.out.write(template.render(path, template_values))
Exemplo n.º 9
0
 def get(self):
     keyname = self.request.get('camera')
     if keyname is not None:
         cam = CameraSource.get(db.Key(keyname))
         memcache.set("camera{%s}.eventkey" % cam.key(), "trigger")
         self.response.out.write("triggered!")
Exemplo n.º 10
0
    def post(self):
        proc_start_time = datetime.now()
        self.response.headers['Content-Type'] = 'text/plain'

        # ensure that this task isn't too old (in case this task got requeued).
        epoch = self.request.get('epoch')
        if epoch is None:
            self.response.out.write("no epoch specified")
            return
        if (proc_start_time - datetime.fromtimestamp(float(epoch))) > timedelta(seconds=30):
            self.response.out.write("task too old")
            return
            

        keyname = self.request.get('camera')
        if keyname is not None:
            # The requested camera was specified as a parameter, so poll just that one.
            cam = CameraSource.get(db.Key(keyname))

            # If disabled then stop processing and don't requeue a task.
            if not cam.enabled:
                self.response.out.write("disabled")
                return
            
            lastimg_time = memcache.get("camera{%s}.lastimg_time" % cam.key())
            alerted = memcache.get("camera{%s}.eventkey" % cam.key()) is not None

            
            try:
                # Loop until we hit the execution time limit.
                while True:                    
                    loop_start_time = datetime.now()
                    
                    # Time will expire at 30 seconds, so stop if we're getting close.
                    if (loop_start_time - proc_start_time) > timedelta(seconds=MODETECT_RUNTIME_LIMIT):
                        break
                
                    if lastimg_time is None:
                        sleep_amt = 0.0
                    elif alerted:
                        td = (loop_start_time - lastimg_time)
                        elapsed = (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
                        sleep_amt = 1.0 / cam.alert_max_fps - elapsed
                    else:
                        td = (loop_start_time - lastimg_time)
                        elapsed = (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
                        sleep_amt = 1.0 / cam.poll_max_fps - elapsed

                    if (sleep_amt > 0.0):
                        time.sleep(sleep_amt)
                        
                    lastimg_time = datetime.now()
                    alerted = self.pollCamera(cam)

            except DeadlineExceededError, apiproxy_errors.DeadlineExceededError:
                self.response.out.write("timeout hit, ignoring")

                
            # Time probably expired, so queue a task to start back up.            
            # This may fail with CancelledError if we don't have time to do that.
            ImageFetcherTask.queueTask(cam.key())