This file is indexed.

/usr/lib/xen-4.9/bin/verify-stream-v2 is in xen-utils-4.9 4.9.2-0ubuntu1.

This file is owned by root:root, with mode 0o755.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#! /usr/bin/python2
# -*- coding: utf-8 -*-

""" Verify a v2 format migration stream """

import sys
import struct
import os, os.path
import syslog
import traceback

from xen.migration.verify import StreamError, RecordError
from xen.migration.libxc import VerifyLibxc
from xen.migration.libxl import VerifyLibxl

fin = None             # Input file/fd
log_to_syslog = False  # Boolean - Log to syslog instead of stdout/err?
verbose = False        # Boolean - Summarise stream contents
quiet = False          # Boolean - Suppress error printing

def info(msg):
    """Info message, routed to appropriate destination"""
    if not quiet and verbose:
        if log_to_syslog:
            for line in msg.split("\n"):
                syslog.syslog(syslog.LOG_INFO, line)
        else:
            print msg

def err(msg):
    """Error message, routed to appropriate destination"""
    if not quiet:
        if log_to_syslog:
            for line in msg.split("\n"):
                syslog.syslog(syslog.LOG_ERR, line)
        print >> sys.stderr, msg

def stream_read(_ = None):
    """Read from input"""
    return fin.read(_)

def rdexact(nr_bytes):
    """Read exactly nr_bytes from fin"""
    _ = stream_read(nr_bytes)
    if len(_) != nr_bytes:
        raise IOError("Stream truncated")
    return _

def unpack_exact(fmt):
    """Unpack a format from fin"""
    sz = struct.calcsize(fmt)
    return struct.unpack(fmt, rdexact(sz))


def skip_xl_header():
    """Skip over an xl header in the stream"""

    hdr = rdexact(32)
    if hdr != "Xen saved domain, xl format\n \0 \r":
        raise StreamError("No xl header")

    _, mflags, _, optlen = unpack_exact("=IIII")
    _ = rdexact(optlen)

    info("Processed xl header")

    if mflags & 2: # XL_MANDATORY_FLAG_STREAMv2
        return "libxl"
    else:
        return "libxc"

def read_stream(fmt):
    """ Read an entire stream """

    try:
        if fmt == "xl":
            fmt = skip_xl_header()

        if fmt == "libxc":
            VerifyLibxc(info, stream_read).verify()
        else:
            VerifyLibxl(info, stream_read).verify()

    except (IOError, StreamError, RecordError):
        err("Stream Error:")
        err(traceback.format_exc())
        return 1

    except StandardError:
        err("Script Error:")
        err(traceback.format_exc())
        err("Please fix me")
        return 2

    return 0

def open_file_or_fd(val, mode, buffering):
    """
    If 'val' looks like a decimal integer, open it as an fd.  If not, try to
    open it as a regular file.
    """

    fd = -1
    try:
        # Does it look like an integer?
        try:
            fd = int(val, 10)
        except ValueError:
            pass

        # Try to open it...
        if fd != -1:
            return os.fdopen(fd, mode, buffering)
        else:
            return open(val, mode, buffering)

    except StandardError, e:
        if fd != -1:
            err("Unable to open fd %d: %s: %s" %
                (fd, e.__class__.__name__, e))
        else:
            err("Unable to open file '%s': %s: %s" %
                (val, e.__class__.__name__, e))

    raise SystemExit(2)

def main():
    """ main """
    from optparse import OptionParser
    global fin, quiet, verbose

    # Change stdout to be line-buffered.
    sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 1)

    parser = OptionParser(usage = "%prog [options]",
                          description =
                          "Verify a stream according to the v2 spec")

    # Optional options
    parser.add_option("-i", "--in", dest = "fin", metavar = "<FD or FILE>",
                      default = "0",
                      help = "Stream to verify (defaults to stdin)")
    parser.add_option("-v", "--verbose", action = "store_true", default = False,
                      help = "Summarise stream contents")
    parser.add_option("-q", "--quiet", action = "store_true", default = False,
                      help = "Suppress all logging/errors")
    parser.add_option("-f", "--format", dest = "format",
                      metavar = "<libxc|libxl|xl>", default = "libxc",
                      choices = ["libxc", "libxl", "xl"],
                      help = "Format of the incoming stream (defaults to libxc)")
    parser.add_option("--syslog", action = "store_true", default = False,
                      help = "Log to syslog instead of stdout")

    opts, _ = parser.parse_args()

    if opts.syslog:
        global log_to_syslog

        syslog.openlog("verify-stream-v2", syslog.LOG_PID)
        log_to_syslog = True

    verbose = opts.verbose
    quiet = opts.quiet
    fin = open_file_or_fd(opts.fin, "rb", 0)

    return read_stream(opts.format)

if __name__ == "__main__":
    try:
        sys.exit(main())
    except SystemExit, e:
        sys.exit(e.code)
    except KeyboardInterrupt:
        sys.exit(2)