Commit c452bde33acf674f10a808dac9d913b434aea802
1 parent
ce03424b
Exists in
master
build computers json and writing to file
Showing
2 changed files
with
141 additions
and
88 deletions
Show diff stats
wscserver/config/routing.py
| 1 | 1 | from wscserver.model.Coleta import ColetaContextFactory |
| 2 | -from wscserver.view.restfulview import CustomRESTfulView | |
| 2 | +#from wscserver.view.restfulview import CustomRESTfulView | |
| 3 | 3 | from wscserver.model.So import SoContextFactory |
| 4 | 4 | |
| 5 | +from wscserver.view.restfulview import viewcoleta | |
| 6 | + | |
| 5 | 7 | def make_routes(config): |
| 6 | 8 | """ |
| 7 | 9 | Cria rotas |
| 8 | 10 | """ |
| 11 | + | |
| 12 | + | |
| 13 | + config.add_route('the_big_colect', 'rest/coleta', request_method='GET') | |
| 14 | + config.add_view(view=viewcoleta, route_name='the_big_colect', request_method='GET') | |
| 15 | + | |
| 9 | 16 | config.add_static_view('static', 'static', cache_max_age=3600) |
| 10 | - config.add_restful_routes( | |
| 11 | - 'rest/coleta', ColetaContextFactory, view=CustomRESTfulView) | |
| 17 | + #config.add_restful_routes( | |
| 18 | + # 'rest/coleta', ColetaContextFactory, view=CustomRESTfulView) | |
| 12 | 19 | config.add_restful_routes('rest/coleta2', ColetaContextFactory) |
| 13 | 20 | config.add_route('download','zip/coleta') |
| 14 | 21 | config.add_restful_routes('rest/so', SoContextFactory) | ... | ... |
wscserver/view/restfulview.py
| 1 | -from pyramid_restler.view import RESTfulView | |
| 2 | -from collections import defaultdict | |
| 3 | 1 | import json |
| 4 | 2 | import hashlib |
| 5 | -from itertools import groupby | |
| 6 | - | |
| 7 | -class CustomRESTfulView(RESTfulView): | |
| 8 | - | |
| 9 | - """ | |
| 10 | - Classe com parametros personalizados de view dos registros | |
| 11 | - para as classes WMI | |
| 12 | - """ | |
| 13 | - | |
| 14 | - # Computer class and properties filters | |
| 15 | - computer_filter = { | |
| 16 | - "OperatingSystem": [ | |
| 17 | - "Caption", | |
| 18 | - "Version", | |
| 19 | - "InstallDate", | |
| 20 | - # quantidade ??? | |
| 21 | - ], | |
| 22 | - "Win32_Processor": [ | |
| 23 | - "Manufacturer", | |
| 24 | - "Caption", | |
| 25 | - "NumberOfLogicalProcessors", | |
| 26 | - # idade ?? | |
| 27 | - ], | |
| 28 | - "Win32_BIOS": [ | |
| 29 | - "Manufacturer", | |
| 30 | - ], | |
| 31 | - } | |
| 32 | - | |
| 33 | - def render_json(self, collection): | |
| 34 | 3 | |
| 35 | - """ | |
| 36 | - :param collection: List of <wscserver.model.Coleta.Coleta object> | |
| 37 | - collection element attributes example: | |
| 38 | - | |
| 39 | - "id_class": 3, | |
| 40 | - "id_computador_coleta_historico": 1, | |
| 41 | - "nm_class_name": "NetworkAdapterConfiguration", | |
| 42 | - "nm_property_name": "Description", | |
| 43 | - "id_computador_coleta": 1, | |
| 44 | - "id_class_property": 6, | |
| 45 | - "dt_hr_inclusao": "2014-07-18 12:34:43", | |
| 46 | - "id_computador": 3, | |
| 47 | - "te_class_property_value": " "Intel(R) 82579V Gigabit Network Connection" | |
| 4 | +from pyramid.response import Response | |
| 5 | +from wscserver.model import session | |
| 6 | + | |
| 7 | + | |
| 8 | +FILE_BEGIN = '{"results":[' | |
| 9 | +FILE_END = '], "result_count": %s}' | |
| 10 | + | |
| 11 | +# Computer class and properties filters | |
| 12 | +COMPUTER_FILTER = { | |
| 13 | + "OperatingSystem": [ | |
| 14 | + "Caption", | |
| 15 | + "Version", | |
| 16 | + "InstallDate", | |
| 17 | + # quantidade ??? | |
| 18 | + ], | |
| 19 | + "Win32_Processor": [ | |
| 20 | + "Manufacturer", | |
| 21 | + "Caption", | |
| 22 | + "NumberOfLogicalProcessors", | |
| 23 | + # idade ?? | |
| 24 | + ], | |
| 25 | + "Win32_BIOS": [ | |
| 26 | + "Manufacturer", | |
| 27 | + ], | |
| 28 | + "SoftwareList": [] | |
| 29 | +} | |
| 30 | + | |
| 31 | +FILTER_KEYS = str(tuple(COMPUTER_FILTER.keys())) | |
| 32 | + | |
| 33 | + | |
| 34 | +def viewcoleta(request): | |
| 35 | + | |
| 36 | + #create index idx_id_computador on computador_coleta(id_computador); | |
| 37 | + | |
| 38 | + limit = request.params.get('limit', 'NULL') | |
| 39 | + | |
| 40 | + stmt1 = """ | |
| 41 | + SELECT | |
| 42 | + id_computador | |
| 43 | + FROM computador_coleta | |
| 44 | + GROUP BY id_computador | |
| 45 | + LIMIT {}; | |
| 46 | + """.format(limit) | |
| 47 | + | |
| 48 | + computer_ids = session.execute(stmt1) | |
| 49 | + | |
| 50 | + | |
| 51 | + stmt2 = """ | |
| 52 | + SELECT classe.nm_class_name, | |
| 53 | + cp.nm_property_name, | |
| 54 | + cc.te_class_property_value | |
| 55 | + FROM computador_coleta AS cc | |
| 56 | + INNER JOIN class_property as cp ON (cc.id_class_property = | |
| 57 | + cp.id_class_property) | |
| 58 | + INNER JOIN classe ON (classe.id_class = cp.id_class) | |
| 59 | + WHERE cc.id_computador = {} AND | |
| 60 | + classe.nm_class_name IN {}; | |
| 48 | 61 | """ |
| 49 | 62 | |
| 50 | - def keyfunc(obj): | |
| 51 | - # Will group by computer ID | |
| 52 | - return int(obj.id_computador) | |
| 63 | + with open('/tmp/coleta.json', 'w') as f: | |
| 53 | 64 | |
| 54 | - # Sort list before grouping | |
| 55 | - collection = sorted(collection, key=keyfunc) | |
| 65 | + f.write(FILE_BEGIN) | |
| 56 | 66 | |
| 57 | - # Create result list | |
| 58 | - computers = [ ] | |
| 67 | + count = computer_ids.rowcount | |
| 59 | 68 | |
| 60 | - # Navigate groups | |
| 61 | - for id_computador, computer_group in groupby(collection, keyfunc): | |
| 69 | + for (id_computador, ) in computer_ids.fetchall(): | |
| 62 | 70 | |
| 63 | - computer = { } | |
| 71 | + computer_attributes = session.execute( | |
| 72 | + stmt2.format(id_computador, FILTER_KEYS)).fetchall() | |
| 73 | + computer_json = build_computer_json(computer_attributes) | |
| 64 | 74 | |
| 65 | - for collection_element in list(computer_group): | |
| 75 | + f.write(computer_json) | |
| 76 | + count -= 1 | |
| 66 | 77 | |
| 67 | - class_ = collection_element.nm_class_name | |
| 68 | - property_ = collection_element.nm_property_name | |
| 69 | - property_value = collection_element.te_class_property_value | |
| 78 | + if count is not 0: | |
| 79 | + f.write(',') | |
| 70 | 80 | |
| 71 | - if class_ == 'SoftwareList': | |
| 72 | - if computer.get(class_) is None: | |
| 73 | - computer[class_] = [ ] | |
| 74 | - elif property_value.lower().find('office') > -1: | |
| 75 | - computer[class_].append(property_value) | |
| 76 | - elif property_value.lower().find('microsoft') > -1: | |
| 77 | - computer[class_].append(property_value) | |
| 78 | - continue | |
| 81 | + f.write(FILE_END % computer_ids.rowcount) | |
| 79 | 82 | |
| 80 | - elif class_ not in self.computer_filter \ | |
| 81 | - or property_ not in self.computer_filter[class_]: | |
| 82 | - # Filter classes and properties | |
| 83 | - continue | |
| 83 | + return Response('ok') | |
| 84 | + #return Response( | |
| 85 | + # content_type='application/json', | |
| 86 | + # content_disposition='filename=coleta.json', | |
| 87 | + # app_iter=[open('/var/antony/coleta.json', 'rb').read()] | |
| 88 | + #) | |
| 84 | 89 | |
| 85 | - elif computer.get(class_) is None: | |
| 86 | - computer[class_] = { } | |
| 87 | - else: | |
| 88 | - prefixed_property = class_ + '_' + property_ | |
| 89 | - computer[class_][prefixed_property] = property_value | |
| 90 | 90 | |
| 91 | - computers.append(computer) | |
| 92 | 91 | |
| 93 | - response = { | |
| 94 | - 'results': computers, | |
| 95 | - 'result_count': len(computers) | |
| 96 | - } | |
| 97 | - | |
| 98 | - return dict( | |
| 99 | - body=json.dumps(response), | |
| 100 | - content_type='application/json' | |
| 101 | - ) | |
| 92 | +def build_computer_json(computer_group): | |
| 102 | 93 | |
| 94 | + computer = { | |
| 95 | + "OperatingSystem": {}, | |
| 96 | + "Win32_Processor": {}, | |
| 97 | + "Win32_BIOS": {}, | |
| 98 | + "SoftwareList": [] | |
| 99 | + } | |
| 103 | 100 | |
| 101 | + for class_, property_, property_value in computer_group: | |
| 102 | + | |
| 103 | + if class_ == 'SoftwareList': | |
| 104 | + if property_value.lower().find('office') > -1: | |
| 105 | + computer[class_].append(property_value) | |
| 106 | + elif property_value.lower().find('microsoft') > -1: | |
| 107 | + computer[class_].append(property_value) | |
| 108 | + continue | |
| 109 | + | |
| 110 | + elif property_ not in COMPUTER_FILTER[class_]: | |
| 111 | + continue | |
| 112 | + | |
| 113 | + else: | |
| 114 | + prefixed_property = class_ + '_' + property_ | |
| 115 | + computer[class_][prefixed_property] = property_value | |
| 116 | + | |
| 117 | + return json.dumps(computer) | |
| 118 | + | |
| 119 | +def zipcoleta(): | |
| 120 | + """Recebe o json da coleta em um arquivo e zipa""" | |
| 121 | + coleta = requests.get('http://localhost/wscserver/rest/coleta') | |
| 122 | + | |
| 123 | + tmpdir = tempfile.gettempdir() | |
| 124 | + os.chdir(tmpdir) | |
| 125 | + f = open('coleta.json','r') | |
| 126 | + arquivozip = 'coleta.zip' | |
| 127 | + with zipfile.ZipFile(arquivozip, 'w') as myzip: | |
| 128 | + myzip.write(f.name) | |
| 129 | + f.close() | |
| 130 | + os.remove('coleta.json') | |
| 131 | + filepath = os.path.abspath(arquivozip) | |
| 132 | + return filepath | |
| 133 | +''' | |
| 134 | +def zipcoleta(): | |
| 135 | + """Recebe o json da coleta em um arquivo e zipa""" | |
| 136 | + coleta = requests.get('http://localhost/wscserver/rest/coleta') | |
| 137 | + | |
| 138 | + path = tempfile.gettempdir() | |
| 139 | + os.chdir(path) | |
| 140 | + f = open('coleta.json','w') | |
| 141 | + f.write(coleta.text) | |
| 142 | + arquivozip = 'coleta.zip' | |
| 143 | + with zipfile.ZipFile(arquivozip, 'w') as myzip: | |
| 144 | + myzip.write(f.name) | |
| 145 | + f.close() | |
| 146 | + os.remove('coleta.json') | |
| 147 | + filepath = os.path.abspath(arquivozip) | |
| 148 | + return filepath | |
| 149 | +''' | ... | ... |