summaryrefslogtreecommitdiff
path: root/lizardfs-3.12-cgi-py3.patch
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-04-06 14:02:10 +0000
committerCoprDistGit <infra@openeuler.org>2023-04-06 14:02:10 +0000
commit1b5f52e22f377cd7fa2bffab2ae1cefdc1c43fe2 (patch)
treecd455860dfaed53912bf8e4a99a084b84b94ac8f /lizardfs-3.12-cgi-py3.patch
parentaac450e024c595ebf20cee258c114444cabacaf0 (diff)
automatic import of lizardfsopeneuler20.03
Diffstat (limited to 'lizardfs-3.12-cgi-py3.patch')
-rw-r--r--lizardfs-3.12-cgi-py3.patch1461
1 files changed, 1461 insertions, 0 deletions
diff --git a/lizardfs-3.12-cgi-py3.patch b/lizardfs-3.12-cgi-py3.patch
new file mode 100644
index 0000000..089413d
--- /dev/null
+++ b/lizardfs-3.12-cgi-py3.patch
@@ -0,0 +1,1461 @@
+diff -urb lizardfs-3.12.0/src/cgi/cgiserv.py.in lizardfs-3.12.0b/src/cgi/cgiserv.py.in
+--- lizardfs-3.12.0/src/cgi/cgiserv.py.in 2017-12-20 09:59:37.000000000 +0000
++++ lizardfs-3.12.0b/src/cgi/cgiserv.py.in 2019-08-24 16:25:11.915084539 +0100
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python2
++#!/usr/bin/env python3
+ import fcntl
+ import errno
+ import posix
+@@ -10,9 +10,9 @@
+ import traceback
+ import datetime
+ import mimetypes
+-import urlparse
+-import urllib
+-import cStringIO
++import urllib.parse
++import urllib.request, urllib.parse, urllib.error
++import io
+ import socket
+ import select
+
+@@ -142,7 +142,7 @@
+ # ============================================================================
+ def loop(server,handler,timeout=30):
+ while True:
+- k = client_handlers.keys()
++ k = list(client_handlers.keys())
+ # w = sockets to which there is something to send
+ # we must test if we can send data
+ w = [ cl for cl in client_handlers if client_handlers[cl].writable ]
+@@ -209,7 +209,7 @@
+ if (self.protocol == "HTTP/1.1" and close_conn.lower() == "keep-alive"):
+ self.close_when_done = False
+ # parse the url
+- scheme,netloc,path,params,query,fragment = urlparse.urlparse(self.url)
++ scheme,netloc,path,params,query,fragment = urllib.parse.urlparse(self.url)
+ self.path,self.rest = path,(params,query,fragment)
+
+ if self.method == 'POST':
+@@ -220,7 +220,7 @@
+ # request is incomplete if not all message body received
+ if len(body)<content_length:
+ return False
+- f_body = cStringIO.StringIO(body)
++ f_body = io.StringIO(body)
+ f_body.seek(0)
+ sys.stdin = f_body # compatibility with CGI
+
+@@ -246,11 +246,11 @@
+ return self.err_resp(403,'Forbidden')
+ else:
+ fstatdata = os.stat(file_name)
+- if (fstatdata.st_mode & 0170000) == 0040000: # directory
++ if (fstatdata.st_mode & 0o170000) == 0o040000: # directory
+ for index in self.index_files:
+ if os.path.exists(file_name+'/'+index) and os.access(file_name+'/'+index,os.R_OK):
+ return self.redirect_resp(index)
+- if (fstatdata.st_mode & 0170000) != 0100000:
++ if (fstatdata.st_mode & 0o170000) != 0o100000:
+ return self.err_resp(403,'Forbidden')
+ ext = os.path.splitext(file_name)[1]
+ c_type = mimetypes.types_map.get(ext,'text/plain')
+@@ -301,14 +301,14 @@
+ self.make_cgi_env()
+ # redirect print statements to a cStringIO
+ save_stdout = sys.stdout
+- sys.stdout = cStringIO.StringIO()
++ sys.stdout = io.StringIO()
+ # run the script
+ try:
+- execfile(self.file_name, {})
++ exec(compile(open(self.file_name, "rb").read(), self.file_name, 'exec'), {})
+ except SystemExit:
+ pass
+ except:
+- sys.stdout = cStringIO.StringIO()
++ sys.stdout = io.StringIO()
+ sys.stdout.write("Content-type:text/plain\r\n\r\n")
+ traceback.print_exc(file=sys.stdout)
+ response = sys.stdout.getvalue()
+@@ -341,7 +341,7 @@
+ env['REQUEST_URI'] = self.url
+ env['PATH_TRANSLATED'] = self.translate_path()
+ env['SCRIPT_NAME'] = self.path
+- env['PATH_INFO'] = urlparse.urlunparse(("","","",self.rest[0],"",""))
++ env['PATH_INFO'] = urllib.parse.urlunparse(("","","",self.rest[0],"",""))
+ env['QUERY_STRING'] = self.rest[1]
+ if not self.host == self.client_address[0]:
+ env['REMOTE_HOST'] = self.host
+@@ -376,12 +376,12 @@
+
+ def mylock(filename):
+ try:
+- fd = posix.open(filename,posix.O_RDWR|posix.O_CREAT,0666)
++ fd = posix.open(filename,posix.O_RDWR|posix.O_CREAT,0o666)
+ except IOError:
+ return -1
+ try:
+ fcntl.flock(fd,fcntl.LOCK_EX|fcntl.LOCK_NB)
+- except IOError,ex:
++ except IOError as ex:
+ if ex.errno != errno.EAGAIN:
+ posix.close(fd)
+ return -1
+@@ -397,38 +397,38 @@
+
+ def wdlock(fname,runmode,timeout):
+ killed = 0
+- for i in xrange(timeout):
++ for i in range(timeout):
+ l = mylock(fname)
+ if l==0:
+ if runmode==2:
+ if killed:
+ return 0
+ else:
+- print "can't find process to terminate"
++ print("can't find process to terminate")
+ return -1
+ if runmode==3:
+- print "mfscgiserv is not running"
++ print("mfscgiserv is not running")
+ return 0
+- print "lockfile created and locked"
++ print("lockfile created and locked")
+ return 1
+ elif l<0:
+- print "lockfile error"
++ print("lockfile error")
+ return -1
+ else:
+ if runmode==3:
+- print "mfscgiserv pid:%u" % l
++ print("mfscgiserv pid:%u" % l)
+ return 0
+ if runmode==1:
+- print "can't start: lockfile is already locked by another process"
++ print("can't start: lockfile is already locked by another process")
+ return -1
+ if killed!=l:
+- print "sending SIGTERM to lock owner (pid:%u)" % l
++ print("sending SIGTERM to lock owner (pid:%u)" % l)
+ posix.kill(l,signal.SIGTERM)
+ killed = l
+ if (i%10)==0 and i>0:
+- print "about %u seconds passed and lock still exists" % i
++ print("about %u seconds passed and lock still exists" % i)
+ time.sleep(1)
+- print "about %u seconds passed and lockfile is still locked - giving up" % timeout
++ print("about %u seconds passed and lockfile is still locked - giving up" % timeout)
+ return -1
+
+ if __name__=="__main__":
+@@ -440,20 +440,20 @@
+ rootpath="@CGI_PATH@"
+ datapath="@DATA_PATH@"
+
+- print
+- print " ######################## ! DEPRECATION WARNING ! #########################"
+- print " # #"
+- print " # mfscgiserv service is deprecated, please use lizardfs-cgiserv instead. #"
+- print " # See manual entry lizardfs-cgiserver(8) for details. #"
+- print " # #"
+- print " ######################## ! DEPRECATION WARNING ! #########################"
+- print
++ print()
++ print(" ######################## ! DEPRECATION WARNING ! #########################")
++ print(" # #")
++ print(" # mfscgiserv service is deprecated, please use lizardfs-cgiserv instead. #")
++ print(" # See manual entry lizardfs-cgiserver(8) for details. #")
++ print(" # #")
++ print(" ######################## ! DEPRECATION WARNING ! #########################")
++ print()
+
+ opts,args = getopt.getopt(sys.argv[1:],"hH:P:R:D:t:fv")
+ for opt,val in opts:
+ if opt=='-h':
+- print "usage: %s [-H bind_host] [-P bind_port] [-R rootpath] [-D datapath] [-t locktimeout] [-f [-v]] [start|stop|restart|test]\n" % sys.argv[0]
+- print "-H bind_host : local address to listen on (default: any)\n-P bind_port : port to listen on (default: 9425)\n-R rootpath : local path to use as HTTP document root (default: @CGI_PATH@)\n-D datapath : local path to store data eg. lockfile (default: @DATA_PATH@)\n-t locktimeout : how long to wait for lockfile (default: 60s)\n-f : run in foreground\n-v : log requests on stderr"
++ print("usage: %s [-H bind_host] [-P bind_port] [-R rootpath] [-D datapath] [-t locktimeout] [-f [-v]] [start|stop|restart|test]\n" % sys.argv[0])
++ print("-H bind_host : local address to listen on (default: any)\n-P bind_port : port to listen on (default: 9425)\n-R rootpath : local path to use as HTTP document root (default: @CGI_PATH@)\n-D datapath : local path to store data eg. lockfile (default: @DATA_PATH@)\n-t locktimeout : how long to wait for lockfile (default: 60s)\n-f : run in foreground\n-v : log requests on stderr")
+ sys.exit(0)
+ elif opt=='-H':
+ host = val
+@@ -493,30 +493,30 @@
+ # daemonize
+ try:
+ pid = os.fork()
+- except OSError, e:
+- raise Exception, "fork error: %s [%d]" % (e.strerror, e.errno)
++ except OSError as e:
++ raise Exception("fork error: %s [%d]" % (e.strerror, e.errno))
+ if pid>0:
+ posix.read(pipefd[0],1)
+ os._exit(0)
+ os.setsid()
+ try:
+ pid = os.fork()
+- except OSError, e:
+- raise Exception, "fork error: %s [%d]" % (e.strerror, e.errno)
++ except OSError as e:
++ raise Exception("fork error: %s [%d]" % (e.strerror, e.errno))
+ posix.write(pipefd[1],'0')
+ if pid>0:
+ os._exit(0)
+
+ if wdlock(lockfname,mode,locktimeout)==1:
+
+- print "starting simple cgi server (host: %s , port: %u , rootpath: %s)" % (host,port,rootpath)
++ print("starting simple cgi server (host: %s , port: %u , rootpath: %s)" % (host,port,rootpath))
+
+ if daemonize:
+ os.close(0)
+ os.close(1)
+ os.close(2)
+ if os.open("/dev/null",os.O_RDWR)!=0:
+- raise Exception, "can't open /dev/null as 0 descriptor"
++ raise Exception("can't open /dev/null as 0 descriptor")
+ os.dup2(0,1)
+ os.dup2(0,2)
+
+@@ -530,9 +530,9 @@
+ # launch the server on the specified port
+ if not daemonize:
+ if host!='any':
+- print "Asynchronous HTTP server running on %s:%s" % (host,port)
++ print("Asynchronous HTTP server running on %s:%s" % (host,port))
+ else:
+- print "Asynchronous HTTP server running on port %s" % port
++ print("Asynchronous HTTP server running on port %s" % port)
+ if not daemonize and verbose:
+ HTTP.logging = True
+ else:
+diff -urb lizardfs-3.12.0/src/cgi/chart.cgi.in lizardfs-3.12.0b/src/cgi/chart.cgi.in
+--- lizardfs-3.12.0/src/cgi/chart.cgi.in 2017-12-20 09:59:37.000000000 +0000
++++ lizardfs-3.12.0b/src/cgi/chart.cgi.in 2019-08-24 16:26:28.862416629 +0100
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python2
++#!/usr/bin/env python3
+
+ import socket
+ import struct
+@@ -12,18 +12,18 @@
+
+ fields = cgi.FieldStorage()
+
+-if fields.has_key("host"):
++if "host" in fields:
+ host = fields.getvalue("host")
+ else:
+ host = ''
+-if fields.has_key("port"):
++if "port" in fields:
+ try:
+ port = int(fields.getvalue("port"))
+ except ValueError:
+ port = 0
+ else:
+ port = 0
+-if fields.has_key("id"):
++if "id" in fields:
+ try:
+ chartid = int(fields.getvalue("id"))
+ except ValueError:
+@@ -36,7 +36,7 @@
+ while totalsent < len(msg):
+ sent = socket.send(msg[totalsent:])
+ if sent == 0:
+- raise RuntimeError, "socket connection broken"
++ raise RuntimeError("socket connection broken")
+ totalsent = totalsent + sent
+
+ def myrecv(socket,leng):
+@@ -44,15 +44,15 @@
+ while len(msg) < leng:
+ chunk = socket.recv(leng-len(msg))
+ if chunk == '':
+- raise RuntimeError, "socket connection broken"
++ raise RuntimeError("socket connection broken")
+ msg = msg + chunk
+ return msg
+
+ if host=='' or port==0 or chartid<0:
+- print "Content-Type: image/gif"
+- print
++ print("Content-Type: image/gif")
++ print()
+ f = open('err.gif')
+- print f.read(),
++ print(f.read(), end=' ')
+ f.close()
+ else:
+ try:
+@@ -66,32 +66,32 @@
+ # data = s.recv(length)
+ # print len(data),length
+ if data[:3]=="GIF":
+- print "Content-Type: image/gif"
+- print
+- print data,
++ print("Content-Type: image/gif")
++ print()
++ print(data, end=' ')
+ elif data[:8]=="\x89PNG\x0d\x0a\x1a\x0a":
+- print "Content-Type: image/png"
+- print
+- print data,
++ print("Content-Type: image/png")
++ print()
++ print(data, end=' ')
+ elif data[:9]=="timestamp":
+- print "Content-Type: text"
+- print
+- print data,
++ print("Content-Type: text")
++ print()
++ print(data, end=' ')
+ else:
+- print "Content-Type: image/gif"
++ print("Content-Type: image/gif")
+ f = open('err.gif')
+- print f.read(),
++ print(f.read(), end=' ')
+ f.close()
+ else:
+- print "Content-Type: image/gif"
+- print
++ print("Content-Type: image/gif")
++ print()
+ f = open('err.gif')
+- print f.read(),
++ print(f.read(), end=' ')
+ f.close()
+ s.close()
+ except Exception:
+- print "Content-Type: image/gif"
+- print
++ print("Content-Type: image/gif")
++ print()
+ f = open('err.gif')
+- print f.read(),
++ print(f.read(), end=' ')
+ f.close()
+Only in lizardfs-3.12.0b/src/cgi: chart.cgi.in.bak
+diff -urb lizardfs-3.12.0/src/cgi/lizardfs-cgiserver.py.in lizardfs-3.12.0b/src/cgi/lizardfs-cgiserver.py.in
+--- lizardfs-3.12.0/src/cgi/lizardfs-cgiserver.py.in 2017-12-20 09:59:37.000000000 +0000
++++ lizardfs-3.12.0b/src/cgi/lizardfs-cgiserver.py.in 2019-08-24 16:25:32.778174579 +0100
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python2
++#!/usr/bin/env python3
+ # vim: noexpandtab shiftwidth=4 softtabstop=4 tabstop=4
+
+ import fcntl
+@@ -13,9 +13,9 @@
+ import traceback
+ import datetime
+ import mimetypes
+-import urlparse
+-import urllib
+-import cStringIO
++import urllib.parse
++import urllib.request, urllib.parse, urllib.error
++import io
+ import socket
+ import select
+ import pwd
+@@ -140,7 +140,7 @@
+ # ============================================================================
+ def loop(server,handler,timeout=30):
+ while True:
+- k = client_handlers.keys()
++ k = list(client_handlers.keys())
+ # w = sockets to which there is something to send
+ # we must test if we can send data
+ w = [ cl for cl in client_handlers if client_handlers[cl].writable ]
+@@ -207,7 +207,7 @@
+ if (self.protocol == "HTTP/1.1" and close_conn.lower() == "keep-alive"):
+ self.close_when_done = False
+ # parse the url
+- scheme,netloc,path,params,query,fragment = urlparse.urlparse(self.url)
++ scheme,netloc,path,params,query,fragment = urllib.parse.urlparse(self.url)
+ self.path,self.rest = path,(params,query,fragment)
+
+ if self.method == 'POST':
+@@ -218,7 +218,7 @@
+ # request is incomplete if not all message body received
+ if len(body)<content_length:
+ return False
+- f_body = cStringIO.StringIO(body)
++ f_body = io.StringIO(body)
+ f_body.seek(0)
+ sys.stdin = f_body # compatibility with CGI
+
+@@ -244,11 +244,11 @@
+ return self.err_resp(403,'Forbidden')
+ else:
+ fstatdata = os.stat(file_name)
+- if (fstatdata.st_mode & 0170000) == 0040000: # directory
++ if (fstatdata.st_mode & 0o170000) == 0o040000: # directory
+ for index in self.index_files:
+ if os.path.exists(file_name+'/'+index) and os.access(file_name+'/'+index,os.R_OK):
+ return self.redirect_resp(index)
+- if (fstatdata.st_mode & 0170000) != 0100000:
++ if (fstatdata.st_mode & 0o170000) != 0o100000:
+ return self.err_resp(403,'Forbidden')
+ ext = os.path.splitext(file_name)[1]
+ c_type = mimetypes.types_map.get(ext,'text/plain')
+@@ -299,15 +299,15 @@
+ self.make_cgi_env()
+ # redirect print statements to a cStringIO
+ save_stdout = sys.stdout
+- output_buffer = cStringIO.StringIO()
++ output_buffer = io.StringIO()
+ sys.stdout = output_buffer
+ # run the script
+ try:
+- execfile(self.file_name, {})
++ exec(compile(open(self.file_name, "rb").read(), self.file_name, 'exec'), {})
+ except SystemExit:
+ pass
+ except:
+- output_buffer = cStringIO.StringIO()
++ output_buffer = io.StringIO()
+ output_buffer.write("Content-type:text/plain\r\n\r\n")
+ traceback.print_exc(file=output_buffer)
+ sys.stdout = save_stdout # restore sys.stdout
+@@ -340,7 +340,7 @@
+ env['REQUEST_URI'] = self.url
+ env['PATH_TRANSLATED'] = self.translate_path()
+ env['SCRIPT_NAME'] = self.path
+- env['PATH_INFO'] = urlparse.urlunparse(("","","",self.rest[0],"",""))
++ env['PATH_INFO'] = urllib.parse.urlunparse(("","","",self.rest[0],"",""))
+ env['QUERY_STRING'] = self.rest[1]
+ if not self.host == self.client_address[0]:
+ env['REMOTE_HOST'] = self.host
+@@ -447,13 +447,13 @@
+ opts,args = getopt.getopt(sys.argv[1:],"vhH:P:R:p:u:")
+ for opt, val in opts:
+ if opt == '-h':
+- print "usage: %s [-H bind_host] [-P bind_port] [-R rootpath] [-v]\n" % sys.argv[0]
+- print "-H bind_host : local address to listen on (default: any)"
+- print "-P bind_port : port to listen on (default: 9425)"
+- print "-R rootpath : local path to use as HTTP document root (default: @CGI_PATH@)"
+- print "-v : log requests on stderr"
+- print "-p : pidfile path, setting it triggers manual daemonization"
+- print "-u : username of server owner, used in manual daemonization"
++ print("usage: %s [-H bind_host] [-P bind_port] [-R rootpath] [-v]\n" % sys.argv[0])
++ print("-H bind_host : local address to listen on (default: any)")
++ print("-P bind_port : port to listen on (default: 9425)")
++ print("-R rootpath : local path to use as HTTP document root (default: @CGI_PATH@)")
++ print("-v : log requests on stderr")
++ print("-p : pidfile path, setting it triggers manual daemonization")
++ print("-u : username of server owner, used in manual daemonization")
+ sys.exit(0)
+ elif opt == '-H':
+ host = val
+@@ -471,9 +471,9 @@
+ # launch the server on the specified port
+ server = Server(host, port)
+ if host != 'any':
+- print "Asynchronous HTTP server running on %s:%s" % (host,port)
++ print("Asynchronous HTTP server running on %s:%s" % (host,port))
+ else:
+- print "Asynchronous HTTP server running on port %s" % port
++ print("Asynchronous HTTP server running on port %s" % port)
+ if verbose:
+ HTTP.logging = True
+ else:
+diff -urb lizardfs-3.12.0/src/cgi/mfs.cgi.in lizardfs-3.12.0b/src/cgi/mfs.cgi.in
+--- lizardfs-3.12.0/src/cgi/mfs.cgi.in 2017-12-20 09:59:37.000000000 +0000
++++ lizardfs-3.12.0b/src/cgi/mfs.cgi.in 2019-08-24 16:25:01.217038306 +0100
+@@ -1,11 +1,11 @@
+-#!/usr/bin/env python2
++#!/usr/bin/env python3
+ # vim: noexpandtab shiftwidth=4 softtabstop=4 tabstop=4
+
+ import socket
+ import struct
+ import time
+ import traceback
+-import urllib
++import urllib.request, urllib.parse, urllib.error
+ import cgi
+ import cgitb
+ import sys
+@@ -57,7 +57,7 @@
+ fields = cgi.FieldStorage()
+
+ try:
+- if fields.has_key("masterhost"):
++ if "masterhost" in fields:
+ masterhost = fields.getvalue("masterhost")
+ else:
+ masterhost = socket.gethostbyname('mfsmaster')
+@@ -68,7 +68,7 @@
+ except Exception:
+ masterport = 9421
+ try:
+- if fields.has_key("mastername"):
++ if "mastername" in fields:
+ mastername = fields.getvalue("mastername")
+ else:
+ mastername = 'LizardFS'
+@@ -122,7 +122,7 @@
+ head = deserialize_dict(buffer, tree[1], tree[2])
+ head_len = 3
+ else:
+- raise RuntimeError, "Unknown tree to deserialize: {0}".format(tree)
++ raise RuntimeError("Unknown tree to deserialize: {0}".format(tree))
+ if (len(tree) > head_len):
+ tail = deserialize(buffer, tree[head_len:], True)
+ return (head,) + tail
+@@ -147,7 +147,7 @@
+ """ Deserialize a std::string and remove it from buffer """
+ length = deserialize_primitive(buffer, "L")
+ if len(buffer) < length or buffer[length - 1] != 0:
+- raise RuntimeError, "malformed message; cannot deserialize"
++ raise RuntimeError("malformed message; cannot deserialize")
+ ret = str(buffer[0:length-1])
+ del buffer[0:length]
+ return ret
+@@ -155,13 +155,13 @@
+ def deserialize_list(buffer, element_tree):
+ """ Deserialize a list of elements and remove it from buffer """
+ length = deserialize_primitive(buffer, "L")
+- return [deserialize(buffer, element_tree) for i in xrange(length)]
++ return [deserialize(buffer, element_tree) for i in range(length)]
+
+ def deserialize_dict(buffer, key_tree, value_tree):
+ """ Deserialize a dict and remove it from buffer """
+ length = deserialize_primitive(buffer, "L")
+ ret = {}
+- for i in xrange(length):
++ for i in range(length):
+ key = deserialize(buffer, key_tree)
+ val = deserialize(buffer, value_tree)
+ ret[key] = val
+@@ -180,14 +180,14 @@
+ def cltoma_list_goals():
+ if masterversion < LIZARDFS_VERSION_WITH_CUSTOM_GOALS:
+ # For old servers just return the default 10 goals
+- return [(i, str(i), str(i) + "*_") for i in xrange(1, 10)]
++ return [(i, str(i), str(i) + "*_") for i in range(1, 10)]
+ else:
+ # For new servers, use LIZ_CLTOMA_LIST_GOALS to fetch the list of goal definitions
+ request = make_liz_message(LIZ_CLTOMA_LIST_GOALS, 0, "\1")
+ response = send_and_receive(masterhost, masterport, request, LIZ_MATOCL_LIST_GOALS, 0)
+ goals = deserialize(response, List(Primitive("H") + 2 * String))
+ if response:
+- raise RuntimeError, "malformed LIZ_MATOCL_LIST_GOALS response (too long by {0} bytes)".format(len(response))
++ raise RuntimeError("malformed LIZ_MATOCL_LIST_GOALS response (too long by {0} bytes)".format(len(response)))
+ return goals
+
+ def cltoma_chunks_health(only_regular):
+@@ -198,7 +198,7 @@
+ safe, endangered, lost = deserialize(response, 3 * Dict(Primitive("B"), Primitive("Q")))
+ raw_replication, raw_deletion = deserialize(response, 2 * Dict(Primitive("B"), Tuple(11 * "Q")))
+ if response:
+- raise RuntimeError, "malformed LIZ_MATOCL_CHUNKS_HEALTH response (too long by {0} bytes)".format(len(response))
++ raise RuntimeError("malformed LIZ_MATOCL_CHUNKS_HEALTH response (too long by {0} bytes)".format(len(response)))
+ availability, replication, deletion = [], [], []
+ for (id, name, _) in goals:
+ availability.append((name, safe.setdefault(id, 0), endangered.setdefault(id, 0), lost.setdefault(id, 0)))
+@@ -236,7 +236,7 @@
+ for (addr, port, v1, v2, v3) in servers:
+ # for shadow masters, addr is int (4 bytes) -- convert it to string.
+ # for the active master we use "masterhost" to connect with it and we don't know the real IP
+- ip = addr_to_host(addr) if isinstance(addr, (int, long)) else "-"
++ ip = addr_to_host(addr) if isinstance(addr, int) else "-"
+ version = "%u.%u.%u" % (v1, v2, v3)
+ if port == 0:
+ # shadow didn't register its port yet
+@@ -267,14 +267,14 @@
+ return str.replace('&','&amp;').replace('<','&lt;').replace('>','&gt;').replace("'",'&apos;').replace('"','&quot;')
+
+ def urlescape(str):
+- return urllib.quote_plus(str)
++ return urllib.parse.quote_plus(str)
+
+ def mysend(socket,msg):
+ totalsent = 0
+ while totalsent < len(msg):
+ sent = socket.send(msg[totalsent:])
+ if sent == 0:
+- raise RuntimeError, "socket connection broken"
++ raise RuntimeError("socket connection broken")
+ totalsent = totalsent + sent
+
+ def myrecv(socket,leng):
+@@ -282,18 +282,18 @@
+ while len(msg) < leng:
+ chunk = socket.recv(leng-len(msg))
+ if chunk == '':
+- raise RuntimeError, "socket connection broken"
++ raise RuntimeError("socket connection broken")
+ msg = msg + chunk
+ return msg
+
+ def addr_to_host(addr):
+ """ Convert IP address ('xxx.xxx.xxx.xxx' or 'hostname' or a 4-byte integer) to string """
+- if isinstance(addr, (int, long)):
++ if isinstance(addr, int):
+ return socket.inet_ntoa(struct.pack(">L", addr))
+ elif isinstance(addr, str):
+ return addr
+ else:
+- raise RuntimeError, "unknown format of server address"
++ raise RuntimeError("unknown format of server address")
+
+
+ def send_and_receive(host, port, request, response_type, response_version = None):
+@@ -305,7 +305,7 @@
+ header = myrecv(s, 8)
+ cmd, length = struct.unpack(">LL", header)
+ if cmd != response_type:
+- raise RuntimeError, "received wrong response (%x instead of %x)" % (cmd, response_type)
++ raise RuntimeError("received wrong response (%x instead of %x)" % (cmd, response_type))
+ data = bytearray(myrecv(s, length))
+ except:
+ s.close()
+@@ -314,7 +314,7 @@
+ if response_version is not None:
+ version = deserialize_primitive(data, "L")
+ if version != response_version:
+- raise RuntimeError, "received wrong response version (%u instead of %u)" % (version, response_version)
++ raise RuntimeError("received wrong response version (%u instead of %u)" % (version, response_version))
+ return data
+
+ def decimal_number(number,sep=' '):
+@@ -382,43 +382,43 @@
+ elif length==68 or length==76:
+ masterversion = struct.unpack(">HBB",data[:4])
+ except Exception:
+- print "Content-Type: text/html; charset=UTF-8"
+- print
+- print """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">"""
+- print """<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">"""
+- print """<head>"""
+- print """<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />"""
+- print """<title>LizardFS Info (%s)</title>""" % (htmlentities(mastername))
+- print """<link href="favicon.ico" rel="icon" type="image/x-icon" />"""
+- print """<link rel="stylesheet" href="mfs.css" type="text/css" />"""
+- print """<script type="text/javascript">changemaster = function() {
++ print("Content-Type: text/html; charset=UTF-8")
++ print()
++ print("""<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">""")
++ print("""<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">""")
++ print("""<head>""")
++ print("""<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />""")
++ print("""<title>LizardFS Info (%s)</title>""" % (htmlentities(mastername)))
++ print("""<link href="favicon.ico" rel="icon" type="image/x-icon" />""")
++ print("""<link rel="stylesheet" href="mfs.css" type="text/css" />""")
++ print("""<script type="text/javascript">changemaster = function() {
+ window.location="mfs.cgi?masterhost=" + document.getElementById("masterhost").value + "&masterport=" + document.getElementById("masterport").value }
+- </script>"""
+- print """</head>"""
+- print """<body>"""
+- print """<h1 align="center">Can't connect to LizardFS master (IP:%s ; PORT:%u)</h1>""" % (htmlentities(masterhost),masterport)
+- print """<h2 align="center">Please enter alternative master address:"""
+- print """<input type="text" id="masterhost" value="mfsmaster" size="32" /><input type="number" id="masterport" size="6" value="9421" />"""
+- print """<input type="button" value="Go" onclick="changemaster()" /></h2>"""
+- print """</body>"""
+- print """</html>"""
++ </script>""")
++ print("""</head>""")
++ print("""<body>""")
++ print("""<h1 align="center">Can't connect to LizardFS master (IP:%s ; PORT:%u)</h1>""" % (htmlentities(masterhost),masterport))
++ print("""<h2 align="center">Please enter alternative master address:""")
++ print("""<input type="text" id="masterhost" value="mfsmaster" size="32" /><input type="number" id="masterport" size="6" value="9421" />""")
++ print("""<input type="button" value="Go" onclick="changemaster()" /></h2>""")
++ print("""</body>""")
++ print("""</html>""")
+ exit()
+
+ if masterversion==(0,0,0):
+- print "Content-Type: text/html; charset=UTF-8"
+- print
+- print """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">"""
+- print """<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">"""
+- print """<head>"""
+- print """<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />"""
+- print """<title>LizardFS Info (%s)</title>""" % (htmlentities(mastername))
+- print """<link href="favicon.ico" rel="icon" type="image/x-icon" />"""
+- print """<link rel="stylesheet" href="mfs.css" type="text/css" />"""
+- print """</head>"""
+- print """<body>"""
+- print """<h1 align="center">Can't detect LizardFS master version</h1>"""
+- print """</body>"""
+- print """</html>"""
++ print("Content-Type: text/html; charset=UTF-8")
++ print()
++ print("""<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">""")
++ print("""<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">""")
++ print("""<head>""")
++ print("""<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />""")
++ print("""<title>LizardFS Info (%s)</title>""" % (htmlentities(mastername)))
++ print("""<link href="favicon.ico" rel="icon" type="image/x-icon" />""")
++ print("""<link rel="stylesheet" href="mfs.css" type="text/css" />""")
++ print("""</head>""")
++ print("""<body>""")
++ print("""<h1 align="center">Can't detect LizardFS master version</h1>""")
++ print("""</body>""")
++ print("""</html>""")
+ exit()
+
+
+@@ -427,7 +427,7 @@
+ for k in fields:
+ if k not in update:
+ c.append("%s=%s" % (k,urlescape(fields.getvalue(k))))
+- for k,v in update.iteritems():
++ for k,v in update.items():
+ if v!="":
+ c.append("%s=%s" % (k,urlescape(v)))
+ return "mfs.cgi?%s" % ("&amp;".join(c))
+@@ -446,13 +446,13 @@
+ return createlink({revname:"1"}) if orderval==columnid and revval==0 else createlink({ordername:str(columnid),revname:"0"})
+
+ # commands
+-if fields.has_key("CSremove"):
++if "CSremove" in fields:
+ cmd_success = 0
+ tracedata = ""
+ try:
+ serverdata = fields.getvalue("CSremove").split(":")
+ if len(serverdata)==2:
+- csip = map(int,serverdata[0].split("."))
++ csip = list(map(int,serverdata[0].split(".")))
+ csport = int(serverdata[1])
+ if len(csip)==4:
+ s = socket.socket()
+@@ -466,45 +466,45 @@
+ tracedata = traceback.format_exc()
+ url = createlink({"CSremove":""})
+ if cmd_success:
+- print "Status: 302 Found"
+- print "Location: %s" % url.replace("&amp;","&")
+- print "Content-Type: text/html; charset=UTF-8"
+- print
+- print """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">"""
+- print """<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">"""
+- print """<head>"""
+- print """<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />"""
+- print """<meta http-equiv="Refresh" content="0; url=%s" />""" % url
+- print """<title>LizardFS Info (%s)</title>""" % (htmlentities(mastername))
+- print """<link href="favicon.ico" rel="icon" type="image/x-icon" />"""
+- print """<link rel="stylesheet" href="mfs.css" type="text/css" />"""
+- print """</head>"""
+- print """<body>"""
+- print """<h1 align="center"><a href="%s">If you see this then it means that redirection didn't work, so click here</a></h1>"""
+- print """</body>"""
+- print """</html>"""
+- else:
+- print "Content-Type: text/html; charset=UTF-8"
+- print
+- print """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">"""
+- print """<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">"""
+- print """<head>"""
+- print """<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />"""
+- print """<meta http-equiv="Refresh" content="5; url=%s" />""" % url
+- print """<title>LizardFS Info (%s)</title>""" % (htmlentities(mastername))
+- print """<link href="favicon.ico" rel="icon" type="image/x-icon" />"""
+- print """<link rel="stylesheet" href="mfs.css" type="text/css" />"""
+- print """</head>"""
+- print """<body>"""
+- print """<h3 align="center">Can't remove server (%s) from list - wait 5 seconds for refresh</h3>""" % fields.getvalue("CSremove")
++ print("Status: 302 Found")
++ print("Location: %s" % url.replace("&amp;","&"))
++ print("Content-Type: text/html; charset=UTF-8")
++ print()
++ print("""<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">""")
++ print("""<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">""")
++ print("""<head>""")
++ print("""<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />""")
++ print("""<meta http-equiv="Refresh" content="0; url=%s" />""" % url)
++ print("""<title>LizardFS Info (%s)</title>""" % (htmlentities(mastername)))
++ print("""<link href="favicon.ico" rel="icon" type="image/x-icon" />""")
++ print("""<link rel="stylesheet" href="mfs.css" type="text/css" />""")
++ print("""</head>""")
++ print("""<body>""")
++ print("""<h1 align="center"><a href="%s">If you see this then it means that redirection didn't work, so click here</a></h1>""")
++ print("""</body>""")
++ print("""</html>""")
++ else:
++ print("Content-Type: text/html; charset=UTF-8")
++ print()
++ print("""<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">""")
++ print("""<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">""")
++ print("""<head>""")
++ print("""<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />""")
++ print("""<meta http-equiv="Refresh" content="5; url=%s" />""" % url)
++ print("""<title>LizardFS Info (%s)</title>""" % (htmlentities(mastername)))
++ print("""<link href="favicon.ico" rel="icon" type="image/x-icon" />""")
++ print("""<link rel="stylesheet" href="mfs.css" type="text/css" />""")
++ print("""</head>""")
++ print("""<body>""")
++ print("""<h3 align="center">Can't remove server (%s) from list - wait 5 seconds for refresh</h3>""" % fields.getvalue("CSremove"))
+ if tracedata:
+- print """<hr />"""
+- print """<pre>%s</pre>""" % tracedata
+- print """</body>"""
+- print """</html>"""
++ print("""<hr />""")
++ print("""<pre>%s</pre>""" % tracedata)
++ print("""</body>""")
++ print("""</html>""")
+ exit()
+
+-if fields.has_key("sections"):
++if "sections" in fields:
+ sectionstr = fields.getvalue("sections")
+ sectionset = set(sectionstr.split("|"))
+ else:
+@@ -550,53 +550,53 @@
+ sectionorder=["IN","CH","CS","HD","EX","MS","MO","MC","CC","HELP"];
+
+
+-print "Content-Type: text/html; charset=UTF-8"
+-print
++print("Content-Type: text/html; charset=UTF-8")
++print()
+ # print """<!-- Put IE into quirks mode -->
+-print """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">"""
+-print """<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">"""
+-print """<head>"""
+-print """<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />"""
+-print """<title>LizardFS Info (%s)</title>""" % (htmlentities(mastername))
+-print """<link href="favicon.ico" rel="icon" type="image/x-icon" />"""
+-print """<link rel="stylesheet" href="mfs.css" type="text/css" />"""
+-print """</head>"""
+-print """<body>"""
++print("""<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">""")
++print("""<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">""")
++print("""<head>""")
++print("""<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />""")
++print("""<title>LizardFS Info (%s)</title>""" % (htmlentities(mastername)))
++print("""<link href="favicon.ico" rel="icon" type="image/x-icon" />""")
++print("""<link rel="stylesheet" href="mfs.css" type="text/css" />""")
++print("""</head>""")
++print("""<body>""")
+
+ #MENUBAR
+-print """<div id="header">"""
+-print """<table class="HDR" cellpadding="0" cellspacing="0" border="0" summary="Page header">"""
+-print """<tr>"""
+-print """<td class="LOGO"><a href="http://www.lizardfs.org"><img src="logomini.png" alt="logo" style="border:0;width:123px;height:47px" /></a></td>"""
+-print """<td class="MENU"><table class="MENU" cellspacing="0" summary="Header menu">"""
+-print """<tr>"""
++print("""<div id="header">""")
++print("""<table class="HDR" cellpadding="0" cellspacing="0" border="0" summary="Page header">""")
++print("""<tr>""")
++print("""<td class="LOGO"><a href="http://www.lizardfs.org"><img src="logomini.png" alt="logo" style="border:0;width:123px;height:47px" /></a></td>""")
++print("""<td class="MENU"><table class="MENU" cellspacing="0" summary="Header menu">""")
++print("""<tr>""")
+ last="U"
+ for k in sectionorder:
+ if k==sectionorder[-1]:
+ last = "L%s" % last
+ if k in sectionset:
+ if len(sectionset)<=1:
+- print """<td class="%sS">%s &#8722;</td>""" % (last,sectiondef[k])
++ print("""<td class="%sS">%s &#8722;</td>""" % (last,sectiondef[k]))
+ else:
+- print """<td class="%sS"><a href="%s">%s</a> <a href="%s">&#8722;</a></td>""" % (last,createlink({"sections":k}),sectiondef[k],createlink({"sections":"|".join(sectionset-set([k]))}))
++ print("""<td class="%sS"><a href="%s">%s</a> <a href="%s">&#8722;</a></td>""" % (last,createlink({"sections":k}),sectiondef[k],createlink({"sections":"|".join(sectionset-set([k]))})))
+ last="S"
+ else:
+- print """<td class="%sU"><a href="%s">%s</a> <a href="%s">+</a></td>""" % (last,createlink({"sections":k}),sectiondef[k],createlink({"sections":"|".join(sectionset|set([k]))}))
++ print("""<td class="%sU"><a href="%s">%s</a> <a href="%s">+</a></td>""" % (last,createlink({"sections":k}),sectiondef[k],createlink({"sections":"|".join(sectionset|set([k]))})))
+ last="U"
+-print """</tr>"""
+-print """</table></td>"""
+-print """<td class="FILLER" style="white-space:nowrap;">"""
+-print """</td>"""
+-print """</tr>"""
+-print """</table>"""
+-print """</div>"""
++print("""</tr>""")
++print("""</table></td>""")
++print("""<td class="FILLER" style="white-space:nowrap;">""")
++print("""</td>""")
++print("""</tr>""")
++print("""</table>""")
++print("""</div>""")
+
+ #print """<div id="footer">
+ #Moose File System by Jakub Kruszona-Zawadzki
+ #</div>
+ #"""
+
+-print """<div id="container">"""
++print("""<div id="container">""")
+
+ if "IN" in sectionset:
+ try:
+@@ -752,15 +752,15 @@
+ out.append(""" <tr><td align="left">unrecognized answer from LizardFS master</td></tr>""")
+ out.append("""</table>""")
+ s.close()
+- print "\n".join(out)
++ print("\n".join(out))
+ except Exception:
+- print """<table class="FR" cellspacing="0" summary="Exception">"""
+- print """<tr><td align="left"><pre>"""
++ print("""<table class="FR" cellspacing="0" summary="Exception">""")
++ print("""<tr><td align="left"><pre>""")
+ traceback.print_exc(file=sys.stdout)
+- print """</pre></td></tr>"""
+- print """</table>"""
++ print("""</pre></td></tr>""")
++ print("""</table>""")
+
+- print """<br/>"""
++ print("""<br/>""")
+
+ if masterversion>=(1,5,13):
+ try:
+@@ -775,7 +775,7 @@
+ cmd,length = struct.unpack(">LL",header)
+ if cmd==MATOCL_CHUNKS_MATRIX and length==484:
+ matrix = []
+- for i in xrange(11):
++ for i in range(11):
+ data = myrecv(s,44)
+ matrix.append(list(struct.unpack(">LLLLLLLLLLL",data)))
+ out.append("""<table class="FR" cellspacing="0" summary="Chunks state matrix">""")
+@@ -803,13 +803,13 @@
+ out.append(""" </tr>""")
+ classsum = 7*[0]
+ sumlist = 11*[0]
+- for neededCopies in xrange(11):
++ for neededCopies in range(11):
+ out.append(""" <tr>""")
+ if neededCopies==10:
+ out.append(""" <td align="center">10+</td>""")
+ else:
+ out.append(""" <td align="center">%u</td>""" % neededCopies)
+- for vc in xrange(11):
++ for vc in range(11):
+ if neededCopies==0:
+ if vc==0:
+ cl = "DELETEREADY"
+@@ -847,22 +847,22 @@
+ sumlist = [ a + b for (a,b) in zip(sumlist,matrix[neededCopies])]
+ out.append(""" <tr>""")
+ out.append(""" <td align="center">all 1+</td>""")
+- for vc in xrange(11):
++ for vc in range(11):
+ out.append(""" <td align="right">%u</td>""" % sumlist[vc])
+ out.append(""" <td align="right">%u</td>""" % sum(sumlist))
+ out.append(""" </tr>""")
+ out.append(""" <tr><td colspan="13">""" + " / ".join(["""<span class="%sBOX"><!-- --></span>&nbsp;-&nbsp;%s (<span class="%s">%u</span>)""" % (cl,desc,cl,classsum[clidx]) for clidx,cl,desc in [(0,"MISSING","missing"),(1,"ENDANGERED","endangered"),(2,"UNDERGOAL","undergoal"),(3,"NORMAL","stable"),(4,"OVERGOAL","overgoal"),(5,"DELETEPENDING","pending&nbsp;deletion"),(6,"DELETEREADY","ready&nbsp;to&nbsp;be&nbsp;removed")]]) + """</td></tr>""")
+ out.append("""</table>""")
+ s.close()
+- print "\n".join(out)
++ print("\n".join(out))
+ except Exception:
+- print """<table class="FR" cellspacing="0" summary="Exception">"""
+- print """<tr><td align="left"><pre>"""
++ print("""<table class="FR" cellspacing="0" summary="Exception">""")
++ print("""<tr><td align="left"><pre>""")
+ traceback.print_exc(file=sys.stdout)
+- print """</pre></td></tr>"""
+- print """</table>"""
++ print("""</pre></td></tr>""")
++ print("""</table>""")
+
+- print """<br/>"""
++ print("""<br/>""")
+
+ try:
+ out = []
+@@ -908,15 +908,15 @@
+ out.append(""" </tr>""")
+ out.append("""</table>""")
+ s.close()
+- print "\n".join(out)
++ print("\n".join(out))
+ except Exception:
+- print """<table class="FR" cellspacing="0" summary="Exception">"""
+- print """<tr><td align="left"><pre>"""
++ print("""<table class="FR" cellspacing="0" summary="Exception">""")
++ print("""<tr><td align="left"><pre>""")
+ traceback.print_exc(file=sys.stdout)
+- print """</pre></td></tr>"""
+- print """</table>"""
++ print("""</pre></td></tr>""")
++ print("""</table>""")
+
+- print """<br/>"""
++ print("""<br/>""")
+
+ try:
+ out = []
+@@ -957,7 +957,7 @@
+ else:
+ out.append(""" <tr><th colspan="8">Important messages:</th></tr>""")
+ out.append(""" <tr>""")
+- out.append(""" <td colspan="8" align="left"><small><pre>%s</pre></small></td>""" % (urllib.unquote(data[36:]).replace("&","&amp;").replace(">","&gt;").replace("<","&lt;")))
++ out.append(""" <td colspan="8" align="left"><small><pre>%s</pre></small></td>""" % (urllib.parse.unquote(data[36:]).replace("&","&amp;").replace(">","&gt;").replace("<","&lt;")))
+ out.append(""" </tr>""")
+ else:
+ out.append(""" <tr>""")
+@@ -965,15 +965,15 @@
+ out.append(""" </tr>""")
+ out.append("""</table>""")
+ s.close()
+- print "\n".join(out)
++ print("\n".join(out))
+ except Exception:
+- print """<table class="FR" cellspacing="0" summary="Exception">"""
+- print """<tr><td align="left"><pre>"""
++ print("""<table class="FR" cellspacing="0" summary="Exception">""")
++ print("""<tr><td align="left"><pre>""")
+ traceback.print_exc(file=sys.stdout)
+- print """</pre></td></tr>"""
+- print """</table>"""
++ print("""</pre></td></tr>""")
++ print("""</table>""")
+
+- print """<br/>"""
++ print("""<br/>""")
+
+ if "CH" in sectionset:
+ try:
+@@ -998,7 +998,7 @@
+ out.append(make_table_row('<th class="PERC20">', '</th>', headers))
+ sums = 3 * [0]
+ i = 0
+- for goal, safe, endangered, lost in filter(lambda row: sum(row[1:]) > 0, availability):
++ for goal, safe, endangered, lost in [row for row in availability if sum(row[1:]) > 0]:
+ out.append(""" <tr class="%s">""" % ("C1" if i % 2 == 0 else "C2"))
+ i += 1
+ out.append((""" <th class="LEFT">%s</th>""" + 4 * """<td>%s</td>""") %
+@@ -1009,7 +1009,7 @@
+ make_cell(lost, "MISSING"))
+ )
+ out.append(""" </tr>""")
+- sums = map(sum, zip(sums, [safe, endangered, lost])) # add row to the summary
++ sums = list(map(sum, list(zip(sums, [safe, endangered, lost])))) # add row to the summary
+ # Add summary and end the table
+ out.append(""" <tr>""")
+ out.append((""" <th>all</th>""" + 4 * """<th>%s</th>""") %
+@@ -1029,14 +1029,14 @@
+ )
+ i = 0
+ sums = 11 * [0]
+- for row in filter(lambda row: sum(row[1:]) > 0, table):
++ for row in [row for row in table if sum(row[1:]) > 0]:
+ out.append(""" <tr class="%s">""" % ("C1" if i % 2 == 0 else "C2"))
+ i += 1
+ out.append((""" <th class="LEFT">%s</th>""" + 11 * """<td>%s</td>""") %
+ ((row[0], make_cell(row[1], "NORMAL")) + tuple(map(make_cell, row[2:])))
+ )
+ out.append(""" </tr>""")
+- sums = map(sum, zip(sums, row[1:])) # add row to the summary
++ sums = list(map(sum, list(zip(sums, row[1:])))) # add row to the summary
+ # Add summary and end the table
+ out.append(""" <tr>""")
+ out.append((""" <th>all</th>""" + 11 * """<th>%s</th>""") % tuple(map(make_cell, sums)))
+@@ -1047,14 +1047,14 @@
+ add_repl_del_state(out, "replicat", replication)
+ out.append("""<br/>""")
+ add_repl_del_state(out, "delet", deletion)
+- print "\n".join(out)
++ print("\n".join(out))
+ except Exception:
+- print """<table class="FR" cellspacing="0" summary="Exception">"""
+- print """<tr><td align="left"><pre>"""
++ print("""<table class="FR" cellspacing="0" summary="Exception">""")
++ print("""<tr><td align="left"><pre>""")
+ traceback.print_exc(file=sys.stdout)
+- print """</pre></td></tr>"""
+- print """</table>"""
+- print """<br/>"""
++ print("""</pre></td></tr>""")
++ print("""</table>""")
++ print("""<br/>""")
+
+ if "CS" in sectionset:
+ if masterversion >= LIZARDFS_VERSION_WITH_LIST_OF_SHADOWS:
+@@ -1091,14 +1091,14 @@
+ out.append(make_table_row('<td>', '</td>', (i,) + row))
+ i += 1
+ out.append("""</table>""")
+- print "\n".join(out)
++ print("\n".join(out))
+ except Exception:
+- print """<table class="FR" cellspacing="0" summary="Exception">"""
+- print """<tr><td align="left"><pre>"""
++ print("""<table class="FR" cellspacing="0" summary="Exception">""")
++ print("""<tr><td align="left"><pre>""")
+ traceback.print_exc(file=sys.stdout)
+- print """</pre></td></tr>"""
+- print """</table>"""
+- print """<br/>"""
++ print("""</pre></td></tr>""")
++ print("""</table>""")
++ print("""<br/>""")
+
+ out = []
+
+@@ -1157,7 +1157,7 @@
+ else:
+ vector_size = length / 54
+ pos = 0
+- for i in xrange(vector_size):
++ for i in range(vector_size):
+ if cmd==LIZ_MATOCL_CSERV_LIST:
+ disconnected,v1,v2,v3,ip1,ip2,ip3,ip4,port,used,total,chunks,tdused,tdtotal,tdchunks,errcnt,label_length = struct.unpack(">BBBBBBBBHQQLQQLLL",data[pos:pos + 58])
+ label = data[pos+58:pos+58+label_length-1]
+@@ -1233,15 +1233,15 @@
+
+ out.append("""</table>""")
+ s.close()
+- print "\n".join(out)
++ print("\n".join(out))
+ except Exception:
+- print """<table class="FR" cellspacing="0" summary="Exception">"""
+- print """<tr><td align="left"><pre>"""
++ print("""<table class="FR" cellspacing="0" summary="Exception">""")
++ print("""<tr><td align="left"><pre>""")
+ traceback.print_exc(file=sys.stdout)
+- print """</pre></td></tr>"""
+- print """</table>"""
++ print("""</pre></td></tr>""")
++ print("""</table>""")
+
+- print """<br/>"""
++ print("""<br/>""")
+
+ if masterversion>=(1,6,5):
+ out = []
+@@ -1274,7 +1274,7 @@
+ data = myrecv(s,length)
+ n = length/8
+ servers = []
+- for i in xrange(n):
++ for i in range(n):
+ d = data[i*8:(i+1)*8]
+ v1,v2,v3,ip1,ip2,ip3,ip4 = struct.unpack(">HBBBBBB",d)
+ strip = "%u.%u.%u.%u" % (ip1,ip2,ip3,ip4)
+@@ -1300,15 +1300,15 @@
+ i+=1
+ out.append("""</table>""")
+ s.close()
+- print "\n".join(out)
++ print("\n".join(out))
+ except Exception:
+- print """<table class="FR" cellspacing="0" summary="Exception">"""
+- print """<tr><td align="left"><pre>"""
++ print("""<table class="FR" cellspacing="0" summary="Exception">""")
++ print("""<tr><td align="left"><pre>""")
+ traceback.print_exc(file=sys.stdout)
+- print """</pre></td></tr>"""
+- print """</table>"""
++ print("""</pre></td></tr>""")
++ print("""</table>""")
+
+- print """<br/>"""
++ print("""<br/>""")
+
+ if "HD" in sectionset:
+ out = []
+@@ -1346,7 +1346,7 @@
+ data = myrecv(s,length)
+ n = length/54
+ servers = []
+- for i in xrange(n):
++ for i in range(n):
+ d = data[i*54:(i+1)*54]
+ disconnected,v1,v2,v3,ip1,ip2,ip3,ip4,port,used,total,chunks,tdused,tdtotal,tdchunks,errcnt = struct.unpack(">BBBBBBBBHQQLQQLL",d)
+ if disconnected==0:
+@@ -1355,7 +1355,7 @@
+ data = myrecv(s,length)
+ n = length/50
+ servers = []
+- for i in xrange(n):
++ for i in range(n):
+ d = data[i*50:(i+1)*50]
+ ip1,ip2,ip3,ip4,port,used,total,chunks,tdused,tdtotal,tdchunks,errcnt = struct.unpack(">BBBBHQQLQQLL",d)
+ hostlist.append((1,5,0,ip1,ip2,ip3,ip4,port))
+@@ -1602,15 +1602,15 @@
+ i+=1
+ out.append("""</table>""")
+
+- print "\n".join(out)
++ print("\n".join(out))
+ except Exception:
+- print """<table class="FR" cellspacing="0" summary="Exception">"""
+- print """<tr><td align="left"><pre>"""
++ print("""<table class="FR" cellspacing="0" summary="Exception">""")
++ print("""<tr><td align="left"><pre>""")
+ traceback.print_exc(file=sys.stdout)
+- print """</pre></td></tr>"""
+- print """</table>"""
++ print("""</pre></td></tr>""")
++ print("""</table>""")
+
+- print """<br/>"""
++ print("""<br/>""")
+
+ if "EX" in sectionset:
+ out = []
+@@ -1816,11 +1816,11 @@
+ out.append("""</table>""")
+ out.append("""<br/>""")
+ except Exception:
+- print """<table class="FR" cellspacing="0" summary="Exception">"""
+- print """<tr><td align="left"><pre>"""
++ print("""<table class="FR" cellspacing="0" summary="Exception">""")
++ print("""<tr><td align="left"><pre>""")
+ traceback.print_exc(file=sys.stdout)
+- print """</pre></td></tr>"""
+- print """</table>"""
++ print("""</pre></td></tr>""")
++ print("""</table>""")
+
+ try:
+ goals = cltoma_list_goals()
+@@ -1839,15 +1839,15 @@
+ definition = re.sub(r'([0-9]+)\*([A-Za-z0-9_]+)(,?)', r'\1 &times; <b>\2</b>\3 ', definition)
+ out.append(""" <tr class="C%u"><td>%s</td><td class="LEFT">%s</td><td class="LEFT">%s</td>""" % (row_class, id, name, definition))
+ out.append("""</table>""")
+- print "\n".join(out)
++ print("\n".join(out))
+ except Exception:
+- print """<table class="FR" cellspacing="0" summary="Exception">"""
+- print """<tr><td align="left"><pre>"""
++ print("""<table class="FR" cellspacing="0" summary="Exception">""")
++ print("""<tr><td align="left"><pre>""")
+ traceback.print_exc(file=sys.stdout)
+- print """</pre></td></tr>"""
+- print """</table>"""
++ print("""</pre></td></tr>""")
++ print("""</table>""")
+
+- print """<br/>"""
++ print("""<br/>""")
+
+ if "ML" in sectionset:
+ out = []
+@@ -1899,7 +1899,7 @@
+ data = myrecv(s,length)
+ n = length/136
+ servers = []
+- for i in xrange(n):
++ for i in range(n):
+ d = data[i*136:(i+1)*136]
+ addrdata = d[0:8]
+ stats_c = []
+@@ -1915,7 +1915,7 @@
+ ver = "unknown"
+ else:
+ ver = "%d.%d.%d" % (v1,v2,v3)
+- for i in xrange(16):
++ for i in range(16):
+ stats_c.append(struct.unpack(">L",d[i*4+8:i*4+12]))
+ stats_l.append(struct.unpack(">L",d[i*4+72:i*4+76]))
+ try:
+@@ -1943,25 +1943,25 @@
+ out.append(""" <td align="left" rowspan="2">%s</td>""" % host)
+ out.append(""" <td align="center" rowspan="2">%s</td>""" % ipnum)
+ out.append(""" <td align="center" rowspan="2">%s</td>""" % ver)
+- for st in xrange(16):
++ for st in range(16):
+ out.append(""" <td align="right">%u</td>""" % (stats_c[st]))
+ out.append(""" </tr>""")
+ out.append(""" <tr class="C%u">""" % (((i-1)%2)*2+2))
+- for st in xrange(16):
++ for st in range(16):
+ out.append(""" <td align="right">%u</td>""" % (stats_l[st]))
+ out.append(""" </tr>""")
+ i+=1
+ out.append("""</table>""")
+ s.close()
+- print "\n".join(out)
++ print("\n".join(out))
+ except Exception:
+- print """<table class="FR" cellspacing="0" summary="Exception">"""
+- print """<tr><td align="left"><pre>"""
++ print("""<table class="FR" cellspacing="0" summary="Exception">""")
++ print("""<tr><td align="left"><pre>""")
+ traceback.print_exc(file=sys.stdout)
+- print """</pre></td></tr>"""
+- print """</table>"""
++ print("""</pre></td></tr>""")
++ print("""</table>""")
+
+- print """<br/>"""
++ print("""<br/>""")
+
+ if "MS" in sectionset:
+ out = []
+@@ -2199,15 +2199,15 @@
+ i+=1
+ out.append("""</table>""")
+ s.close()
+- print "\n".join(out)
++ print("\n".join(out))
+ except Exception:
+- print """<table class="FR" cellspacing="0" summary="Exception">"""
+- print """<tr><td align="left"><pre>"""
++ print("""<table class="FR" cellspacing="0" summary="Exception">""")
++ print("""<tr><td align="left"><pre>""")
+ traceback.print_exc(file=sys.stdout)
+- print """</pre></td></tr>"""
+- print """</table>"""
++ print("""</pre></td></tr>""")
++ print("""</table>""")
+
+- print """<br/>"""
++ print("""<br/>""")
+
+ if "MO" in sectionset:
+ out = []
+@@ -2322,27 +2322,27 @@
+ out.append(""" <td align="left" rowspan="2">%s</td>""" % host)
+ out.append(""" <td align="center" rowspan="2">%s</td>""" % ipnum)
+ out.append(""" <td align="left" rowspan="2">%s</td>""" % info)
+- for st in xrange(16):
++ for st in range(16):
+ out.append(""" <td align="right">%u</td>""" % (stats_c[st]))
+ out.append(""" <td align="right">%u</td>""" % (sum(stats_c)))
+ out.append(""" </tr>""")
+ out.append(""" <tr class="C%u">""" % (((i-1)%2)*2+2))
+- for st in xrange(16):
++ for st in range(16):
+ out.append(""" <td align="right">%u</td>""" % (stats_l[st]))
+ out.append(""" <td align="right">%u</td>""" % (sum(stats_l)))
+ out.append(""" </tr>""")
+ i+=1
+ out.append("""</table>""")
+ s.close()
+- print "\n".join(out)
++ print("\n".join(out))
+ except Exception:
+- print """<table class="FR" cellspacing="0" summary="Exception">"""
+- print """<tr><td align="left"><pre>"""
++ print("""<table class="FR" cellspacing="0" summary="Exception">""")
++ print("""<tr><td align="left"><pre>""")
+ traceback.print_exc(file=sys.stdout)
+- print """</pre></td></tr>"""
+- print """</table>"""
++ print("""</pre></td></tr>""")
++ print("""</table>""")
+
+- print """<br/>"""
++ print("""<br/>""")
+
+ if "MC" in sectionset:
+ out = []
+@@ -2471,7 +2471,7 @@
+ out.append(""" </tr>""")
+ out.append("""</table>""")
+ out.append("""<table class="FR" cellspacing="0" summary="Master charts view">""")
+- for i in xrange(2):
++ for i in range(2):
+ out.append(""" <tr>""")
+ out.append(""" <td align="center" colspan="4">""")
+ out.append(""" <div id="ma_desc%u">%s</div>""" % (i,charts[0][2]))
+@@ -2489,21 +2489,21 @@
+ out.append(""" </td>""")
+ out.append(""" </tr>""")
+ out.append("""</table>""")
+- print "\n".join(out)
++ print("\n".join(out))
+ except Exception:
+- print """<table class="FR" cellspacing="0" summary="Exception">"""
+- print """<tr><td align="left"><pre>"""
++ print("""<table class="FR" cellspacing="0" summary="Exception">""")
++ print("""<tr><td align="left"><pre>""")
+ traceback.print_exc(file=sys.stdout)
+- print """</pre></td></tr>"""
+- print """</table>"""
++ print("""</pre></td></tr>""")
++ print("""</table>""")
+
+- print """<br/>"""
++ print("""<br/>""")
+
+ if "CC" in sectionset:
+ out = []
+
+ try:
+- if fields.has_key("CCdata"):
++ if "CCdata" in fields:
+ CCdata = fields.getvalue("CCdata")
+ else:
+ CCdata = ""
+@@ -2521,7 +2521,7 @@
+ if cmd==MATOCL_CSERV_LIST and (length%54)==0:
+ data = myrecv(s,length)
+ n = length/54
+- for i in xrange(n):
++ for i in range(n):
+ d = data[i*54:(i+1)*54]
+ disconnected,v1,v2,v3,ip1,ip2,ip3,ip4,port,used,total,chunks,tdused,tdtotal,tdchunks,errcnt = struct.unpack(">BBBBBBBBHQQLQQLL",d)
+ if disconnected==0:
+@@ -2529,7 +2529,7 @@
+ elif cmd==MATOCL_CSERV_LIST and (length%50)==0:
+ data = myrecv(s,length)
+ n = length/50
+- for i in xrange(n):
++ for i in range(n):
+ d = data[i*50:(i+1)*50]
+ ip1,ip2,ip3,ip4,port,used,total,chunks,tdused,tdtotal,tdchunks,errcnt = struct.unpack(">BBBBHQQLQQLL",d)
+ hostlist.append((ip1,ip2,ip3,ip4,port))
+@@ -2685,7 +2685,7 @@
+ out.append(""" </tr>""")
+ out.append("""</table>""")
+ out.append("""<table class="FR" cellspacing="0" summary="Server charts view">""")
+- for i in xrange(2):
++ for i in range(2):
+ out.append(""" <tr>""")
+ out.append(""" <td align="center" colspan="4">""")
+ out.append(""" <div id="cs_desc%u">%s</div>""" % (i,charts[0][2]))
+@@ -2755,30 +2755,30 @@
+ out.append(""" </td>""")
+ out.append(""" </tr>""")
+ out.append("""</table>""")
+- print "\n".join(out)
++ print("\n".join(out))
+ except Exception:
+- print """<table class="FR" cellspacing="0" summary="Exception">"""
+- print """<tr><td align="left"><pre>"""
++ print("""<table class="FR" cellspacing="0" summary="Exception">""")
++ print("""<tr><td align="left"><pre>""")
+ traceback.print_exc(file=sys.stdout)
+- print """</pre></td></tr>"""
+- print """</table>"""
++ print("""</pre></td></tr>""")
++ print("""</table>""")
+
+- print """<br/>"""
++ print("""<br/>""")
+
+ def print_file(name):
+ f=open(name)
+ for line in f:
+- print line
++ print(line)
+
+ if "HELP" in sectionset:
+ # FIXME(kulek@lizardfs.org) - it should be in separate file help.html however we are waiting for CMAKE to make it happen.
+ #print_file("@CGI_PATH@/help.html")
+- print """please contact with help@lizardfs.com"""
+- print """<br/>"""
++ print("""please contact with help@lizardfs.com""")
++ print("""<br/>""")
+
+
+
+-print """</div> <!-- end of container -->"""
++print("""</div> <!-- end of container -->""")
+
+-print """</body>"""
+-print """</html>"""
++print("""</body>""")
++print("""</html>""")