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 | +''' | ... | ... |