Use env to set environ when starting dnsmasq
Explictly use env to setup needed environment variables for dnsmasq when starting to avoid problems with subprocess mis-interpreting the first command line argument as the executable name. Also update DnsmasqFilter to accept any command that starts with env followed by a set of args that include an equals sign, as long as the next arg is the dnsmasq command. fixes bug #1073253 Change-Id: I8ac08ba2d2309934a67ed2cb28049ed5d3277d63
This commit is contained in:
parent
7aea941005
commit
1d7d733d01
@ -831,7 +831,8 @@ def restart_dhcp(context, dev, network_ref):
|
||||
else:
|
||||
LOG.debug(_('Pid %d is stale, relaunching dnsmasq'), pid)
|
||||
|
||||
cmd = ['FLAGFILE=%s' % FLAGS.dhcpbridge_flagfile,
|
||||
cmd = ['env',
|
||||
'FLAGFILE=%s' % FLAGS.dhcpbridge_flagfile,
|
||||
'NETWORK_ID=%s' % str(network_ref['id']),
|
||||
'dnsmasq',
|
||||
'--strict-order',
|
||||
|
@ -73,19 +73,21 @@ class DnsmasqFilter(CommandFilter):
|
||||
"""Specific filter for the dnsmasq call (which includes env)"""
|
||||
|
||||
def match(self, userargs):
|
||||
if (userargs[0].startswith("FLAGFILE=") and
|
||||
userargs[1].startswith("NETWORK_ID=") and
|
||||
userargs[2] == "dnsmasq"):
|
||||
if (userargs[0] == 'env' and
|
||||
userargs[1].startswith('FLAGFILE=') and
|
||||
userargs[2].startswith('NETWORK_ID=') and
|
||||
userargs[3] == 'dnsmasq'):
|
||||
return True
|
||||
return False
|
||||
|
||||
def get_command(self, userargs):
|
||||
return [self.exec_path] + userargs[3:]
|
||||
dnsmasq_pos = userargs.index('dnsmasq')
|
||||
return [self.exec_path] + userargs[dnsmasq_pos + 1:]
|
||||
|
||||
def get_environment(self, userargs):
|
||||
env = os.environ.copy()
|
||||
env['FLAGFILE'] = userargs[0].split('=')[-1]
|
||||
env['NETWORK_ID'] = userargs[1].split('=')[-1]
|
||||
env['FLAGFILE'] = userargs[1].split('=')[-1]
|
||||
env['NETWORK_ID'] = userargs[2].split('=')[-1]
|
||||
return env
|
||||
|
||||
|
||||
|
@ -55,7 +55,7 @@ class RootwrapTestCase(test.TestCase):
|
||||
self.assertTrue(filtermatch is None)
|
||||
|
||||
def test_DnsmasqFilter(self):
|
||||
usercmd = ['FLAGFILE=A', 'NETWORK_ID=foobar', 'dnsmasq', 'foo']
|
||||
usercmd = ['env', 'FLAGFILE=A', 'NETWORK_ID=foobar', 'dnsmasq', 'foo']
|
||||
f = filters.DnsmasqFilter("/usr/bin/dnsmasq", "root")
|
||||
self.assertTrue(f.match(usercmd))
|
||||
self.assertEqual(f.get_command(usercmd), ['/usr/bin/dnsmasq', 'foo'])
|
||||
|
Loading…
Reference in New Issue
Block a user