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()
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)
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'] }
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()))
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()
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)
def setTag(self, name, message): log("Setting Tag " + self.name + "." + str(message['message']['name'])) self.tags[name]['value'] = message['message']['value']