From 8dca64add23f1ff4f9bbe9b403fedea15b218dba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Qin=20Zhang=20=EF=BC=88=E5=BC=A0=E7=90=B4=EF=BC=89?= Date: Mon, 30 Oct 2023 15:25:42 +0800 Subject: [PATCH 1/7] Remove the use of 'unicode' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 'unicode' is not available in python3, so remove the use of it. And for python3 'bytes' string might need to be converted to a regular string Signed-off-by: Qin Zhang (张琴) --- XSConsoleCurses.py | 4 ++-- XSConsoleLang.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/XSConsoleCurses.py b/XSConsoleCurses.py index a394bd0..e77ed1a 100644 --- a/XSConsoleCurses.py +++ b/XSConsoleCurses.py @@ -174,8 +174,8 @@ def ClippedAddStr(self, inString, inX, inY, inColour): # Internal use if len(clippedStr) > 0: try: encodedStr = clippedStr - if isinstance(clippedStr, unicode): - encodedStr = clippedStr.encode('utf-8') + if isinstance(clippedStr, bytes): + encodedStr = clippedStr.decode('utf-8') # Clear field here since addstr will clear len(encodedStr)-len(clippedStr) too few spaces self.win.addstr(inY, xPos, len(clippedStr)*' ', CursesPalette.ColourAttr(FirstValue(inColour, self.defaultColour))) self.win.refresh() diff --git a/XSConsoleLang.py b/XSConsoleLang.py index e13f8f7..f47e239 100644 --- a/XSConsoleLang.py +++ b/XSConsoleLang.py @@ -82,15 +82,15 @@ def ToString(cls, inLabel): elif isinstance(inLabel, Exception): exn_strings = [] for arg in inLabel.args: - if isinstance(arg, unicode): - exn_strings.append(arg.encode('utf-8')) + if isinstance(arg, bytes): + exn_strings.append(arg.decode('utf-8')) else: exn_strings.append(str(arg)) retVal = str(tuple(exn_strings)) cls.LogError(retVal) else: - if isinstance(inLabel, unicode): - inLabel = inLabel.encode('utf-8') + if isinstance(inLabel, bytes): + inLabel = inLabel.decode('utf-8') retVal = inLabel if cls.stringHook is not None: cls.stringHook(retVal) From 7ce0139eedf1e899278d51fd180fc19edb487f36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Qin=20Zhang=20=EF=BC=88=E5=BC=A0=E7=90=B4=EF=BC=89?= Date: Thu, 9 Nov 2023 15:08:43 +0800 Subject: [PATCH 2/7] Update xmlrpc and socketserver syntax for python3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Qin Zhang (张琴) --- XSConsoleRemoteTest.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/XSConsoleRemoteTest.py b/XSConsoleRemoteTest.py index b506bf2..2f39506 100644 --- a/XSConsoleRemoteTest.py +++ b/XSConsoleRemoteTest.py @@ -13,7 +13,7 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -import os, socket, xmlrpclib +import os, socket, xmlrpc.client from XSConsoleBases import * from XSConsoleImporter import * @@ -21,19 +21,19 @@ from XSConsoleLog import * from XSConsoleLayout import * -import SocketServer -import SimpleXMLRPCServer +import socketserver +import xmlrpc.server -class UnixSimpleXMLRPCRequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler): +class UnixSimpleXMLRPCRequestHandler(xmlrpc.server.SimpleXMLRPCRequestHandler): # Python 2.7's SimpleXMLRPCRequestHandler enables Nagle's algorithm by default # which fails because we're working with Unix domain sockets so disable it. disable_nagle_algorithm = False -class UDSXMLRPCServer(SocketServer.UnixStreamServer, SimpleXMLRPCServer.SimpleXMLRPCDispatcher): +class UDSXMLRPCServer(socketserver.UnixStreamServer, xmlrpc.server.SimpleXMLRPCDispatcher): def __init__(self, inAddr, inRequestHandler = None): self.logRequests = False - SimpleXMLRPCServer.SimpleXMLRPCDispatcher.__init__(self) - SocketServer.UnixStreamServer.__init__(self, inAddr, + xmlrpc.server.SimpleXMLRPCDispatcher.__init__(self) + socketserver.UnixStreamServer.__init__(self, inAddr, FirstValue(inRequestHandler, UnixSimpleXMLRPCRequestHandler)) def handle_request(self): @@ -122,14 +122,14 @@ def WrapProcedure(self, inProc): # Any return value of inProc is discarded try: inProc() except Exception as e: - raise xmlrpclib.Fault(1, self.ErrorString(e)) + raise xmlrpc.client.Fault(1, self.ErrorString(e)) return None def WrapFunction(self, inFunc): # inFunc returns a value try: retVal = inFunc() except Exception as e: - raise xmlrpclib.Fault(1, self.ErrorString(e)) + raise xmlrpc.client.Fault(1, self.ErrorString(e)) return retVal def StandardReturn(self, inInfix = None): @@ -193,7 +193,7 @@ def HandleXMLRPCVerify(self, inString): result = line break if result is None: - raise xmlrpclib.Fault(1, self.ErrorString()+"\n\nSearch string '"+inString+"' not found.") + raise xmlrpc.client.Fault(1, self.ErrorString()+"\n\nSearch string '"+inString+"' not found.") return self.StandardReturn("found '"+result+"'") def HandleXMLRPCActivate(self, inName): @@ -250,7 +250,7 @@ def HandleXMLRPCAssertFailure(self): """ self.params = ['assertfailure'] if len(self.errors) == 0: - raise xmlrpclib.Fault(1, self.ErrorString()) + raise xmlrpc.client.Fault(1, self.ErrorString()) return self.StandardReturn() def HandleXMLRPCAssertSuccess(self): @@ -261,7 +261,7 @@ def HandleXMLRPCAssertSuccess(self): """ self.params = ['assertsuccess'] if len(self.errors) > 0: - raise xmlrpclib.Fault(1, self.ErrorString()) + raise xmlrpc.client.Fault(1, self.ErrorString()) return self.StandardReturn() class NullRemoteTest: From 11f58d10fc12eaf3c0b40b0c64db8e0c9a36c652 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Qin=20Zhang=20=EF=BC=88=E5=BC=A0=E7=90=B4=EF=BC=89?= Date: Thu, 9 Nov 2023 15:11:41 +0800 Subject: [PATCH 3/7] Update 'urllib' syntax for python3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Qin Zhang (张琴) --- XSConsoleMetrics.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/XSConsoleMetrics.py b/XSConsoleMetrics.py index 4fb430e..93b2305 100644 --- a/XSConsoleMetrics.py +++ b/XSConsoleMetrics.py @@ -14,7 +14,7 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import XenAPI -import urllib +import urllib.request import xml.dom.minidom from XSConsoleAuth import * @@ -138,9 +138,9 @@ def FetchData(self): httpRequest = 'http://localhost/rrd_updates?session_id=%s&start=%s&host=true' % (sessionID, int(time.time()) - self.SNAPSHOT_SECS) - socket = urllib.URLopener().open(httpRequest) + socket = urllib.request.urlopen(httpRequest) try: - content = socket.read() + content = socket.read().decode('utf-8') finally: socket.close() retVal = self.ParseXML(content) From 3cb8b55774587652c1f2211d72de66872db9f233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Qin=20Zhang=20=EF=BC=88=E5=BC=A0=E7=90=B4=EF=BC=89?= Date: Wed, 25 Oct 2023 16:21:02 +0800 Subject: [PATCH 4/7] Update pam authentication code based on python3-pam package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We use PyPAM for python2 and as a result of testing the part of code is not working for python3-pam with the failure "'PamAuthenticator' object has no attribute 'start'" Signed-off-by: Qin Zhang (张琴) --- XSConsoleAuth.py | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/XSConsoleAuth.py b/XSConsoleAuth.py index e35e316..2bc076e 100644 --- a/XSConsoleAuth.py +++ b/XSConsoleAuth.py @@ -15,10 +15,7 @@ import os, spwd, re, sys, time, socket -try: - import PAM # From PyPAM RPM -except ImportError: - import pam as PAM # From pip install python-pam +import pam from XSConsoleBases import * from XSConsoleLang import * @@ -109,26 +106,7 @@ def TCPAuthenticate(self, inUsername, inPassword): session.close() def PAMAuthenticate(self, inUsername, inPassword): - - def PAMConv(inAuth, inQueryList, *theRest): - # *theRest consumes the userData argument from later versions of PyPAM - retVal = [] - for query in inQueryList: - if query[1] == PAM.PAM_PROMPT_ECHO_ON or query[1] == PAM.PAM_PROMPT_ECHO_OFF: - # Return inPassword from the scope that encloses this function - retVal.append((inPassword, 0)) # Append a tuple with two values (so double brackets) - return retVal - - auth = PAM.pam() - auth.start('passwd') - auth.set_item(PAM.PAM_USER, inUsername) - auth.set_item(PAM.PAM_CONV, PAMConv) - - try: - auth.authenticate() - auth.acct_mgmt() - # No exception implies a successful login - except Exception as e: + if not pam.authenticate(inUsername, inPassword, service="passwd"): # Display a generic message for all failures raise Exception(Lang("The system could not log you in. Please check your access credentials and try again.")) From 995d6ed0840f632067cf966f6de23fe2f9ab2189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Qin=20Zhang=20=EF=BC=88=E5=BC=A0=E7=90=B4=EF=BC=89?= Date: Mon, 13 Nov 2023 13:38:46 +0800 Subject: [PATCH 5/7] Use python3 explictly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Qin Zhang (张琴) --- xsconsole | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xsconsole b/xsconsole index 9d2f126..afb4c4b 100755 --- a/xsconsole +++ b/xsconsole @@ -4,4 +4,4 @@ if [ "$USER" = "" ]; then export USER=root fi -exec /usr/bin/python /usr/lib64/xsconsole/XSConsole.py $@ +exec /usr/bin/python3 /usr/lib64/xsconsole/XSConsole.py $@ From c0f32bda11c6bd1b5cc0c106e5a917b60164f975 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Qin=20Zhang=20=EF=BC=88=E5=BC=A0=E7=90=B4=EF=BC=89?= Date: Thu, 23 Nov 2023 15:55:08 +0800 Subject: [PATCH 6/7] Remove the use of 'encode' as it's used to turn a Unicode string into a regular string in Python2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Qin Zhang (张琴) --- XSConsoleCurses.py | 4 ++-- XSConsoleRemoteTest.py | 2 +- plugins-base/XSFeatureSRCommon.py | 6 +++--- plugins-base/XSFeatureVMCommon.py | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/XSConsoleCurses.py b/XSConsoleCurses.py index e77ed1a..31037f5 100644 --- a/XSConsoleCurses.py +++ b/XSConsoleCurses.py @@ -279,10 +279,10 @@ def Snapshot(self): retVal.append(self.title) if self.hasBox: for i in range(1, self.ySize-1): - retVal.append(self.win.instr(i, 1, self.xSize-2)) + retVal.append(self.win.instr(i, 1, self.xSize-2).decode('utf-8')) else: for i in range(self.ySize): - retVal.append(self.win.instr(i, 0, self.xSize)) + retVal.append(self.win.instr(i, 0, self.xSize).decode('utf-8')) return retVal diff --git a/XSConsoleRemoteTest.py b/XSConsoleRemoteTest.py index 2f39506..a9288da 100644 --- a/XSConsoleRemoteTest.py +++ b/XSConsoleRemoteTest.py @@ -25,7 +25,7 @@ import xmlrpc.server class UnixSimpleXMLRPCRequestHandler(xmlrpc.server.SimpleXMLRPCRequestHandler): - # Python 2.7's SimpleXMLRPCRequestHandler enables Nagle's algorithm by default + # Python's SimpleXMLRPCRequestHandler enables Nagle's algorithm by default # which fails because we're working with Unix domain sockets so disable it. disable_nagle_algorithm = False diff --git a/plugins-base/XSFeatureSRCommon.py b/plugins-base/XSFeatureSRCommon.py index 83390de..f6a7370 100644 --- a/plugins-base/XSFeatureSRCommon.py +++ b/plugins-base/XSFeatureSRCommon.py @@ -211,7 +211,7 @@ def UpdateFieldsINITIAL(self): pane.ResetFields() sr = HotAccessor().sr[self.srHandle] - srName = sr.name_label(None).encode('utf-8') + srName = sr.name_label(None) if srName is None: pane.AddTitleField(Lang("The Virtual Machine is no longer present")) else: @@ -226,7 +226,7 @@ def UpdateFieldsCONFIRM(self): pane.ResetFields() sr = HotAccessor().sr[self.srHandle] - srName = sr.name_label(None).encode('utf-8') + srName = sr.name_label(None) if srName is None: pane.AddTitleField(Lang("The Storage Repository is no longer present")) else: @@ -282,7 +282,7 @@ def Commit(self): Layout.Inst().PopDialogue() operationName = SRUtils.OperationName(self.operation) - srName = HotAccessor().sr[self.srHandle].name_label(Lang('')).encode('utf-8') + srName = HotAccessor().sr[self.srHandle].name_label(Lang('')) messagePrefix = operationName + Lang(' operation on ') + srName + ' ' Layout.Inst().TransientBanner(messagePrefix+Lang('in progress...')) try: diff --git a/plugins-base/XSFeatureVMCommon.py b/plugins-base/XSFeatureVMCommon.py index 108938c..579ea1e 100644 --- a/plugins-base/XSFeatureVMCommon.py +++ b/plugins-base/XSFeatureVMCommon.py @@ -162,7 +162,7 @@ def UpdateFieldsINITIAL(self): pane.ResetFields() vm = HotAccessor().guest_vm[self.vmHandle] - vmName = vm.name_label(None).encode('utf-8') + vmName = vm.name_label(None) if vmName is None: pane.AddTitleField(Lang("The Virtual Machine is no longer present")) else: @@ -183,7 +183,7 @@ def UpdateFieldsCONFIRM(self): pane.ResetFields() vm = HotAccessor().vm[self.vmHandle] - vmName = vm.name_label(None).encode('utf-8') + vmName = vm.name_label(None) if vmName is None: pane.AddTitleField(Lang("The Virtual Machine is no longer present")) else: @@ -245,7 +245,7 @@ def Commit(self): Layout.Inst().PopDialogue() operationName = VMUtils.OperationName(self.operation) - vmName = HotAccessor().guest_vm[self.vmHandle].name_label(Lang('')).encode('utf-8') + vmName = HotAccessor().guest_vm[self.vmHandle].name_label(Lang('')) messagePrefix = operationName + Lang(' operation on ') + vmName + ' ' try: task = VMUtils.AsyncOperation(self.operation, self.vmHandle, *self.opParams) From a6ba7c14fa63d72a53ce5bc6cfc2eca1febe2556 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Qin=20Zhang=20=EF=BC=88=E5=BC=A0=E7=90=B4=EF=BC=89?= Date: Fri, 24 Nov 2023 17:30:40 +0800 Subject: [PATCH 7/7] Remove the use of __cmp__ and use __eq__ instead MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Qin Zhang (张琴) --- XSConsoleHotData.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/XSConsoleHotData.py b/XSConsoleHotData.py index 9e56e7e..1691b36 100644 --- a/XSConsoleHotData.py +++ b/XSConsoleHotData.py @@ -32,18 +32,16 @@ def __init__(self, inOpaqueRef, inType): def __repr__(self): return str(self.__dict__) - # __hash__ and __cmp__ allow this object to be used as a dictionary key + # __hash__ and __eq__ allow this object to be used as a dictionary key def __hash__(self): return self.hash - def __cmp__(self, inOther): + def __eq__(self, inOther): if not isinstance(inOther, HotOpaqueRef): - return 1 + return False if self.opaqueRef == inOther.opaqueRef: - return 0 - if self.opaqueRef < inOther.opaqueRef: - return -1 - return 1 + return True + return False def OpaqueRef(self): return self.opaqueRef def Type(self): return self.type