2 # -*- coding: utf-8 -*-
4 # This file is part of Karesansui.
6 # Copyright (C) 2009-2010 HDE, Inc.
8 # This program is free software; you can redistribute it and/or
9 # modify it under the terms of the GNU General Public License
10 # as published by the Free Software Foundation; either version 2
11 # of the License, or (at your option) any later version.
17 from optparse import OptionParser
19 from ksscommand import KssCommand, KssCommandException, KssCommandOptException
23 IFCONFIG='/usr/sbin/ifconfig'
24 BRCTL='/usr/sbin/brctl'
28 from karesansui import __version__
29 from karesansui.lib.virt.virt import KaresansuiVirtConnection, KaresansuiVirtException
30 from karesansui.lib.utils import load_locale
32 print >>sys.stderr, "[Error] karesansui package was not found."
37 usage = '%prog [options]'
40 optp = OptionParser(usage=usage, version=__version__)
41 optp.add_option('-n', '--name', dest='name', help=_('Network name'))
42 optp.add_option('-c', '--cidr', dest='cidr', help=_('Bridge IP address'), default=None)
43 optp.add_option('-s', '--dhcp-start', dest='dhcp_start', help=_('DHCP start IP address'), default=None)
44 optp.add_option('-e', '--dhcp-end', dest='dhcp_end', help=_('DHCP end IP address'), default=None)
45 optp.add_option('-f', '--forward-dev', dest='forward_dev', help=_('Forward device'), default=None)
46 optp.add_option('-m', '--forward-mode', dest='forward_mode', help=_('Forward mode'), default=None)
47 optp.add_option('-b', '--bridge-name', dest='bridge_name', help=_('Bridge name'), default=None)
48 optp.add_option('-a', '--autostart', dest='autostart', help=_('Autostart'), default="yes")
49 return optp.parse_args()
53 raise KssCommandOptException('ERROR: %s option is required.' % '-n or --name')
54 if not (opts.cidr or opts.dhcp_start or opts.dhcp_end or opts.forward_dev or opts.forward_mode or opts.bridge_name):
55 raise KssCommandOptException('ERROR: At least one option should be specified.')
57 class UpdateNetwork(KssCommand):
60 (opts, args) = getopts()
64 conn = KaresansuiVirtConnection(readonly=False)
66 forward = {"dev": opts.forward_dev,
67 "mode": opts.forward_mode,
69 bridge = opts.bridge_name
71 if opts.autostart == "yes":
77 conn.update_network(opts.name, opts.cidr, opts.dhcp_start, opts.dhcp_end, forward, bridge, autostart=autostart)
80 self.logger.error('Failed to update network. - net=%s' % (opts.name))
83 # The network should be active now.
84 # If not, we're going to start it up.
85 active_networks = conn.list_active_network()
86 if not (opts.name in active_networks):
88 conn.start_network(opts.name)
90 except KaresansuiVirtException, e:
91 # try to bring down existing bridge
92 kvn = conn.search_kvn_networks(opts.name)[0]
94 bridge_name = kvn.get_info()['bridge']['name']
98 ret, res = execute_command([IFCONFIG, bridge_name, 'down'])
99 ret, res = execute_command([BRCTL, 'delbr', bridge_name])
102 conn.start_network(opts.name)
105 active_networks = conn.list_active_network()
106 if not (opts.name in active_networks):
107 raise KssCommandException('Updated network but it\'s dead. - net=%s' % (opts.name))
113 if __name__ == "__main__":
114 target = UpdateNetwork()
115 sys.exit(target.run())