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
							 | 
						|
								}
							 |