File: //var/packages/CMS/target/scripts/sql/create_gpo_view.sql
DROP VIEW IF EXISTS policy;
CREATE VIEW IF NOT EXISTS policy AS
SELECT
gpo.id,
gpo.name,
gpo.desc,
gpo.mtime,
gpo.extra_info,
gpo.setting,
(COALESCE(ds.id, ou.id) NOT NULL) AS linked,
CASE WHEN (COALESCE(ds.id, ou.id) NOT NULL)
THEN gpo.parent_type
ELSE NULL
END AS parent_type,
CASE WHEN (COALESCE(ds.id, ou.id) NOT NULL)
THEN gpo.parent_id
ELSE NULL
END AS parent_id,
COALESCE(ds.hostname, ou.name) AS parent_name
FROM gpo
LEFT JOIN ds
ON
gpo.parent_type=1 AND
gpo.parent_id=ds.id AND
EXISTS(SELECT * FROM ds_linked_gpo_id
WHERE ds_id=ds.id AND linked_gpo_id=gpo.id)
LEFT JOIN ou
ON
gpo.parent_type=2 AND
gpo.parent_id=ou.id AND
EXISTS(SELECT * FROM ou_linked_gpo_id
WHERE ou_id=ou.id AND linked_gpo_id=gpo.id)
;
DROP VIEW IF EXISTS gpo_do_it_later;
CREATE VIEW IF NOT EXISTS gpo_do_it_later AS
SELECT * FROM policy
WHERE linked=0
;
-- There are the polies delegated directly. If you want to get all policies delegated
-- directly and propagately, you should select by delegated_policy.
DROP VIEW IF EXISTS directly_delegated_policy;
CREATE VIEW IF NOT EXISTS directly_delegated_policy AS
SELECT p.*, d.user_type, d.ugid
FROM
policy AS p INNER JOIN
delegate AS d ON
p.parent_type=d.target_type AND
p.parent_id=d.target_id
;
-- All policies including delegated directly and propagately.
--
-- ┌-> Server <----------------[1]---┐
-- User -------┼-> Group <-----------------[2]---┼-------- Policy
-- └-> Group -----> Server <---[3]---┘
-- delegate has apply
DROP VIEW IF EXISTS delegated_policy;
CREATE VIEW IF NOT EXISTS delegated_policy AS
-- Select [1] and [2]
SELECT * FROM directly_delegated_policy
UNION
-- Select [3]
SELECT
policy.*,
delegate.user_type,
delegate.ugid
FROM
policy
-- Find [1] and [3]
INNER JOIN ds ON policy.parent_type=1 AND policy.parent_id=ds.id
-- Use delegated group to filter for [3]
INNER JOIN delegate ON delegate.target_type=2 AND delegate.target_id=ds.parent_id
;
DROP VIEW IF EXISTS ou_linked_gpo_id;
CREATE VIEW IF NOT EXISTS ou_linked_gpo_id AS
SELECT ou.id AS ou_id, json_extract(json_each.value, "$.id") AS linked_gpo_id
FROM
ou LEFT JOIN
json_each(ou.linked_gpo, "$.order")
WHERE json_valid(ou.linked_gpo)
;
DROP VIEW IF EXISTS ds_linked_gpo_id;
CREATE VIEW IF NOT EXISTS ds_linked_gpo_id AS
SELECT ds.id AS ds_id, json_extract(json_each.value, "$.id") AS linked_gpo_id
FROM
ds LEFT JOIN
json_each(ds.linked_gpo, "$.order")
WHERE json_valid(ds.linked_gpo)
;