-
Notifications
You must be signed in to change notification settings - Fork 2
/
pgSession.py
executable file
·174 lines (160 loc) · 7.35 KB
/
pgSession.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
"""
Work on makeing this a generic session handler for all Polyglot's
"""
import requests,json,warnings
from requests.adapters import HTTPAdapter, Retry
class pgSession():
def __init__(self,parent,l_name,logger,host,port=None,debug_level=-1):
self.parent = parent
self.l_name = l_name
self.logger = logger
self.host = host
self.port = port
self.debug_level = debug_level
if port is None:
self.port_s = ""
else:
self.port_s = ':{}'.format(port)
# Create our session
self.session = requests.Session()
# Allow for retries on all connections.
retries = 30
backoff_factor = .3
status_force_list = (500, 502, 503, 504, 505, 506)
adapter = HTTPAdapter(
max_retries=Retry(
total=retries,
read=retries,
connect=retries,
backoff_factor=backoff_factor,
status_forcelist=status_force_list,
)
)
for prefix in "http://", "https://":
self.session.mount(prefix, adapter)
def close(self):
self.session.close()
return
def get(self,path,payload,auth=None):
url = "https://{}{}/{}".format(self.host,self.port_s,path)
self.l_debug('get',0,"Sending: url={0} payload={1}".format(url,payload))
# No speical headers?
headers = {
"Content-Type": "application/json"
}
if auth is not None:
headers['Authorization'] = auth
self.l_debug('get', 1, "headers={}".format(headers))
# Some are getting unclosed socket warnings due to garbage collection?? no idea why, so just ignore them since we dont' care
warnings.filterwarnings("ignore", category=ResourceWarning, message="unclosed.*<socket.socket.*>")
#self.session.headers.update(headers)
try:
response = self.session.get(
url,
params=payload,
headers=headers,
timeout=(61,10)
)
self.l_debug('get', 1, "url={}".format(response.url))
# This is supposed to catch all request excpetions.
except requests.exceptions.RequestException as e:
self.l_error('get',"Connection error for %s: %s" % (url, e))
return False
return(self.response(response,'get'))
def response(self,response,name):
fname = 'reponse:'+name
self.l_debug(fname,0,' Got: code=%s' % (response.status_code))
self.l_debug(fname,2,' text=%s' % (response.text))
json_data = False
st = False
if response.status_code == 200:
self.l_debug(fname,0,' All good!')
st = True
elif response.status_code == 400:
self.l_error(fname,"Bad request: %s: text: %s" % (response.url,response.text) )
elif response.status_code == 404:
self.l_error(fname,"Not Found: %s: text: %s" % (response.url,response.text) )
elif response.status_code == 401:
# Authentication error
self.l_error(fname,"Unauthorized: %s: text: %s" % (response.url,response.text) )
elif response.status_code == 500:
self.l_error(fname,"Server Error: %s %s: text: %s" % (response.status_code,response.url,response.text) )
elif response.status_code == 522:
self.l_error(fname,"Timeout Error: %s %s: text: %s" % (response.status_code,response.url,response.text) )
else:
self.l_error(fname,"Unknown response %s: %s %s" % (response.status_code, response.url, response.text) )
self.l_error(fname,"Check system status: https://status.ecobee.com/")
# No matter what, return the code and error
try:
json_data = json.loads(response.text)
except (Exception) as err:
# Only complain about this error if we didn't have an error above
if st:
self.l_error(fname,'Failed to convert to json {0}: {1}'.format(response.text,err), exc_info=True)
json_data = False
return { 'code': response.status_code, 'data': json_data }
def post(self,path,payload={},params={},dump=True,auth=None):
url = "https://{}{}/{}".format(self.host,self.port_s,path)
if dump:
payload = json.dumps(payload)
self.l_debug('post',0,"Sending: url={0} payload={1}".format(url,payload))
headers = {
'Content-Length': str(len(payload))
}
if 'json' in params and ( params['json'] or params['json'] == 'true'):
headers['Content-Type'] = 'application/json'
if auth is not None:
headers['Authorization'] = auth
self.l_debug('post', 1, "headers={}".format(headers))
#self.session.headers.update(headers)
# Some are getting unclosed socket warnings due to garbage collection?? no idea why, so just ignore them since we dont' care
warnings.filterwarnings("ignore", category=ResourceWarning, message="unclosed.*<socket.socket.*>")
try:
response = self.session.post(
url,
params=params,
data=payload,
headers=headers,
timeout=(61,10)
)
self.l_debug('post', 1, "url={}".format(response.url))
# This is supposed to catch all request excpetions.
except requests.exceptions.RequestException as e:
self.l_error('post',"Connection error for %s: %s" % (url, e))
return False
return(self.response(response,'post'))
def delete(self,path,auth=None):
url = "https://{}{}/{}".format(self.host,self.port_s,path)
self.l_debug('delete',0,"Sending: url={0}".format(url))
# No speical headers?
headers = {
"Content-Type": "application/json"
}
if auth is not None:
headers['Authorization'] = auth
self.l_debug('delete', 1, "headers={}".format(headers))
# Some are getting unclosed socket warnings due to garbage collection?? no idea why, so just ignore them since we dont' care
warnings.filterwarnings("ignore", category=ResourceWarning, message="unclosed.*<socket.socket.*>")
#self.session.headers.update(headers)
try:
response = self.session.delete(
url,
headers=headers,
timeout=(61,10)
)
self.l_debug('delete', 1, "url={}".format(response.url))
self.logger.debug('delete got: {}'.format(response))
# This is supposed to catch all request excpetions.
except requests.exceptions.RequestException as e:
self.l_error('delete',"Connection error for %s: %s" % (url, e))
return False
return(self.response(response,'delete'))
def l_info(self, name, string):
self.logger.info("%s:%s: %s" % (self.l_name,name,string))
def l_error(self, name, string, exc_info=False):
self.logger.error("%s:%s: %s" % (self.l_name,name,string), exc_info=exc_info)
def l_warning(self, name, string):
self.logger.warning("%s:%s: %s" % (self.l_name,name,string))
def l_debug(self, name, debug_level, string):
if self.debug_level >= debug_level:
self.logger.debug("%s:%s: %s" % (self.l_name,name,string))