Cybersecurity
DevOps Cloud (ADM)
IT Operations Cloud
<rule>
<description>Create missing containers on the fly</description>
<comment xml:space="preserve">This policy creates missing containers that are needed to perform the current add or move operation. All containers are created as class "Organizational Unit". If your tree structure uses different classes, change the policy accordingly. It is assumed that all DNs are in slash format. This policy should be used as a publisher command transform policy.</comment>
<conditions>
<or>
<if-xpath op="true">self::add/@dest-dn</if-xpath>
<if-xpath op="true">self::move/parent[not(association)]/@dest-dn</if-xpath>
</or>
</conditions>
<actions>
<do-set-local-variable name="missing-containers">
<arg-node-set/>
</do-set-local-variable>
<do-set-local-variable name="parent-dn">
<arg-string>
<token-xpath expression="self::move/parent/@dest-dn"/>
<token-parse-dn dest-dn-format="slash" length="-2" src-dn-format="slash">
<token-xpath expression="self::add/@dest-dn"/>
</token-parse-dn>
</arg-string>
</do-set-local-variable>
<do-while>
<arg-conditions>
<and>
<if-local-variable mode="regex" name="parent-dn" op="equal">. </if-local-variable>
<if-xpath op="not-true">query:readObject($destQueryProcessor,'',$parent-dn,'','')</if-xpath>
</and>
</arg-conditions>
<arg-actions>
<do-set-local-variable name="missing-containers">
<arg-node-set>
<token-local-variable name="parent-dn"/>
<token-local-variable name="missing-containers"/>
</arg-node-set>
</do-set-local-variable>
<do-set-local-variable name="parent-dn">
<arg-string>
<token-parse-dn dest-dn-format="slash" length="-2" src-dn-format="slash">
<token-local-variable name="parent-dn"/>
</token-parse-dn>
</arg-string>
</do-set-local-variable>
</arg-actions>
</do-while>
<do-for-each>
<arg-node-set>
<token-local-variable name="missing-containers"/>
</arg-node-set>
<arg-actions>
<do-add-dest-object class-name="Organizational Unit" when="before">
<arg-dn>
<token-local-variable name="current-node"/>
</arg-dn>
</do-add-dest-object>
</arg-actions>
</do-for-each>
</actions>
</rule>
<rule>
<description>Create missing containers on the fly (global)</description>
<comment xml:space="preserve">This policy creates missing containers that are needed to perform the current add or move operation. The CGV "dynamic-container-creation" must be set to "true" to enable this rule and the GCV "dynamic-container-default-class" must be set. If containers shall be created as different classes depending on the tree depth, they must be defined in the "dynamic-container-classes" mapping table. It is assumed that all DNs are in slash format. This rule should be placed in a library object and linked into driver configs as a publisher command transform policy.</comment>
<conditions>
<or>
<if-global-variable mode="nocase" name="dynamic-container-creation" op="equal">true</if-global-variable>
</or>
<or>
<if-xpath op="true">self::add/@dest-dn</if-xpath>
<if-xpath op="true">self::move/parent[not(association)]/@dest-dn</if-xpath>
</or>
</conditions>
<actions>
<do-set-local-variable name="missing-containers">
<arg-node-set/>
</do-set-local-variable>
<do-set-local-variable name="parent-dn" scope="policy">
<arg-string>
<token-replace-first regex="^\\~dirxml.auto.treename~\\" replace-with="">
<token-xpath expression="self::move/parent/@dest-dn"/>
<token-parse-dn dest-dn-format="slash" length="-2" src-dn-format="slash">
<token-xpath expression="self::add/@dest-dn"/>
</token-parse-dn>
</token-replace-first>
</arg-string>
</do-set-local-variable>
<do-while>
<arg-conditions>
<and>
<if-local-variable mode="regex" name="parent-dn" op="equal">. </if-local-variable>
<if-xpath op="not-true">query:readObject($destQueryProcessor,'',$parent-dn,'','')</if-xpath>
</and>
</arg-conditions>
<arg-actions>
<do-set-local-variable name="missing-containers">
<arg-node-set>
<token-local-variable name="parent-dn"/>
<token-local-variable name="missing-containers"/>
</arg-node-set>
</do-set-local-variable>
<do-set-local-variable name="parent-dn">
<arg-string>
<token-parse-dn dest-dn-format="slash" length="-2" src-dn-format="slash">
<token-local-variable name="parent-dn"/>
</token-parse-dn>
</arg-string>
</do-set-local-variable>
</arg-actions>
</do-while>
<do-for-each>
<arg-node-set>
<token-local-variable name="missing-containers"/>
</arg-node-set>
<arg-actions>
<do-set-local-variable name="parent-class" scope="policy">
<arg-string>
<token-map default-value="~dynamic-container-default-class~" dest="Class" src="Level" table="..\dynamic-container-classes">
<token-xpath expression='string-length(translate($current-node,"\","*"))'/>
</token-map>
</arg-string>
</do-set-local-variable>
<do-add-dest-object class-name="$parent-class$" when="before">
<arg-dn>
<token-local-variable name="current-node"/>
</arg-dn>
</do-add-dest-object>
</arg-actions>
</do-for-each>
</actions>
</rule>
[...]:DemoDriver PT:
<nds dtdversion="2.0" ndsversion="8.x">
<source>
<product build="20090520_001502" instance="DemoDriver" version="3.5.4">Identity Manager Driver for Lotus Notes</product>
<contact>Novell, Inc.</contact>
</source>
<input>
<move class-name="Group" dest-dn="data\idm\groups\de\muenchen\groups_storage\Testgroup" dest-entry-id="..." event-id="...">
<association>E2D4087C0055768DB32C128D1BA6494C</association>
<parent dest-dn="\IDM-TEST-TREE\data\idm\groups\de\leipzig\groups_storage"/>
</move>
</input>
</nds>
[...]:DemoDriver PT:Applying policy: 'pub-ctp: create missing containers'.
[...]:DemoDriver PT: Applying to move #1.
[...]:DemoDriver PT: Evaluating selection criteria for rule 'Create missing containers on the fly'.
[...]:DemoDriver PT: (if-xpath true "self::add/@dest-dn") = FALSE.
[...]:DemoDriver PT: (if-xpath true "self::move/parent[not(association)]/@dest-dn") = TRUE.
[...]:DemoDriver PT: Rule selected.
[...]:DemoDriver PT: Applying rule 'Create missing containers on the fly'.
[...]:DemoDriver PT: Action: do-set-local-variable("missing-containers",arg-node-set()).
[...]:DemoDriver PT: arg-node-set()
[...]:DemoDriver PT: Arg Value: {}.
[...]:DemoDriver PT: Action: do-set-local-variable("parent-dn",token-xpath("self::move/parent/@dest-dn") token-parse-dn(dest-dn-format="slash",length="-2",src-dn-format="slash",token-xpath("self::add/@dest-dn"))).
[...]:DemoDriver PT: arg-string(token-xpath("self::move/parent/@dest-dn") token-parse-dn(dest-dn-format="slash",length="-2",src-dn-format="slash",token-xpath("self::add/@dest-dn")))
[...]:DemoDriver PT: token-xpath("self::move/parent/@dest-dn")
[...]:DemoDriver PT: Token Value: "\IDM-TEST-TREE\data\idm\groups\de\leipzig\groups_storage".
[...]:DemoDriver PT: token-parse-dn(dest-dn-format="slash",length="-2",src-dn-format="slash",token-xpath("self::add/@dest-dn"))
[...]:DemoDriver PT: token-parse-dn(dest-dn-format="slash",length="-2",src-dn-format="slash",token-xpath("self::add/@dest-dn"))
[...]:DemoDriver PT: token-xpath("self::add/@dest-dn")
[...]:DemoDriver PT: Token Value: "".
[...]:DemoDriver PT: Arg Value: "".
[...]:DemoDriver PT: Token Value: "".
[...]:DemoDriver PT: Arg Value: "\IDM-TEST-TREE\data\idm\groups\de\leipzig\groups_storage".
[...]:DemoDriver PT: Action: do-while().
[...]:DemoDriver PT: Evaluating conditions.
[...]:DemoDriver PT: (if-local-variable 'parent-dn' match ". ") = TRUE.
[...]:DemoDriver PT: Query from policy
[...]:DemoDriver PT:
<nds dtdversion="3.5" ndsversion="8.x">
<source>
<product version="3.6.10.4747">DirXML</product>
<contact>Novell, Inc.</contact>
</source>
<input>
<query dest-dn="\IDM-TEST-TREE\data\idm\groups\de\leipzig\groups_storage" scope="entry">
<read-attr/>
</query>
</input>
</nds>
[...]:DemoDriver PT: Pumping XDS to eDirectory.
[...]:DemoDriver PT: Performing operation query for \IDM-TEST-TREE\data\idm\groups\de\leipzig\groups_storage.
[...]:DemoDriver PT: Query from policy result
[...]:DemoDriver PT:
<nds dtdversion="3.5" ndsversion="8.x">
<source>
<product version="3.6.10.4747">DirXML</product>
<contact>Novell, Inc.</contact>
</source>
<output>
<status event-id="0" level="success"></status>
</output>
</nds>
[...]:DemoDriver PT: (if-xpath not-true "query:readObject($destQueryProcessor,'',$parent-dn,'','')") = TRUE.
[...]:DemoDriver PT: Performing while actions.
[...]:DemoDriver PT: Action: do-set-local-variable("missing-containers",arg-node-set(token-local-variable("parent-dn") token-local-variable("missing-containers"))).
[...]:DemoDriver PT: arg-node-set(token-local-variable("parent-dn") token-local-variable("missing-containers"))
[...]:DemoDriver PT: token-local-variable("parent-dn")
[...]:DemoDriver PT: Token Value: "\IDM-TEST-TREE\data\idm\groups\de\leipzig\groups_storage".
[...]:DemoDriver PT: token-local-variable("missing-containers")
[...]:DemoDriver PT: Token Value: {}.
[...]:DemoDriver PT: Arg Value: {"\IDM-TEST-TREE\data\idm\groups\de\leipzig\g..."}.
[...]:DemoDriver PT: Action: do-set-local-variable("parent-dn",token-parse-dn(dest-dn-format="slash",length="-2",src-dn-format="slash",token-local-variable("parent-dn"))).
[...]:DemoDriver PT: arg-string(token-parse-dn(dest-dn-format="slash",length="-2",src-dn-format="slash",token-local-variable("parent-dn")))
[...]:DemoDriver PT: token-parse-dn(dest-dn-format="slash",length="-2",src-dn-format="slash",token-local-variable("parent-dn"))
[...]:DemoDriver PT: token-parse-dn(dest-dn-format="slash",length="-2",src-dn-format="slash",token-local-variable("parent-dn"))
[...]:DemoDriver PT: token-local-variable("parent-dn")
[...]:DemoDriver PT: Token Value: "\IDM-TEST-TREE\data\idm\groups\de\leipzig\groups_storage".
[...]:DemoDriver PT: Arg Value: "\IDM-TEST-TREE\data\idm\groups\de\leipzig\groups_storage".
[...]:DemoDriver PT: Token Value: "\IDM-TEST-TREE\data\idm\groups\de\leipzig".
[...]:DemoDriver PT: Arg Value: "\IDM-TEST-TREE\data\idm\groups\de\leipzig".
[...]:DemoDriver PT: Evaluating conditions.
[...]:DemoDriver PT: (if-local-variable 'parent-dn' match ". ") = TRUE.
[...]:DemoDriver PT: Query from policy
[...]:DemoDriver PT:
<nds dtdversion="3.5" ndsversion="8.x">
<source>
<product version="3.6.10.4747">DirXML</product>
<contact>Novell, Inc.</contact>
</source>
<input>
<query dest-dn="\IDM-TEST-TREE\data\idm\groups\de\leipzig" scope="entry">
<read-attr/>
</query>
</input>
</nds>
[...]:DemoDriver PT: Pumping XDS to eDirectory.
[...]:DemoDriver PT: Performing operation query for \IDM-TEST-TREE\data\idm\groups\de\leipzig.
[...]:DemoDriver PT: Query from policy result
[...]:DemoDriver PT:
<nds dtdversion="3.5" ndsversion="8.x">
<source>
<product version="3.6.10.4747">DirXML</product>
<contact>Novell, Inc.</contact>
</source>
<output>
<status event-id="0" level="success"></status>
</output>
</nds>
[...]:DemoDriver PT: (if-xpath not-true "query:readObject($destQueryProcessor,'',$parent-dn,'','')") = TRUE.
[...]:DemoDriver PT: Performing while actions.
[...]:DemoDriver PT: Action: do-set-local-variable("missing-containers",arg-node-set(token-local-variable("parent-dn") token-local-variable("missing-containers"))).
[...]:DemoDriver PT: arg-node-set(token-local-variable("parent-dn") token-local-variable("missing-containers"))
[...]:DemoDriver PT: token-local-variable("parent-dn")
[...]:DemoDriver PT: Token Value: "\IDM-TEST-TREE\data\idm\groups\de\leipzig".
[...]:DemoDriver PT: token-local-variable("missing-containers")
[...]:DemoDriver PT: Token Value: {"\IDM-TEST-TREE\data\idm\groups\de\leipzig\g..."}.
[...]:DemoDriver PT: Arg Value: {"\IDM-TEST-TREE\data\idm\groups\de\leipzig","\IDM-TEST-TREE\data\idm\groups\de\leipzig\g..."}.
[...]:DemoDriver PT: Action: do-set-local-variable("parent-dn",token-parse-dn(dest-dn-format="slash",length="-2",src-dn-format="slash",token-local-variable("parent-dn"))).
[...]:DemoDriver PT: arg-string(token-parse-dn(dest-dn-format="slash",length="-2",src-dn-format="slash",token-local-variable("parent-dn")))
[...]:DemoDriver PT: token-parse-dn(dest-dn-format="slash",length="-2",src-dn-format="slash",token-local-variable("parent-dn"))
[...]:DemoDriver PT: token-parse-dn(dest-dn-format="slash",length="-2",src-dn-format="slash",token-local-variable("parent-dn"))
[...]:DemoDriver PT: token-local-variable("parent-dn")
[...]:DemoDriver PT: Token Value: "\IDM-TEST-TREE\data\idm\groups\de\leipzig".
[...]:DemoDriver PT: Arg Value: "\IDM-TEST-TREE\data\idm\groups\de\leipzig".
[...]:DemoDriver PT: Token Value: "\IDM-TEST-TREE\data\idm\groups\de".
[...]:DemoDriver PT: Arg Value: "\IDM-TEST-TREE\data\idm\groups\de".
[...]:DemoDriver PT: Evaluating conditions.
[...]:DemoDriver PT: (if-local-variable 'parent-dn' match ". ") = TRUE.
[...]:DemoDriver PT: Query from policy
[...]:DemoDriver PT:
<nds dtdversion="3.5" ndsversion="8.x">
<source>
<product version="3.6.10.4747">DirXML</product>
<contact>Novell, Inc.</contact>
</source>
<input>
<query dest-dn="\IDM-TEST-TREE\data\idm\groups\de" scope="entry">
<read-attr/>
</query>
</input>
</nds>
[...]:DemoDriver PT: Pumping XDS to eDirectory.
[...]:DemoDriver PT: Performing operation query for \IDM-TEST-TREE\data\idm\groups\de.
[...]:DemoDriver PT: Query from policy result
[...]:DemoDriver PT:
<nds dtdversion="3.5" ndsversion="8.x">
<source>
<product version="3.6.10.4747">DirXML</product>
<contact>Novell, Inc.</contact>
</source>
<output>
<instance class-name="Organizational Unit" event-id="0" qualified-src-dn="O=data\OU=idm\OU=groups\OU=de" src-dn="\IDM-TEST-TREE\data\idm\groups\de" src-entry-id="..."/>
<status event-id="0" level="success"></status>
</output>
</nds>
[...]:DemoDriver PT: (if-xpath not-true "query:readObject($destQueryProcessor,'',$parent-dn,'','')") = FALSE.
[...]:DemoDriver PT: Action: do-for-each(arg-node-set(token-local-variable("missing-containers"))).
[...]:DemoDriver PT: arg-node-set(token-local-variable("missing-containers"))
[...]:DemoDriver PT: token-local-variable("missing-containers")
[...]:DemoDriver PT: Token Value: {"\IDM-TEST-TREE\data\idm\groups\de\leipzig","\IDM-TEST-TREE\data\idm\groups\de\leipzig\g..."}.
[...]:DemoDriver PT: Arg Value: {"\IDM-TEST-TREE\data\idm\groups\de\leipzig","\IDM-TEST-TREE\data\idm\groups\de\leipzig\g..."}.
[...]:DemoDriver PT: Performing actions for local-variable(current-node) = "\IDM-TEST-TREE\data\idm\groups\de\leipzig".
[...]:DemoDriver PT: Action: do-add-dest-object(class-name="Organizational Unit",when="before",arg-dn(token-local-variable("current-node"))).
[...]:DemoDriver PT: arg-dn(token-local-variable("current-node"))
[...]:DemoDriver PT: token-local-variable("current-node")
[...]:DemoDriver PT: Token Value: "\IDM-TEST-TREE\data\idm\groups\de\leipzig".
[...]:DemoDriver PT: Arg Value: "\IDM-TEST-TREE\data\idm\groups\de\leipzig".
[...]:DemoDriver PT: Performing actions for local-variable(current-node) = "\IDM-TEST-TREE\data\idm\groups\de\leipzig\g...".
[...]:DemoDriver PT: Action: do-add-dest-object(class-name="Organizational Unit",when="before",arg-dn(token-local-variable("current-node"))).
[...]:DemoDriver PT: arg-dn(token-local-variable("current-node"))
[...]:DemoDriver PT: token-local-variable("current-node")
[...]:DemoDriver PT: Token Value: "\IDM-TEST-TREE\data\idm\groups\de\leipzig\groups_storage".
[...]:DemoDriver PT: Arg Value: "\IDM-TEST-TREE\data\idm\groups\de\leipzig\groups_storage".
[...]:DemoDriver PT:Policy returned:
[...]:DemoDriver PT:
<nds dtdversion="2.0" ndsversion="8.x">
<source>
<product build="20090520_001502" instance="DemoDriver" version="3.5.4">Identity Manager Driver for Lotus Notes</product>
<contact>Novell, Inc.</contact>
</source>
<input>
<add class-name="Organizational Unit" dest-dn="\IDM-TEST-TREE\data\idm\groups\de\leipzig" event-id="..."/>
<add class-name="Organizational Unit" dest-dn="\IDM-TEST-TREE\data\idm\groups\de\leipzig\groups_storage" event-id="..."/>
<move class-name="Group" dest-dn="data\idm\groups\de\muenchen\groups_storage\Testgroup" dest-entry-id="..." event-id="...">
<association>E2D4087C0055768DB32C128D1BA6494C</association>
<parent dest-dn="\IDM-TEST-TREE\data\idm\groups\de\leipzig\groups_storage"/>
</move>
</input>
</nds>
[...]:DemoDriver PT:Filtering out notification-only attributes.
[...]:DemoDriver PT:Pumping XDS to eDirectory.
[...]:DemoDriver PT:Performing operation add for \IDM-TEST-TREE\data\idm\groups\de\leipzig.
[...]:DemoDriver PT:Adding entry \IDM-TEST-TREE\data\idm\groups\de\leipzig.
[...]:DemoDriver PT:Creating RDN leipzig in context \IDM-TEST-TREE\data\idm\groups\de.
[...]:DemoDriver PT:Performing operation add for \IDM-TEST-TREE\data\idm\groups\de\leipzig\groups_storage.
[...]:DemoDriver PT:Adding entry \IDM-TEST-TREE\data\idm\groups\de\leipzig\groups_storage.
[...]:DemoDriver PT:Creating RDN groups_storage in context \IDM-TEST-TREE\data\idm\groups\de\leipzig.
[...]:DemoDriver PT:Performing operation move for data\idm\groups\de\muenchen\groups_storage\Testgroup.
[...]:DemoDriver PT:Moving entry \IDM-TEST-TREE\data\idm\groups\de\muenchen\groups_storage\Testgroup to \IDM-TEST-TREE\data\idm\groups\de\leipzig\groups_storage.
[...]:DemoDriver PT:
DirXML Log Event -------------------
Driver: \IDM-TEST-TREE\system\idm\drvset01\DemoDriver
Channel: Publisher
Object: (data\idm\groups\de\muenchen\groups_storage\Testgroup)
Status: Success
[...]:DemoDriver PT:
DirXML Log Event -------------------
Driver: \IDM-TEST-TREE\system\idm\drvset01\DemoDriver
Channel: Publisher
Object: (data\idm\groups\de\muenchen\groups_storage\Testgroup)
Status: Success
[...]:DemoDriver PT:
DirXML Log Event -------------------
Driver: \IDM-TEST-TREE\system\idm\drvset01\DemoDriver
Channel: Publisher
Object: (data\idm\groups\de\muenchen\groups_storage\Testgroup)
Status: Success