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