You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
3.8 KiB
Python
132 lines
3.8 KiB
Python
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)
|