]>
git.proxmox.com Git - mirror_ifupdown2.git/blob - ifupdown2/ifupdown/main.py
3 # Copyright 2014-2017 Cumulus Networks, Inc. All rights reserved.
5 # Roopa Prabhu, roopa@cumulusnetworks.com
6 # Julien Fortin, julien@cumulusnetworks.com
8 # tool to configure network interfaces
18 from ifupdown2
.ifupdown
.log
import log
19 from ifupdown2
.ifupdown
.argv
import Parse
20 from ifupdown2
.ifupdown
.config
import IFUPDOWN2_CONF_PATH
21 from ifupdown2
.ifupdown
.ifupdownmain
import ifupdownMain
23 from ifupdown
.log
import log
24 from ifupdown
.argv
import Parse
25 from ifupdown
.config
import IFUPDOWN2_CONF_PATH
26 from ifupdown
.ifupdownmain
import ifupdownMain
29 _SIGINT
= signal
.getsignal(signal
.SIGINT
)
30 _SIGTERM
= signal
.getsignal(signal
.SIGTERM
)
31 _SIGQUIT
= signal
.getsignal(signal
.SIGQUIT
)
37 def __init__(self
, daemon
, uid
):
43 self
.interfaces_filename
= None
44 self
.interfaces_file_iobuf
= None
48 'down': self
.run_down
,
49 'query': self
.run_query
,
50 'reload': self
.run_reload
53 def parse_argv(self
, argv
):
54 args_parse
= Parse(argv
)
57 self
.args
= args_parse
.get_args()
58 self
.op
= args_parse
.get_op()
60 def update_logger(self
, socket
=None):
61 syslog
= self
.args
.syslog
if hasattr(self
.args
, 'syslog') else False
62 log
.update_current_logger(syslog
=syslog
,
63 verbose
=self
.args
.verbose
,
64 debug
=self
.args
.debug
)
66 log
.set_socket(socket
)
68 def main(self
, stdin_buffer
=None):
69 if self
.op
!= 'query' and self
.uid
!= 0:
70 raise Exception('must be root to run this command')
74 self
.init(stdin_buffer
)
75 self
.handlers
.get(self
.op
)(self
.args
)
79 # if args and args.debug:
86 # if args and not args.debug:
87 # print '\nrerun the command with \'-d\' for a detailed errormsg'
91 def init(self
, stdin_buffer
):
92 if hasattr(self
.args
, 'interfacesfile') and self
.args
.interfacesfile
!= None:
93 # Check to see if -i option is allowed by config file
94 # But for ifquery, we will not check this
95 if (not self
.op
== 'query' and
96 configmap_g
.get('disable_cli_interfacesfile', '0') == '1'):
97 log
.error('disable_cli_interfacesfile is set so users '
98 'not allowed to specify interfaces file on cli.')
100 if self
.args
.interfacesfile
== '-':
101 # If interfaces file is stdin, read
103 self
.interfaces_file_iobuf
= stdin_buffer
105 self
.interfaces_file_iobuf
= sys
.stdin
.read()
107 self
.interfaces_filename
= self
.args
.interfacesfile
109 # if the ifupdown2 config file does not have it, default to standard
110 self
.interfaces_filename
= configmap_g
.get('default_interfaces_configfile',
111 '/etc/network/interfaces')
113 def read_config(self
):
116 with
open(IFUPDOWN2_CONF_PATH
, 'r') as f
:
118 configStr
= '[ifupdown2]\n' + config
119 configFP
= StringIO
.StringIO(configStr
)
120 parser
= ConfigParser
.RawConfigParser()
121 parser
.readfp(configFP
)
122 configmap_g
= dict(parser
.items('ifupdown2'))
124 # Preprocess config map
125 configval
= configmap_g
.get('multiple_vlan_aware_bridge_support', '0')
127 # if multiple bridges not allowed, set the bridge-vlan-aware
128 # attribute in the 'no_repeats' config, so that the ifupdownmain
129 # module can catch it appropriately
130 configmap_g
['no_repeats'] = {'bridge-vlan-aware': 'yes'}
132 configval
= configmap_g
.get('link_master_slave', '0')
134 # link_master_slave is only valid when all is set
135 if hasattr(self
.args
, 'all') and not self
.args
.all
:
136 configmap_g
['link_master_slave'] = '0'
138 configval
= configmap_g
.get('delay_admin_state_change', '0')
140 # reset link_master_slave if delay_admin_state_change is on
141 configmap_g
['link_master_slave'] = '0'
143 def run_up(self
, args
):
144 log
.debug('args = %s' % str(args
))
148 if len(args
.iflist
) == 0:
150 log
.debug('creating ifupdown object ..')
151 cachearg
= (False if (iflist
or args
.nocache
or args
.noact
)
153 ifupdown_handle
= ifupdownMain(daemon
=self
.daemon
,
156 withdepends
=args
.withdepends
,
157 perfmode
=args
.perfmode
,
160 addons_enable
=not args
.noaddons
,
161 statemanager_enable
=not args
.noaddons
,
162 interfacesfile
=self
.interfaces_filename
,
163 interfacesfileiobuf
=self
.interfaces_file_iobuf
,
164 interfacesfileformat
=args
.interfacesfileformat
)
166 ifupdown_handle
.up(['up'], args
.all
, args
.CLASS
, iflist
,
167 excludepats
=args
.excludepats
,
168 printdependency
=args
.printdependency
,
169 syntaxcheck
=args
.syntaxcheck
, type=args
.type,
170 skipupperifaces
=args
.skipupperifaces
)
172 ifupdown_handle
.up(['pre-up', 'up', 'post-up'],
173 args
.all
, args
.CLASS
, iflist
,
174 excludepats
=args
.excludepats
,
175 printdependency
=args
.printdependency
,
176 syntaxcheck
=args
.syntaxcheck
, type=args
.type,
177 skipupperifaces
=args
.skipupperifaces
)
181 def run_down(self
, args
):
182 log
.debug('args = %s' % str(args
))
186 log
.debug('creating ifupdown object ..')
187 ifupdown_handle
= ifupdownMain(daemon
=self
.daemon
,
188 config
=configmap_g
, force
=args
.force
,
189 withdepends
=args
.withdepends
,
190 perfmode
=args
.perfmode
,
192 addons_enable
=not args
.noaddons
,
193 statemanager_enable
=not args
.noaddons
,
194 interfacesfile
=self
.interfaces_filename
,
195 interfacesfileiobuf
=self
.interfaces_file_iobuf
,
196 interfacesfileformat
=args
.interfacesfileformat
)
198 ifupdown_handle
.down(['pre-down', 'down', 'post-down'],
199 args
.all
, args
.CLASS
, iflist
,
200 excludepats
=args
.excludepats
,
201 printdependency
=args
.printdependency
,
202 usecurrentconfig
=args
.usecurrentconfig
,
207 def run_query(self
, args
):
208 log
.debug('args = %s' % str(args
))
213 qop
= 'query-checkcurr'
215 qop
= 'query-running'
218 elif args
.syntaxhelp
:
220 elif args
.printdependency
:
221 qop
= 'query-dependency'
222 elif args
.printsavedstate
:
223 qop
= 'query-savedstate'
226 cachearg
= (False if (iflist
or args
.nocache
or args
.syntaxhelp
or
227 (qop
!= 'query-checkcurr' and
228 qop
!= 'query-running')) else True)
229 if not iflist
and qop
== 'query-running':
230 iflist
= [i
for i
in os
.listdir('/sys/class/net/')
231 if os
.path
.isdir('/sys/class/net/%s' % i
)]
232 log
.debug('creating ifupdown object ..')
233 ifupdown_handle
= ifupdownMain(daemon
=self
.daemon
,
235 withdepends
=args
.withdepends
,
236 perfmode
=args
.perfmode
,
238 interfacesfile
=self
.interfaces_filename
,
239 interfacesfileiobuf
=self
.interfaces_file_iobuf
,
240 interfacesfileformat
=args
.interfacesfileformat
,
241 withdefaults
=args
.withdefaults
)
242 # list implies all auto interfaces (this is how ifupdown behaves)
245 ifupdown_handle
.query([qop
], args
.all
, args
.list, args
.CLASS
, iflist
,
246 excludepats
=args
.excludepats
,
247 printdependency
=args
.printdependency
,
248 format
=args
.format
, type=args
.type)
252 def run_reload(self
, args
):
253 log
.debug('args = %s' % str(args
))
256 log
.debug('creating ifupdown object ..')
257 ifupdown_handle
= ifupdownMain(daemon
=self
.daemon
,
259 interfacesfile
=self
.interfaces_filename
,
260 withdepends
=args
.withdepends
,
261 perfmode
=args
.perfmode
,
263 ifupdown_handle
.reload(['pre-up', 'up', 'post-up'],
264 ['pre-down', 'down', 'post-down'],
265 auto
=args
.all
, allow
=args
.CLASS
, ifacenames
=None,
266 excludepats
=args
.excludepats
,
267 usecurrentconfig
=args
.usecurrentconfig
,
268 syntaxcheck
=args
.syntaxcheck
,
269 currentlyup
=args
.currentlyup
)
274 def set_signal_handlers():
275 signal
.signal(signal
.SIGQUIT
, _SIGQUIT
)
276 signal
.signal(signal
.SIGTERM
, _SIGTERM
)
277 signal
.signal(signal
.SIGINT
, _SIGINT
)