committed by
GitHub
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 144 additions and 0 deletions
@ -0,0 +1,144 @@ |
|||
#!/usr/bin/bash |
|||
|
|||
# Deploy certificates to a Proxmox Mail Gateway using the API. |
|||
# |
|||
# Environment variables that can be set are: |
|||
# `DEPLOY_PROXMOXMG_SERVER`: The hostname of the proxmox backup server. Defaults to |
|||
# _cdomain. |
|||
# `DEPLOY_PROXMOXMG_SERVER_PORT`: The port number the management interface is on. |
|||
# Defaults to 8006. |
|||
# `DEPLOY_PROXMOXMG_USER`: The user we'll connect as. Defaults to root. |
|||
# `DEPLOY_PROXMOXMG_USER_REALM`: The authentication realm the user authenticates |
|||
# with. Defaults to pam. |
|||
# `DEPLOY_PROXMOXMG_PASSWORD`: The password for the user account. Required. |
|||
# `DEPLOY_PROXMOXMG_CERTIFICATE_TYPE`: Certificate type to deploy. Either 'api' or |
|||
# 'smtp'. Defaults to 'api'. |
|||
|
|||
proxmoxmg_deploy() { |
|||
_cdomain="$1" |
|||
_ckey="$2" |
|||
_ccert="$3" |
|||
_cca="$4" |
|||
_cfullchain="$5" |
|||
|
|||
_debug _cdomain "$_cdomain" |
|||
_debug2 _ckey "$_ckey" |
|||
_debug _ccert "$_ccert" |
|||
_debug _cca "$_cca" |
|||
_debug _cfullchain "$_cfullchain" |
|||
|
|||
# "Sane" defaults. |
|||
_getdeployconf DEPLOY_PROXMOXMG_SERVER |
|||
if [ -z "$DEPLOY_PROXMOXMG_SERVER" ]; then |
|||
_target_hostname="$_cdomain" |
|||
else |
|||
_target_hostname="$DEPLOY_PROXMOXMG_SERVER" |
|||
_savedeployconf DEPLOY_PROXMOXMG_SERVER "$DEPLOY_PROXMOXMG_SERVER" |
|||
fi |
|||
_debug2 DEPLOY_PROXMOXMG_SERVER "$_target_hostname" |
|||
|
|||
_getdeployconf DEPLOY_PROXMOXMG_SERVER_PORT |
|||
if [ -z "$DEPLOY_PROXMOXMG_SERVER_PORT" ]; then |
|||
_target_port="8006" |
|||
else |
|||
_target_port="$DEPLOY_PROXMOXMG_SERVER_PORT" |
|||
_savedeployconf DEPLOY_PROXMOXMG_SERVER_PORT "$DEPLOY_PROXMOXMG_SERVER_PORT" |
|||
fi |
|||
_debug2 DEPLOY_PROXMOXMG_SERVER_PORT "$_target_port" |
|||
|
|||
# More "sane" defaults. |
|||
_getdeployconf DEPLOY_PROXMOXMG_USER |
|||
if [ -z "$DEPLOY_PROXMOXMG_USER" ]; then |
|||
_proxmoxmg_user="root" |
|||
else |
|||
_proxmoxmg_user="$DEPLOY_PROXMOXMG_USER" |
|||
_savedeployconf DEPLOY_PROXMOXMG_USER "$DEPLOY_PROXMOXMG_USER" |
|||
fi |
|||
_debug2 DEPLOY_PROXMOXMG_USER "$_proxmoxmg_user" |
|||
|
|||
_getdeployconf DEPLOY_PROXMOXMG_USER_REALM |
|||
if [ -z "$DEPLOY_PROXMOXMG_USER_REALM" ]; then |
|||
_proxmoxmg_user_realm="pam" |
|||
else |
|||
_proxmoxmg_user_realm="$DEPLOY_PROXMOXMG_USER_REALM" |
|||
_savedeployconf DEPLOY_PROXMOXMG_USER_REALM "$DEPLOY_PROXMOXMG_USER_REALM" |
|||
fi |
|||
_debug2 DEPLOY_PROXMOXMG_USER_REALM "$_proxmoxmg_user_realm" |
|||
|
|||
# This is required. |
|||
_getdeployconf DEPLOY_PROXMOXMG_PASSWORD |
|||
if [ -z "$DEPLOY_PROXMOXMG_PASSWORD" ]; then |
|||
_err "User password not provided." |
|||
return 1 |
|||
else |
|||
_proxmoxmg_password="$DEPLOY_PROXMOXMG_PASSWORD" |
|||
_savedeployconf DEPLOY_PROXMOXMG_PASSWORD "$DEPLOY_PROXMOXMG_PASSWORD" |
|||
fi |
|||
_debug2 DEPLOY_PROXMOXMG_PASSWORD "$_proxmoxmg_password" |
|||
|
|||
_getdeployconf DEPLOY_PROXMOXMG_CERTIFICATE_TYPE |
|||
if [ -z "$DEPLOY_PROXMOXMG_CERTIFICATE_TYPE" ]; then |
|||
_target_certificate_type="api" |
|||
else |
|||
_target_certificate_type="$DEPLOY_PROXMOXMG_CERTIFICATE_TYPE" |
|||
_savedeployconf DEPLOY_PROXMOXMG_CERTIFICATE_TYPE "$DEPLOY_PROXMOXMG_CERTIFICATE_TYPE" |
|||
fi |
|||
_debug2 DEPLOY_PROXMOXMG_CERTIFICATE_TYPE "$_target_certificate_type" |
|||
|
|||
# Complete URL. |
|||
_target_url="https://${_target_hostname}:${_target_port}/api2/json/nodes/localhost/certificates/custom/${_target_certificate_type}" |
|||
_debug TARGET_URL "$_target_url" |
|||
|
|||
# PMG API Ticket retrieval. |
|||
_debug2 "Retrieve API Ticket" |
|||
response=$(_post "{\"username\":\"${_proxmoxmg_user}@${_proxmoxmg_user_realm}\",\"password\":\"${_proxmoxmg_password}\"}" "https://${_target_hostname}:${_target_port}/api2/json/access/ticket" "" POST "application/json") |
|||
_retval=$? |
|||
if [ "${_retval}" -ne 0 ]; then |
|||
_err "Proxmox Mail Gateway API authentication failed." |
|||
_debug "Response" "$response" |
|||
return 1 |
|||
fi |
|||
|
|||
# Extract ticket and CSRFPreventionToken from response. |
|||
_proxmoxmg_ticket=$(echo "$response" | _egrep_o '"ticket"\s*:\s*"[^\"]+"' | cut -d'"' -f4) |
|||
_proxmoxmg_csrf_token=$(echo "$response" | _egrep_o '"CSRFPreventionToken"\s*:\s*"[^\"]+"' | cut -d'"' -f4) |
|||
|
|||
_debug2 "_proxmoxmg_ticket" "$_proxmoxmg_ticket" |
|||
_debug2 "_proxmoxmg_csrf_token" "$_proxmoxmg_csrf_token" |
|||
|
|||
_proxmoxmg_header_api_token="Cookie: PMGAuthCookie=${_proxmoxmg_ticket}" |
|||
_debug2 "Auth Header" "$_proxmoxmg_header_api_token" |
|||
# Ugly. I hate putting heredocs inside functions because heredocs don't |
|||
# account for whitespace correctly but it _does_ work and is several times |
|||
# cleaner than anything else I had here. |
|||
# |
|||
# This dumps the json payload to a variable that should be passable to the |
|||
# _psot function. |
|||
_json_payload=$( |
|||
cat <<HEREDOC |
|||
{ |
|||
"certificates": "$(tr '\n' ':' <"$_cfullchain" | sed 's/:/\\n/g')", |
|||
"key": "$(tr '\n' ':' <"$_ckey" | sed 's/:/\\n/g')", |
|||
"restart":true, |
|||
"force":true |
|||
} |
|||
HEREDOC |
|||
) |
|||
_debug2 Payload "$_json_payload" |
|||
|
|||
_info "Push certificates to server" |
|||
export _H1="${_proxmoxmg_header_api_token}" |
|||
export _H2="CSRFPreventionToken: ${_proxmoxmg_csrf_token}" |
|||
response=$(_post "$_json_payload" "$_target_url" "" POST "application/json") |
|||
_retval=$? |
|||
if [ "${_retval}" -eq 0 ]; then |
|||
_debug3 response "$response" |
|||
_info "Certificate successfully deployed" |
|||
return 0 |
|||
else |
|||
_err "Certificate deployment failed" |
|||
_debug "Response" "$response" |
|||
return 1 |
|||
fi |
|||
|
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue