This file is indexed.

/usr/src/openvswitch-1.4.0/ovsdb/ovsdb-dot.in is in openvswitch-datapath-dkms 1.4.0-1ubuntu1.

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
#! @PYTHON@

from datetime import date
import ovs.db.error
import ovs.db.schema
import getopt
import os
import re
import sys

argv0 = sys.argv[0]

def printEdge(tableName, type, baseType, label):
    if baseType.ref_table_name:
        if type.n_min == 0:
            if type.n_max == 1:
                arity = "?"
            elif type.n_max == sys.maxint:
                arity = "*"
            else:
                arity = "{,%d}" % type.n_max
        elif type.n_min == 1:
            if type.n_max == 1:
                arity = ""
            elif type.n_max == sys.maxint:
                arity = "+"
            else:
                arity = "{1,%d}" % type.n_max

        options = {}
        options['label'] = '"%s%s"' % (label, arity)
        if baseType.ref_type == 'weak':
            options['constraint'] = 'false'
            options['style'] = 'dotted'
        print "\t%s -> %s [%s];" % (
            tableName,
            baseType.ref_table_name,
            ', '.join(['%s=%s' % (k,v) for k,v in options.items()]))

def schemaToDot(schemaFile):
    schema = ovs.db.schema.DbSchema.from_json(ovs.json.from_file(schemaFile))

    print "digraph %s {" % schema.name
    print '\tsize="6.5,4";'
    print '\tmargin="0";'
    print "\tnode [shape=box];"
    print "\tedge [dir=none, arrowhead=none, arrowtail=none];"
    for tableName, table in schema.tables.iteritems():
        options = {}
        if table.is_root:
            options['style'] = 'bold'
        print "\t%s [%s];" % (
            tableName,
            ', '.join(['%s=%s' % (k,v) for k,v in options.items()]))
        for columnName, column in table.columns.iteritems():
            if column.type.value:
                printEdge(tableName, column.type, column.type.key, "%s key" % columnName)
                printEdge(tableName, column.type, column.type.value, "%s value" % columnName)
            else:
                printEdge(tableName, column.type, column.type.key, columnName)
    print "}";

def usage():
    print """\
%(argv0)s: compiles ovsdb schemas to graphviz format
Prints a .dot file that "dot" can render to an entity-relationship diagram
usage: %(argv0)s [OPTIONS] SCHEMA
where SCHEMA is an OVSDB schema in JSON format

The following options are also available:
  -h, --help                  display this help message
  -V, --version               display version information\
""" % {'argv0': argv0}
    sys.exit(0)

if __name__ == "__main__":
    try:
        try:
            options, args = getopt.gnu_getopt(sys.argv[1:], 'hV',
                                              ['help', 'version'])
        except getopt.GetoptError, geo:
            sys.stderr.write("%s: %s\n" % (argv0, geo.msg))
            sys.exit(1)

        for key, value in options:
            if key in ['-h', '--help']:
                usage()
            elif key in ['-V', '--version']:
                print "ovsdb-dot (Open vSwitch) @VERSION@"
            else:
                sys.exit(0)

        if len(args) != 1:
            sys.stderr.write("%s: exactly 1 non-option argument required "
                             "(use --help for help)\n" % argv0)
            sys.exit(1)

        schemaToDot(args[0])

    except ovs.db.error.Error, e:
        sys.stderr.write("%s: %s\n" % (argv0, e.msg))
        sys.exit(1)

# Local variables:
# mode: python
# End: