DISPATCH-990: Add/remove policy hostname tree entries Tie hostname lookup tree to life cycle of policy rulesets.
Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/f90c2a80 Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/f90c2a80 Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/f90c2a80 Branch: refs/heads/master Commit: f90c2a805d663fb2ea15a0fec7c70c16ce0aa1aa Parents: e1ae8d3 Author: Chuck Rolke <[email protected]> Authored: Fri May 11 09:22:24 2018 -0400 Committer: Chuck Rolke <[email protected]> Committed: Fri May 11 09:22:24 2018 -0400 ---------------------------------------------------------------------- python/qpid_dispatch_internal/dispatch.py | 4 ++++ python/qpid_dispatch_internal/policy/policy_local.py | 10 ++++++++++ src/dispatch.c | 15 +++++++++++++++ src/policy.c | 14 ++++++++------ src/policy.h | 6 +++--- 5 files changed, 40 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/f90c2a80/python/qpid_dispatch_internal/dispatch.py ---------------------------------------------------------------------- diff --git a/python/qpid_dispatch_internal/dispatch.py b/python/qpid_dispatch_internal/dispatch.py index 4c9123b..609396e 100644 --- a/python/qpid_dispatch_internal/dispatch.py +++ b/python/qpid_dispatch_internal/dispatch.py @@ -78,6 +78,10 @@ class QdDll(ctypes.PyDLL): self._prototype(self.qd_dispatch_policy_c_counts_alloc, c_long, [], check=False) self._prototype(self.qd_dispatch_policy_c_counts_free, None, [c_long], check=False) self._prototype(self.qd_dispatch_policy_c_counts_refresh, None, [c_long, py_object]) + self._prototype(self.qd_dispatch_policy_host_pattern_add, None, [self.qd_dispatch_p, c_char_p]) + self._prototype(self.qd_dispatch_policy_host_pattern_remove, None, [self.qd_dispatch_p, c_char_p]) + self._prototype(self.qd_dispatch_policy_host_pattern_lookup, c_char_p, [self.qd_dispatch_p, c_char_p]) + self._prototype(self.qd_dispatch_register_display_name_service, None, [self.qd_dispatch_p, py_object]) http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/f90c2a80/python/qpid_dispatch_internal/policy/policy_local.py ---------------------------------------------------------------------- diff --git a/python/qpid_dispatch_internal/policy/policy_local.py b/python/qpid_dispatch_internal/policy/policy_local.py index bee0499..cd62072 100644 --- a/python/qpid_dispatch_internal/policy/policy_local.py +++ b/python/qpid_dispatch_internal/policy/policy_local.py @@ -539,6 +539,13 @@ class PolicyLocal(object): self.statsdb[name].update_ruleset(candidate) self._manager.log_info("Updated policy rules for vhost %s" % name) # TODO: ruleset lock + if self.use_hostname_patterns: + agent = self._manager.get_agent() + if name in self.rulesetdb: + # an update. remove existing hostname pattern + agent.qd.qd_dispatch_policy_host_pattern_remove(agent.dispatch, name) + # add new pattern + agent.qd.qd_dispatch_policy_host_pattern_add(agent.dispatch, name) self.rulesetdb[name] = {} self.rulesetdb[name].update(candidate) @@ -550,6 +557,9 @@ class PolicyLocal(object): if name not in self.rulesetdb: raise PolicyError("Policy '%s' does not exist" % name) # TODO: ruleset lock + if self.use_hostname_patterns: + agent = self._manager.get_agent() + agent.qd.qd_dispatch_policy_host_pattern_remove(agent.dispatch, name) del self.rulesetdb[name] # http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/f90c2a80/src/dispatch.c ---------------------------------------------------------------------- diff --git a/src/dispatch.c b/src/dispatch.c index 99469f0..6f82471 100644 --- a/src/dispatch.c +++ b/src/dispatch.c @@ -270,6 +270,21 @@ void qd_dispatch_policy_c_counts_refresh(long ccounts, qd_entity_t *entity) qd_policy_c_counts_refresh(ccounts, entity); } +void qd_dispatch_policy_host_pattern_add(qd_dispatch_t *qd, char *hostPattern) +{ + qd_policy_host_pattern_add(qd->policy, hostPattern); +} + +void qd_dispatch_policy_host_pattern_remove(qd_dispatch_t *qd, char *hostPattern) +{ + qd_policy_host_pattern_remove(qd->policy, hostPattern); +} + +char * qd_dispatch_policy_host_pattern_lookup(qd_dispatch_t *qd, char *hostPattern) +{ + return qd_policy_host_pattern_lookup(qd->policy, hostPattern); +} + qd_error_t qd_dispatch_prepare(qd_dispatch_t *qd) { qd->server = qd_server(qd, qd->thread_count, qd->router_id, qd->sasl_config_path, qd->sasl_config_name); http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/f90c2a80/src/policy.c ---------------------------------------------------------------------- diff --git a/src/policy.c b/src/policy.c index c545f46..77523ce 100644 --- a/src/policy.c +++ b/src/policy.c @@ -834,10 +834,10 @@ bool qd_policy_approve_link_name(const char *username, // Add a hostname to the lookup parse_tree -void qd_policy_host_pattern_add(qd_policy_t *policy, const char *hostPattern) +void qd_policy_host_pattern_add(qd_policy_t *policy, char *hostPattern) { sys_mutex_lock(policy->tree_lock); - void *oldp = qd_parse_tree_add_pattern_str(policy->hostname_tree, hostPattern, (void*)hostPattern); + void *oldp = qd_parse_tree_add_pattern_str(policy->hostname_tree, hostPattern, hostPattern); sys_mutex_unlock(policy->tree_lock); if (oldp) { qd_log(policy->log_source, QD_LOG_INFO, "vhost hostname pattern '%s' replaced existing pattern", hostPattern); @@ -846,7 +846,7 @@ void qd_policy_host_pattern_add(qd_policy_t *policy, const char *hostPattern) // Remove a hostname from the lookup parse_tree -void qd_policy_host_pattern_remove(qd_policy_t *policy, const char *hostPattern) +void qd_policy_host_pattern_remove(qd_policy_t *policy, char *hostPattern) { sys_mutex_lock(policy->tree_lock); void *oldp = qd_parse_tree_remove_pattern_str(policy->hostname_tree, hostPattern); @@ -858,14 +858,16 @@ void qd_policy_host_pattern_remove(qd_policy_t *policy, const char *hostPattern) // Look up a hostname in the lookup parse_tree -const char *qd_policy_host_pattern_lookup(qd_policy_t *policy, const char *hostPattern) +char * qd_policy_host_pattern_lookup(qd_policy_t *policy, char *hostPattern) { void *payload = 0; sys_mutex_lock(policy->tree_lock); bool matched = qd_parse_tree_retrieve_match_str(policy->hostname_tree, hostPattern, &payload); sys_mutex_unlock(policy->tree_lock); - if (!matched) payload = 0; + if (!matched) { + payload = 0; + } qd_log(policy->log_source, QD_LOG_TRACE, "vhost hostname pattern '%s' lookup returned '%s'", hostPattern, (payload ? (char *)payload : "null")); - return (const char *)payload; + return payload; } http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/f90c2a80/src/policy.h ---------------------------------------------------------------------- diff --git a/src/policy.h b/src/policy.h index 66f7ac1..57a64fe 100644 --- a/src/policy.h +++ b/src/policy.h @@ -182,18 +182,18 @@ bool qd_policy_approve_link_name(const char *username, * @param[in] policy qd_policy_t * @param[in] hostPattern the hostname pattern with possible parse_tree wildcards */ -void qd_policy_host_pattern_add(qd_policy_t *policy, const char *hostPattern); +void qd_policy_host_pattern_add(qd_policy_t *policy, char *hostPattern); /** Remove a hostname from the lookup parse_tree * @param[in] policy qd_policy_t * @param[in] hostPattern the hostname pattern with possible parse_tree wildcards */ -void qd_policy_host_pattern_remove(qd_policy_t *policy, const char *hostPattern); +void qd_policy_host_pattern_remove(qd_policy_t *policy, char *hostPattern); /** Look up a hostname in the lookup parse_tree * @param[in] policy qd_policy_t * @param[in] hostname a concrete vhost name * @return the name of the ruleset whose hostname pattern matched this actual hostname */ -const char *qd_policy_host_pattern_lookup(qd_policy_t *policy, const char *hostPattern); +char * qd_policy_host_pattern_lookup(qd_policy_t *policy, char *hostPattern); #endif --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
