OSDN Git Service

Merge branch 'dev' of ssh://raid.local.hde.co.jp/hde/karesansui/karesansui into dev
[karesansui/karesansui.git] / bin / update_network.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 #
4 # This file is part of Karesansui.
5 #
6 # Copyright (C) 2009-2010 HDE, Inc.
7 #
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.
12 #
13
14 import os
15 import sys
16 import logging
17 from optparse import OptionParser
18
19 from ksscommand import KssCommand, KssCommandException, KssCommandOptException
20
21 import __cmd__
22
23 IFCONFIG='/usr/sbin/ifconfig'
24 BRCTL='/usr/sbin/brctl'
25
26 try:
27     import karesansui
28     from karesansui import __version__
29     from karesansui.lib.virt.virt import KaresansuiVirtConnection, KaresansuiVirtException
30     from karesansui.lib.utils import load_locale
31 except ImportError:
32     print >>sys.stderr, "[Error] karesansui package was not found."
33     sys.exit(1)
34
35 _ = load_locale()
36
37 usage = '%prog [options]'
38
39 def getopts():
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()
50
51 def chkopts(opts):
52     if not opts.name:
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.')
56
57 class UpdateNetwork(KssCommand):
58
59     def process(self):
60         (opts, args) = getopts()
61         chkopts(opts)
62         self.up_progress(10)
63
64         conn = KaresansuiVirtConnection(readonly=False)
65         try:
66             forward = {"dev": opts.forward_dev,
67                        "mode": opts.forward_mode,
68                        }
69             bridge  = opts.bridge_name
70
71             if opts.autostart == "yes":
72                 autostart = True
73             else:
74                 autostart = False
75
76             try:
77                 conn.update_network(opts.name, opts.cidr, opts.dhcp_start, opts.dhcp_end, forward, bridge, autostart=autostart)
78                 self.up_progress(20)
79             except:
80                 self.logger.error('Failed to update network. - net=%s' % (opts.name))
81                 raise
82
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):
87                 try:
88                     conn.start_network(opts.name)
89                     self.up_progress(10)
90                 except KaresansuiVirtException, e:
91                     # try to bring down existing bridge
92                     kvn = conn.search_kvn_networks(opts.name)[0]
93                     try:
94                         bridge_name = kvn.get_info()['bridge']['name']
95                     except KeyError:
96                         pass
97
98                     ret, res = execute_command([IFCONFIG, bridge_name, 'down'])
99                     ret, res = execute_command([BRCTL, 'delbr', bridge_name])
100
101                     # try again
102                     conn.start_network(opts.name)
103                     self.up_progress(10)
104
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))
108
109             return True
110         finally:
111             conn.close()
112
113 if __name__ == "__main__":
114     target = UpdateNetwork()
115     sys.exit(target.run())