def start(self): """Start the daemon. Args: None Returns: """ # Check for a pidfile to see if the daemon already runs try: with open(self.pidfile, 'r') as pf_handle: pid = int(pf_handle.read().strip()) except IOError: pid = None if pid: log_message = ( 'PID file: %s already exists. Daemon already running?' '') % (self.pidfile) log.log2die(1062, log_message) # Start the daemon self.daemonize() # Log success log_message = ('Daemon Started - PID file: %s') % (self.pidfile) log.log2info(1070, log_message) # Run code for daemon self.run()
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 purge(self): """Purge data from cache by posting to central server. Args: None Returns: success: "True: if successful """ # Initialize key variables id_agent = self.data['id_agent'] # Add files in cache directory to list only if they match the # cache suffix all_filenames = [ filename for filename in os.listdir(self.cache_dir) if os.path.isfile(os.path.join(self.cache_dir, filename)) ] filenames = [ filename for filename in all_filenames if filename.endswith(self.cache_suffix) ] # Read cache file in sorted order. # NOTE: We must post data in timestamp sorted order. for filename in filenames.sorted(): # Only post files for our own UID value if id_agent not in filename: continue # Get the full filepath for the cache file and post filepath = os.path.join(self.cache_dir, filename) with open(filepath, 'r') as f_handle: try: data = json.load(f_handle) except: # Log removal log_message = ( 'Error reading previously cached agent data file %s ' 'for agent %s. May be corrupted.' '') % (filepath, self.name()) log.log2die(1058, log_message) # Post file success = self.post(save=False, data=data) # Delete file if successful if success is True: os.remove(filepath) # Log removal log_message = ('Purging cache file %s after successfully ' 'contacting server' '') % (filepath) log.log2info(1053, 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 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