Commit 9ebb3738 authored by Pavel Emelyanov's avatar Pavel Emelyanov

crit: Print IP addresses in pretty mode

There are two places where we store IP addresses (both IPv4 and IPv6).
Mark them with custom option and print them in compressed form for
--pretty output.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
Acked-by: 's avatarRuslan Kuprieiev <kupruser@gmail.com>
parent 0d2aeb35
...@@ -2,6 +2,7 @@ import "google/protobuf/descriptor.proto"; ...@@ -2,6 +2,7 @@ import "google/protobuf/descriptor.proto";
message CRIU_Opts { message CRIU_Opts {
optional bool hex = 1; // Idicate that CRIT should treat this field as hex. optional bool hex = 1; // Idicate that CRIT should treat this field as hex.
optional bool ipadd = 2; // The field is IPv4/v6 address
} }
extend google.protobuf.FieldOptions { extend google.protobuf.FieldOptions {
......
...@@ -22,8 +22,8 @@ message inet_sk_entry { ...@@ -22,8 +22,8 @@ message inet_sk_entry {
required uint32 flags = 9 [(criu).hex = true]; required uint32 flags = 9 [(criu).hex = true];
required uint32 backlog = 10; required uint32 backlog = 10;
repeated uint32 src_addr = 11; repeated uint32 src_addr = 11 [(criu).ipadd = true];
repeated uint32 dst_addr = 12; repeated uint32 dst_addr = 12 [(criu).ipadd = true];
required fown_entry fown = 13; required fown_entry fown = 13;
required sk_opts_entry opts = 14; required sk_opts_entry opts = 14;
......
from google.protobuf.descriptor import FieldDescriptor as FD from google.protobuf.descriptor import FieldDescriptor as FD
import opts_pb2 import opts_pb2
import ipaddr
import socket
# pb2dict and dict2pb are methods to convert pb to/from dict. # pb2dict and dict2pb are methods to convert pb to/from dict.
# Inspired by: # Inspired by:
...@@ -43,6 +45,9 @@ _basic_cast = { ...@@ -43,6 +45,9 @@ _basic_cast = {
def _marked_as_hex(field): def _marked_as_hex(field):
return field.GetOptions().Extensions[opts_pb2.criu].hex return field.GetOptions().Extensions[opts_pb2.criu].hex
def _marked_as_ip(field):
return field.GetOptions().Extensions[opts_pb2.criu].ipadd
def _pb2dict_cast(field, value, pretty = False, is_hex = False): def _pb2dict_cast(field, value, pretty = False, is_hex = False):
if not is_hex: if not is_hex:
is_hex = _marked_as_hex(field) is_hex = _marked_as_hex(field)
...@@ -73,6 +78,19 @@ def pb2dict(pb, pretty = False, is_hex = False): ...@@ -73,6 +78,19 @@ def pb2dict(pb, pretty = False, is_hex = False):
for field, value in pb.ListFields(): for field, value in pb.ListFields():
if field.label == FD.LABEL_REPEATED: if field.label == FD.LABEL_REPEATED:
d_val = [] d_val = []
if pretty and _marked_as_ip(field):
if len(value) == 1:
v = socket.ntohl(value[0])
addr = ipaddr.IPv4Address(v)
else:
v = 0 + (socket.ntohl(value[0]) << (32 * 3)) + \
(socket.ntohl(value[1]) << (32 * 2)) + \
(socket.ntohl(value[2]) << (32 * 1)) + \
(socket.ntohl(value[3]))
addr = ipaddr.IPv6Address(v)
d_val.append(addr.compressed)
else:
for v in value: for v in value:
d_val.append(_pb2dict_cast(field, v, pretty, is_hex)) d_val.append(_pb2dict_cast(field, v, pretty, is_hex))
else: else:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment