You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
262 lines
8.5 KiB
262 lines
8.5 KiB
#!/usr/bin/env sh |
|
|
|
# OpenStack Barbican deploy hook |
|
# |
|
# This requires you to have OpenStackClient and python-barbicanclient |
|
# installed. |
|
# |
|
# You will require Keystone V3 credentials loaded into your environment, which |
|
# could be either password or v3applicationcredential type. |
|
# |
|
# Author: Andy Botting <andy@andybotting.com> |
|
|
|
openstack_deploy() { |
|
_cdomain="$1" |
|
_ckey="$2" |
|
_ccert="$3" |
|
_cca="$4" |
|
_cfullchain="$5" |
|
|
|
_debug _cdomain "$_cdomain" |
|
_debug _ckey "$_ckey" |
|
_debug _ccert "$_ccert" |
|
_debug _cca "$_cca" |
|
_debug _cfullchain "$_cfullchain" |
|
|
|
if ! _exists openstack; then |
|
_err "OpenStack client not found" |
|
return 1 |
|
fi |
|
|
|
_openstack_credentials || return $? |
|
|
|
_info "Generate import pkcs12" |
|
_import_pkcs12="$(_mktemp)" |
|
if ! _openstack_to_pkcs "$_import_pkcs12" "$_ckey" "$_ccert" "$_cca"; then |
|
_err "Error creating pkcs12 certificate" |
|
return 1 |
|
fi |
|
_debug _import_pkcs12 "$_import_pkcs12" |
|
_base64_pkcs12=$(_base64 "multiline" <"$_import_pkcs12") |
|
|
|
secretHrefs=$(_openstack_get_secrets) |
|
_debug secretHrefs "$secretHrefs" |
|
_openstack_store_secret || return $? |
|
|
|
if [ -n "$secretHrefs" ]; then |
|
_info "Cleaning up existing secret" |
|
_openstack_delete_secrets || return $? |
|
fi |
|
|
|
_info "Certificate successfully deployed" |
|
return 0 |
|
} |
|
|
|
_openstack_store_secret() { |
|
if ! openstack secret store --name "$_cdomain." -t 'application/octet-stream' -e base64 --payload "$_base64_pkcs12"; then |
|
_err "Failed to create OpenStack secret" |
|
return 1 |
|
fi |
|
return |
|
} |
|
|
|
_openstack_delete_secrets() { |
|
echo "$secretHrefs" | while read -r secretHref; do |
|
_info "Deleting old secret $secretHref" |
|
if ! openstack secret delete "$secretHref"; then |
|
_err "Failed to delete OpenStack secret" |
|
return 1 |
|
fi |
|
done |
|
return |
|
} |
|
|
|
_openstack_get_secrets() { |
|
if ! secretHrefs=$(openstack secret list -f value --name "$_cdomain." | cut -d' ' -f1); then |
|
_err "Failed to list secrets" |
|
return 1 |
|
fi |
|
echo "$secretHrefs" |
|
} |
|
|
|
_openstack_to_pkcs() { |
|
# The existing _toPkcs command can't allow an empty password, due to sh |
|
# -z test, so copied here and forcing the empty password. |
|
_cpfx="$1" |
|
_ckey="$2" |
|
_ccert="$3" |
|
_cca="$4" |
|
|
|
${ACME_OPENSSL_BIN:-openssl} pkcs12 -export -out "$_cpfx" -inkey "$_ckey" -in "$_ccert" -certfile "$_cca" -password "pass:" |
|
} |
|
|
|
_openstack_credentials() { |
|
_debug "Check OpenStack credentials" |
|
|
|
# If we have OS_AUTH_URL already set in the environment, then assume we want |
|
# to use those, otherwise use stored credentials |
|
if [ -n "$OS_AUTH_URL" ]; then |
|
_debug "OS_AUTH_URL env var found, using environment" |
|
else |
|
_debug "OS_AUTH_URL not found, loading stored credentials" |
|
OS_AUTH_URL="${OS_AUTH_URL:-$(_readaccountconf_mutable OS_AUTH_URL)}" |
|
OS_IDENTITY_API_VERSION="${OS_IDENTITY_API_VERSION:-$(_readaccountconf_mutable OS_IDENTITY_API_VERSION)}" |
|
OS_AUTH_TYPE="${OS_AUTH_TYPE:-$(_readaccountconf_mutable OS_AUTH_TYPE)}" |
|
OS_APPLICATION_CREDENTIAL_ID="${OS_APPLICATION_CREDENTIAL_ID:-$(_readaccountconf_mutable OS_APPLICATION_CREDENTIAL_ID)}" |
|
OS_APPLICATION_CREDENTIAL_SECRET="${OS_APPLICATION_CREDENTIAL_SECRET:-$(_readaccountconf_mutable OS_APPLICATION_CREDENTIAL_SECRET)}" |
|
OS_USERNAME="${OS_USERNAME:-$(_readaccountconf_mutable OS_USERNAME)}" |
|
OS_PASSWORD="${OS_PASSWORD:-$(_readaccountconf_mutable OS_PASSWORD)}" |
|
OS_PROJECT_NAME="${OS_PROJECT_NAME:-$(_readaccountconf_mutable OS_PROJECT_NAME)}" |
|
OS_PROJECT_ID="${OS_PROJECT_ID:-$(_readaccountconf_mutable OS_PROJECT_ID)}" |
|
OS_USER_DOMAIN_NAME="${OS_USER_DOMAIN_NAME:-$(_readaccountconf_mutable OS_USER_DOMAIN_NAME)}" |
|
OS_USER_DOMAIN_ID="${OS_USER_DOMAIN_ID:-$(_readaccountconf_mutable OS_USER_DOMAIN_ID)}" |
|
OS_PROJECT_DOMAIN_NAME="${OS_PROJECT_DOMAIN_NAME:-$(_readaccountconf_mutable OS_PROJECT_DOMAIN_NAME)}" |
|
OS_PROJECT_DOMAIN_ID="${OS_PROJECT_DOMAIN_ID:-$(_readaccountconf_mutable OS_PROJECT_DOMAIN_ID)}" |
|
fi |
|
|
|
# Check each var and either save or clear it depending on whether its set. |
|
# The helps us clear out old vars in the case where a user may want |
|
# to switch between password and app creds |
|
_debug "OS_AUTH_URL" "$OS_AUTH_URL" |
|
if [ -n "$OS_AUTH_URL" ]; then |
|
export OS_AUTH_URL |
|
_saveaccountconf_mutable OS_AUTH_URL "$OS_AUTH_URL" |
|
else |
|
unset OS_AUTH_URL |
|
_clearaccountconf SAVED_OS_AUTH_URL |
|
fi |
|
|
|
_debug "OS_IDENTITY_API_VERSION" "$OS_IDENTITY_API_VERSION" |
|
if [ -n "$OS_IDENTITY_API_VERSION" ]; then |
|
export OS_IDENTITY_API_VERSION |
|
_saveaccountconf_mutable OS_IDENTITY_API_VERSION "$OS_IDENTITY_API_VERSION" |
|
else |
|
unset OS_IDENTITY_API_VERSION |
|
_clearaccountconf SAVED_OS_IDENTITY_API_VERSION |
|
fi |
|
|
|
_debug "OS_AUTH_TYPE" "$OS_AUTH_TYPE" |
|
if [ -n "$OS_AUTH_TYPE" ]; then |
|
export OS_AUTH_TYPE |
|
_saveaccountconf_mutable OS_AUTH_TYPE "$OS_AUTH_TYPE" |
|
else |
|
unset OS_AUTH_TYPE |
|
_clearaccountconf SAVED_OS_AUTH_TYPE |
|
fi |
|
|
|
_debug "OS_APPLICATION_CREDENTIAL_ID" "$OS_APPLICATION_CREDENTIAL_ID" |
|
if [ -n "$OS_APPLICATION_CREDENTIAL_ID" ]; then |
|
export OS_APPLICATION_CREDENTIAL_ID |
|
_saveaccountconf_mutable OS_APPLICATION_CREDENTIAL_ID "$OS_APPLICATION_CREDENTIAL_ID" |
|
else |
|
unset OS_APPLICATION_CREDENTIAL_ID |
|
_clearaccountconf SAVED_OS_APPLICATION_CREDENTIAL_ID |
|
fi |
|
|
|
_secure_debug "OS_APPLICATION_CREDENTIAL_SECRET" "$OS_APPLICATION_CREDENTIAL_SECRET" |
|
if [ -n "$OS_APPLICATION_CREDENTIAL_SECRET" ]; then |
|
export OS_APPLICATION_CREDENTIAL_SECRET |
|
_saveaccountconf_mutable OS_APPLICATION_CREDENTIAL_SECRET "$OS_APPLICATION_CREDENTIAL_SECRET" |
|
else |
|
unset OS_APPLICATION_CREDENTIAL_SECRET |
|
_clearaccountconf SAVED_OS_APPLICATION_CREDENTIAL_SECRET |
|
fi |
|
|
|
_debug "OS_USERNAME" "$OS_USERNAME" |
|
if [ -n "$OS_USERNAME" ]; then |
|
export OS_USERNAME |
|
_saveaccountconf_mutable OS_USERNAME "$OS_USERNAME" |
|
else |
|
unset OS_USERNAME |
|
_clearaccountconf SAVED_OS_USERNAME |
|
fi |
|
|
|
_secure_debug "OS_PASSWORD" "$OS_PASSWORD" |
|
if [ -n "$OS_PASSWORD" ]; then |
|
export OS_PASSWORD |
|
_saveaccountconf_mutable OS_PASSWORD "$OS_PASSWORD" |
|
else |
|
unset OS_PASSWORD |
|
_clearaccountconf SAVED_OS_PASSWORD |
|
fi |
|
|
|
_debug "OS_PROJECT_NAME" "$OS_PROJECT_NAME" |
|
if [ -n "$OS_PROJECT_NAME" ]; then |
|
export OS_PROJECT_NAME |
|
_saveaccountconf_mutable OS_PROJECT_NAME "$OS_PROJECT_NAME" |
|
else |
|
unset OS_PROJECT_NAME |
|
_clearaccountconf SAVED_OS_PROJECT_NAME |
|
fi |
|
|
|
_debug "OS_PROJECT_ID" "$OS_PROJECT_ID" |
|
if [ -n "$OS_PROJECT_ID" ]; then |
|
export OS_PROJECT_ID |
|
_saveaccountconf_mutable OS_PROJECT_ID "$OS_PROJECT_ID" |
|
else |
|
unset OS_PROJECT_ID |
|
_clearaccountconf SAVED_OS_PROJECT_ID |
|
fi |
|
|
|
_debug "OS_USER_DOMAIN_NAME" "$OS_USER_DOMAIN_NAME" |
|
if [ -n "$OS_USER_DOMAIN_NAME" ]; then |
|
export OS_USER_DOMAIN_NAME |
|
_saveaccountconf_mutable OS_USER_DOMAIN_NAME "$OS_USER_DOMAIN_NAME" |
|
else |
|
unset OS_USER_DOMAIN_NAME |
|
_clearaccountconf SAVED_OS_USER_DOMAIN_NAME |
|
fi |
|
|
|
_debug "OS_USER_DOMAIN_ID" "$OS_USER_DOMAIN_ID" |
|
if [ -n "$OS_USER_DOMAIN_ID" ]; then |
|
export OS_USER_DOMAIN_ID |
|
_saveaccountconf_mutable OS_USER_DOMAIN_ID "$OS_USER_DOMAIN_ID" |
|
else |
|
unset OS_USER_DOMAIN_ID |
|
_clearaccountconf SAVED_OS_USER_DOMAIN_ID |
|
fi |
|
|
|
_debug "OS_PROJECT_DOMAIN_NAME" "$OS_PROJECT_DOMAIN_NAME" |
|
if [ -n "$OS_PROJECT_DOMAIN_NAME" ]; then |
|
export OS_PROJECT_DOMAIN_NAME |
|
_saveaccountconf_mutable OS_PROJECT_DOMAIN_NAME "$OS_PROJECT_DOMAIN_NAME" |
|
else |
|
unset OS_PROJECT_DOMAIN_NAME |
|
_clearaccountconf SAVED_OS_PROJECT_DOMAIN_NAME |
|
fi |
|
|
|
_debug "OS_PROJECT_DOMAIN_ID" "$OS_PROJECT_DOMAIN_ID" |
|
if [ -n "$OS_PROJECT_DOMAIN_ID" ]; then |
|
export OS_PROJECT_DOMAIN_ID |
|
_saveaccountconf_mutable OS_PROJECT_DOMAIN_ID "$OS_PROJECT_DOMAIN_ID" |
|
else |
|
unset OS_PROJECT_DOMAIN_ID |
|
_clearaccountconf SAVED_OS_PROJECT_DOMAIN_ID |
|
fi |
|
|
|
if [ "$OS_AUTH_TYPE" = "v3applicationcredential" ]; then |
|
# Application Credential auth |
|
if [ -z "$OS_APPLICATION_CREDENTIAL_ID" ] || [ -z "$OS_APPLICATION_CREDENTIAL_SECRET" ]; then |
|
_err "When using OpenStack application credentials, OS_APPLICATION_CREDENTIAL_ID" |
|
_err "and OS_APPLICATION_CREDENTIAL_SECRET must be set." |
|
_err "Please check your credentials and try again." |
|
return 1 |
|
fi |
|
else |
|
# Password auth |
|
if [ -z "$OS_USERNAME" ] || [ -z "$OS_PASSWORD" ]; then |
|
_err "OpenStack username or password not found." |
|
_err "Please check your credentials and try again." |
|
return 1 |
|
fi |
|
|
|
if [ -z "$OS_PROJECT_NAME" ] && [ -z "$OS_PROJECT_ID" ]; then |
|
_err "When using password authentication, OS_PROJECT_NAME or" |
|
_err "OS_PROJECT_ID must be set." |
|
_err "Please check your credentials and try again." |
|
return 1 |
|
fi |
|
fi |
|
|
|
return 0 |
|
}
|
|
|