def __init__(self): gc.enable() self.mini_probe = MiniProbe(http) self.config = self.mini_probe.read_config('./probe.conf') self.probe_stop = False self.announce = False self.task = False self.has_json_content = False self.data_request_payload_json = [] self.task_request_response_json = [] self.key_sha1 = self.mini_probe.hash_access_key(self.config['key']) self.out_queue = multiprocessing.Queue() self.sensor_list = self.mini_probe.get_import_sensors() self.announce_json = json.dumps( self.mini_probe.build_announce(self.sensor_list)) self.announce_data = self.mini_probe.create_parameters( self.config, self.announce_json, 'announce') self.url_announce = self.mini_probe.create_url(self.config, 'announce', http) self.url_task = self.mini_probe.create_url(self.config, 'tasks', http) self.task_data = self.mini_probe.build_task(self.config) self.url_data = self.mini_probe.create_url(self.config, 'data', http) self.procs = [] # Set up debug logging self.logger = logging.getLogger("") if self.config['debug'] == "True": self.config['debug'] = True self.logger.setLevel(logging.DEBUG) logging.warning("DEBUG LOGGING HAS BEEN TURNED ON!!") logging.getLogger("requests").setLevel(logging.INFO) else: self.config['debug'] = False self.logger.setLevel(logging.INFO) logging.info("Debug logging has been turned off!!") logging.getLogger("requests").setLevel(logging.WARNING) if self.config['cleanmem'] == "True": self.config['cleanmem'] = True else: self.config['cleanmem'] = False
def __init__(self): gc.enable() self.mini_probe = MiniProbe(http) self.config = self.mini_probe.read_config('./probe.conf') self.probe_stop = False self.announce = False self.task = False self.has_json_content = False self.data_request_payload_json = [] self.task_request_response_json = [] self.key_sha1 = self.mini_probe.hash_access_key(self.config['key']) self.out_queue = multiprocessing.Queue() self.sensor_list = self.mini_probe.get_import_sensors() self.announce_json = json.dumps(self.mini_probe.build_announce(self.sensor_list)) self.announce_data = self.mini_probe.create_parameters(self.config, self.announce_json, 'announce') self.url_announce = self.mini_probe.create_url(self.config, 'announce', http) self.url_task = self.mini_probe.create_url(self.config, 'tasks', http) self.task_data = self.mini_probe.build_task(self.config) self.url_data = self.mini_probe.create_url(self.config, 'data', http) self.procs = [] # Set up debug logging self.logger = logging.getLogger("") if self.config['debug'] == "True": self.config['debug'] = True self.logger.setLevel(logging.DEBUG) logging.warning("DEBUG LOGGING HAS BEEN TURNED ON!!") logging.getLogger("requests").setLevel(logging.INFO) else: self.config['debug'] = False self.logger.setLevel(logging.INFO) logging.info("Debug logging has been turned off!!") logging.getLogger("requests").setLevel(logging.WARNING) if self.config['cleanmem'] == "True": self.config['cleanmem'] = True else: self.config['cleanmem'] = False
class Probe(object): def __init__(self): gc.enable() self.mini_probe = MiniProbe(http) self.config = self.mini_probe.read_config('./probe.conf') self.probe_stop = False self.announce = False self.task = False self.has_json_content = False self.data_request_payload_json = [] self.task_request_response_json = [] self.key_sha1 = self.mini_probe.hash_access_key(self.config['key']) self.out_queue = multiprocessing.Queue() self.sensor_list = self.mini_probe.get_import_sensors() self.announce_json = json.dumps(self.mini_probe.build_announce(self.sensor_list)) self.announce_data = self.mini_probe.create_parameters(self.config, self.announce_json, 'announce') self.url_announce = self.mini_probe.create_url(self.config, 'announce', http) self.url_task = self.mini_probe.create_url(self.config, 'tasks', http) self.task_data = self.mini_probe.build_task(self.config) self.url_data = self.mini_probe.create_url(self.config, 'data', http) self.procs = [] # Set up debug logging self.logger = logging.getLogger("") if self.config['debug'] == "True": self.config['debug'] = True self.logger.setLevel(logging.DEBUG) logging.warning("DEBUG LOGGING HAS BEEN TURNED ON!!") logging.getLogger("requests").setLevel(logging.INFO) else: self.config['debug'] = False self.logger.setLevel(logging.INFO) logging.info("Debug logging has been turned off!!") logging.getLogger("requests").setLevel(logging.WARNING) if self.config['cleanmem'] == "True": self.config['cleanmem'] = True else: self.config['cleanmem'] = False def send_announce(self): """ send announce request to core """ try: announce_request = self.mini_probe.request_to_core("announce", self.announce_data, self.config) if announce_request.status_code == requests.codes.ok: self.announce = True logging.info("Announce success.") logging.debug("Announce success. Details: HTTP Status %s, Message: %s" % (announce_request.status_code, announce_request.text)) else: logging.info("Announce pending. Trying again in %s seconds" % str(int(self.config['baseinterval']) / 2)) logging.debug("Announce pending. Details: HTTP Status %s, Message: %s" % (announce_request.status_code, announce_request.text)) time.sleep(int(self.config['baseinterval']) / 2) except Exception as request_exception: logging.error(request_exception) time.sleep(int(self.config['baseinterval']) / 2) def get_tasks(self): """ get tasks from core """ self.data_request_payload_json = [] self.has_json_content = False try: task_request = self.mini_probe.request_to_core("tasks", self.task_data, self.config) try: if str(task_request.json()) != "[]": self.has_json_content = True self.task = True logging.info("Task success.") logging.debug("Task success. HTTP Status %s, Message: %s" % (task_request.status_code, task_request.text)) return task_request else: logging.info("Task has no JSON content. Trying again in %s seconds" % (int(self.config['baseinterval']) / 2)) logging.debug("Task has no JSON content. Details: HTTP Status %s, Message: %s" % (task_request.status_code, task_request.text)) return None except Exception as json_exception: logging.info(json_exception) logging.info("No JSON. HTTP Status: %s, Message: %s" % (task_request.status_code, task_request.text)) return None except Exception as request_exception: logging.error(request_exception) logging.error("Exception. Trying again in %s seconds." % str(int(self.config['baseinterval']) / 3)) return None def send_data(self): """ send processed data to the core """ try: data_request = self.mini_probe.request_to_core("data", json.dumps(self.data_request_payload_json), self.config) if data_request.status_code == requests.codes.ok: logging.info("Data success.") logging.debug("Data success. Details: HTTP Status %s, Message: %s" % (data_request.status_code, data_request.text)) self.data_request_payload_json = [] else: logging.info("Data issue. Current data might be dropped, please turn on debug logging") logging.debug("Data issue. Details: HTTP Status %s, Message: %s" % (data_request.status_code, data_request.text)) except Exception as request_exception: logging.error(request_exception) def kill_procs(self): """ killing processes in worker pool when finished """ for p in self.procs: if not p.is_alive(): p.join() p.terminate() del p def main(self): """ Main routine for MiniProbe (Python) """ # Doing some startup logging logging.info("PRTG Small Probe '%s' starting on '%s'" % (self.config['name'], socket.gethostname())) logging.info("Connecting to PRTG Core Server at %s:%s" % (self.config['server'], self.config['port'])) while not self.announce: self.send_announce() while not self.probe_stop: self.task = False while not self.task: task_request = self.get_tasks() if not task_request: time.sleep(int(self.config['baseinterval']) / 2) gc.collect() if task_request.status_code == requests.codes.ok and self.has_json_content: self.task_request_response_json = task_request.json() logging.debug("JSON response: %s" % self.task_request_response_json) if self.config['subprocs']: json_response_chunks = self.mini_probe.split_json_response(self.task_request_response_json, self.config['subprocs']) else: json_response_chunks = self.mini_probe.split_json_response(self.task_request_response_json) for element in json_response_chunks: for part in element: logging.debug(part) for sensor in self.sensor_list: if part['kind'] == sensor.get_kind(): p = multiprocessing.Process(target=sensor.get_data, args=(part, self.out_queue), name=part['kind']) self.procs.append(p) logging.debug("Spawning sensor %s." % p.name) p.start() else: pass gc.collect() try: while len(self.data_request_payload_json) < len(element): out = self.out_queue.get() self.data_request_payload_json.append(out) except Exception as data_queue_exception: logging.error(data_queue_exception) pass self.send_data() if len(self.task_request_response_json) > 10: time.sleep((int(self.config['baseinterval']) * (9 / len(self.task_request_response_json)))) else: time.sleep(int(self.config['baseinterval']) / 2) elif task_request.status_code != requests.codes.ok: logging.info("Task issue. Request returning incorrect status code. Turn on debugging for details") logging.debug("Task issue. Details: HTTP Status %s, Message: %s" % (task_request.status_code, task_request.text)) else: logging.info("Task has no JSON content. Nothing to do. Waiting for %s seconds." % str(int(self.config['baseinterval']) / 3)) time.sleep(int(self.config['baseinterval']) / 3) self.kill_procs() gc.collect() if self.config['cleanmem']: # checking if clean memory option has been chosen during install then call the method to flush mem self.mini_probe.clean_mem() sys.exit()
class Probe(object): def __init__(self): gc.enable() self.mini_probe = MiniProbe(http) self.config = self.mini_probe.read_config('./probe.conf') self.probe_stop = False self.announce = False self.task = False self.has_json_content = False self.data_request_payload_json = [] self.task_request_response_json = [] self.key_sha1 = self.mini_probe.hash_access_key(self.config['key']) self.out_queue = multiprocessing.Queue() self.sensor_list = self.mini_probe.get_import_sensors() self.announce_json = json.dumps( self.mini_probe.build_announce(self.sensor_list)) self.announce_data = self.mini_probe.create_parameters( self.config, self.announce_json, 'announce') self.url_announce = self.mini_probe.create_url(self.config, 'announce', http) self.url_task = self.mini_probe.create_url(self.config, 'tasks', http) self.task_data = self.mini_probe.build_task(self.config) self.url_data = self.mini_probe.create_url(self.config, 'data', http) self.procs = [] # Set up debug logging self.logger = logging.getLogger("") if self.config['debug'] == "True": self.config['debug'] = True self.logger.setLevel(logging.DEBUG) logging.warning("DEBUG LOGGING HAS BEEN TURNED ON!!") logging.getLogger("requests").setLevel(logging.INFO) else: self.config['debug'] = False self.logger.setLevel(logging.INFO) logging.info("Debug logging has been turned off!!") logging.getLogger("requests").setLevel(logging.WARNING) if self.config['cleanmem'] == "True": self.config['cleanmem'] = True else: self.config['cleanmem'] = False def send_announce(self): """ send announce request to core """ try: announce_request = self.mini_probe.request_to_core( "announce", self.announce_data, self.config) if announce_request.status_code == requests.codes.ok: self.announce = True logging.info("Announce success.") logging.debug( "Announce success. Details: HTTP Status %s, Message: %s" % (announce_request.status_code, announce_request.text)) else: logging.info("Announce pending. Trying again in %s seconds" % str(int(self.config['baseinterval']) / 2)) logging.debug( "Announce pending. Details: HTTP Status %s, Message: %s" % (announce_request.status_code, announce_request.text)) time.sleep(int(self.config['baseinterval']) / 2) except Exception as request_exception: logging.error(request_exception) time.sleep(int(self.config['baseinterval']) / 2) def get_tasks(self): """ get tasks from core """ self.data_request_payload_json = [] self.has_json_content = False try: task_request = self.mini_probe.request_to_core( "tasks", self.task_data, self.config) try: if str(task_request.json()) != "[]": self.has_json_content = True self.task = True logging.info("Task success.") logging.debug( "Task success. HTTP Status %s, Message: %s" % (task_request.status_code, task_request.text)) return task_request else: logging.info( "Task has no JSON content. Trying again in %s seconds" % (int(self.config['baseinterval']) / 2)) logging.debug( "Task has no JSON content. Details: HTTP Status %s, Message: %s" % (task_request.status_code, task_request.text)) return None except Exception as json_exception: logging.info(json_exception) logging.info("No JSON. HTTP Status: %s, Message: %s" % (task_request.status_code, task_request.text)) return None except Exception as request_exception: logging.error(request_exception) logging.error("Exception. Trying again in %s seconds." % str(int(self.config['baseinterval']) / 3)) return None def send_data(self): """ send processed data to the core """ try: data_request = self.mini_probe.request_to_core( "data", json.dumps(self.data_request_payload_json), self.config) if data_request.status_code == requests.codes.ok: logging.info("Data success.") logging.debug( "Data success. Details: HTTP Status %s, Message: %s" % (data_request.status_code, data_request.text)) self.data_request_payload_json = [] else: logging.info( "Data issue. Current data might be dropped, please turn on debug logging" ) logging.debug( "Data issue. Details: HTTP Status %s, Message: %s" % (data_request.status_code, data_request.text)) except Exception as request_exception: logging.error(request_exception) def kill_procs(self): """ killing processes in worker pool when finished """ for p in self.procs: if not p.is_alive(): p.join() p.terminate() del p def main(self): """ Main routine for MiniProbe (Python) """ # Doing some startup logging logging.info("PRTG Small Probe '%s' starting on '%s'" % (self.config['name'], socket.gethostname())) logging.info("Connecting to PRTG Core Server at %s:%s" % (self.config['server'], self.config['port'])) while not self.announce: self.send_announce() while not self.probe_stop: self.task = False while not self.task: task_request = self.get_tasks() if not task_request: time.sleep(int(self.config['baseinterval']) / 2) gc.collect() if task_request.status_code == requests.codes.ok and self.has_json_content: self.task_request_response_json = task_request.json() logging.debug("JSON response: %s" % self.task_request_response_json) if self.config['subprocs']: json_response_chunks = self.mini_probe.split_json_response( self.task_request_response_json, self.config['subprocs']) else: json_response_chunks = self.mini_probe.split_json_response( self.task_request_response_json) for element in json_response_chunks: for part in element: logging.debug(part) for sensor in self.sensor_list: if part['kind'] == sensor.get_kind(): p = multiprocessing.Process( target=sensor.get_data, args=(part, self.out_queue), name=part['kind']) self.procs.append(p) logging.debug("Spawning sensor %s." % p.name) p.start() else: pass gc.collect() try: while len( self.data_request_payload_json) < len(element): out = self.out_queue.get() self.data_request_payload_json.append(out) except Exception as data_queue_exception: logging.error(data_queue_exception) pass self.send_data() if len(self.task_request_response_json) > 10: time.sleep( (int(self.config['baseinterval']) * (9 / len(self.task_request_response_json)))) else: time.sleep(int(self.config['baseinterval']) / 2) elif task_request.status_code != requests.codes.ok: logging.info( "Task issue. Request returning incorrect status code. Turn on debugging for details" ) logging.debug( "Task issue. Details: HTTP Status %s, Message: %s" % (task_request.status_code, task_request.text)) else: logging.info( "Task has no JSON content. Nothing to do. Waiting for %s seconds." % str(int(self.config['baseinterval']) / 3)) time.sleep(int(self.config['baseinterval']) / 3) self.kill_procs() gc.collect() if self.config['cleanmem']: # checking if clean memory option has been chosen during install then call the method to flush mem self.mini_probe.clean_mem() sys.exit()