]>
git.proxmox.com Git - mirror_ifupdown2.git/blob - ifupdown2/__main__.py
3 # Copyright 2016 Cumulus Networks, Inc. All rights reserved.
4 # Author: Julien Fortin, julien@cumulusnetworks.com
19 import ifupdown2
.ifupdown
.config
as core_config
20 from ifupdown2
.ifupdown
.log
import log
21 from ifupdown2
import __version__
23 core_config
.__version
__ = __version__
25 import ifupdown
.config
as core_config
26 from ifupdown
.log
import log
28 core_config
.__version
__ = __import__('__init__').__version
__
31 class Ifupdown2Complete(Exception):
32 def __init__(self
, status
):
36 class Ifupdown2Client
:
37 def __init__(self
, argv
):
45 self
.socket
= socket
.socket(socket
.AF_UNIX
, socket
.SOCK_STREAM
)
47 self
.socket
.connect('/var/run/ifupdown2d/uds')
49 signal
.signal(signal
.SIGINT
, self
.signal_handler
)
50 signal
.signal(signal
.SIGTERM
, self
.signal_handler
)
51 signal
.signal(signal
.SIGQUIT
, self
.signal_handler
)
54 self
.SO_PEERCRED
= socket
.SO_PEERCRED
55 except AttributeError:
56 # powerpc is the only non-generic we care about. alpha, mips,
57 # sparc, and parisc also have non-generic values.
58 machine
= os
.uname()[4]
59 if re
.search(r
'^(ppc|powerpc)', machine
):
66 self
.socket
.setsockopt(socket
.SOL_SOCKET
, self
.SO_PASSCRED
, 1)
67 except Exception as e
:
68 raise Exception('setsockopt: %s' % str(e
))
74 ERROR: %s could not connect to ifupdown2d
76 Try starting ifupdown2d with:
77 sudo systemctl start ifupdown2d
79 To configure ifupdown2d to start when the box boots:
80 sudo systemctl enable ifupdown2d
87 def signal_handler(self
, sig
, frame
):
88 if self
.daemon_pid
> 0:
89 os
.kill(self
.daemon_pid
, sig
)
92 ready
= select
.select([self
.socket
], [], [])
93 if ready
and ready
[0] and ready
[0][0] == self
.socket
:
94 d
= self
.socket
.recv(65536)
102 def get_packets(self
):
104 ifupdown2 output is divided into "json packets"
105 the first 4 bytes is the size of the next json
109 data_size
= len(self
.data
)
111 raise Ifupdown2Complete(status
=1)
116 packet_len
= struct
.unpack('=I', self
.data
[:self
.HEADER_SIZE
])[0]
117 packet_data
= self
.data
[self
.HEADER_SIZE
:packet_len
+ self
.HEADER_SIZE
]
119 fmt
= "=%ds" % packet_len
121 packets
.append(json
.loads(struct
.unpack(fmt
, packet_data
)[0]))
123 self
.data
= self
.data
[self
.HEADER_SIZE
+ packet_len
:]
124 data_size
-= self
.HEADER_SIZE
+ packet_len
129 def process_packets(self
, packets
):
130 for packet
in packets
:
132 self
.daemon_pid
= packet
['pid']
133 if 'stdout' in packet
:
134 sys
.stdout
.write(packet
['stdout'])
135 if 'stderr' in packet
:
136 sys
.stderr
.write(packet
['stderr'])
137 if 'status' in packet
:
138 raise Ifupdown2Complete(packet
['status'])
143 for arg
in ['-i', '--interfaces']:
145 if self
.argv
[self
.argv
.index(arg
) + 1] == '-':
146 self
.stdin
= sys
.stdin
.read()
148 except (ValueError, IndexError):
151 self
.socket
.send(json
.dumps({
160 self
.process_packets(self
.get_packets())
161 except Ifupdown2Complete
as e
:
164 except Exception as e
:
165 if ((isinstance(e
.args
, tuple) and e
[0] == 4)
166 or (hasattr(e
, 'errno') and e
.errno
== errno
.EINTR
)):
170 except Exception as e
:
171 sys
.stderr
.write(str(e
))
174 return status
if status
!= None else 1
177 def ifupdown2_standalone():
179 import ifupdown2
.ifupdown
.main
as main_ifupdown2
181 import ifupdown
.main
as main_ifupdown2
182 ifupdown2
= main_ifupdown2
.Ifupdown2(daemon
=False, uid
=os
.geteuid())
183 ifupdown2
.parse_argv(sys
.argv
)
184 ifupdown2
.update_logger()
185 return ifupdown2
.main()
190 if 'use_daemon=yes' in open(core_config
.IFUPDOWN2_CONF_PATH
).read():
191 return Ifupdown2Client(sys
.argv
).run()
193 return ifupdown2_standalone()
194 except KeyboardInterrupt:
196 except Exception as e
:
201 if __name__
== '__main__':
204 except KeyboardInterrupt: