diff --git a/wscserver/config/routing.py b/wscserver/config/routing.py index d9cf25a..a0ff864 100644 --- a/wscserver/config/routing.py +++ b/wscserver/config/routing.py @@ -1,14 +1,21 @@ from wscserver.model.Coleta import ColetaContextFactory -from wscserver.view.restfulview import CustomRESTfulView +#from wscserver.view.restfulview import CustomRESTfulView from wscserver.model.So import SoContextFactory +from wscserver.view.restfulview import viewcoleta + def make_routes(config): """ Cria rotas """ + + + config.add_route('the_big_colect', 'rest/coleta', request_method='GET') + config.add_view(view=viewcoleta, route_name='the_big_colect', request_method='GET') + config.add_static_view('static', 'static', cache_max_age=3600) - config.add_restful_routes( - 'rest/coleta', ColetaContextFactory, view=CustomRESTfulView) + #config.add_restful_routes( + # 'rest/coleta', ColetaContextFactory, view=CustomRESTfulView) config.add_restful_routes('rest/coleta2', ColetaContextFactory) config.add_route('download','zip/coleta') config.add_restful_routes('rest/so', SoContextFactory) diff --git a/wscserver/view/restfulview.py b/wscserver/view/restfulview.py index 5735d8a..b395e2f 100644 --- a/wscserver/view/restfulview.py +++ b/wscserver/view/restfulview.py @@ -1,103 +1,149 @@ -from pyramid_restler.view import RESTfulView -from collections import defaultdict import json import hashlib -from itertools import groupby - -class CustomRESTfulView(RESTfulView): - - """ - Classe com parametros personalizados de view dos registros - para as classes WMI - """ - - # Computer class and properties filters - computer_filter = { - "OperatingSystem": [ - "Caption", - "Version", - "InstallDate", - # quantidade ??? - ], - "Win32_Processor": [ - "Manufacturer", - "Caption", - "NumberOfLogicalProcessors", - # idade ?? - ], - "Win32_BIOS": [ - "Manufacturer", - ], - } - - def render_json(self, collection): - """ - :param collection: List of - collection element attributes example: - - "id_class": 3, - "id_computador_coleta_historico": 1, - "nm_class_name": "NetworkAdapterConfiguration", - "nm_property_name": "Description", - "id_computador_coleta": 1, - "id_class_property": 6, - "dt_hr_inclusao": "2014-07-18 12:34:43", - "id_computador": 3, - "te_class_property_value": " "Intel(R) 82579V Gigabit Network Connection" +from pyramid.response import Response +from wscserver.model import session + + +FILE_BEGIN = '{"results":[' +FILE_END = '], "result_count": %s}' + +# Computer class and properties filters +COMPUTER_FILTER = { + "OperatingSystem": [ + "Caption", + "Version", + "InstallDate", + # quantidade ??? + ], + "Win32_Processor": [ + "Manufacturer", + "Caption", + "NumberOfLogicalProcessors", + # idade ?? + ], + "Win32_BIOS": [ + "Manufacturer", + ], + "SoftwareList": [] +} + +FILTER_KEYS = str(tuple(COMPUTER_FILTER.keys())) + + +def viewcoleta(request): + + #create index idx_id_computador on computador_coleta(id_computador); + + limit = request.params.get('limit', 'NULL') + + stmt1 = """ + SELECT + id_computador + FROM computador_coleta + GROUP BY id_computador + LIMIT {}; + """.format(limit) + + computer_ids = session.execute(stmt1) + + + stmt2 = """ + SELECT classe.nm_class_name, + cp.nm_property_name, + cc.te_class_property_value + FROM computador_coleta AS cc + INNER JOIN class_property as cp ON (cc.id_class_property = + cp.id_class_property) + INNER JOIN classe ON (classe.id_class = cp.id_class) + WHERE cc.id_computador = {} AND + classe.nm_class_name IN {}; """ - def keyfunc(obj): - # Will group by computer ID - return int(obj.id_computador) + with open('/tmp/coleta.json', 'w') as f: - # Sort list before grouping - collection = sorted(collection, key=keyfunc) + f.write(FILE_BEGIN) - # Create result list - computers = [ ] + count = computer_ids.rowcount - # Navigate groups - for id_computador, computer_group in groupby(collection, keyfunc): + for (id_computador, ) in computer_ids.fetchall(): - computer = { } + computer_attributes = session.execute( + stmt2.format(id_computador, FILTER_KEYS)).fetchall() + computer_json = build_computer_json(computer_attributes) - for collection_element in list(computer_group): + f.write(computer_json) + count -= 1 - class_ = collection_element.nm_class_name - property_ = collection_element.nm_property_name - property_value = collection_element.te_class_property_value + if count is not 0: + f.write(',') - if class_ == 'SoftwareList': - if computer.get(class_) is None: - computer[class_] = [ ] - elif property_value.lower().find('office') > -1: - computer[class_].append(property_value) - elif property_value.lower().find('microsoft') > -1: - computer[class_].append(property_value) - continue + f.write(FILE_END % computer_ids.rowcount) - elif class_ not in self.computer_filter \ - or property_ not in self.computer_filter[class_]: - # Filter classes and properties - continue + return Response('ok') + #return Response( + # content_type='application/json', + # content_disposition='filename=coleta.json', + # app_iter=[open('/var/antony/coleta.json', 'rb').read()] + #) - elif computer.get(class_) is None: - computer[class_] = { } - else: - prefixed_property = class_ + '_' + property_ - computer[class_][prefixed_property] = property_value - computers.append(computer) - response = { - 'results': computers, - 'result_count': len(computers) - } - - return dict( - body=json.dumps(response), - content_type='application/json' - ) +def build_computer_json(computer_group): + computer = { + "OperatingSystem": {}, + "Win32_Processor": {}, + "Win32_BIOS": {}, + "SoftwareList": [] + } + for class_, property_, property_value in computer_group: + + if class_ == 'SoftwareList': + if property_value.lower().find('office') > -1: + computer[class_].append(property_value) + elif property_value.lower().find('microsoft') > -1: + computer[class_].append(property_value) + continue + + elif property_ not in COMPUTER_FILTER[class_]: + continue + + else: + prefixed_property = class_ + '_' + property_ + computer[class_][prefixed_property] = property_value + + return json.dumps(computer) + +def zipcoleta(): + """Recebe o json da coleta em um arquivo e zipa""" + coleta = requests.get('http://localhost/wscserver/rest/coleta') + + tmpdir = tempfile.gettempdir() + os.chdir(tmpdir) + f = open('coleta.json','r') + arquivozip = 'coleta.zip' + with zipfile.ZipFile(arquivozip, 'w') as myzip: + myzip.write(f.name) + f.close() + os.remove('coleta.json') + filepath = os.path.abspath(arquivozip) + return filepath +''' +def zipcoleta(): + """Recebe o json da coleta em um arquivo e zipa""" + coleta = requests.get('http://localhost/wscserver/rest/coleta') + + path = tempfile.gettempdir() + os.chdir(path) + f = open('coleta.json','w') + f.write(coleta.text) + arquivozip = 'coleta.zip' + with zipfile.ZipFile(arquivozip, 'w') as myzip: + myzip.write(f.name) + f.close() + os.remove('coleta.json') + filepath = os.path.abspath(arquivozip) + return filepath +''' -- libgit2 0.21.2