Make mtlib Python 3 compatible

Most changes were generated using `futurize`:

    $ futurize --stage1 --all-imports --write --nobackups mtlib/**/*.py

Then the `__future__` imports were sorted, an issue with `Path` division
overloading fixed, and a few out-of-date imports replaced or removed.

TEST=Run `mtedit` on a local ZIP file using 2.7; where imports have been
     changed, check that objects in those files can still be imported in
     a 2.7 REPL. Check that `import mtlib` in a Python 3 REPL doesn't
     fail with any errors in mtlib. (It will fail with errors in
     `touch_firmware_test/`, but that's out of scope of this CL.)
BUG=None

Change-Id: I208ac77516ce96118e3d51d226f990693b9a3931
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/mttools/+/2018104
Tested-by: Harry Cutts <hcutts@chromium.org>
Reviewed-by: Sean O'Brien <seobrien@chromium.org>
Commit-Queue: Harry Cutts <hcutts@chromium.org>
diff --git a/mtlib/__init__.py b/mtlib/__init__.py
index 0470330..e9ed28c 100644
--- a/mtlib/__init__.py
+++ b/mtlib/__init__.py
@@ -1,3 +1,5 @@
-from log import Log
-from platform import PlatformProperties, PlatformDatabase
-from cros_remote import CrOSRemote
\ No newline at end of file
+from __future__ import absolute_import
+
+from .log import Log
+from .platform import PlatformProperties, PlatformDatabase
+from .cros_remote import CrOSRemote
diff --git a/mtlib/cros_info.py b/mtlib/cros_info.py
index 813c876..b226fc1 100644
--- a/mtlib/cros_info.py
+++ b/mtlib/cros_info.py
@@ -3,6 +3,8 @@
 # found in the LICENSE file.
 """Classes to extract information about chromebooks and their touch devices."""
 
+from __future__ import absolute_import
+from __future__ import division
 from __future__ import print_function
 
 import os
diff --git a/mtlib/cros_remote.py b/mtlib/cros_remote.py
index f3f20a1..f28f39d 100755
--- a/mtlib/cros_remote.py
+++ b/mtlib/cros_remote.py
@@ -4,9 +4,11 @@
 
 """This module defines a class for remotely accessing a Chromebook."""
 
+from __future__ import absolute_import
+from __future__ import division
 from __future__ import print_function
 
-from cros_info import CrOSDeviceInfo
+from .cros_info import CrOSDeviceInfo
 from mtlib.util import Execute, SafeExecute, AskUser
 import os
 import tempfile
diff --git a/mtlib/feedback.py b/mtlib/feedback.py
index caf3970..f7aa771 100644
--- a/mtlib/feedback.py
+++ b/mtlib/feedback.py
@@ -2,9 +2,10 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+from __future__ import absolute_import
+from __future__ import division
 from __future__ import print_function
 
-import cookielib
 import datetime
 import time
 import getpass
@@ -14,9 +15,10 @@
 import re
 import subprocess
 import sys
-import urllib
-import urllib2
-import StringIO
+try:
+    from StringIO import StringIO
+except ImportError:
+    from io import StringIO
 import multiprocessing
 import random
 import errno
@@ -186,7 +188,7 @@
     time.sleep(sleep_time)
     data_line = None
     system_log = None
-    for count, line in enumerate(StringIO.StringIO(report)):
+    for count, line in enumerate(StringIO(report)):
       if 'name: "system_logs.zip"' in line:
         data_line = count + 2
       elif data_line and data_line == count:
@@ -204,7 +206,7 @@
                                         FeedbackDownloader.SCREENSHOT_FIELD)
     data_line = None
     screenshot = None
-    for count, line in enumerate(StringIO.StringIO(report)):
+    for count, line in enumerate(StringIO(report)):
       if 'screenshot <' in line:
         data_line = count + 2
       elif data_line and data_line == count:
diff --git a/mtlib/firmware.py b/mtlib/firmware.py
index 65a0bc4..d061715 100644
--- a/mtlib/firmware.py
+++ b/mtlib/firmware.py
@@ -4,6 +4,8 @@
 
 """Provides tools for packaging, installing and testing firmware."""
 
+from __future__ import absolute_import
+from __future__ import division
 from __future__ import print_function
 
 from mtlib.util import Path, RequiredRegex, Execute, SafeExecute, GitRepo
@@ -174,7 +176,7 @@
       path = tar_name + str(binary.device_file)
       info = tarfile.TarInfo(path)
       info.size = len(binary.data)
-      info.mode = 0755
+      info.mode = 0o755
       info.uid = 0
       info.gid = 0
       info.mtime = time.time()
diff --git a/mtlib/gesture_log.py b/mtlib/gesture_log.py
index 081b2e5..ef8aa74 100755
--- a/mtlib/gesture_log.py
+++ b/mtlib/gesture_log.py
@@ -2,6 +2,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+from __future__ import absolute_import
+from __future__ import division
 from __future__ import print_function
 
 import decimal
diff --git a/mtlib/log.py b/mtlib/log.py
index 73ada15..2835d11 100644
--- a/mtlib/log.py
+++ b/mtlib/log.py
@@ -2,12 +2,17 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+from __future__ import absolute_import
+from __future__ import division
 from __future__ import print_function
 
 from gzip import GzipFile
 from mtlib.feedback import FeedbackDownloader
-from StringIO import StringIO
-from cros_remote import CrOSRemote
+try:
+    from StringIO import StringIO
+except ImportError:
+    from io import StringIO
+from .cros_remote import CrOSRemote
 import base64
 import bz2
 import imghdr
diff --git a/mtlib/platform.py b/mtlib/platform.py
index 0f30bf3..932c3c3 100755
--- a/mtlib/platform.py
+++ b/mtlib/platform.py
@@ -4,6 +4,8 @@
 #
 """ This module manages the platform properties in mttools/platforms. """
 
+from __future__ import absolute_import
+from __future__ import division
 from __future__ import print_function
 
 from collections import namedtuple
@@ -12,9 +14,10 @@
 import re
 import sys
 
-from cros_remote import CrOSRemote
-from util import AskUser, ExecuteException
-from xorg_conf import XorgInputClassParser
+from .cros_remote import CrOSRemote
+from .util import AskUser, ExecuteException
+from .xorg_conf import XorgInputClassParser
+from functools import reduce
 
 # path to current script directory
 script_dir = os.path.dirname(os.path.realpath(__file__))
diff --git a/mtlib/util.py b/mtlib/util.py
index 51585ae..052a3f4 100644
--- a/mtlib/util.py
+++ b/mtlib/util.py
@@ -8,6 +8,8 @@
 repositories, shell commands, and user interaction via command line.
 """
 
+from __future__ import absolute_import
+from __future__ import division
 from __future__ import print_function
 
 import os
@@ -158,6 +160,9 @@
   def __div__(self, other):
     return self.Join(other)
 
+  def __truediv__(self, other):
+    return self.Join(other)
+
   def __bool__(self):
     return self.exists
 
@@ -398,7 +403,7 @@
       if validate:
         try:
           reply = validate(reply)
-        except Exception, e:
+        except Exception as e:
           print(e)
           continue
       return reply
diff --git a/mtlib/xorg_conf.py b/mtlib/xorg_conf.py
index b5379d4..9cbd5fc 100644
--- a/mtlib/xorg_conf.py
+++ b/mtlib/xorg_conf.py
@@ -2,6 +2,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+from __future__ import absolute_import
+from __future__ import division
 from __future__ import print_function
 
 import math