Exemplo n.º 1
0
    def main(self):
        self.lastTime = self.scantime
        cycleCount = 0
        while (True):
            cycleCount += 1
            tic = time.time()

            self.producer.linger_ms = int(self.lastTime) / 2

            if self.enableDevice:
                self.updateTags()

            if not self.enableDevice:
                self.checkPeers()

            self.keepAlive()

            if self.dieEnabled:
                if time.time() > (self.dieTimer + self.dieTimeout):
                    log("Killing process due to client timeout - " + self.name)
                    break
            else:
                self.dieTimer = time.time()

            self.lastTime = (time.time() - tic) * 1000
            if ((cycleCount % 20) == 0):
                log(self.name + " - Cycle Time - " + str(self.lastTime))

            self.cleanup()
Exemplo n.º 2
0
 def addTag(self, name, message):
     log("Adding Tag " + self.name + "." + str(message['message']['name']))
     tp = TopicPartition(message['message']['topic'], 0)
     self.tags[str(message['message']['name'])] = ({
         "name":
         message['message']['name'],
         "topic":
         tp
     })
     self.topics.append(tp)
     self.consumer.assign(self.topics)
     self.consumer.seek_to_end(tp)
Exemplo n.º 3
0
 def addTag(self, name, message):
     log("Adding Tag " + self.name + "." + str(message['message']['name']))
     self.tags[name] = {
         "name": message['message']['name'],
         "value": message['message']['value'],
         "description": message['message']['description'],
         "rawlow": message['message']['rawlow'],
         "rawhigh": message['message']['rawhigh'],
         "englow": message['message']['englow'],
         "enghigh": message['message']['enghigh'],
         "eu": message['message']['eu'],
         "type": message['message']['type']
     }
Exemplo n.º 4
0
 def run(self):
     """ Process run function """
     try:
         self.logger = Logger(self.brokerArray, self.group_id)
         self.producer = KafkaProducer(bootstrap_servers=self.brokerArray,
                                       compression_type=COMPRESSION_TYPE,
                                       acks=1,
                                       linger_ms=1000,
                                       batch_size=1000000)
         self.consumer = KafkaConsumer(
             self.admin_topic,
             group_id=self.group_id,
             bootstrap_servers=self.brokerArray,
             value_deserializer=lambda m: json.loads(m.decode('utf-8')))
         self.waitForMessages()
     except Exception as e:
         log(e)
         log(traceback.print_tb(sys.exc_info()[2]))
         self.logger.log('Error: {}'.format(sys.exc_info()))
Exemplo n.º 5
0
 def waitForMessages(self, brokerArray, name, timeout):
     messages = self.admin_device_consumer.poll(timeout_ms=timeout)
     if not (messages == {}):
         for message in messages[self.admin_tp]:
             m = self.parseMessage(message.value)
             if m['handler'] == self.name:
                 if m['cmd'] == 'del':
                     if m['name'] in self.tags:
                         self.delTag(m['name'], m)
                     else:
                         log("Tag " + m['name'] + " not found for deletion")
                 if m['cmd'] == 'update' or m['cmd'] == 'add':
                     if m['name'] in self.tags:
                         self.delTag(m['name'], m, False)
                         self.addTag(m['name'], m)
                     else:
                         self.addTag(m['name'], m)
                 if m['cmd'] == 'set':
                     if m['name'] in self.tags:
                         self.setTag(m['name'], m)
                     else:
                         log("Tag " + m['name'] + " not found for setting")
                 if m['cmd'] == 'die-reset':
                     log("Die Check - " + str(time.time() - self.dieTimer))
                     self.dieCheck()
             if m['cmd'] == 'get':
                 log(self.name + " - Recieved Config Message")
                 if self.enableDevice:
                     self.getConfig(m['name'], m)
             if m['cmd'] == 'keep-alive':
                 if m['name'] == self.name:
                     if m['message']['enabled']:
                         self.peers[m['handler']] = time.time()
                     if not m['message']['enabled'] and m[
                             'name'] == self.name:
                         self.peers[m['handler']] = time.time()
Exemplo n.º 6
0
                        self.logger.log("Device " + message.value['name'] +
                                        " has been manually removed")
                    else:
                        self.logger.log("Device " + message.value['name'] +
                                        " isn't available to delete")
            if message.value['cmd'] == 'get-devices':
                self.logger.log("Recieved Agent Config Request on " +
                                self.hostname)
                self.getDeviceConfig(message.value['name'])
            if message.value['cmd'] == 'get-clients':
                self.logger.log("Recieved Agent Config Request on " +
                                self.hostname)
                self.getClientConfig(message.value['name'])


def parseCommandLineArguments():
    """Any command line arguments will be returned as a dictionary """
    parser = argparse.ArgumentParser(description='ckSCADA Agent.')
    parser.add_argument('--configfile',
                        default='config.json',
                        help='config file to use (default: config.json)')
    return parser.parse_args()


if __name__ == '__main__':
    log("Starting te ckSCADA server")
    log("All messages will be logged to the Kafka topic '_logging'")

    cmdLineArguments = parseCommandLineArguments()
    agent = Agent(cmdLineArguments)
Exemplo n.º 7
0
 def setTag(self, name, message):
     log("Setting Tag " + self.name + "." + str(message['message']['name']))
     self.tags[name]['value'] = message['message']['value']