diff --git a/kubernetes/apps/default/sabnzbd/app/externalsecret.yaml b/kubernetes/apps/default/sabnzbd/app/externalsecret.yaml index 6cd24098..e9b36cbc 100644 --- a/kubernetes/apps/default/sabnzbd/app/externalsecret.yaml +++ b/kubernetes/apps/default/sabnzbd/app/externalsecret.yaml @@ -13,8 +13,15 @@ spec: template: engineVersion: v2 data: + CROSS_SEED_API_KEY: "{{ .CROSS_SEED_API_KEY }}" + PUSHOVER_TOKEN: "{{ .sabz_token }}" + PUSHOVER_USER_KEY: "{{ .userkey_jahanson }}" SABNZBD__API_KEY: "{{ .api_key }}" SABNZBD__NZB_KEY: "{{ .nzb_key }}" dataFrom: + - extract: + key: cross-seed + - extract: + key: pushover - extract: key: sabnzbd diff --git a/kubernetes/apps/default/sabnzbd/app/helmrelease.yaml b/kubernetes/apps/default/sabnzbd/app/helmrelease.yaml index 7e52600d..f6c0cec4 100644 --- a/kubernetes/apps/default/sabnzbd/app/helmrelease.yaml +++ b/kubernetes/apps/default/sabnzbd/app/helmrelease.yaml @@ -22,6 +22,11 @@ spec: remediation: retries: 3 strategy: rollback + dependsOn: + - name: rook-ceph-cluster + namespace: rook-ceph + - name: volsync + namespace: volsync-system values: controllers: sabnzbd: @@ -43,6 +48,11 @@ spec: sabnzbd.default.svc.cluster.local, sabz.jahanson.tech, sabnzbd.jahanson.tech + CROSS_SEED_ENABLED: true + CROSS_SEED_HOST: cross-seed.qbittorrent.svc.cluster.local + CROSS_SEED_PORT: 80 + CROSS_SEED_SLEEP_INTERVAL: 30 + PUSHOVER_ENABLED: true envFrom: - secretRef: name: sabnzbd-secret @@ -70,14 +80,15 @@ spec: cpu: 100m limits: memory: 16Gi - pod: - securityContext: - runAsUser: 568 - runAsGroup: 568 - runAsNonRoot: true - fsGroup: 568 - fsGroupChangePolicy: OnRootMismatch - supplementalGroups: [10000] + defaultPodOptions: + securityContext: + runAsNonRoot: true + runAsUser: 568 + runAsGroup: 568 + fsGroup: 568 + fsGroupChangePolicy: OnRootMismatch + supplementalGroups: [10000] + seccompProfile: { type: RuntimeDefault } service: app: controller: sabnzbd @@ -104,6 +115,12 @@ spec: existingClaim: sabnzbd tmp: type: emptyDir + scripts: + type: configMap + name: sabnzbd-scripts + defaultMode: 0775 + globalMounts: + - readOnly: true media: type: nfs server: 10.1.1.13 diff --git a/kubernetes/apps/default/sabnzbd/app/kustomization.yaml b/kubernetes/apps/default/sabnzbd/app/kustomization.yaml index be13d2db..744f3931 100644 --- a/kubernetes/apps/default/sabnzbd/app/kustomization.yaml +++ b/kubernetes/apps/default/sabnzbd/app/kustomization.yaml @@ -6,3 +6,11 @@ resources: - ./externalsecret.yaml - ./helmrelease.yaml - ../../../../templates/volsync +configMapGenerator: + - name: sabnzbd-scripts + files: + - post-process.sh=./resources/post-process.sh +generatorOptions: + disableNameSuffixHash: true + annotations: + kustomize.toolkit.fluxcd.io/substitute: disabled diff --git a/kubernetes/apps/default/sabnzbd/app/resources/post-process.sh b/kubernetes/apps/default/sabnzbd/app/resources/post-process.sh new file mode 100644 index 00000000..03b6904c --- /dev/null +++ b/kubernetes/apps/default/sabnzbd/app/resources/post-process.sh @@ -0,0 +1,121 @@ +#!/usr/bin/env bash +# shellcheck disable=SC2154 + +set -euo pipefail + +# User-defined variables +CROSS_SEED_ENABLED="${CROSS_SEED_ENABLED:-false}" +CROSS_SEED_HOST="${CROSS_SEED_HOST:-required}" +CROSS_SEED_PORT="${CROSS_SEED_PORT:-required}" +CROSS_SEED_API_KEY="${CROSS_SEED_API_KEY:-required}" +CROSS_SEED_SLEEP_INTERVAL="${CROSS_SEED_SLEEP_INTERVAL:-30}" +PUSHOVER_ENABLED="${PUSHOVER_ENABLED:-false}" +PUSHOVER_USER_KEY="${PUSHOVER_USER_KEY:-required}" +PUSHOVER_TOKEN="${PUSHOVER_TOKEN:-required}" + +# Function to set release variables from SABnzbd +set_sab_vars() { + RELEASE_NAME="${SAB_FILENAME:-}" + RELEASE_DIR="${SAB_COMPLETE_DIR:-}" + RELEASE_CAT="${SAB_CAT:-}" + RELEASE_SIZE="${SAB_BYTES:-}" + RELEASE_STATUS="${SAB_PP_STATUS:-}" + RELEASE_INDEXER="${SAB_URL:-}" + RELEASE_TYPE="NZB" +} + +# Function to set release variables from qBittorrent +set_qb_vars() { + RELEASE_NAME="$1" # %N + RELEASE_DIR="$2" # %F + RELEASE_CAT="$3" # %L + RELEASE_SIZE="$4" # %Z + RELEASE_INDEXER="$5" # %T + RELEASE_STATUS=0 # Always 0 for qBittorrent + RELEASE_TYPE="Torrent" +} + +# Function to send pushover notification +send_pushover_notification() { + local pushover_message status_code json_data + printf -v pushover_message \ + "%s\nCategory: %s\nIndexer: %s\nSize: %s" \ + "${RELEASE_NAME%.*}" \ + "${RELEASE_CAT}" \ + "$(trurl --url "${RELEASE_INDEXER}" --get '{idn:host}')" \ + "$(numfmt --to iec --format "%8.2f" "${RELEASE_SIZE}")" + + json_data=$(jo \ + token="${PUSHOVER_TOKEN}" \ + user="${PUSHOVER_USER_KEY}" \ + title="${RELEASE_TYPE} Downloaded" \ + message="${pushover_message}" \ + priority="-2" \ + html="1" + ) + + status_code=$(curl \ + --silent \ + --write-out "%{http_code}" \ + --output /dev/null \ + --request POST \ + --header "Content-Type: application/json" \ + --data-binary "${json_data}" \ + "https://api.pushover.net/1/messages.json" + ) + + printf "pushover notification returned with HTTP status code %s and payload: %s\n" \ + "${status_code}" \ + "$(echo "${json_data}" | jq --compact-output)" >&2 +} + +# Function to search for cross-seed +search_cross_seed() { + local status_code + status_code=$(curl \ + --silent \ + --output /dev/null \ + --write-out "%{http_code}" \ + --request POST \ + --data-urlencode "path=${RELEASE_DIR}" \ + --header "X-Api-Key: ${CROSS_SEED_API_KEY}" \ + "http://${CROSS_SEED_HOST}:${CROSS_SEED_PORT}/api/webhook" + ) + + printf "cross-seed search returned with HTTP status code %s and path %s\n" \ + "${status_code}" \ + "${RELEASE_DIR}" >&2 + + sleep "${CROSS_SEED_SLEEP_INTERVAL}" +} + +main() { + # Determine the source and set release variables accordingly + if env | grep -q "^SAB_"; then + set_sab_vars + else + set_qb_vars "$@" + fi + + # Check if post-processing was successful + if [[ "${RELEASE_STATUS}" -ne 0 ]]; then + printf "post-processing failed with sabnzbd status code %s\n" \ + "${RELEASE_STATUS}" >&2 + exit 1 + fi + + # Update permissions on the release directory + chmod -R 750 "${RELEASE_DIR}" + + # Send pushover notification + if [[ "${PUSHOVER_ENABLED}" == "true" ]]; then + send_pushover_notification + fi + + # Search for cross-seed + if [[ "${CROSS_SEED_ENABLED}" == "true" ]]; then + search_cross_seed + fi +} + +main "$@"