X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=utilities%2Fovs-vsctl.in;h=06dbabb19855758b1083a975a4df2682da899d7c;hb=b7f22a6aeb08ce3fca4f895ad19fba089bdeef52;hp=d8b4404588e529e7ff0f731bb8f6720b9a8c8794;hpb=2792c2ad6d2483f5114ef9a96049742afb042181;p=openvswitch diff --git a/utilities/ovs-vsctl.in b/utilities/ovs-vsctl.in index d8b44045..06dbabb1 100755 --- a/utilities/ovs-vsctl.in +++ b/utilities/ovs-vsctl.in @@ -29,14 +29,14 @@ if argv0.find('/') >= 0: argv0 = argv0[argv0.rfind('/') + 1:] DEFAULT_VSWITCHD_CONF = "@sysconfdir@/ovs-vswitchd.conf" -VSWITCHD_CONF = DEFAULT_VSWITCHD_CONF +vswitchd_conf = DEFAULT_VSWITCHD_CONF -DEFAULT_VSWITCHD_TARGET = "@RUNDIR@/ovs-vswitchd.pid" -VSWITCHD_TARGET = DEFAULT_VSWITCHD_TARGET +DEFAULT_VSWITCHD_TARGET = "ovs-vswitchd" +vswitchd_target = DEFAULT_VSWITCHD_TARGET -RELOAD_VSWITCHD = True +reload_vswitchd = True -SYSLOG = True +enable_syslog = True class Error(Exception): def __init__(self, msg): @@ -44,7 +44,7 @@ class Error(Exception): self.msg = msg def log(message): - if SYSLOG: + if enable_syslog: syslog.syslog(message) # XXX Most of the functions below should be integrated into a @@ -158,12 +158,11 @@ def do_cfg_save(cfg, file): file.write("%s=%s\n" % (key, value)) def cfg_reload(): - target = VSWITCHD_TARGET + target = vswitchd_target + if not target.startswith('/'): + pid = read_first_line_of_file('%s/%s.pid' % ('@RUNDIR@', target)) + target = '%s/%s.%s.ctl' % ('@RUNDIR@', target, pid) s = os.stat(target) - if stat.S_ISREG(s.st_mode): - pid = read_first_line_of_file(target) - target = "@RUNDIR@/ovs-vswitchd.%s.ctl" % pid - s = os.stat(target) if not stat.S_ISSOCK(s.st_mode): raise Error("%s is not a Unix domain socket, cannot reload" % target) skt = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) @@ -183,7 +182,7 @@ def cfg_save(cfg, filename): do_cfg_save(cfg, f) f.close() os.rename(tmp_name, filename) - if RELOAD_VSWITCHD: + if reload_vswitchd: cfg_reload() # Returns a set of the immediate subsections of 'section' within 'cfg'. For @@ -348,7 +347,7 @@ General options: --no-syslog do not write mesages to syslog -c, --config=FILE set configuration file (default: %(config)s) - -t, --target=PIDFILE|SOCKET set ovs-vswitchd target + -t, --target=PROGRAM|SOCKET set ovs-vswitchd target (default: %(target)s) --no-reload do not make ovs-vswitchd reload its configuration -h, --help display this help message and exit @@ -480,17 +479,66 @@ def cmd_br_to_parent(cfg, bridge): parent, vlan = find_bridge(cfg, bridge) return (parent,) +cmdTable = {'add-br': (cmd_add_br, True, lambda n: n == 1 or n == 3), + 'del-br': (cmd_del_br, True, 1), + 'list-br': (cmd_list_br, False, 0), + 'br-exists': (cmd_br_exists, False, 1), + 'list-ports': (cmd_list_ports, False, 1), + 'add-port': (cmd_add_port, True, 2), + 'add-bond': (cmd_add_bond, True, lambda n: n >= 4), + 'del-port': (cmd_del_port, True, lambda n: n == 1 or n == 2), + 'port-to-br': (cmd_port_to_br, False, 1), + 'br-to-vlan': (cmd_br_to_vlan, False, 1), + 'br-to-parent': (cmd_br_to_parent, False, 1), + 'list-ifaces': (cmd_list_ifaces, False, 1), + 'iface-to-br': (cmd_iface_to_br, False, 1)} + +# Break up commands at -- boundaries. +def split_commands(args): + commands = [] + command = [] + for arg in args: + if arg == '--': + if command: + commands.append(command) + command = [] + else: + command.append(arg) + if command: + commands.append(command) + return commands + +def check_command(args): + command, args = args[0], args[1:] + if command not in cmdTable: + sys.stderr.write("%s: unknown command '%s' (use --help for help)\n" + % (argv0, command)) + sys.exit(1) + + function, is_mutator, nargs = cmdTable[command] + if callable(nargs) and not nargs(len(args)): + sys.stderr.write("%s: '%s' command does not accept %d arguments (use --help for help)\n" % (argv0, command, len(args))) + sys.exit(1) + elif not callable(nargs) and len(args) != nargs: + sys.stderr.write("%s: '%s' command takes %d arguments but %d were supplied (use --help for help)\n" % (argv0, command, nargs, len(args))) + sys.exit(1) + +def run_command(cfg, args): + command, args = args[0], args[1:] + function, need_lock, nargs = cmdTable[command] + return function(cfg, *args) + def main(): # Parse command line. try: - options, args = getopt.gnu_getopt(sys.argv[1:], "c:t:hV", - ["config=", - "target=", - "no-reload", - "no-syslog", - "oneline", - "help", - "version"]) + options, args = getopt.getopt(sys.argv[1:], "c:t:hV", + ["config=", + "target=", + "no-reload", + "no-syslog", + "oneline", + "help", + "version"]) except getopt.GetoptError, msg: sys.stderr.write("%s: %s (use --help for help)\n" % (argv0, msg)) sys.exit(1) @@ -499,78 +547,59 @@ def main(): oneline = False for opt, optarg in options: if opt == "-c" or opt == "--config": - global VSWITCHD_CONF - VSWITCHD_CONF = optarg + global vswitchd_conf + vswitchd_conf = optarg elif opt == "-t" or opt == "--target": - global VSWITCHD_TARGET - if optarg[0] != '/': - optarg = '@RUNDIR@/' + optarg - VSWITCHD_TARGET = optarg + global vswitchd_target + vswitchd_target = optarg elif opt == "--no-reload": - global RELOAD_VSWITCHD - RELOAD_VSWITCHD = False + global reload_vswitchd + reload_vswitchd = False elif opt == "-h" or opt == "--help": usage() elif opt == "-V" or opt == "--version": version() elif opt == "--no-syslog": - global SYSLOG - SYSLOG = False + global enable_syslog + enable_syslog = False elif opt == "--oneline": oneline = True else: raise RuntimeError("unhandled option %s" % opt) - if SYSLOG: + if enable_syslog: syslog.openlog("ovs-vsctl") log("Called as %s" % ' '.join(sys.argv[1:])) - # Execute commands. - if not args: + # Break arguments into a series of commands. + commands = split_commands(args) + if not commands: sys.stderr.write("%s: missing command name (use --help for help)\n" % argv0) sys.exit(1) - commands = {'add-br': (cmd_add_br, True, lambda n: n == 1 or n == 3), - 'del-br': (cmd_del_br, True, 1), - 'list-br': (cmd_list_br, False, 0), - 'br-exists': (cmd_br_exists, False, 1), - 'list-ports': (cmd_list_ports, False, 1), - 'add-port': (cmd_add_port, True, 2), - 'add-bond': (cmd_add_bond, True, lambda n: n >= 4), - 'del-port': (cmd_del_port, True, lambda n: n == 1 or n == 2), - 'port-to-br': (cmd_port_to_br, False, 1), - 'br-to-vlan': (cmd_br_to_vlan, False, 1), - 'br-to-parent': (cmd_br_to_parent, False, 1), - 'list-ifaces': (cmd_list_ifaces, False, 1), - 'iface-to-br': (cmd_iface_to_br, False, 1)} - command = args[0] - args = args[1:] - if command not in commands: - sys.stderr.write("%s: unknown command '%s' (use --help for help)\n" - % (argv0, command)) - sys.exit(1) + # Check command syntax. + need_lock = False + for command in commands: + check_command(command) + if cmdTable[command[0]][1]: + need_lock = True - function, is_mutator, nargs = commands[command] - if callable(nargs) and not nargs(len(args)): - sys.stderr.write("%s: '%s' command does not accept %d arguments (use --help for help)\n" % (argv0, command, len(args))) - sys.exit(1) - elif not callable(nargs) and len(args) != nargs: - sys.stderr.write("%s: '%s' command takes %d arguments but %d were supplied (use --help for help)\n" % (argv0, command, nargs, len(args))) - sys.exit(1) - else: - cfg = cfg_read(VSWITCHD_CONF, is_mutator) - output = function(cfg, *args) - if output != None: - if oneline: - print '\\n'.join([str(s).replace('\\', '\\\\') - for s in output]) - else: - for line in output: - print line - if is_mutator: - cfg_save(cfg, VSWITCHD_CONF) - sys.exit(0) + # Execute commands. + cfg = cfg_read(vswitchd_conf, need_lock) + for command in commands: + output = run_command(cfg, command) + if oneline: + if output == None: + output = () + print '\\n'.join([str(s).replace('\\', '\\\\') + for s in output]) + elif output != None: + for line in output: + print line + if need_lock: + cfg_save(cfg, vswitchd_conf) + sys.exit(0) if __name__ == "__main__": try: