def stop(self): """Stop the daemon. Args: None Returns: """ # Get the pid from the pidfile try: with open(self.pidfile, 'r') as pf_handle: pid = int(pf_handle.read().strip()) except IOError: pid = None if not pid: log_message = ( 'PID file: %s does not exist. Daemon not running?' '') % (self.pidfile) log.log2warning(1063, log_message) # Not an error in a restart return # Try killing the daemon process try: while 1: # Sleep a while time.sleep(0.3) # Process lockfile state when trying to stop if self.lockfile is None: os.kill(pid, signal.SIGTERM) else: if os.path.exists(self.lockfile) is True: continue else: os.kill(pid, signal.SIGTERM) except OSError as err: error = str(err.args) if error.find("No such process") > 0: self.delpid() self.dellock() else: log_message = (str(err.args)) log_message = ( '%s - PID file: %s') % (log_message, self.pidfile) log.log2die(1068, log_message) except: log_message = ( 'Unknown daemon "stop" error for PID file: %s' '') % (self.pidfile) log.log2die(1066, log_message) # Log success self.delpid() self.dellock() log_message = ('Daemon Stopped - PID file: %s') % (self.pidfile) log.log2info(1071, log_message)
def post(self, save=True, data=None): """Post data to central server. Args: save: When True, save data to cache directory if postinf fails data: Data to post. If None, then uses self.data Returns: success: "True: if successful """ # Initialize key variables success = False response = False timestamp = self.data['timestamp'] id_agent = self.data['id_agent'] # Create data to post if data is None: data = self.data # Post data save to cache if this fails try: result = requests.post(self.url, json=data) response = True except: if save is True: # Create a unique very long filename to reduce risk of devicehash = general.hashstring(self.data['devicename'], sha=1) filename = ('%s/%s_%s_%s.json') % (self.cache_dir, timestamp, id_agent, devicehash) # Save data with open(filename, 'w') as f_handle: json.dump(data, f_handle) # Define success if response is True: if result.status_code == 200: success = True # Log message if success is True: log_message = ('Agent "%s" successfully contacted server %s' '') % (self.name(), self.url) log.log2info(1027, log_message) else: log_message = ('Agent "%s" failed to contact server %s' '') % (self.name(), self.url) log.log2warning(1028, log_message) # Return return success
def add_all(self, data_list, error_code, die=True): """Do a database modification. Args: data_list: List of sqlalchemy table objects error_code: Error number to use if one occurs die: Don't die if False, just return success Returns: success: True is successful """ # Initialize key variables success = False # Open database connection. Prepare cursor session = self.session() try: # Update the database cache session.add_all(data_list) # Commit change session.commit() # disconnect from server self.close() # Update success success = True except Exception as exception_error: success = False session.rollback() log_message = ('Unable to modify database connection. ' 'Error: \"%s\"') % (exception_error) if die is True: log.log2die(error_code, log_message) else: log.log2warning(error_code, log_message) except: success = False session.rollback() log_message = ('Unexpected database exception') if die is True: log.log2die(error_code, log_message) else: log.log2warning(error_code, log_message) # Return return success
def post(self, save=True, data=None): """Post data to central server. Args: save: When True, save data to cache directory if postinf fails data: Data to post. If None, then uses self.data Returns: success: "True: if successful """ # Initialize key variables success = False timestamp = self.data['timestamp'] id_agent = self.data['id_agent'] # Create data to post if data is None: data = self.data # Post data save to cache if this fails uri = ('/receive/%s') % (id_agent) success = self._api.post(uri, data) # Log message if success is True: log_message = ( 'Agent "%s" successfully contacted server' '') % (self.name()) log.log2info(1012, log_message) else: # Save data if requested if save is True: # Create a unique very long filename to reduce risk of filename = ('%s/%s_%s.json') % ( self.cache_dir, timestamp, self.cache_suffix) # Save data with open(filename, 'w') as f_handle: json.dump(data, f_handle) # Log message log_message = ( 'Agent "%s" failed to contact server' '') % (self.name()) log.log2warning(1013, log_message) # Return return success