]>
git.proxmox.com Git - mirror_ifupdown2.git/blob - ifupdown2/sbin/ifupdown2d
3 # Copyright 2017 Cumulus Networks, Inc. All rights reserved.
5 # Roopa Prabhu, roopa@cumulusnetworks.com
6 # Julien Fortin, julien@cumulusnetworks.com
9 # tool to configure network interfaces
25 import ifupdown2
.ifupdown
.argv
27 from ifupdown2
.ifupdown
.log
import log
28 from ifupdown2
.ifupdown
.main
import Ifupdown2
32 from ifupdown
.log
import log
33 from ifupdown
.main
import Ifupdown2
37 shutdown_event
= threading
.Event()
42 self
.working_directory
= '/var/run/ifupdown2d/'
43 self
.server_address
= '/var/run/ifupdown2d/uds'
45 if not os
.path
.exists(self
.working_directory
):
46 log
.info('creating %s' % self
.working_directory
)
47 os
.makedirs(self
.working_directory
, mode
=0755)
49 if os
.path
.exists(self
.server_address
):
50 log
.info('removing uds %s' % self
.server_address
)
51 os
.remove(self
.server_address
)
53 self
.context
= daemon
.DaemonContext(
54 working_directory
=self
.working_directory
,
56 signal
.SIGINT
: self
.signal_handler
,
57 signal
.SIGTERM
: self
.signal_handler
,
58 signal
.SIGQUIT
: self
.signal_handler
,
64 self
.SO_PEERCRED
= socket
.SO_PEERCRED
65 except AttributeError:
66 # powerpc is the only non-generic we care about. alpha, mips,
67 # sparc, and parisc also have non-generic values.
68 machine
= os
.uname()[4]
69 if re
.search(r
'^(ppc|powerpc)', machine
):
76 log
.info('daemonizing ifupdown2d...')
79 log
.info('preloading all necessary modules')
80 self
.preload_imports()
83 log
.info('opening UNIX socket')
84 self
.uds
= socket
.socket(socket
.AF_UNIX
, socket
.SOCK_STREAM
)
85 fcntl
.fcntl(self
.uds
.fileno(), fcntl
.F_SETFD
, fcntl
.FD_CLOEXEC
)
86 except Exception as e
:
87 raise Exception('socket: %s' % str(e
))
89 self
.uds
.bind(self
.server_address
)
90 except Exception as e
:
91 raise Exception('bind: %s' % str(e
))
93 self
.uds
.setsockopt(socket
.SOL_SOCKET
, self
.SO_PASSCRED
, 1)
94 except Exception as e
:
95 raise Exception('setsockopt: %s' % str(e
))
98 except Exception as e
:
99 raise Exception('listen: %s' % str(e
))
100 os
.chmod(self
.server_address
, 0777)
109 def preload_imports():
111 preloading all the necessary modules
112 at first will increase performances
140 import ifupdown2
.ifupdown
.exceptions
141 import ifupdown2
.ifupdown
.graph
142 import ifupdown2
.ifupdown
.iface
143 import ifupdown2
.ifupdown
.iff
144 import ifupdown2
.ifupdown
.ifupdownbase
145 import ifupdown2
.ifupdown
.ifupdownbase
146 import ifupdown2
.ifupdown
.ifupdownconfig
147 import ifupdown2
.ifupdown
.ifupdownflags
148 import ifupdown2
.ifupdown
.ifupdownmain
149 import ifupdown2
.ifupdown
.netlink
150 import ifupdown2
.ifupdown
.networkinterfaces
151 import ifupdown2
.ifupdown
.policymanager
152 import ifupdown2
.ifupdown
.scheduler
153 import ifupdown2
.ifupdown
.statemanager
154 import ifupdown2
.ifupdown
.template
155 import ifupdown2
.ifupdown
.utils
157 import ifupdown2
.ifupdownaddons
.cache
158 import ifupdown2
.ifupdownaddons
.dhclient
159 import ifupdown2
.ifupdownaddons
.mstpctlutil
160 import ifupdown2
.ifupdownaddons
.LinkUtils
161 import ifupdown2
.ifupdownaddons
.modulebase
162 import ifupdown2
.ifupdownaddons
.systemutils
163 import ifupdown2
.ifupdownaddons
.utilsbase
164 except ImportError, e
:
165 raise ImportError('%s - required module not found' % str(e
))
168 def signal_handler(sig
, frame
):
169 log
.info('received %s' % 'SIGINT' if sig
== signal
.SIGINT
else 'SIGTERM')
170 Daemon
.shutdown_event
.set()
173 def user_waiting_for_reply():
174 return not log
.is_syslog()
179 if Daemon
.shutdown_event
.is_set():
180 log
.info("shutdown signal RXed, breaking out loop")
184 (client_socket
, client_address
) = self
.uds
.accept()
185 except socket
.error
as e
:
191 exit(self
.ifupdown2(client_socket
))
193 log
.tx_data(json
.dumps({'pid': pid
}), socket
=client_socket
)
195 start
= datetime
.datetime
.now()
196 status
= os
.WEXITSTATUS(os
.waitpid(pid
, 0)[1])
197 end
= datetime
.datetime
.now()
199 log
.tx_data(json
.dumps({'status': status
}), socket
=client_socket
)
200 client_socket
.close()
202 log
.info('exit status %d - in %ssecs'
203 % (status
, (end
- start
).total_seconds()))
205 except Exception as e
:
209 def get_client_uid(self
, client_socket
):
210 creds
= client_socket
.getsockopt(socket
.SOL_SOCKET
, self
.SO_PEERCRED
, struct
.calcsize('3i'))
211 (pid
, uid
, gid
) = struct
.unpack('3i', creds
)
212 log
.debug('client uid %d' % uid
)
216 def get_client_request(client_socket
):
218 This function handles requests of any length.
220 if the received json is longer than 65k it will be truncated
221 several calls to recv will be needed, we store the data until
222 we can decode them with the json library.
226 log
.debug('waiting for request on client socket')
227 ready
= select
.select([client_socket
], [], [])
229 if ready
and ready
[0] and ready
[0][0] == client_socket
:
230 # data available start reading
231 raw_data
= client_socket
.recv(65536)
234 return json
.loads(raw_data
)
236 # the json is incomplete
237 data
.append(raw_data
)
241 return json
.loads(''.join(data
))
245 def ifupdown2(self
, client_socket
):
247 fcntl
.fcntl(client_socket
.fileno(), fcntl
.F_SETFD
, fcntl
.FD_CLOEXEC
)
249 ifupdown2
= Ifupdown2(daemon
=True, uid
=self
.get_client_uid(client_socket
))
250 ifupdown2
.set_signal_handlers()
252 request
= self
.get_client_request(client_socket
)
253 log
.info('request: %s' % request
['argv'])
255 ifupdown2
.parse_argv(request
['argv'])
256 # adjust the logger with argv
257 ifupdown2
.update_logger(socket
=client_socket
)
260 status
= ifupdown2
.main(request
['stdin'])
261 except Exception as e
:
265 except ifupdown2
.ifupdown
.argv
.ArgvParseError
as e
:
266 log
.update_current_logger(syslog
=False, verbose
=True, debug
=False)
267 log
.set_socket(client_socket
)
270 except Exception as e
:
276 client_socket
.close()
280 if __name__
== '__main__':
283 except Exception as e
:
287 log
.error(traceback
.format_exc())