def kill_dnsmasq(config):
# There can be more than one bound to it, especially if libvirt was used..
# Easy way: started from (previous) run of manifest_api.
if config['PXE_INTERFACE'] is None:
return
try:
with open(config['DNSMASQ_PIDFILE'], 'r') as f:
pid = int(f.read())
kill_pid(pid, 'dnsmasq')
except Exception: # a valiant effort in vain
pass
# Hard way: track down dnsmasq(s) attached to the configured interface.
pxe_interface = config['PXE_INTERFACE']
if pxe_interface not in NIF.interfaces():
return
tmp = NIF.ifaddresses(pxe_interface).get(NIF.AF_INET, None)
if tmp is None: # ASS-U-MES "torms" address bound here
return
pxe_addr = tmp[0]['addr']
# libvirt bridge will always have DNS (53). A truly simple net definition
# won't have TFTP (69) but others might. Obviously one started from here
# will have TFTP. And /etc/init.d/dnsmasq starts a *.* DNS listener
# which picks up PXE_INTERFACE when explicitly bound processes are killed.
# net_connections returns an object with a laddr field that's a tuple
# of (listenaddress, port). Filter on that.
openconns = [(c.laddr[1], c.pid) # port, pid
for c in psutil.net_connections(kind='inet4')
if c.laddr[1] in (53, 69) and (
c.laddr[0] == pxe_addr or c.laddr[0] == '0.0.0.0'
)]
pids = set(c[1] for c in openconns)
if pids:
mainapp.logger.info('Killing %d copies of dnsmasq' % len(pids))
while len(pids):
pid = pids.pop()
kill_pid(pid, 'dnsmasq') # Until someone starts using bind9...
manifest_api.py 文件源码
python
阅读 21
收藏 0
点赞 0
评论 0
评论列表
文章目录