Some checks failed
CI / skip-ci-check (pull_request) Successful in 6s
CI / lint-and-test (pull_request) Failing after 9s
CI / ansible-validation (pull_request) Failing after 6s
CI / secret-scanning (pull_request) Successful in 5s
CI / dependency-scan (pull_request) Successful in 8s
CI / sast-scan (pull_request) Failing after 5s
CI / license-check (pull_request) Successful in 11s
CI / vault-check (pull_request) Failing after 6s
CI / playbook-test (pull_request) Failing after 6s
CI / container-scan (pull_request) Failing after 6s
CI / sonar-analysis (pull_request) Failing after 2s
CI / workflow-summary (pull_request) Successful in 4s
Document pve10 static IPs, monitoring stack, and site LXCs; add portfolio to inventory; Mailcow mailbox automation; vault import/export scripts; security audit guides and UniFi DHCP reference. Co-authored-by: Cursor <cursoragent@cursor.com>
63 lines
2.2 KiB
Bash
Executable File
63 lines
2.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Create or update a Mailcow mailbox via API.
|
|
#
|
|
# Usage:
|
|
# make mailcow-mailbox MAILBOX=alerts
|
|
# # or with env (after: source scripts/load-mailcow-vault-env.sh):
|
|
# MAILBOX_LOCAL_PART=notify MAILBOX_NAME="Notify" MAILBOX_PASSWORD='...' ./scripts/mailcow-mailbox.sh
|
|
#
|
|
# Variables (env or make):
|
|
# MAILBOX / MAILBOX_LOCAL_PART — local part (required)
|
|
# MAILBOX_NAME — display name (default: title-case of local part)
|
|
# MAILBOX_PASSWORD — if unset, loaded from vault_mailcow_mailbox_passwords[local_part]
|
|
# MAILBOX_QUOTA — MiB (default 1024)
|
|
# MAILCOW_URL, MAILCOW_DOMAIN, MAILCOW_API_KEY — see load-mailcow-vault-env.sh
|
|
|
|
set -euo pipefail
|
|
|
|
MAILCOW_URL="${MAILCOW_URL:-https://mail.levkine.ca}"
|
|
DOMAIN="${MAILCOW_DOMAIN:-levkine.ca}"
|
|
LOCAL_PART="${MAILBOX_LOCAL_PART:-${MAILBOX:-}}"
|
|
API_KEY="${MAILCOW_API_KEY:-}"
|
|
MAILBOX_PASSWORD="${MAILBOX_PASSWORD:-${ALERTS_PASSWORD:-}}"
|
|
QUOTA="${MAILBOX_QUOTA:-1024}"
|
|
|
|
if [[ -z "${LOCAL_PART}" ]]; then
|
|
echo "Set MAILBOX=localpart or MAILBOX_LOCAL_PART" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z "${API_KEY}" ]]; then
|
|
echo "Set MAILCOW_API_KEY (make mailcow-mailbox loads vault/.env)" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z "${MAILBOX_PASSWORD}" ]]; then
|
|
echo "Set MAILBOX_PASSWORD or add vault_mailcow_mailbox_passwords.${LOCAL_PART} in vault" >&2
|
|
exit 1
|
|
fi
|
|
|
|
DISPLAY_NAME="${MAILBOX_NAME:-$(echo "${LOCAL_PART}" | sed 's/[-_]/ /g' | awk '{for(i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) tolower(substr($i,2)); print}')}"
|
|
|
|
ATTR=$(jq -nc \
|
|
--arg lp "${LOCAL_PART}" \
|
|
--arg dom "${DOMAIN}" \
|
|
--arg name "${DISPLAY_NAME}" \
|
|
--arg pw "${MAILBOX_PASSWORD}" \
|
|
--arg quota "${QUOTA}" \
|
|
'{local_part:$lp,domain:$dom,name:$name,quota:$quota,password:$pw,password2:$pw,active:"1"}')
|
|
|
|
echo "Creating mailbox ${LOCAL_PART}@${DOMAIN} (${DISPLAY_NAME})..."
|
|
RESP=$(curl -sk -w "\n%{http_code}" -X POST "${MAILCOW_URL}/api/v1/add/mailbox" \
|
|
-H "X-API-Key: ${API_KEY}" \
|
|
-d "attr=${ATTR}")
|
|
HTTP_CODE=$(echo "${RESP}" | tail -1)
|
|
BODY=$(echo "${RESP}" | sed '$d')
|
|
echo "${BODY}" | jq . 2>/dev/null || echo "${BODY}"
|
|
if [[ "${HTTP_CODE}" -lt 200 || "${HTTP_CODE}" -ge 300 ]]; then
|
|
echo "Mailcow API HTTP ${HTTP_CODE}" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "Done: ${LOCAL_PART}@${DOMAIN}"
|