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