From 310f1e208562dfd03062ba8a6edf14ca7d74417a Mon Sep 17 00:00:00 2001 From: Jonas Leder Date: Thu, 18 Jul 2024 12:03:11 +0200 Subject: [PATCH] Add compatibility with python3 --- .../class/issabel/vendor/Snom.py | 121 +++++++++++------- 1 file changed, 78 insertions(+), 43 deletions(-) diff --git a/setup/usr/share/issabel/endpoint-classes/class/issabel/vendor/Snom.py b/setup/usr/share/issabel/endpoint-classes/class/issabel/vendor/Snom.py index 9223734..071e688 100755 --- a/setup/usr/share/issabel/endpoint-classes/class/issabel/vendor/Snom.py +++ b/setup/usr/share/issabel/endpoint-classes/class/issabel/vendor/Snom.py @@ -29,6 +29,7 @@ import re import urllib3 from eventlet.green import socket, urllib, os +from urllib3.exceptions import HTTPError, MaxRetryError, NewConnectionError import http.client from eventlet.green.urllib.parse import urlencode import issabel.BaseEndpoint @@ -71,10 +72,11 @@ def probeModel(self): unsecured by default. ''' sModel = None + http = urllib3.PoolManager() try: - response = urllib3.urlopen('http://' + self._ip + '/') - htmlbody = response.read() - if response.code == 200: + response = http.request('GET', 'http://' + self._ip + '/') + htmlbody = response.data.decode('utf-8') + if response.status == 200: # snom 320 m = re.search(r'snom (\w+)', htmlbody, re.IGNORECASE) if m != None: sModel = m.group(1) @@ -96,7 +98,7 @@ def updateGlobalConfig(serveriplist, amipool, endpoints): vars = {'server_ip' : Endpoint._global_serverip} #for sConfigFile in ('snom300.htm', 'snom320.htm', 'snom360.htm', 'snom821.htm'): - for sModel in ('300', '320', '360', '710', '720', '760', '821', '870'): + for sModel in ('300', '320', '360', '710', '720', '760', '821', '870', 'D315'): try: #sConfigPath = issabel.BaseEndpoint.TFTP_DIR + '/' + sConfigFile sConfigPath = '%s/snom%s.htm' % (issabel.BaseEndpoint.TFTP_DIR, sModel) @@ -228,10 +230,9 @@ def _loginHttp_V2(self): 'link' : 'index.htm', 'submit' : 'Login' } - response = urllib3.urlopen( - 'http://' + self._ip + '/index.htm', - urlencode(postvars)) - htmlbody = response.read() + http = urllib3.PoolManager() + response = http.request('GET', 'http://' + self._ip + '/index.htm') + htmlbody = response.data.decode('utf-8') if not 'Set-Cookie' in response.headers: logging.error('Endpoint %s@%s invalid username or password' % (self._vendorname, self._ip)) @@ -244,13 +245,17 @@ def _loginHttp_V2(self): if m != None: logging.warning('Endpoint %s@%s accepting EULA...' % (self._vendorname, self._ip)) postvars = {'eula' : m.group(1), 'save' : 'Submit'} - response = urllib3.urlopen(urllib3.Request( + encoded_postvars = urlencode(postvars).encode('utf-8') + http = urllib3.PoolManager() + response = http.request( + 'POST', 'http://' + self._ip + '/index.htm', - urlencode(postvars), - {'Cookie' : self._cookie_v2})) - htmlbody = response.read() + body=encoded_postvars, + headers={'Cookie': self._cookie_v2, 'Content-Type': 'application/x-www-form-urlencoded'} + ) + htmlbody = response.data.decode('utf-8') return True - except urllib3.URLError as e: + except HTTPError as e: logging.error('Endpoint %s@%s failed to connect - %s' % (self._vendorname, self._ip, str(e))) return False @@ -262,10 +267,17 @@ def _loginHttp_V2(self): def _setProvisionServer_V1(self): try: postvars = {'setting_server': 'tftp://' + self._serverip, 'Settings' : 'Save' } - response = urllib3.urlopen('http://' + self._ip + '/advanced_update.htm', urlencode(postvars)) - htmlbody = response.read() + encoded_postvars = urlencode(postvars).encode('utf-8') + http = urllib3.PoolManager() + response = http.request( + 'POST', + 'http://' + self._ip + '/advanced_update.htm', + headers={'Content-Type': 'application/x-www-form-urlencoded'}, + body=encoded_postvars + ) + htmlbody = response.data.decode('utf-8') return True - except urllib3.URLError as e: + except HTTPError as e: logging.error('Endpoint %s@%s failed to connect - %s' % (self._vendorname, self._ip, str(e))) return False @@ -340,17 +352,20 @@ def _setProvisionServer_V2(self): 'dns_server1' : self._static_dns1, 'dns_server2' : self._static_dns2, }) - response = urllib3.urlopen(urllib3.Request( + encoded_postvars = urlencode(postvars).encode('utf-8') + response = http.request( + 'POST', 'http://' + self._ip + '/network.htm', - urlencode(postvars), - {'Cookie' : self._cookie_v2})) - htmlbody = response.read() + body=encoded_postvars, + headers={'Cookie': self._cookie_v2, 'Content-Type': 'application/x-www-form-urlencoded'} + ) + htmlbody = response.data.decode('utf-8') if not 'Please reboot the device' in htmlbody: logging.error('Endpoint %s@%s failed to save provisioning or network settings' % (self._vendorname, self._ip)) return False return True - except urllib3.URLError as e: + except HTTPError as e: logging.error('Endpoint %s@%s failed to connect - %s' % (self._vendorname, self._ip, str(e))) return False @@ -360,6 +375,7 @@ def _setProvisionServer_V2(self): return False def _setNetworkConfig_V1(self): + http = urllib3.PoolManager() try: if self._dhcp: postvars = { @@ -378,13 +394,30 @@ def _setNetworkConfig_V1(self): 'Settings' : 'Save', 'ignore_dhcp_findings' : 'dns_server1 dns_server2 gateway ip_adr netmask', } - response = urllib3.urlopen('http://' + self._ip + '/advanced_network.htm', urlencode(postvars)) - htmlbody = response.read() + encoded_postvars = urlencode(postvars).encode('utf-8') + response = http.request( + 'POST', + 'http://' + self._ip + '/advanced_network.htm', + body=encoded_postvars, + headers={'Content-Type': 'application/x-www-form-urlencoded'} + ) + htmlbody = response.data.decode('utf-8') if 'CONFIRM_REBOOT' in htmlbody: - response = urllib3.urlopen('http://' + self._ip + '/advanced_network.htm', 'CONFIRM_REBOOT=Reboot') - htmlbody = response.read() - response = urllib3.urlopen('http://' + self._ip + '/confirm.htm', 'REBOOT=Yes') - htmlbody = response.read() + encoded_postvars = urlencode({"CONFIRM_REBOOT": "Reboot"}).encode('utf-8') + response = http.request( + 'POST', + 'http://' + self._ip + '/advanced_network.htm', + body=encoded_postvars, + headers={'Content-Type': 'application/x-www-form-urlencoded'} + ) + encoded_postvars = urlencode({"REBOOT": "Yes"}).encode('utf-8') + response = http.request( + 'POST', + 'http://' + self._ip + '/confirm.htm', + body=encoded_postvars, + headers={'Content-Type': 'application/x-www-form-urlencoded'} + ) + self._rebootbyhttp_V1() logging.info('Endpoint %s@%s set network config - rebooting' % (self._vendorname, self._ip)) return (True, True) @@ -392,28 +425,27 @@ def _setNetworkConfig_V1(self): logging.info('Endpoint %s@%s set network config - not yet rebooting' % (self._vendorname, self._ip)) return (True, False) - except urllib3.URLError as e: + except HTTPError as e: + # Apparently a successful CONFIRM_REBOOT will start provisioning immediately + return (True, True) logging.error('Endpoint %s@%s failed to connect - %s' % (self._vendorname, self._ip, str(e))) return (False, False) except socket.error as e: logging.error('Endpoint %s@%s failed to reboot phone - %s' % (self._vendorname, self._ip, str(e))) - except http.client.BadStatusLine as e: - # Apparently a successful CONFIRM_REBOOT will start provisioning immediately - return (True, True) return (False, False) def _rebootbyhttp_V1(self): try: - response = urllib3.urlopen('http://' + self._ip + '/advanced_update.htm?reboot=Reboot') - htmlbody = response.read() - if response.code == 302: + http = urllib3.PoolManager() + response = http.request('GET', 'http://' + self._ip + '/advanced_update.htm?reboot=Reboot') + if response.status == 200: return True else: logging.error('Endpoint %s@%s failed to reboot phone - got error code %d' % - (self._vendorname, self._ip, response.code)) - except urllib3.URLError as e: + (self._vendorname, self._ip, response.status)) + except HTTPError as e: logging.error('Endpoint %s@%s failed to connect - %s' % (self._vendorname, self._ip, str(e))) return False @@ -427,17 +459,20 @@ def _rebootbyhttp_V1(self): def _rebootbyhttp_V2(self): try: - response = urllib3.urlopen(urllib3.Request( + http = urllib3.PoolManager() + encoded_postvars = urlencode({'reboot' : 'Reboot'}).encode('utf-8') + response = http.request( + 'POST', 'http://' + self._ip + '/update.htm', - urlencode({'reboot' : 'Reboot'}), - {'Cookie' : self._cookie_v2})) - htmlbody = response.read() - if response.code == 200: + body=encoded_postvars, + headers={'Cookie': self._cookie_v2, 'Content-Type': 'application/x-www-form-urlencoded'} + ) + if response.status == 200: return True else: logging.error('Endpoint %s@%s failed to reboot phone - got error code %d' % - (self._vendorname, self._ip, response.code)) - except urllib3.URLError as e: + (self._vendorname, self._ip, response.status)) + except HTTPError as e: logging.error('Endpoint %s@%s failed to connect - %s' % (self._vendorname, self._ip, str(e))) return False