]> git.proxmox.com Git - mirror_ifupdown2.git/blob - sbin/ifupdown
More fixes and changes
[mirror_ifupdown2.git] / sbin / ifupdown
1 #!/usr/bin/python
2
3 import sys
4 import os
5 import re
6 import argparse
7 from ifupdown.ifupdownmain import *
8
9 import logging
10
11 lockfile="/run/network/.lock"
12 logger = None
13
14 def run(args, op):
15 logger.debug('args = %s' %str(args))
16
17 try:
18 iflist = args.iflist
19 if len(args.iflist) == 0:
20 iflist = None
21
22 cachearg=(False if (iflist is not None or
23 args.nocache == True or
24 args.perfmode == True)
25 else True)
26
27 logger.debug('creating ifupdown object ..')
28 if op == 'up' or op == 'down' or op == 'reload':
29 ifupdown_handle = ifupdownMain(force=args.force,
30 withdepends=args.withdepends,
31 perfmode=args.perfmode,
32 njobs=args.jobs,
33 dryrun=args.noact,
34 cache=cachearg)
35 elif op == 'query':
36 ifupdown_handle = ifupdownMain(withdepends=args.withdepends,
37 perfmode=args.perfmode,
38 njobs=args.jobs,
39 format=args.format,
40 cache=cachearg)
41
42 logger.debug('calling \'%s\'' %op + ' for all interfaces ..')
43 if op == 'up':
44 ifupdown_handle.up(args.all, args.CLASS, iflist,
45 excludepats=args.excludepats,
46 printdependency=args.printdependency)
47 elif op == 'down':
48 ifupdown_handle.down(args.all, args.CLASS, iflist,
49 excludepats=args.excludepats)
50 elif op == 'query':
51 if args.checkcurstate == True:
52 qtype='query-checkcurr'
53 elif args.presumedstate == True:
54 qtype='query-presumed'
55 elif args.presumedstatedetailed == True:
56 qtype='query-presumeddetailed'
57 elif args.runningstate == True:
58 if iflist is None:
59 iflist = [i for i in os.listdir('/sys/class/net/')
60 if os.path.isdir('/sys/class/net/%s' %i) == True]
61 qtype='query-running'
62 elif args.pretty == True:
63 qtype='query-pretty'
64 else:
65 qtype='query'
66
67 ifupdown_handle.query(qtype, args.all, args.CLASS, iflist,
68 excludepats=args.excludepats,
69 printdependency=args.printdependency)
70 elif op == 'reload':
71 if iflist is not None:
72 raise Exception('iflist is currently not supported with reload')
73 ifupdown_handle.reload(args.all, args.CLASS, iflist,
74 excludepats=args.excludepats,
75 downchangediface=args.downchangediface)
76 except:
77 raise
78
79 def init(args):
80 global logger
81
82 log_level = logging.WARNING
83
84 if args.verbose == True:
85 log_level = logging.INFO
86
87 if args.debug == True:
88 log_level = logging.DEBUG
89
90 try:
91 logging.basicConfig(level=log_level,
92 format='%(levelname)s: %(message)s')
93 logger = logging.getLogger('ifupdown')
94 except:
95 raise
96
97
98 def deinit():
99 {}
100
101 def update_argparser(argparser):
102 """ base parser, common to all commands """
103
104 argparser.add_argument('-a', '--all', action='store_true', required=False,
105 help='process all interfaces marked \"auto\"')
106 argparser.add_argument('iflist', metavar='IFACE',
107 nargs='*', help='interface list separated by spaces')
108
109 argparser.add_argument('-v', '--verbose', dest='verbose',
110 action='store_true', help='verbose')
111 argparser.add_argument('-d', '--debug', dest='debug',
112 action='store_true',
113 help='output debug info')
114 argparser.add_argument('-q', '--quiet', dest='quiet',
115 action='store_true',
116 help=argparse.SUPPRESS)
117 argparser.add_argument('--allow', dest='CLASS',
118 help='ignore non-\"allow-CLASS\" interfaces')
119 argparser.add_argument('--with-depends', dest='withdepends',
120 action='store_true', help='run with all dependent interfaces')
121 argparser.add_argument('--perfmode', dest='perfmode',
122 action='store_true', help=argparse.SUPPRESS)
123 argparser.add_argument('-j', '--jobs', dest='jobs', type=int,
124 default=-1, choices=range(1,12), help=argparse.SUPPRESS)
125 argparser.add_argument('--nocache', dest='nocache', action='store_true',
126 help=argparse.SUPPRESS)
127 argparser.add_argument('-X', '--exclude', dest='excludepats',
128 action='append',
129 help='Exclude interfaces from the list of interfaces' +
130 ' to operate on')
131
132 def update_ifupdown_argparser(argparser):
133 """ common arg parser for ifup and ifdown """
134 argparser.add_argument('-f', '--force', dest='force',
135 action='store_true',
136 help='force run all operations')
137 argparser.add_argument('-n', '--no-act', dest='noact',
138 action='store_true', help='print out what would happen,' +
139 'but don\'t do it')
140 argparser.add_argument('--print-dependency',
141 dest='printdependency', choices=['list', 'dot'],
142 help='print iface dependency')
143
144 def update_ifup_argparser(argparser):
145 update_ifupdown_argparser(argparser)
146
147 def update_ifdown_argparser(argparser):
148 update_ifupdown_argparser(argparser)
149
150 def update_ifquery_argparser(argparser):
151 """ arg parser for ifquery options """
152
153 # -l is same as '-a', only here for backward compatibility
154 argparser.add_argument('-l', '--list', action='store_true', dest='all',
155 help=argparse.SUPPRESS)
156 group = argparser.add_mutually_exclusive_group(required=False)
157 group.add_argument('-r', '--running-state', dest='runningstate',
158 action='store_true',
159 help='query running state of an interface')
160
161 group.add_argument('-c', '--check-state', dest='checkcurstate',
162 action='store_true',
163 help='check running against config of an interface')
164
165 # presumed-state is state maintained by ifupdown
166 group.add_argument('--presumed-state', dest='presumedstate',
167 action='store_true', help=argparse.SUPPRESS)
168
169 # presumed-state-detailed prints all details about the object stored
170 # by ifupdown
171 group.add_argument('--presumed-state-detailed',
172 dest='presumedstatedetailed',
173 action='store_true', help=argparse.SUPPRESS)
174
175 group.add_argument('--format', dest='format', default='nwifaces',
176 choices=['nwifaces', 'json'], help=argparse.SUPPRESS)
177
178 group.add_argument('--pretty', action='store_true', dest='pretty',
179 help='pretty print config file entries')
180
181 argparser.add_argument('--print-dependency',
182 dest='printdependency', choices=['list', 'dot'],
183 help=argparse.SUPPRESS)
184
185 def update_ifreload_argparser(argparser):
186 update_ifupdown_argparser(argparser)
187
188 argparser.add_argument('--down-changediface', dest='downchangediface',
189 action='store_true',
190 help='down interfaces that have changed before bringing them up')
191
192 def parse_args(argsv, op):
193 if op == 'query':
194 descr = 'query interfaces (all or interface list)'
195 else:
196 descr = 'interface management'
197
198 argparser = argparse.ArgumentParser(description=descr)
199 update_argparser(argparser)
200 if op == 'up':
201 update_ifup_argparser(argparser)
202 elif op == 'down':
203 update_ifdown_argparser(argparser)
204 elif op == 'query':
205 update_ifquery_argparser(argparser)
206 elif op == 'reload':
207 update_ifreload_argparser(argparser)
208
209 return argparser.parse_args(argsv)
210
211 def main(argv):
212 """ main function """
213 try:
214 op = None
215 if re.search(r'ifup', argv[0]) != None:
216 op = 'up'
217 elif re.search(r'ifdown', argv[0]) != None:
218 op = 'down'
219 elif re.search(r'ifquery', argv[0]) != None:
220 op = 'query'
221 elif re.search(r'ifreload', argv[0]) != None:
222 op = 'reload'
223 else:
224 print ('Unexpected executable.' +
225 ' Should be \'ifup\' or \'ifdown\' or \'ifquery\'')
226 exit(1)
227
228 # Command line arg parser
229 args = parse_args(argv[1:], op)
230 if len(args.iflist) == 0 and args.all == False:
231 print '\'-a\' option or interface list are required'
232 exit(1)
233
234 if len(args.iflist) > 0 and args.all is True:
235 print '\'-a\' option and interface list are mutually exclusive'
236 exit(1)
237
238 init(args)
239 run(args, op)
240 except Exception, e:
241 if str(e) == '':
242 exit(1)
243
244 if args.debug == True:
245 raise
246 else:
247 logger.error(str(e))
248 print '\nRerun the command with \'-d\' for a detailed errormsg'
249 exit(1)
250 finally:
251 deinit()
252
253 if __name__ == "__main__":
254
255 if not os.geteuid() == 0:
256 print 'Error: Must be root to run this command'
257 exit(1)
258
259 """
260 XXX: Cannot use this. A spawned dhclient process can hold the lock
261 if not utilities.lockFile(lockfile):
262 print 'Another instance of this program is already running.'
263 exit(0)
264 """
265
266 main(sys.argv)