Пример #1
0
 def entityData(self, analysis):
     sensor_name = self.sensor_lookup.get(tools.getKey(Analysis, 'sensor', analysis, asID=False), "")
     row = [analysis.key().name(), sensor_name, tools.sdatetime(analysis.dt_created), tools.sdatetime(analysis.dt_updated)]
     for col in self.columns:
         value = analysis.columnValue(col, default="")
         row.append(value)
     return row
Пример #2
0
 def entityData(self, apilog):
     request_id = "ID:" + str(apilog.key().id())
     uid = "ID:%s" % tools.getKey(APILog, 'user', apilog, asID=True)
     row = [
         request_id, uid,
         tools.sdatetime(apilog.date), apilog.path, apilog.method,
         apilog.request
     ]
     return row
Пример #3
0
 def entityData(self, sensor):
     sensor_type_id = tools.getKey(Sensor, 'sensortype', sensor, asID=True)
     row = [
         "ID:%s" % sensor.key().name(), sensor.name,
         "ID:%s" % sensor_type_id,
         tools.sdatetime(sensor.dt_created),
         sensor.contacts if sensor.contacts else "",
         ', '.join([str(gid) for gid in sensor.group_ids])
     ]
     return row
Пример #4
0
 def entityData(self, rec):
     row = [
         "ID:%s" % rec.key().name(),
         "ID:%s" %
         tools.getKey(Record, 'sensor', rec, asID=False, asKeyName=True),
         tools.sdatetime(rec.dt_recorded, fmt="%Y-%m-%d %H:%M:%S %Z")
     ]
     for col in self.columns:
         row.append(str(rec.columnValue(col, default="")))
     return row
Пример #5
0
 def entityData(self, alarm):
     alarm_id = alarm.key().id()
     sensor_id = tools.getKey(Alarm,
                              'sensor',
                              alarm,
                              asID=False,
                              asKeyName=True)
     sensor_name = self.sensor_lookup.get(sensor_id, "")
     rule_id = tools.getKey(Alarm, 'rule', alarm, asID=True)
     rule_name = str(
         self.rule_lookup.get(
             tools.getKey(Alarm, 'rule', alarm, asID=False), ""))
     apex = "%.2f" % alarm.apex if alarm.apex is not None else "--"
     row = [
         "ID:%s" % alarm_id,
         "ID:%s" % sensor_id, sensor_name,
         "ID:%s" % rule_id, rule_name, apex,
         tools.sdatetime(alarm.dt_start),
         tools.sdatetime(alarm.dt_end)
     ]
     return row
Пример #6
0
 def __evalFunction(self, toks):
     val = toks[0]
     fnName = val[0].upper()
     args = val[1:]
     args = [arg for arg in args if arg is not None]  # Filter nones
     if not args:
         return 0
     if fnName == 'SUM':
         return sum(args)
     elif fnName == 'AVE':
         from tools import average
         return average(args)
     elif fnName == 'MAX':
         return max(args)
     elif fnName == "MIN":
         return min(args)
     elif fnName == "COUNT":
         return len(args)
     elif fnName == "ALARMS":
         # Usage: ALARMS([rule_id])
         # Returns list of alarms in processed batch, optionally filtered by rule_id
         alarm_list = list(self.alarm_list)
         if args and args[0].isdigit():
             rule_id = int(args[0])
             if rule_id:
                 alarm_list.filter(lambda al: tools.getKey(
                     Alarm, 'rule', al, asID=True) == rule_id)
         return alarm_list
     elif fnName == "DISTANCE":
         dist = 0
         # self.prior_batch_last_record.columnValue()
         last_gp = None
         for gp in args:
             gp = tools.safe_geopoint(gp)
             if last_gp and gp:
                 dist += tools.calcLocDistance(last_gp, gp)
             if gp:
                 last_gp = gp
         return dist  # m
     elif fnName == "SQRT":
         arg = args[0]
         return math.sqrt(arg)
     return 0
Пример #7
0
 def __evalFunction(self, toks):
     val = toks[0]
     fnName = val[0].upper()
     args = val[1:]
     args = [arg for arg in args if arg is not None]  # Filter nones
     if not args:
         return 0
     if fnName == 'SUM':
         return sum(args)
     elif fnName == 'AVE':
         from tools import average
         return average(args)
     elif fnName == 'MAX':
         return max(args)
     elif fnName == "MIN":
         return min(args)
     elif fnName == "COUNT":
         return len(args)
     elif fnName == "ALARMS":
         # Usage: ALARMS([rule_id])
         # Returns list of alarms in processed batch, optionally filtered by rule_id
         alarm_list = list(self.alarm_list)
         if args and args[0].isdigit():
             rule_id = int(args[0])
             if rule_id:
                 alarm_list.filter(lambda al : tools.getKey(Alarm, 'rule', al, asID=True) == rule_id)
         return alarm_list
     elif fnName == "DISTANCE":
         dist = 0
         # self.prior_batch_last_record.columnValue()
         last_gp = None
         for gp in args:
             gp = tools.safe_geopoint(gp)
             if last_gp and gp:
                 dist += tools.calcLocDistance(last_gp, gp)
             if gp:
                 last_gp = gp
         return dist  # m
     elif fnName == "SQRT":
         arg = args[0]
         return math.sqrt(arg)
     return 0
Пример #8
0
 def entityData(self, alarm):
     sensor_name = str(self.sensor_lookup.get(tools.getKey(Alarm, 'sensor', alarm, asID=False), ""))
     rule_name = str(self.rule_lookup.get(tools.getKey(Alarm, 'rule', alarm, asID=False), ""))
     apex = "%.2f" % alarm.apex if alarm.apex is not None else "--"
     row = [sensor_name, rule_name, apex, tools.sdatetime(alarm.dt_start), tools.sdatetime(alarm.dt_end)]
     return row, []
Пример #9
0
 def entityData(self, alarm):
     sensor_name = self.sensor_lookup.get(tools.getKey(Alarm, 'sensor', alarm, asID=False), "")
     rule_name = str(self.rule_lookup.get(tools.getKey(Alarm, 'rule', alarm, asID=False), ""))
     apex = "%.2f" % alarm.apex if alarm.apex is not None else "--"
     row = [sensor_name, rule_name, apex, tools.sdatetime(alarm.dt_start), tools.sdatetime(alarm.dt_end)]
     return row
Пример #10
0
 def __evalFunction(self, toks):
     val = toks[0]
     fnName = val[0].upper()
     args = val[1:]
     args = [arg for arg in args if arg is not None]  # Filter nones
     if not args:
         return 0
     if fnName == 'SUM':
         args = self.__getArglist(args)
         if args:
             return [sum(args)]
         return [0]
     elif fnName == 'AVE':
         from tools import average
         args = self.__getArglist(args)
         if args:
             return [average(args)]
         return [0]
     elif fnName == 'MAX':
         args = self.__getArglist(args)
         if args:
             res = max(args)
             return [res]
         return [0]
     elif fnName == "MIN":
         args = self.__getArglist(args)
         if args:
             return [min(args)]
         return [0]
     elif fnName == "COUNT":
         args = self.__getArglist(args)
         return [len(args)]
     elif fnName == "ALARMS":
         from models import Alarm
         # Usage: ALARMS([rule_id])
         # Returns list of alarms in processed batch, optionally filtered by rule_id
         alarm_list = list(self.alarm_list)
         if args and type(args[0]) in [int, long, float]:
             rule_id = int(args[0])
             if rule_id:
                 alarm_list = [
                     al for al in alarm_list if tools.getKey(
                         Alarm, 'rule', al, asID=True) == rule_id
                 ]
         return [alarm_list]
     elif fnName == "DISTANCE":
         dist = 0
         last_gp = None
         args = self.__getArglist(args)
         for gp in args:
             gp = tools.safe_geopoint(gp)
             if last_gp and gp:
                 dist += tools.calcLocDistance(last_gp, gp)
             if gp:
                 last_gp = gp
         return [dist]  # m
     elif fnName == "SQRT":
         arg = args[0]
         return [math.sqrt(arg)]
     elif fnName == "SINCE":
         # Returns ms since event (argument), or 0 if none found
         event = args[0]
         since = 0
         now = self.run_ms
         try:
             if event:
                 if type(event) in [long, float]:
                     # Treat as ms timestamp
                     since = now - event
                 elif isinstance(event, basestring):
                     pass
                 elif event.kind() == 'Alarm':
                     since = now - tools.unixtime(event.dt_start)
                 elif event.kind() == 'Record':
                     since = now - tools.unixtime(event.dt_recorded)
         except Exception, e:
             logging.warning("Error in SINCE() - %s" % e)
         return [since]
Пример #11
0
class ExpressionParser(object):
    opMap = {
        "<": lambda a, b: a < b,
        "<=": lambda a, b: a <= b,
        ">": lambda a, b: a > b,
        ">=": lambda a, b: a >= b,
        "!=": lambda a, b: a != b,
        "==": lambda a, b: a == b,
        "AND": lambda a, b: a and b,
        "OR": lambda a, b: a or b
        # "NOT" : lambda x : not a
    }

    FUNCTIONS = [
        "SUM", "AVE", "MAX", "MIN", "COUNT", "ALARMS", "DISTANCE", "SQRT",
        "SINCE", "LAST_ALARM", "NOW", "DOT", "DELTA"
    ]

    def __init__(self,
                 expr,
                 column=None,
                 analysis=None,
                 run_ms=0,
                 verbose=False):
        self.verbose = verbose
        if self.verbose:
            logging.debug("Building expression parser for %s" % expr)
        self.expr = expr
        self.column = column
        self.analysis = analysis
        self.run_ms = run_ms
        self.record_list = []
        self.alarm_list = []
        self.record = None
        # TODO: Pass prior record for accurate calcuations such as distance
        # self.prior_batch_last_record = prior_batch_last_record
        self.pattern = self._getPattern()
        logging.debug("Initialized expression parser with expression: %s" %
                      expr)

    # Generator to extract operators and operands in pairs
    def operatorOperands(self, tokenlist):
        it = iter(tokenlist)
        while 1:
            try:
                yield (it.next(), it.next())
            except StopIteration:
                break

    def __normalizeNumeric(self, value):
        if not tools.is_numeric(value):
            # Handle unexpected text addition
            value = 0
        return value

    def __evalCurrentValue(self, toks):
        return [self.analysis.columnValue(self.column, 0)]

    def __evalAggregateColumn(self, toks):
        column = toks[0]
        if not self.record_list:
            raise Exception(
                "Can't evaluate aggregate column without record list")
        if column == 'ts':
            res = [tools.unixtime(r.dt_recorded) for r in self.record_list]
        else:
            res = [r.columnValue(column, 0) for r in self.record_list]
        return [res]

    def __evalSingleColumn(self, toks):
        column = toks[0]
        if not self.record:
            raise Exception("Can't evaluate single column with no record")
        val = self.record.columnValue(column)
        return [val]

    def __multOp(self, toks):
        value = toks[0]
        _prod = self.__normalizeNumeric(value[0])
        for op, val in self.operatorOperands(value[1:]):
            if op == '*': _prod *= val
            if op == '/':
                _prod /= val
        return _prod

    def __expOp(self, toks):
        value = toks[0]
        res = self.__normalizeNumeric(value[0])
        for op, val in self.operatorOperands(value[1:]):
            if op == '^': res = pow(res, val)
        return res

    def __addOp(self, toks):
        value = toks[0]
        _sum = self.__normalizeNumeric(value[0])
        for op, val in self.operatorOperands(value[1:]):
            if op == '+': _sum += val
            if op == '-': _sum -= val
        return _sum

    def __evalLogicOp(self, toks):
        args = toks[0]
        if self.verbose:
            logging.debug(args)
        val1 = args[0]
        for op, val in self.operatorOperands(args[1:]):
            fn = self.opMap[op]
            val2 = val
            val1 = fn(val1, val2)
        return val1

    def __evalComparisonOp(self, tokens):
        args = tokens[0]
        val1 = args[0]
        for op, val in self.operatorOperands(args[1:]):
            fn = self.opMap[op]
            val2 = val
            if not fn(val1, val2):
                break
            val1 = val2
        else:
            return True
        return False

    def __evalConstant(self, toks):
        return float(toks[0])

    def __getArglist(self, args):
        if type(args) is list and len(args) > 0:
            first = args[0]
            if type(first) is list:
                return first
            return args
        return []

    def __evalFunction(self, toks):
        val = toks[0]
        fnName = val[0].upper()
        args = val[1:]
        args = [arg for arg in args if arg is not None]  # Filter nones
        if not args:
            return 0
        if fnName == 'SUM':
            args = self.__getArglist(args)
            if args:
                return [sum(args)]
            return [0]
        elif fnName == 'AVE':
            from tools import average
            args = self.__getArglist(args)
            if args:
                return [average(args)]
            return [0]
        elif fnName == 'MAX':
            args = self.__getArglist(args)
            if args:
                res = max(args)
                return [res]
            return [0]
        elif fnName == "MIN":
            args = self.__getArglist(args)
            if args:
                return [min(args)]
            return [0]
        elif fnName == "COUNT":
            args = self.__getArglist(args)
            return [len(args)]
        elif fnName == "ALARMS":
            from models import Alarm
            # Usage: ALARMS([rule_id])
            # Returns list of alarms in processed batch, optionally filtered by rule_id
            alarm_list = list(self.alarm_list)
            if args and type(args[0]) in [int, long, float]:
                rule_id = int(args[0])
                if rule_id:
                    alarm_list = [
                        al for al in alarm_list if tools.getKey(
                            Alarm, 'rule', al, asID=True) == rule_id
                    ]
            return [alarm_list]
        elif fnName == "DISTANCE":
            dist = 0
            last_gp = None
            args = self.__getArglist(args)
            for gp in args:
                gp = tools.safe_geopoint(gp)
                if last_gp and gp:
                    dist += tools.calcLocDistance(last_gp, gp)
                if gp:
                    last_gp = gp
            return [dist]  # m
        elif fnName == "SQRT":
            arg = args[0]
            return [math.sqrt(arg)]
        elif fnName == "SINCE":
            # Returns ms since event (argument), or 0 if none found
            event = args[0]
            since = 0
            now = self.run_ms
            try:
                if event:
                    if type(event) in [long, float]:
                        # Treat as ms timestamp
                        since = now - event
                    elif isinstance(event, basestring):
                        pass
                    elif event.kind() == 'Alarm':
                        since = now - tools.unixtime(event.dt_start)
                    elif event.kind() == 'Record':
                        since = now - tools.unixtime(event.dt_recorded)
            except Exception, e:
                logging.warning("Error in SINCE() - %s" % e)
            return [since]
        elif fnName == "LAST_ALARM":
            # Takes optional argument of rule ID to filter alarms
            from models import Alarm
            rule_id = None
            last_alarm = None
            if args:
                rule_id = int(args[0])
            alarm_list = list(self.alarm_list)
            if alarm_list:
                if rule_id:
                    alarm_list = [
                        al for al in alarm_list if tools.getKey(
                            Alarm, 'rule', al, asID=True) == rule_id
                    ]
                if alarm_list:
                    last_alarm = sorted(alarm_list,
                                        key=lambda al: al.dt_end,
                                        reverse=True)[0]
                else:
                    last_alarm = self.analysis.sensor.alarm_set.order(
                        "-dt_end").get()
            return [last_alarm]
Пример #12
0
            ],
        },
    },
]

WSGI_APPLICATION = 'Warbler.wsgi.application'

# Database
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'warbler',
        'USER': '******',
        'PASSWORD': getKey('warbler'),
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

# Password validation
# https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME':
        'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME':
Пример #13
0
def imageViewer(request, camID):

    if request.method == 'POST':
        form = photoForm(request.POST)
        if form.is_valid():
            print 'a'
            print form.cleaned_data
            iso = form.cleaned_data['iso']
            ss = form.cleaned_data['shutterspeed']

            # get the camera
            camera = get_object_or_404(Camera, pk=camID)

            # get the computer
            computer = get_object_or_404(Computer, pk=camera.computer_id)

            # Get the current date time
            d = datetime.now()
            dt_file = d.strftime('%y%m%d_%H%M%S')
            dt_text = d.strftime('%H:%M:%S_-_%a_%d_%b_%Y')
            dt_mysql = d.strftime('%Y-%m-%d %H:%M:%S')

            # create a filename to save to.
            fname = "Cam{}_{}.jpg".format(camID, dt_file)

            # Add all of those details to the database.
            I = Image(camera=camera,
                      filename=fname,
                      exdate=dt_mysql,
                      shutterspeed=ss,
                      resw=720,
                      resh=1280,
                      text=dt_text)
            I.save()

            # connect to the computer
            ssh = paramiko.SSHClient()
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy(
            ))  # Shouldn't be neccesary, don't know why it
            # doesn't recognise host.
            ssh.connect(computer.ip_address,
                        username=computer.user_name,
                        password=getKey(computer.user_name))

            #command = "cd Documents/Development/; python tools.py takePhoto --iso {} --ss {} --tt {} --fn {} --resw 720 --resh 1280".format(iso, ss, dt_text, fname)
            command = "cd Documents/Development/; python tools.py takePhoto --iso {} --ss {} --tt {} --fn {}".format(
                iso, ss, dt_text, fname)
            print command
            stdin, stdout, stderr = ssh.exec_command(command)
            # Some sort of error handling would be good...
            #  print stderr.read()

            # Wait for long enough for the photo to be taken.
            sleep(45)
            ssh.close()

            # Now copy the file locally using sftp.
            transport = paramiko.Transport((computer.ip_address, 22))
            transport.connect(username=computer.user_name,
                              password=getKey(computer.user_name))
            sftp = paramiko.SFTPClient.from_transport(transport)
            getFile = "Documents/Development/{}".format(fname)
            putFile = "webCam/static/webCam/images/{}".format(fname)
            sftp.get(getFile, putFile)
            sftp.close()
            transport.close()
            # Now delete the original
            #command = "rm Documents/Development/{}".format(fname)
            #stdin, stdout, stderr = ssh.exec_command(command)

            # Tell the database that the image is ready.
            I.status = 'Ready'

            address = "/static/webCam/images/" + fname

            return render(request, 'webCam/imageViewer.html', {
                'camera': camID,
                'address': address,
                'form': form
            })

    else:

        # Get the most recent image.

        form = photoForm()

    return render(request, 'webCam/imageViewer.html', {
        'camera': camID,
        'address': 'blahXXX.jpg',
        'form': form
    })
    """