h=""" This is a data-collector client, that is intended to perform data-collection operations and submit them to an endpoint @required: - key application/service key - id node identifier usage : python data-collector.py --path config.json The configuration file is structured as JSON object as follows : { id : identifier key: customer's identification key, api: http://localhost/monitor/1/client folders:[] } NOTE: You can download a sample configuration file from https://the-phi.com/smart-top """ from utils.params import PARAMS as SYS_ARGS, Logger import os import requests import json # from threading import Thread, RLock from monitor import Apps, Folders import time from datetime import datetime class Collector : def __init__(self) : """ The configuration file is passed to the class for basic initialization of variables """ self.httpclient = requests.Session() def init(self): # if 'folders' not in SYS_ARGS : # # # # If nothing is set it will monitor the temporary directory # self.locations = [os.environ[name] for name in ['TEMP','TMP','TMPDIR'] if name in os.environ] # else: # self.locations = SYS_ARGS['folders'] # # -- let's get the list of features we are interested . url = SYS_ARGS['api']+'/1/client/login' key = SYS_ARGS['key'] id = SYS_ARGS['id'] if 'id' in SYS_ARGS else os.environ['HOSTNAME'] headers = {"key":key,"id":id} # #-- what features are allowed r = self.httpclient.post(url,headers=headers) if r.status_code == 200 : r = r.json() self.features = r['features'] self.config = r['config'] #-- contains apps and folders Logger.log(action="login",value=r) else: self.features = None self.config = None Logger.log(action='login',value='error') def callback(self,channel,method,header,stream): pass def listen(self): factory = DataSourceFactory() # self.qlistener = factory.instance(type="QueueListener",args=_args) # self.qlistener.callback = self.callback # self.qlistener.init(SYS_ARGS['id']) def post(self,**args) : """ This function will post data to the endpoint """ url = SYS_ARGS['api']+'/1/client/log' key = SYS_ARGS['key'] id = SYS_ARGS['id'] if 'id' in SYS_ARGS else os.environ['HOSTNAME'] headers = {"key":key,"id":id,"context":args['context'],"content-type":"application/json"} body = args['data'].to_json(orient='records') if args['data'].shape[0] > 0 : r = self.httpclient.post(url,headers=headers,data=body) Logger.log(action="post."+args['context'],value=r.status_code) else: Logger.log(action="data.error",value="no data :: "+args['context']) def run(self): """ This function will execute the basic functions to monitor folders and apps running on the system given the configuration specified on the server . """ while True : try: self.init() if self.config and self.features : ELAPSED_TIME = 60* int(self.features['schedule'].replace("min","").strip()) if 'apps' in self.config : self.post( data=(Apps()).get(filter=self.config['apps']),context="apps") if 'folders' in self.config and self.config['folders'] : folder = Folders() f = folder.get(path=self.config['folders']) self.post(data = f ,context="folders") Logger.log(action='sleeping',value=ELAPSED_TIME) # # In case no configuration is provided, the system will simply fall asleep and wait # @TODO: Evaluate whether to wake up the system or not (security concerns)! # time.sleep(ELAPSED_TIME) except Exception,e: Logger.log(action='error',value=e.message) print e break pass if __name__ == '__main__' : # # if 'path' in SYS_ARGS : path = SYS_ARGS['path'] f = open(path) SYS_ARGS = json.loads(f.read()) f.close() Logger.init('data-collector') collector = Collector() collector.run() else: print (h)