Fix rootwrap filter for dnsmasq when no namespace is used
Fixes bug 1055384 Change-Id: I98381299f28da0e4c443efd4c22ba551022e0288
This commit is contained in:
parent
1a2467ba6d
commit
43f6bbb302
@ -9,7 +9,7 @@
|
|||||||
[Filters]
|
[Filters]
|
||||||
|
|
||||||
# dhcp-agent
|
# dhcp-agent
|
||||||
ip_exec_dnsmasq: DnsmasqFilter, /sbin/ip, root
|
ip_exec_dnsmasq: DnsmasqNetnsFilter, /sbin/ip, root
|
||||||
dnsmasq: DnsmasqFilter, /sbin/dnsmasq, root
|
dnsmasq: DnsmasqFilter, /sbin/dnsmasq, root
|
||||||
dnsmasq_usr: DnsmasqFilter, /usr/sbin/dnsmasq, root
|
dnsmasq_usr: DnsmasqFilter, /usr/sbin/dnsmasq, root
|
||||||
# dhcp-agent uses kill as well, that's handled by the generic KillFilter
|
# dhcp-agent uses kill as well, that's handled by the generic KillFilter
|
||||||
|
@ -81,23 +81,17 @@ class DnsmasqFilter(CommandFilter):
|
|||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def is_ip_netns_cmd(self, argv):
|
def is_dnsmasq_env_vars(self, argv):
|
||||||
if ((argv[0] == "ip") and
|
if (argv[0].startswith("QUANTUM_RELAY_SOCKET_PATH=") and
|
||||||
(argv[1] == "netns") and
|
argv[1].startswith("QUANTUM_NETWORK_ID=")):
|
||||||
(argv[2] == "exec")):
|
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def match(self, userargs):
|
def match(self, userargs):
|
||||||
"""This matches the combination of the leading env
|
"""This matches the combination of the leading env
|
||||||
vars, plus either "dnsmasq" (for the case where we're
|
vars plus "dnsmasq" """
|
||||||
not using netns) or "ip" "netns" "exec" <foo> "dnsmasq"
|
if (self.is_dnsmasq_env_vars(userargs) and
|
||||||
(for the case where we are)"""
|
self.is_dnsmasq_cmd(userargs[2:])):
|
||||||
if ((userargs[0].startswith("QUANTUM_RELAY_SOCKET_PATH=") and
|
|
||||||
userargs[1].startswith("QUANTUM_NETWORK_ID=") and
|
|
||||||
(self.is_dnsmasq_cmd(userargs[2:]) or
|
|
||||||
(self.is_ip_netns_cmd(userargs[2:]) and
|
|
||||||
self.is_dnsmasq_cmd(userargs[6:]))))):
|
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@ -111,6 +105,26 @@ class DnsmasqFilter(CommandFilter):
|
|||||||
return env
|
return env
|
||||||
|
|
||||||
|
|
||||||
|
class DnsmasqNetnsFilter(DnsmasqFilter):
|
||||||
|
"""Specific filter for the dnsmasq call (which includes env)"""
|
||||||
|
|
||||||
|
def is_ip_netns_cmd(self, argv):
|
||||||
|
if ((argv[0] == "ip") and
|
||||||
|
(argv[1] == "netns") and
|
||||||
|
(argv[2] == "exec")):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def match(self, userargs):
|
||||||
|
"""This matches the combination of the leading env
|
||||||
|
vars plus "ip" "netns" "exec" <foo> "dnsmasq" """
|
||||||
|
if (self.is_dnsmasq_env_vars(userargs) and
|
||||||
|
self.is_ip_netns_cmd(userargs[2:]) and
|
||||||
|
self.is_dnsmasq_cmd(userargs[6:])):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
class KillFilter(CommandFilter):
|
class KillFilter(CommandFilter):
|
||||||
"""Specific filter for the kill calls.
|
"""Specific filter for the kill calls.
|
||||||
1st argument is the user to run /bin/kill under
|
1st argument is the user to run /bin/kill under
|
||||||
|
@ -65,6 +65,17 @@ class RootwrapTestCase(unittest.TestCase):
|
|||||||
self.assertEqual(env.get('QUANTUM_RELAY_SOCKET_PATH'), 'A')
|
self.assertEqual(env.get('QUANTUM_RELAY_SOCKET_PATH'), 'A')
|
||||||
self.assertEqual(env.get('QUANTUM_NETWORK_ID'), 'foobar')
|
self.assertEqual(env.get('QUANTUM_NETWORK_ID'), 'foobar')
|
||||||
|
|
||||||
|
def test_DnsmasqNetnsFilter(self):
|
||||||
|
usercmd = ['QUANTUM_RELAY_SOCKET_PATH=A', 'QUANTUM_NETWORK_ID=foobar',
|
||||||
|
'ip', 'netns', 'exec', 'foo', 'dnsmasq', 'foo']
|
||||||
|
f = filters.DnsmasqNetnsFilter("/sbin/ip", "root")
|
||||||
|
self.assertTrue(f.match(usercmd))
|
||||||
|
self.assertEqual(f.get_command(usercmd), ['/sbin/ip', 'netns', 'exec',
|
||||||
|
'foo', 'dnsmasq', 'foo'])
|
||||||
|
env = f.get_environment(usercmd)
|
||||||
|
self.assertEqual(env.get('QUANTUM_RELAY_SOCKET_PATH'), 'A')
|
||||||
|
self.assertEqual(env.get('QUANTUM_NETWORK_ID'), 'foobar')
|
||||||
|
|
||||||
def test_KillFilter(self):
|
def test_KillFilter(self):
|
||||||
p = utils.subprocess_popen(["/bin/sleep", "5"])
|
p = utils.subprocess_popen(["/bin/sleep", "5"])
|
||||||
f = filters.KillFilter("root", "/bin/sleep", "-9", "-HUP")
|
f = filters.KillFilter("root", "/bin/sleep", "-9", "-HUP")
|
||||||
|
Loading…
Reference in New Issue
Block a user