@cryptotaxi247 / netdata-1 / commits / 686b691f0

move UrlService to a separate file

lgz committed Oct 13, 2017 at 00:18 UTC 686b691f079b228b38b991e9dfc995bbadc35bd6
1 file changed +112
python.d/python_modules/bases/FrameworkServices/UrlService.py new
+112
@@ -0,0 +1,112 @@
1 +# -*- coding: utf-8 -*-
2 +# Description:
3 +# Author: Pawel Krupa (paulfantom)
4 +# Author: Ilya Mashchenko (l2isbad)
5 +
6 +import urllib3
7 +
8 +from bases.FrameworkServices.SimpleService import SimpleService
9 +
10 +try:
11 + urllib3.disable_warnings()
12 +except AttributeError:
13 + pass
14 +
15 +
16 +class UrlService(SimpleService):
17 + def __init__(self, configuration=None, name=None):
18 + SimpleService.__init__(self, configuration=configuration, name=name)
19 + self.url = self.configuration.get('url')
20 + self.user = self.configuration.get('user')
21 + self.password = self.configuration.get('pass')
22 + self.proxy_user = self.configuration.get('proxy_user')
23 + self.proxy_password = self.configuration.get('proxy_pass')
24 + self.proxy_url = self.configuration.get('proxy_url')
25 + self.header = self.configuration.get('header')
26 + self._manager = None
27 +
28 + def __make_headers(self, **header_kw):
29 + user = header_kw.get('user') or self.user
30 + password = header_kw.get('pass') or self.password
31 + proxy_user = header_kw.get('proxy_user') or self.proxy_user
32 + proxy_password = header_kw.get('proxy_pass') or self.proxy_password
33 + custom_header = header_kw.get('header') or self.header
34 + header_params = dict(keep_alive=True)
35 + proxy_header_params = dict()
36 + if user and password:
37 + header_params['basic_auth'] = '{user}:{password}'.format(user=user,
38 + password=password)
39 + if proxy_user and proxy_password:
40 + proxy_header_params['proxy_basic_auth'] = '{user}:{password}'.format(user=proxy_user,
41 + password=proxy_password)
42 + try:
43 + header, proxy_header = urllib3.make_headers(**header_params), urllib3.make_headers(**proxy_header_params)
44 + except TypeError as error:
45 + self.error('build_header() error: {error}'.format(error=error))
46 + return None, None
47 + else:
48 + header.update(custom_header or dict())
49 + return header, proxy_header
50 +
51 + def _build_manager(self, **header_kw):
52 + header, proxy_header = self.__make_headers(**header_kw)
53 + if header is None or proxy_header is None:
54 + return None
55 + proxy_url = header_kw.get('proxy_url') or self.proxy_url
56 + if proxy_url:
57 + manager = urllib3.ProxyManager
58 + params = dict(proxy_url=proxy_url, headers=header, proxy_headers=proxy_header)
59 + else:
60 + manager = urllib3.PoolManager
61 + params = dict(headers=header)
62 + try:
63 + return manager(**params)
64 + except (urllib3.exceptions.ProxySchemeUnknown, TypeError) as error:
65 + self.error('build_manager() error:', str(error))
66 + return None
67 +
68 + def _get_raw_data(self, url=None, manager=None):
69 + """
70 + Get raw data from http request
71 + :return: str
72 + """
73 + try:
74 + url = url or self.url
75 + manager = manager or self._manager
76 + # TODO: timeout, retries and method hardcoded..
77 + response = manager.request(method='GET',
78 + url=url,
79 + timeout=1,
80 + retries=1,
81 + headers=manager.headers)
82 + except (urllib3.exceptions.HTTPError, TypeError, AttributeError) as error:
83 + self.error('Url: {url}. Error: {error}'.format(url=url, error=error))
84 + return None
85 + if response.status == 200:
86 + return response.data.decode()
87 + self.debug('Url: {url}. Http response status code: {code}'.format(url=url, code=response.status))
88 + return None
89 +
90 + def check(self):
91 + """
92 + Format configuration data and try to connect to server
93 + :return: boolean
94 + """
95 + if not (self.url and isinstance(self.url, str)):
96 + self.error('URL is not defined or type is not <str>')
97 + return False
98 +
99 + self._manager = self._build_manager()
100 + if not self._manager:
101 + return False
102 +
103 + try:
104 + data = self._get_data()
105 + except Exception as error:
106 + self.error('_get_data() failed. Url: {url}. Error: {error}'.format(url=self.url, error=error))
107 + return False
108 +
109 + if isinstance(data, dict) and data:
110 + return True
111 + self.error('_get_data() returned no data or type is not <dict>')
112 + return False