blob: 8cf9fc1b209502eacc582cfcc0ea117b36a3a63e [file] [log] [blame]
{%- from "keystone/map.jinja" import server with context -%}
#!/bin/bash
usage() {
cat <<EOF
Script for fernet and credential key rotation and sync
For additional help please use: $0 -h or --help
example: $0 -s -t fernet
exit 1
EOF
}
if [ $# -lt "2" ]; then
usage
exit 1
fi
help_usage() {
cat <<EOF
Following options are supported:
-s|--sync Perform keys sync to secondary controller nodes only
-r|--rotate Perform keys rotation on primary controller only
-t|--type Possible values are "fernet" or "credential"
EOF
exit 0
}
POSITIONAL=()
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
-h|--help)
help_usage
shift # pass argument
;;
-s|--sync)
SYNC=true
shift # pass argument
;;
-r|--rotate)
ROTATE=true
shift
;;
-t|--type)
TYPE="$2"
shift
shift
;;
*) # unknown option
echo "Unknown option. Please refer to help section by passing -h or --help option"
exit 1
shift # pass argument
;;
esac
done
set -- "${POSITIONAL[@]}" # restore positional parameters
#Setting variables
START_DATE=`date +%d_%m_%Y-%H_%M`
KEYSTONE_MANAGE_CMD="/usr/bin/keystone-manage"
{%- if server.tokens.fernet_sync_nodes_list is defined %}
{%- set _nodes = [] %}
{%- for node_name, fernet_sync_nodes_list in server.tokens.get('fernet_sync_nodes_list', {}).iteritems() %}
{%- if fernet_sync_nodes_list.get('enabled', False) %}
{%- do _nodes.append(fernet_sync_nodes_list.name) %}
{%- endif %}
{%- endfor %}
NODES="{{ ' '.join(_nodes) }}"
{%- else %}
NODES=""
{%- endif %}
{%- if server.credential.credential_sync_nodes_list is defined %}
{%- set _nodes = [] %}
{%- for node_name, credential_sync_nodes_list in server.credential.get('credential_sync_nodes_list', {}).iteritems() %}
{%- if credential_sync_nodes_list.get('enabled', False) %}
{%- do _nodes.append(credential_sync_nodes_list.name) %}
{%- endif %}
{%- endfor %}
CRED_NODES="{{ ' '.join(_nodes) }}"
{%- else %}
CRED_NODES=""
{%- endif %}
FERNET_DIR="{{ server.get('tokens', {}).get('location', {}) }}/"
CRED_DIR="{{ server.get('credential', {}).get('location', {}) }}/"
run_rsync () {
local sync_dir=$1
local sync_node=$2
rsync -e 'ssh -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' -avz --exclude 0 ${sync_dir} keystone@${sync_node}:${sync_dir}
rsync -e 'ssh -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' -avz --delete-after ${sync_dir} keystone@${sync_node}:${sync_dir}
}
run_keystone () {
local keystone_cmd=$1
${KEYSTONE_MANAGE_CMD} --log-file /var/log/keystone/keystone-rotate.log ${keystone_cmd} --keystone-user keystone --keystone-group keystone
}
if !([[ ${TYPE} == "fernet" ]] || [[ ${TYPE} == "credential" ]]) ; then
echo "Given type is not valid - exiting"
exit 1
fi
echo "Script started at: ${START_DATE}"
if [[ "${ROTATE}" = true ]] ; then
if [[ ${TYPE} == "fernet" ]] ; then
echo "Running in Fernet ROTATE mode"
run_keystone "fernet_rotate"
else
echo "Running in Credential ROTATE mode"
if !(run_keystone "credential_rotate") ; then
echo "Credential rotate exited with fail status, calling credential_migrate and then credential_rotate again"
run_keystone "credential_migrate"
sleep 5
run_keystone "credential_rotate"
fi
fi
fi
if [[ "${SYNC}" = true ]] ; then
if [[ ${TYPE} == "fernet" ]] ; then
echo "Running in Fernet SYNC mode"
if [[ ${NODES} != '' ]]; then
for NODE in ${NODES}; do
echo "${NODE}"
run_rsync "${FERNET_DIR}" "${NODE}"
done
else
echo "List of nodes is not specified, no need for sync, exiting"
exit 0
fi
else
echo "Running in Credential SYNC mode"
if [[ ${CRED_NODES} != '' ]]; then
for NODE in ${CRED_NODES}; do
echo "${NODE}"
run_rsync "${CRED_DIR}" "${NODE}"
done
else
echo "List of nodes is not specified, no need for sync, exiting"
exit 0
fi
fi
fi