Commit Hooks#
The Curity Identity Server provides a way to run scripts when a configuration transaction has been committed. This can be useful to run administrative tasks, such as logging, backup or sending external events.
Put the scripts in <IDSVR_HOME>/usr/bin/post-commit-cli-scripts and <IDSVR_HOME>/usr/bin/post-commit-scripts (see details below); no reload or restart is required for the Curity Identity Server to pick them up.
The log file <IDSVR_HOME>/var/log/post-commit-scripts.log contains the output of the scripts and audit-data about running or skipped scripts.
Both types of scripts have access to the environment variables the Curity Identity Server has access to. For the .cli scripts, $EPOCH_TIMESTAMP is also available, with value the epoch timestamp of the script’s execution.
Commit Hook CLI Scripts#
CLI commit hook scripts can be very useful for exporting the current configuration. They take advantage of the Command Line Interface .
The Curity Identity Server executes all .cli files in <IDSVR_HOME>/usr/bin/post-commit-cli-scripts within the command-line-interface context when a configuration change has been committed.
Example: Export a full config backup in xml:
Listing 01 Example post-commit cli-script that creates a config backup
show configuration | display xml | save /tmp/config-backup.${EPOCH_TIMESTAMP}.xml
Example: Create a json file with the current active nodes:
Listing 02 Example post-commit cli-script that stores the service uptime in json format
show environments environment services runtime-service | display json | save /tmp/runtime-service.${EPOCH_TIMESTAMP}.json
Example: export the configuration into multiple xml files:
Listing 03 Example post-commit cli-script that creates a fine-grained config backup, where each sub-tree is in different file.
show configuration profiles profile <authentication-profile-id> | display xml | save /tmp/authentication-profile-backup.${EPOCH_TIMESTAMP}.xml
show configuration profiles profile <token-service-profile-id> | display xml | save /tmp/token-service-profile-backup.${EPOCH_TIMESTAMP}.xml
show configuration facilities | display xml | save /tmp/facilities-backup.${EPOCH_TIMESTAMP}.xml
show configuration processing | display xml | save /tmp/processing-backup.${EPOCH_TIMESTAMP}.xml
show configuration aaa | display xml | save /tmp/aaa-backup.${EPOCH_TIMESTAMP}.xml
show configuration nacm | display xml | save /tmp/nacm-backup.${EPOCH_TIMESTAMP}.xml
CLI scripts that contain the commit command are ignored as they could cause a cyclic behavior.
Commit Hook Scripts#
The Curity Identity Server executes all executable files under <IDSVR_HOME>/usr/bin/post-commit-scripts when a configuration change has been committed.
Example: Send an email to notify of a configuration change.
Listing 04 Example post-commit script that sends an email
#!/bin/bash
T=`date +%s`
ADMIN_EMAIL="admin@example.com"
echo "Sending email to ${ADMIN_EMAIL}"
mail -s "Configuration updated" ${ADMIN_EMAIL} << EOF
AutoGenerated email from Curity Identity Server
Current timestamp: ${T}
EOF
Example: Use the idsh command to export all the procedures and format them to javascript.
Be careful when using idsh within a post-commit script. Accidentally commiting a (non-idempotent) change here could cause an infinite loop.
Listing 05 Example post-commit script that saves all configured procedures into javascript files (Advanced).
#!/bin/bash
T=`date +%s`
TARGET=/tmp/${T}
mkdir -p ${TARGET}
function _export_procedures() {
type=$1
procedures=$(idsh <<< "show configuration processing procedures $type | display-level 1")
while IFS= read -r procedure
do
procedure=$(echo $procedure | sed 's/\;//g')
name=$(echo $procedure | awk '{split($0, column, " "); print column[2]}')
echo "Exporting procedure $type $name"
b64_script=$(idsh <<< "show configuration processing procedures $type $name script")
b64_script=$(echo $b64_script | sed 's/.*script \(.*\);.*/\1/')
mkdir -p $TARGET/$type
echo $b64_script | base64 -D > $TARGET/$type/$name.js
done <<< "$procedures"
}
function _export_procedures_with_subtype() {
type=$1
procedures=$(idsh <<< "show configuration processing procedures $type | display-level 1")
while IFS= read -r procedure
do
procedure=$(echo $procedure | sed 's/\;//g')
name=$(echo $procedure | awk '{split($0, column, " "); print column[2]}')
subtype=$(echo $procedure | awk '{split($0, column, " "); print column[3]}')
echo "Exporting token procedure $type $name"
b64_script=$(idsh <<< "show configuration processing procedures $type $name $subtype script")
b64_script=$(echo $b64_script | sed 's/.*script \(.*\);.*/\1/')
mkdir -p $TARGET/$type/$subtype
echo $b64_script | base64 -D > $TARGET/$type/$subtype/$name.js
done <<< "$procedures"
}
_export_procedures_with_subtype token-procedure
_export_procedures filter-procedure
_export_procedures transformation-procedure
_export_procedures event-listener-procedure
_export_procedures validation-procedure
Since post-commit scripts are run when a transaction has been committed, but before any locks have been released, it is advisable not to run tasks with long durations.