diff --git a/lib/py/criu.py b/lib/py/criu.py index 85c7c07f8..9465eefa2 100644 --- a/lib/py/criu.py +++ b/lib/py/criu.py @@ -85,6 +85,8 @@ class _criu_comm_bin(_criu_comm): css = socket.socketpair(socket.AF_UNIX, socket.SOCK_SEQPACKET) flags = fcntl.fcntl(css[1], fcntl.F_GETFD) fcntl.fcntl(css[1], fcntl.F_SETFD, flags | fcntl.FD_CLOEXEC) + flags = fcntl.fcntl(css[0], fcntl.F_GETFD) + fcntl.fcntl(css[0], fcntl.F_SETFD, flags & ~fcntl.FD_CLOEXEC) self.daemon = daemon diff --git a/lib/py/images/images.py b/lib/py/images/images.py index 3ad8550b1..d70ee1a42 100644 --- a/lib/py/images/images.py +++ b/lib/py/images/images.py @@ -38,6 +38,7 @@ # } # import io +import base64 import google import struct import os @@ -49,6 +50,10 @@ import array from . import magic from .pb import * +if "encodebytes" not in dir(base64): + base64.encodebytes = base64.encodestring + base64.decodebytes = base64.decodestring + # # Predefined hardcoded constants sizeof_u16 = 2 @@ -185,7 +190,7 @@ class pagemap_handler: pb = pagemap_head() while True: buf = f.read(4) - if buf == '': + if buf == b'': break size, = struct.unpack('i', buf) pb.ParseFromString(f.read(size)) @@ -242,13 +247,13 @@ class ghost_file_handler: if no_payload: f.seek(gc.len, os.SEEK_CUR) else: - entry['extra'] = f.read(gc.len).encode('base64') + entry['extra'] = base64.encodebytes(f.read(gc.len)) entries.append(entry) else: if no_payload: f.seek(0, os.SEEK_END) else: - g_entry['extra'] = f.read().encode('base64') + g_entry['extra'] = base64.encodebytes(f.read()) entries.append(g_entry) return entries @@ -274,9 +279,9 @@ class ghost_file_handler: size = len(pb_str) f.write(struct.pack('i', size)) f.write(pb_str) - f.write(item['extra'].decode('base64')) + f.write(base64.decodebytes(item['extra'])) else: - f.write(item['extra'].decode('base64')) + f.write(base64.decodebytes(item['extra'])) def dumps(self, entries): f = io.BytesIO('') @@ -294,10 +299,10 @@ class pipes_data_extra_handler: def load(self, f, pload): size = pload.bytes data = f.read(size) - return data.encode('base64') + return base64.encodebytes(data) def dump(self, extra, f, pload): - data = extra.decode('base64') + data = base64.decodebytes(extra) f.write(data) def skip(self, f, pload): @@ -308,10 +313,10 @@ class sk_queues_extra_handler: def load(self, f, pload): size = pload.length data = f.read(size) - return data.encode('base64') + return base64.encodebytes(data) def dump(self, extra, f, pb): - data = extra.decode('base64') + data = base64.decodebytes(extra) f.write(data) def skip(self, f, pload): @@ -326,14 +331,14 @@ class tcp_stream_extra_handler: inq = f.read(pb.inq_len) outq = f.read(pb.outq_len) - d['inq'] = inq.encode('base64') - d['outq'] = outq.encode('base64') + d['inq'] = base64.encodebytes(inq) + d['outq'] = base64.encodebytes(outq) return d def dump(self, extra, f, pb): - inq = extra['inq'].decode('base64') - outq = extra['outq'].decode('base64') + inq = base64.decodebytes(extra['inq']) + outq = base64.decodebytes(extra['outq']) f.write(inq) f.write(outq) @@ -388,7 +393,7 @@ class ipc_msg_queue_handler: data = f.read(msg.msize) f.seek(rounded - msg.msize, 1) messages.append(pb2dict.pb2dict(msg)) - messages.append(data.encode('base64')) + base64.encodebytes(messages.append(data)) return messages def dump(self, extra, f, pb): @@ -401,7 +406,7 @@ class ipc_msg_queue_handler: f.write(struct.pack('i', size)) f.write(msg_str) rounded = round_up(msg.msize, sizeof_u64) - data = extra[i + 1].decode('base64') + data = base64.decodebytes(extra[i + 1]) f.write(data[:msg.msize]) f.write('\0' * (rounded - msg.msize)) @@ -428,12 +433,12 @@ class ipc_shm_handler: data = f.read(size) rounded = round_up(size, sizeof_u32) f.seek(rounded - size, 1) - return data.encode('base64') + return base64.encodebytes(data) def dump(self, extra, f, pb): entry = pb2dict.pb2dict(pb) size = entry['size'] - data = extra.decode('base64') + data = base64.decodebytes(extra) rounded = round_up(size, sizeof_u32) f.write(data[:size]) f.write('\0' * (rounded - size)) @@ -589,6 +594,6 @@ def dumps(img): Same as dump(), but takes only an image and returns a string. """ - f = io.BytesIO('') + f = io.BytesIO(b'') dump(img, f) return f.getvalue() diff --git a/lib/py/images/pb2dict.py b/lib/py/images/pb2dict.py index 441dacf61..391bdd5b3 100644 --- a/lib/py/images/pb2dict.py +++ b/lib/py/images/pb2dict.py @@ -1,12 +1,10 @@ from google.protobuf.descriptor import FieldDescriptor as FD import opts_pb2 -from builtins import str -from past.builtins import long -from ipaddress import IPv4Address +from ipaddress import IPv4Address, ip_address from ipaddress import IPv6Address import socket import collections -import os +import os, six # pb2dict and dict2pb are methods to convert pb to/from dict. # Inspired by: @@ -27,14 +25,14 @@ import os _basic_cast = { - FD.TYPE_FIXED64 : long, + FD.TYPE_FIXED64 : int, FD.TYPE_FIXED32 : int, - FD.TYPE_SFIXED64 : long, + FD.TYPE_SFIXED64 : int, FD.TYPE_SFIXED32 : int, - FD.TYPE_INT64 : long, - FD.TYPE_UINT64 : long, - FD.TYPE_SINT64 : long, + FD.TYPE_INT64 : int, + FD.TYPE_UINT64 : int, + FD.TYPE_SINT64 : int, FD.TYPE_INT32 : int, FD.TYPE_UINT32 : int, @@ -229,7 +227,7 @@ def get_bytes_dec(field): return decode_base64 def is_string(value): - return isinstance(value, str) + return isinstance(value, six.string_types) def _pb2dict_cast(field, value, pretty = False, is_hex = False): if not is_hex: @@ -243,7 +241,7 @@ def _pb2dict_cast(field, value, pretty = False, is_hex = False): return field.enum_type.values_by_number.get(value, None).name elif field.type in _basic_cast: cast = _basic_cast[field.type] - if pretty and (cast == int or cast == long): + if pretty and (cast == int): if is_hex: # Fields that have (criu).hex = true option set # should be stored in hex string format. @@ -309,7 +307,7 @@ def _dict2pb_cast(field, value): return field.enum_type.values_by_name.get(value, None).number elif field.type in _basic_cast: cast = _basic_cast[field.type] - if (cast == int or cast == long) and is_string(value): + if (cast == int) and is_string(value): if _marked_as_dev(field): return encode_dev(field, value) @@ -349,7 +347,7 @@ def dict2pb(d, pb): if field.label == FD.LABEL_REPEATED: pb_val = getattr(pb, field.name, None) if is_string(value[0]) and _marked_as_ip(field): - val = ipaddr.IPAddress(value[0]) + val = ip_address(value[0]) if val.version == 4: pb_val.append(socket.htonl(int(val))) elif val.version == 6: diff --git a/scripts/build/Dockerfile.centos b/scripts/build/Dockerfile.centos index 75f0ed461..379a84596 100644 --- a/scripts/build/Dockerfile.centos +++ b/scripts/build/Dockerfile.centos @@ -25,6 +25,7 @@ RUN yum install -y \ python-ipaddress \ python2-future \ python-yaml \ + python-six \ tar \ which