Commit c452bde33acf674f10a808dac9d913b434aea802

Authored by antonygc91
1 parent ce03424b
Exists in master

build computers json and writing to file

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