Blob Blame History Raw
diff -u a/src/python/daemonize.py b/src/python/new/daemonize.py
--- a/src/python/daemonize.py	2017-10-17 23:11:48.000000000 +0200
+++ b/src/python/new/daemonize.py	2018-06-25 21:06:09.000000000 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
 
 # Authors:  Jiri Jaburek  <jjaburek@redhat.com>
 #
@@ -18,6 +18,7 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
+from __future__ import print_function
 import os, sys
 
 from pwd import getpwnam
@@ -96,8 +97,8 @@
                 # with original stderr (in case of errors), but with new uid/gid
                 if ioredir:
                     os.open(ioredir[0], os.O_RDWR)
-                    os.open(ioredir[1], os.O_RDWR | os.O_CREAT | os.O_TRUNC, 0666)
-                    os.open(ioredir[2], os.O_RDWR | os.O_CREAT | os.O_TRUNC, 0666)
+                    os.open(ioredir[1], os.O_RDWR | os.O_CREAT | os.O_TRUNC, 0o666)
+                    os.open(ioredir[2], os.O_RDWR | os.O_CREAT | os.O_TRUNC, 0o666)
 
                 os.umask(0)
 
@@ -116,7 +117,7 @@
 
 # argument parsing
 def error(msg):
-    print >> sys.stderr, "error: " + str(msg)
+    print("error: " + str(msg), file=sys.stderr)
     sys.exit(1)
 
 parser = OptionParser(usage='%prog [options] COMMAND')
diff -u a/src/python/journal-compare.py b/src/python/new/journal-compare.py
--- a/src/python/journal-compare.py	2018-06-25 21:01:54.490910141 +0200
+++ b/src/python/new/journal-compare.py	2018-06-25 21:06:13.000000000 +0200
@@ -1,6 +1,6 @@
-#!/usr/bin/python2
+#!/usr/bin/python3
 
-# Copyright (c) 2006 Red Hat, Inc. All rights reserved. This copyrighted material 
+# Copyright (c) 2006 Red Hat, Inc. All rights reserved. This copyrighted material
 # is made available to anyone wishing to use, modify, copy, or
 # redistribute it subject to the terms and conditions of the GNU General
 # Public License v.2.
@@ -15,6 +15,7 @@
 #
 # Author: Petr Muller <pmuller@redhat.com>
 
+from __future__ import print_function
 import xml.dom.minidom
 import sys
 
@@ -125,9 +126,9 @@
 		self.results = {}
 
 	def addTestResult(self, name, result):
-		if not self.results.has_key(name):
-			self.results[name] = Test(name)
-		self.results[name].addResult(result)
+                if name not in self.results:
+                        self.results[name] = Test(name)
+                self.results[name].addResult(result)
 
 	def compare(self, other):
 		result_list = []
@@ -135,7 +136,7 @@
 			try:
 				result_list.append(self.results[key].compare(other.results[key]))
 			except KeyError:
-				print "[WARN] Could not find corresponding test for: %s" % key
+				print("[WARN] Could not find corresponding test for: %s" % key)
 		return result_list
 
 try:
@@ -161,7 +162,7 @@
 	new_type, new_name = new_phases[i].getAttribute("type"), new_phases[i].getAttribute("name")
 
 	if old_type == new_type and old_name == new_name:
-		print "Types match, so we are comparing phase %s of type %s" % (old_type, new_type)
+		print( "Types match, so we are comparing phase %s of type %s" % (old_type, new_type))
 		old_tests = TestSet()
 		new_tests = TestSet()
 		old_metrics = {}
@@ -179,20 +180,20 @@
 				tolerance = float(metric.getAttribute("tolerance"))
 				metrics[key] = Metric(key, value, metric.getAttribute("type"), tolerance)
 
-		print "==== Actual compare ===="
-		print " * Metrics * "
+		print("==== Actual compare ====")
+		print(" * Metrics * ")
 		metric_results = []
 		for key in old_metrics.keys():
 			metric_results.append(old_metrics[key].compare(new_metrics[key]))
 		for metric in metric_results:
 			for message in metric.messages:
-				print "[%s] %s (%s)" % (metric.result, metric.name, message)
-		print " * Tests * "
+				print("[%s] %s (%s)" % (metric.result, metric.name, message))
+		print(" * Tests * ")
 		test_results = old_tests.compare(new_tests)
 		for test in test_results:
-			print "[%s] %s" % (test.result, test.name)
+			print("[%s] %s" % (test.result, test.name))
 			for message in test.messages:
-				print "\t - %s" % message
+				print("\t - %s" % message)
 
 	else:
-		print "We are not doing any compare, types dont match"
+		print("We are not doing any compare, types dont match")
diff -u a/src/python/journalling.py b/src/python/new/journalling.py
--- a/src/python/journalling.py	2018-06-25 21:01:54.490910141 +0200
+++ b/src/python/new/journalling.py	2018-06-25 21:06:19.000000000 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/python2
+#!/usr/bin/python3
 
 # Authors:  Jakub Heger        <jheger@redhat.com>
 #           Dalibor Pospisil   <dapospis@redhat.com>
@@ -20,16 +20,17 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
+# TODO fix xml pretty print
+
 
-import sys
 import os
-import time
 import re
-from optparse import OptionParser
-from lxml import etree
+import sys
+import six
+import time
 import base64
-
-# TODO fix xml pretty print
+from lxml import etree
+from optparse import OptionParser
 
 
 xmlForbidden = [0, 1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 14, 15, 16, 17, 18, 19, 20,
@@ -51,18 +52,19 @@
         return self.items[-1]
 
 
+# Saves the XML journal to a file.
 def saveJournal(journal, journal_path):
     try:
         output = open(journal_path, 'wb')
         output.write(etree.tostring(journal, xml_declaration=True, encoding='utf-8', pretty_print=True))
         output.close()
         return 0
-    except IOError, e:
+    except IOError as e:
         sys.stderr.write('Failed to save journal to %s: %s' % (journal_path, str(e)))
         return 1
 
 
-# Adds attributes starttime and endtime to a element
+# Adds attributes starttime and endtime to a element.
 def addStartEndTime(element, starttime, endtime):
     element.set("starttime", starttime)
     element.set("endtime", endtime)
@@ -72,7 +74,7 @@
     return 0
 
 
-# Find first and last timestamp to fill in starttime and endtime elements of given element
+# Find first and last timestamp to fill in starttime and endtime attributes of given element.
 def getStartEndTime(element):
     starttime = ""
     endtime = ""
@@ -87,7 +89,7 @@
 
 # Parses and decodes lines given to it
 # Returns number of spaces before element, name of the element,
-# its attributes in a dictionary, and content of the element
+# its attributes in a dictionary, and content of the element.
 def parseLine(line):
     TIME_FORMAT = "%Y-%m-%d %H:%M:%S %Z"
     CONTENT_FLAG = 0
@@ -99,12 +101,12 @@
     # Count number of leading spaces
     indent = len(line) - len(line.lstrip())
 
-    # splitting the line into list
+    # Splitting the line into a list
     splitted = line.split()
 
-    # if the line is not empty
+    # If the line is not empty
     if splitted:
-        # if first 2 characters are '-', it is not new element, but ending of pair element
+        # If first 2 characters are '-', it is not new element, but ending of pair element
         if splitted[0][0] == '-' and splitted[0][1] == '-':
             element = ""
         else:
@@ -113,53 +115,82 @@
     else:
         return 0, "", {}, ""
 
-    # parsing the rest of the line
+    # Parsing the rest of the line
     for part in splitted:
-        # if flag is set, string is an elements content
+        # If flag is set, string is an elements content
         if CONTENT_FLAG == 1:
-            # First and last characters(quotes) stripped and
-            # string is decoded from base64
-            content = base64.b64decode(part[1:-1])
-            # end parsing after content is stored
+            # String is decoded from base64
+            try:
+                content = base64.b64decode(part)
+            except TypeError as e:
+                sys.stderr.write('Failed to decode string \'%s\' from base64.\
+                        \nError: %s\nExiting unsuccessfully.\n' % (part[1:-1], e))
+                exit(1)
+            # End parsing after content is stored
             break
-        # test if string is an elements content indicator
+        # Test if string is an elements content indicator
         if part == '--':
             CONTENT_FLAG = 1
             continue
-        # test if string is an elements time attribute
+
+        # Test if string is the elements time attribute
         if re.match(r'^--timestamp=', part):
             attribute_name = "timestamp"
-            # Value is string after '=' sign and without first abd last char(quotes)
-            attribute_value = part.split('=', 1)[1][1:-1]
-            attributes[attribute_name] = time.strftime(TIME_FORMAT, time.localtime(int(attribute_value)))
+            # Value is string after '=' sign
+            attribute_value = part.split('=', 1)[1]
+            try:
+                attributes[attribute_name] = time.strftime(TIME_FORMAT, time.localtime(int(attribute_value)))
+            except ValueError as e:
+                sys.stderr.write('Failed to convert timestamp attribute to int.\
+                        \nError: %s\nExiting unsuccessfully.\n' % (e))
+                exit(1)
             continue
-        # test if string is an elements regular attribute
+
+        # Test if string is the elements regular attribute
         if re.match(r'^--[a-zA-Z0-9]+=', part):
             attribute_name = part.split('=', 1)[0][2:]
-            # Value is string after '=' sign and without first abd last char(quotes)
-            attribute_value = part.split('=', 1)[1][1:-1]
-            attributes[attribute_name] = base64.b64decode(attribute_value)
+            # Value is string after '=' sign
+            attribute_value = part.split('=', 1)[1]
+            try:
+                attributes[attribute_name] = base64.b64decode(attribute_value)
+            except TypeError as e:
+                sys.stderr.write('Failed to decode string \'%s\' from base64.\
+                        \nError: %s\nExiting unsuccessfully.\n' % (attribute_value, e))
+                exit(1)
             continue
 
     return indent, element, attributes, content
 
 
-# Returns xml element created with
+# Returns XML element created with
 # information given as parameters
 def createElement(element, attributes, content):
-    element = unicode(element, 'utf-8', errors='replace').translate(xmlTrans)
+    # In python 3 decoding from base64 causes retyping into bytes.
+    if isinstance(element, bytes):
+        # First bytes are decoded from utf8.
+        element = element.decode('utf8', 'replace')
+    # And then retyped to string, using 'six' module which adds python 2/3 compatible methods.
+    # XML not compatible characters are then also stripped from the string.
+    element = six.text_type(element).translate(xmlTrans)
+
     try:
         new_el = etree.Element(element)
-    except ValueError, e:
+    except ValueError as e:
         sys.stderr.write('Failed to create element with name %s\nError: %s\nExiting unsuccessfully.\n' % (element, e))
         exit(1)
 
-    content = unicode(content, 'utf-8', errors='replace').translate(xmlTrans)
-    new_el.text = content
-
-    for key, value in attributes.iteritems():
-        key = unicode(key, 'utf-8', errors='replace').translate(xmlTrans)
-        value = unicode(value, 'utf-8', errors='replace').translate(xmlTrans)
+    if isinstance(content, bytes):
+        content = content.decode('utf8', 'replace')
+    new_el.text = six.text_type(content).translate(xmlTrans)
+
+    for key, value in attributes.items():
+        if isinstance(key, bytes):
+            key = key.decode('utf8', 'replace')
+        key = six.text_type(key).translate(xmlTrans)
+
+        if isinstance(value, bytes):
+            value = value.decode('utf8', 'replace')
+        value = six.text_type(value).translate(xmlTrans)
         new_el.set(key, value)
     return new_el
 
@@ -172,7 +203,7 @@
     if options.metafile:
         try:
             fh = open(options.metafile, 'r+')
-        except IOError, e:
+        except IOError as e:
             sys.stderr.write('Failed to open queue file with' + str(e), 'FAIL')
             return 1
 
@@ -205,8 +236,8 @@
             previous_el = new_el
 
         elif indent == old_indent:
-            # Closing element with updates to it with no elements inside it
             # TODO refactor
+            # Closing element with updates to it with no elements inside it
             if element == "":
                 # Updating start and end time
                 starttime, endtime = getStartEndTime(previous_el)
@@ -214,9 +245,9 @@
                 if "timestamp" in attributes:
                     endtime = attributes["timestamp"]
                 # Updating attributes found on closing line
-                for key, value in attributes.iteritems():
+                for key, value in attributes.items():
                     previous_el.set(key, value)
-                # add start/end time and remove timestamp attribute
+                # Add start/end time and remove timestamp attribute
                 addStartEndTime(previous_el, starttime, endtime)
             # New element is on the same level as previous one
             else:
@@ -231,7 +262,7 @@
         elif indent < old_indent:
             # Difference between indent levels = how many paired elements will be closed
             indent_diff = old_indent - indent
-            for _ in xrange(indent_diff):
+            for _ in range(indent_diff):
                 el_stack.peek().append(previous_el)
                 previous_el = el_stack.pop()
 
@@ -243,9 +274,9 @@
                 if "timestamp" in attributes:
                     endtime = attributes["timestamp"]
                 # Updating attributes found on closing line
-                for key, value in attributes.iteritems():
+                for key, value in attributes.items():
                     previous_el.set(key, value)
-                # add start/end time and remove timestamp attribute
+                # Add start/end time and remove timestamp attribute
                 addStartEndTime(previous_el, starttime, endtime)
 
             # Ending paired element and creating new one on the same level as the paired one that just ended
@@ -285,9 +316,9 @@
             xslt = etree.parse(options.xslt)
             transform = etree.XSLT(xslt)
             journal = transform(journal)
-    except etree.LxmlError:
-        sys.stderr.write("\nTransformation template file " + options.xslt +
-                         " could not be parsed.\nAborting journal creation.")
+    except etree.LxmlError as e:
+        sys.stderr.write("\nTransformation template file \'" + options.xslt +
+                "\' could not be parsed.\nError: %s\nAborting journal creation.") % (e)
         return 1
 
     if options.journal:
diff -u a/src/python/rlMemAvg.py b/src/python/new/rlMemAvg.py
--- a/src/python/rlMemAvg.py	2018-06-25 21:01:54.490910141 +0200
+++ b/src/python/new/rlMemAvg.py	2018-06-25 21:06:24.000000000 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/python2
+#!/usr/bin/python3
 
 # Authors:  Petr Muller     <pmuller@redhat.com>
 #
@@ -18,6 +18,7 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
+from __future__ import print_function
 import sys, time, re
 
 use_sub   = False
@@ -31,7 +32,7 @@
   use_popen = True
 
 if len(sys.argv) < 2:
-  print 'syntax: rlMemAvg <command>'
+  print('syntax: rlMemAvg <command>')
   sys.exit(1)
 
 proglist = sys.argv[1:]
@@ -59,4 +60,4 @@
   if (use_sub and finish != None) or (use_popen and finish != -1):
     break
 
-print "%d" % (memsum/tick)
+print("%d" % (memsum/tick))
diff -u a/src/python/rlMemPeak.py b/src/python/new/rlMemPeak.py
--- a/src/python/rlMemPeak.py	2018-06-25 21:01:54.491910137 +0200
+++ b/src/python/new/rlMemPeak.py	2018-06-25 21:06:28.000000000 +0200
@@ -1,6 +1,6 @@
-#!/usr/bin/python2
+#!/usr/bin/python3
 
-# Authors:  Petr Muller     <pmuller@redhat.com> 
+# Authors:  Petr Muller     <pmuller@redhat.com>
 #
 # Description: Prints a memory consumption peak of an executed program
 #
@@ -18,6 +18,7 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
+from __future__ import print_function
 import sys, time, re
 
 use_sub   = False
@@ -31,7 +32,7 @@
   use_popen = True
 
 if len(sys.argv) < 2:
-  print 'syntax: rlMemPeak <command>'
+  print('syntax: rlMemPeak <command>')
   sys.exit(1)
 
 proglist = sys.argv[1:]
@@ -57,4 +58,4 @@
   if (use_sub and finish != None) or (use_popen and finish != -1):
     break
 
-print "%d" % (maxmem)
+print("%d" % (maxmem))
diff -u a/src/python/testwatcher.py b/src/python/new/testwatcher.py
--- a/src/python/testwatcher.py	2018-06-25 21:01:54.491910137 +0200
+++ b/src/python/new/testwatcher.py	2018-06-25 21:06:32.000000000 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/python2 -u
+#!/usr/bin/python3
 #
 # Authors:  Jiri Jaburek    <jjaburek@redhat.com>
 #
@@ -54,6 +54,7 @@
 #       and the test sends the cleanup path to the watcher again
 
 
+from __future__ import print_function
 import os
 import sys
 import signal
@@ -105,12 +106,12 @@
 ### HELPERS
 #
 def debug(msg):
-    print 'TESTWATCHER: '+msg
+    print('TESTWATCHER: '+msg)
     sys.stdout.flush()
 
 
 def fatal(msg):
-    print >> sys.stderr, 'TESTWATCHER fatal: '+msg
+    print('TESTWATCHER fatal: '+msg, file=sys.stderr)
     sys.stderr.flush()
     sys.exit(1)
 
@@ -153,13 +154,13 @@
     debug('hooking beah LWD')
     try:
         os.makedirs(os.path.dirname(lwd_guard_file))
-    except OSError, e:
+    except OSError as e:
         if e.errno == errno.EEXIST:
             pass
     f = open(lwd_guard_file, 'w')
     f.write(watchdog_guard_cont)
     f.close()
-    os.chmod(lwd_guard_file, 0755)
+    os.chmod(lwd_guard_file, 0o755)
 
 
 # called when EWD (external watchdog) is about to expire
@@ -234,7 +235,7 @@
             try:
                 os.waitpid(cleanuppid, 0)
                 cleanuppid = 0
-            except OSError, e:
+            except OSError as e:
                 if e.errno == errno.EINTR:
                     pass
                 if e.errno == errno.ECHILD:
@@ -291,7 +292,7 @@
                 # wait for entire process group
                 os.waitpid(testpid, 0)
                 testpid = 0
-            except OSError, e:
+            except OSError as e:
                 # no traceback if interrupted by a signal
                 if e.errno == errno.EINTR:
                     pass