From 26d4b005707ff64d8a13319334e1e04350355fcb Mon Sep 17 00:00:00 2001 From: sonicaj Date: Tue, 9 May 2023 13:50:04 +0000 Subject: [PATCH] Update catalog information --- catalog.json | 40 +- community/ddns-updater/1.0.0/Chart.lock | 6 + community/ddns-updater/1.0.0/Chart.yaml | 26 + community/ddns-updater/1.0.0/README.md | 8 + community/ddns-updater/1.0.0/app-readme.md | 8 + .../1.0.0/charts/common-1.0.7.tgz | Bin 0 -> 55254 bytes .../ddns-updater/1.0.0/ci/aliyun-values.yaml | 19 + .../ddns-updater/1.0.0/ci/allinkl-values.yaml | 19 + .../1.0.0/ci/cloudflare-values.yaml | 37 + .../ddns-updater/1.0.0/ci/config-values.yaml | 52 + .../ddns-updater/1.0.0/ci/dd24-values.yaml | 18 + .../ddns-updater/1.0.0/ci/ddnss-values.yaml | 28 + .../1.0.0/ci/digitalocean-values.yaml | 18 + .../1.0.0/ci/dnsomatic-values.yaml | 27 + .../ddns-updater/1.0.0/ci/dnspod-values.yaml | 18 + .../1.0.0/ci/dondominio-values.yaml | 20 + .../1.0.0/ci/dreamhost-values.yaml | 18 + .../ddns-updater/1.0.0/ci/duckdns-values.yaml | 18 + .../ddns-updater/1.0.0/ci/dyndns-values.yaml | 19 + .../ddns-updater/1.0.0/ci/dynu-values.yaml | 26 + .../ddns-updater/1.0.0/ci/dynv6-values.yaml | 18 + .../ddns-updater/1.0.0/ci/freedns-values.yaml | 18 + .../ddns-updater/1.0.0/ci/gandi-values.yaml | 19 + .../ddns-updater/1.0.0/ci/gcp-values.yaml | 20 + .../ddns-updater/1.0.0/ci/godaddy-values.yaml | 19 + .../ddns-updater/1.0.0/ci/google-values.yaml | 18 + .../ddns-updater/1.0.0/ci/he-values.yaml | 24 + .../1.0.0/ci/infomaniak-values.yaml | 27 + .../ddns-updater/1.0.0/ci/inwx-values.yaml | 19 + .../ddns-updater/1.0.0/ci/linode-values.yaml | 18 + .../ddns-updater/1.0.0/ci/luadns-values.yaml | 19 + .../1.0.0/ci/namecheap-values.yaml | 25 + .../ddns-updater/1.0.0/ci/njalla-values.yaml | 25 + .../ddns-updater/1.0.0/ci/noip-values.yaml | 27 + .../ddns-updater/1.0.0/ci/opendns-values.yaml | 27 + .../ddns-updater/1.0.0/ci/ovh-values.yaml | 49 + .../ddns-updater/1.0.0/ci/porkbun-values.yaml | 26 + .../1.0.0/ci/selfhostedde-values.yaml | 27 + .../1.0.0/ci/servercow-values.yaml | 29 + .../1.0.0/ci/spdyn-values.yaml.yaml | 32 + .../ddns-updater/1.0.0/ci/strato-values.yaml | 25 + .../1.0.0/ci/variomedia-values.yaml | 27 + community/ddns-updater/1.0.0/ix_values.yaml | 54 + community/ddns-updater/1.0.0/metadata.yaml | 8 + community/ddns-updater/1.0.0/questions.yaml | 1349 +++++++++++++++++ .../ddns-updater/1.0.0/templates/NOTES.txt | 1 + .../1.0.0/templates/_configuration.tpl | 65 + .../ddns-updater/1.0.0/templates/_ddns.tpl | 85 ++ .../ddns-updater/1.0.0/templates/_portal.tpl | 12 + .../1.0.0/templates/_validation.tpl | 56 + .../ddns-updater/1.0.0/templates/common.yaml | 10 + .../1.0.0/templates/dnsProviders/_aliyun.tpl | 16 + .../1.0.0/templates/dnsProviders/_allinkl.tpl | 16 + .../templates/dnsProviders/_cloudflare.tpl | 39 + .../1.0.0/templates/dnsProviders/_dd24.tpl | 14 + .../1.0.0/templates/dnsProviders/_ddnss.tpl | 22 + .../templates/dnsProviders/_digitalocean.tpl | 14 + .../1.0.0/templates/dnsProviders/_dnsPod.tpl | 14 + .../templates/dnsProviders/_dnsomatic.tpl | 18 + .../templates/dnsProviders/_dondominio.tpl | 18 + .../templates/dnsProviders/_dreamhost.tpl | 14 + .../1.0.0/templates/dnsProviders/_duckdns.tpl | 16 + .../1.0.0/templates/dnsProviders/_dyndns.tpl | 18 + .../1.0.0/templates/dnsProviders/_dynu.tpl | 22 + .../1.0.0/templates/dnsProviders/_dynv6.tpl | 16 + .../1.0.0/templates/dnsProviders/_freedns.tpl | 14 + .../1.0.0/templates/dnsProviders/_gandi.tpl | 16 + .../1.0.0/templates/dnsProviders/_gcp.tpl | 18 + .../1.0.0/templates/dnsProviders/_godaddy.tpl | 16 + .../1.0.0/templates/dnsProviders/_google.tpl | 16 + .../1.0.0/templates/dnsProviders/_he.tpl | 16 + .../templates/dnsProviders/_infomaniak.tpl | 18 + .../1.0.0/templates/dnsProviders/_inwx.tpl | 16 + .../1.0.0/templates/dnsProviders/_linode.tpl | 14 + .../1.0.0/templates/dnsProviders/_luadns.tpl | 16 + .../templates/dnsProviders/_namecheap.tpl | 16 + .../1.0.0/templates/dnsProviders/_njalla.tpl | 16 + .../1.0.0/templates/dnsProviders/_noip.tpl | 18 + .../1.0.0/templates/dnsProviders/_opendns.tpl | 18 + .../1.0.0/templates/dnsProviders/_ovh.tpl | 38 + .../1.0.0/templates/dnsProviders/_porkbun.tpl | 20 + .../templates/dnsProviders/_selfhostde.tpl | 18 + .../templates/dnsProviders/_servercow.tpl | 20 + .../1.0.0/templates/dnsProviders/_spdyn.tpl | 30 + .../1.0.0/templates/dnsProviders/_strato.tpl | 16 + .../templates/dnsProviders/_variomedia.tpl | 18 + .../1.0.0/upgrade_strategy_disable | 31 + community/ddns-updater/item.yaml | 6 + 88 files changed, 3280 insertions(+), 5 deletions(-) create mode 100644 community/ddns-updater/1.0.0/Chart.lock create mode 100644 community/ddns-updater/1.0.0/Chart.yaml create mode 100644 community/ddns-updater/1.0.0/README.md create mode 100644 community/ddns-updater/1.0.0/app-readme.md create mode 100644 community/ddns-updater/1.0.0/charts/common-1.0.7.tgz create mode 100644 community/ddns-updater/1.0.0/ci/aliyun-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/allinkl-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/cloudflare-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/config-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/dd24-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/ddnss-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/digitalocean-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/dnsomatic-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/dnspod-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/dondominio-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/dreamhost-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/duckdns-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/dyndns-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/dynu-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/dynv6-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/freedns-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/gandi-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/gcp-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/godaddy-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/google-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/he-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/infomaniak-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/inwx-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/linode-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/luadns-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/namecheap-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/njalla-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/noip-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/opendns-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/ovh-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/porkbun-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/selfhostedde-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/servercow-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/spdyn-values.yaml.yaml create mode 100644 community/ddns-updater/1.0.0/ci/strato-values.yaml create mode 100644 community/ddns-updater/1.0.0/ci/variomedia-values.yaml create mode 100644 community/ddns-updater/1.0.0/ix_values.yaml create mode 100644 community/ddns-updater/1.0.0/metadata.yaml create mode 100644 community/ddns-updater/1.0.0/questions.yaml create mode 100644 community/ddns-updater/1.0.0/templates/NOTES.txt create mode 100644 community/ddns-updater/1.0.0/templates/_configuration.tpl create mode 100644 community/ddns-updater/1.0.0/templates/_ddns.tpl create mode 100644 community/ddns-updater/1.0.0/templates/_portal.tpl create mode 100644 community/ddns-updater/1.0.0/templates/_validation.tpl create mode 100644 community/ddns-updater/1.0.0/templates/common.yaml create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_aliyun.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_allinkl.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_cloudflare.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_dd24.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_ddnss.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_digitalocean.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_dnsPod.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_dnsomatic.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_dondominio.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_dreamhost.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_duckdns.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_dyndns.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_dynu.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_dynv6.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_freedns.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_gandi.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_gcp.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_godaddy.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_google.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_he.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_infomaniak.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_inwx.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_linode.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_luadns.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_namecheap.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_njalla.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_noip.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_opendns.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_ovh.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_porkbun.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_selfhostde.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_servercow.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_spdyn.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_strato.tpl create mode 100644 community/ddns-updater/1.0.0/templates/dnsProviders/_variomedia.tpl create mode 100755 community/ddns-updater/1.0.0/upgrade_strategy_disable create mode 100644 community/ddns-updater/item.yaml diff --git a/catalog.json b/catalog.json index 2d5e8a7cd2..b117a56f1b 100644 --- a/catalog.json +++ b/catalog.json @@ -42,7 +42,7 @@ "latest_version": "1.0.89", "latest_app_version": "2023.5.2", "latest_human_version": "2023.5.2_1.0.89", - "last_update": "2023-05-07 15:37:00", + "last_update": "2023-05-09 11:21:40", "name": "home-assistant", "recommended": false, "title": "Home Assistant", @@ -118,7 +118,7 @@ "latest_version": "1.7.45", "latest_app_version": "1.32.1.6999", "latest_human_version": "1.32.1.6999_1.7.45", - "last_update": "2023-05-09 11:06:50", + "last_update": "2023-05-09 11:21:40", "name": "plex", "recommended": false, "title": "Plex", @@ -201,7 +201,7 @@ "latest_version": "1.0.6", "latest_app_version": "7", "latest_human_version": "7_1.0.6", - "last_update": "2023-05-03 13:56:14", + "last_update": "2023-05-09 11:21:40", "name": "wg-easy", "recommended": false, "title": "WG Easy", @@ -286,7 +286,7 @@ "latest_version": "1.0.26", "latest_app_version": "1.23.4", "latest_human_version": "1.23.4_1.0.26", - "last_update": "2023-05-03 13:56:14", + "last_update": "2023-05-09 11:21:40", "name": "syncthing", "recommended": false, "title": "Syncthing", @@ -313,7 +313,7 @@ "latest_version": "1.0.23", "latest_app_version": "4.7.11.0", "latest_human_version": "4.7.11.0_1.0.23", - "last_update": "2023-05-03 13:56:14", + "last_update": "2023-05-09 11:21:40", "name": "emby", "recommended": false, "title": "Emby Server", @@ -555,6 +555,36 @@ "tags": [], "icon_url": "https://static.wikia.nocookie.net/terraria_gamepedia/images/a/a4/NewPromoLogo.png/revision/latest" }, + "ddns-updater": { + "app_readme": "

DDNS Updater

\n

DDNS Updater is a lightweight universal DDNS Updater with web UI

\n
\n

When application is installed, a container will be launched with root privileges.\nThis is required in order to apply the correct permissions to the DDNS Updater directories.\nAfterward, the DDNS Updater container will run as a non-root user (Default: 568).\nAll mounted storage(s) will be chowned only if the parent directory does not match the configured user.

\n
", + "categories": [ + "network" + ], + "description": "Lightweight universal DDNS Updater with web UI", + "healthy": true, + "healthy_error": null, + "home": "https://github.com/qdm12/ddns-updater", + "location": "/__w/charts/charts/community/ddns-updater", + "latest_version": "1.0.0", + "latest_app_version": "latest", + "latest_human_version": "latest_1.0.0", + "last_update": null, + "name": "ddns-updater", + "recommended": false, + "title": "DDNS Updater", + "maintainers": [ + { + "name": "truenas", + "url": "https://www.truenas.com/", + "email": "dev@ixsystems.com" + } + ], + "tags": [ + "ddns", + "ddns-updater" + ], + "icon_url": "https://raw.githubusercontent.com/qdm12/ddns-updater/master/readme/ddnsgopher.svg" + }, "radarr": { "app_readme": "

Radarr

\n

Radarr is a movie collection manager for Usenet and BitTorrent users.

\n
\n

When application is installed, a container will be launched with root privileges.\nThis is required in order to apply the correct permissions to the Radarr directories.\nAfterward, the Radarr container will run as a non-root user (Default: 568).\nAll mounted storage(s) will be chowned only if the parent directory does not match the configured user.

\n
", "categories": [ diff --git a/community/ddns-updater/1.0.0/Chart.lock b/community/ddns-updater/1.0.0/Chart.lock new file mode 100644 index 0000000000..4301461672 --- /dev/null +++ b/community/ddns-updater/1.0.0/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.0.7 +digest: sha256:919bcf42446fc1748a1b77001ec0161bb7a72a198381794b716a6ebb459ac31b +generated: "2023-05-09T16:20:15.690681282+03:00" diff --git a/community/ddns-updater/1.0.0/Chart.yaml b/community/ddns-updater/1.0.0/Chart.yaml new file mode 100644 index 0000000000..29d16335f6 --- /dev/null +++ b/community/ddns-updater/1.0.0/Chart.yaml @@ -0,0 +1,26 @@ +name: ddns-updater +description: Lightweight universal DDNS Updater with web UI +annotations: + title: DDNS Updater +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: 'latest' +kubeVersion: '>=1.16.0-0' +maintainers: + - name: truenas + url: https://www.truenas.com/ + email: dev@ixsystems.com +dependencies: + - name: common + repository: file://../../../common + version: 1.0.7 +home: https://github.com/qdm12/ddns-updater +icon: https://raw.githubusercontent.com/qdm12/ddns-updater/master/readme/ddnsgopher.svg +sources: + - https://github.com/qdm12/ddns-updater + - https://github.com/truenas/charts/tree/master/community/ddns-updater + - https://hub.docker.com/r/qmcgaw/ddns-updater +keywords: + - ddns-updater + - ddns diff --git a/community/ddns-updater/1.0.0/README.md b/community/ddns-updater/1.0.0/README.md new file mode 100644 index 0000000000..b9b51cb2e8 --- /dev/null +++ b/community/ddns-updater/1.0.0/README.md @@ -0,0 +1,8 @@ +# DDNS Updater + +[DDNS Updater](https://github.com/qdm12/ddns-updater) is a lightweight universal DDNS Updater with web UI + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `DDNS Updater` directories. +> Afterward, the `DDNS Updater` container will run as a **non**-root user (Default: `568`). +> All mounted storage(s) will be `chown`ed only if the parent directory does not match the configured user. diff --git a/community/ddns-updater/1.0.0/app-readme.md b/community/ddns-updater/1.0.0/app-readme.md new file mode 100644 index 0000000000..b9b51cb2e8 --- /dev/null +++ b/community/ddns-updater/1.0.0/app-readme.md @@ -0,0 +1,8 @@ +# DDNS Updater + +[DDNS Updater](https://github.com/qdm12/ddns-updater) is a lightweight universal DDNS Updater with web UI + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `DDNS Updater` directories. +> Afterward, the `DDNS Updater` container will run as a **non**-root user (Default: `568`). +> All mounted storage(s) will be `chown`ed only if the parent directory does not match the configured user. diff --git a/community/ddns-updater/1.0.0/charts/common-1.0.7.tgz b/community/ddns-updater/1.0.0/charts/common-1.0.7.tgz new file mode 100644 index 0000000000000000000000000000000000000000..db5781322aedbd83972736ceeed2575cafb5aaa0 GIT binary patch literal 55254 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 Tj>rE300960az00802&7X4hNP@ literal 0 HcmV?d00001 diff --git a/community/ddns-updater/1.0.0/ci/aliyun-values.yaml b/community/ddns-updater/1.0.0/ci/aliyun-values.yaml new file mode 100644 index 0000000000..eebb29ea9f --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/aliyun-values.yaml @@ -0,0 +1,19 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: aliyun + host: "@" + domain: example.com + ipVersion: "" + aliyunAccessKey: key + aliyunSecret: secret diff --git a/community/ddns-updater/1.0.0/ci/allinkl-values.yaml b/community/ddns-updater/1.0.0/ci/allinkl-values.yaml new file mode 100644 index 0000000000..2592c94ed1 --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/allinkl-values.yaml @@ -0,0 +1,19 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: allinkl + host: "@" + domain: example.com + ipVersion: "" + allinklUsername: user + allinklPassword: pass diff --git a/community/ddns-updater/1.0.0/ci/cloudflare-values.yaml b/community/ddns-updater/1.0.0/ci/cloudflare-values.yaml new file mode 100644 index 0000000000..ddf897e728 --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/cloudflare-values.yaml @@ -0,0 +1,37 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: cloudflare + host: "@" + domain: example.com + ipVersion: "" + cloudflareZoneID: zoneid + cloudflareTtl: 1 + cloudflareProxied: false + cloudflareToken: token + - provider: cloudflare + host: "@" + domain: example.com + ipVersion: "" + cloudflareZoneID: zoneid + cloudflareTtl: 1 + cloudflareProxied: false + cloudflareUserServiceKey: v1.0.0-abcdef + - provider: cloudflare + host: "@" + domain: example.com + ipVersion: "" + cloudflareZoneID: zoneid + cloudflareTtl: 1 + cloudflareEmail: email@example.com + cloudflareApiKey: api_key diff --git a/community/ddns-updater/1.0.0/ci/config-values.yaml b/community/ddns-updater/1.0.0/ci/config-values.yaml new file mode 100644 index 0000000000..b5a268b42e --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/config-values.yaml @@ -0,0 +1,52 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsRunAs: + user: 1000 + group: 1000 + +ddnsConfig: + config: + - provider: allinkl + host: "@" + domain: example.com + ipVersion: "" + allinklUsername: user + allinklPassword: pass + + period: 1m + backupPeriod: 1h + updateCooldownPeriod: 10m + publicIpDnsTimeout: 3s + httpTimeout: 15s + publicIpFetchers: + - provider: all + + shoutrrrAddresses: + - discord://token@id + - gotify://gotify-host/token + publicIpDnsProviders: + - provider: all + publicIpHttpProviders: + - provider: custom + custom: https://ifconfig.io/ip + publicIpv4HttpProviders: + - provider: custom + custom: https://api.ipify.org + publicIpv6HttpProviders: + - provider: custom + custom: https://api6.ipify.org + + additionalEnvs: + - name: LOG_LEVEL + value: debug + - name: LOG_CALLER + value: short diff --git a/community/ddns-updater/1.0.0/ci/dd24-values.yaml b/community/ddns-updater/1.0.0/ci/dd24-values.yaml new file mode 100644 index 0000000000..b066669f1e --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/dd24-values.yaml @@ -0,0 +1,18 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: dd24 + host: "@" + domain: example.com + ipVersion: "" + dd24Password: password diff --git a/community/ddns-updater/1.0.0/ci/ddnss-values.yaml b/community/ddns-updater/1.0.0/ci/ddnss-values.yaml new file mode 100644 index 0000000000..a460416441 --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/ddnss-values.yaml @@ -0,0 +1,28 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: ddnss + host: "@" + domain: example.com + ipVersion: "" + ddnssUsername: username + ddnssPassword: password + ddnssProviderIP: false + ddnssDualStack: true + - provider: ddnss + host: "@" + domain: example.com + ipVersion: "" + ddnssUsername: username + ddnssPassword: password + ddnssProviderIP: true diff --git a/community/ddns-updater/1.0.0/ci/digitalocean-values.yaml b/community/ddns-updater/1.0.0/ci/digitalocean-values.yaml new file mode 100644 index 0000000000..7c1bf1a50c --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/digitalocean-values.yaml @@ -0,0 +1,18 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: digitalocean + host: "@" + domain: example.com + ipVersion: "" + digitalOceanToken: token diff --git a/community/ddns-updater/1.0.0/ci/dnsomatic-values.yaml b/community/ddns-updater/1.0.0/ci/dnsomatic-values.yaml new file mode 100644 index 0000000000..af9aa233fe --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/dnsomatic-values.yaml @@ -0,0 +1,27 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: dnsomatic + host: "@" + domain: example.com + ipVersion: "" + dnsOMaticUsername: username + dnsOMaticPassword: password + dnsOMaticProviderIP: false + - provider: dnsomatic + host: "@" + domain: example.com + ipVersion: "" + dnsOMaticUsername: username + dnsOMaticPassword: password + dnsOMaticProviderIP: true diff --git a/community/ddns-updater/1.0.0/ci/dnspod-values.yaml b/community/ddns-updater/1.0.0/ci/dnspod-values.yaml new file mode 100644 index 0000000000..d32b54e926 --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/dnspod-values.yaml @@ -0,0 +1,18 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: dnspod + host: "@" + domain: example.com + ipVersion: "" + dnsPodToken: token diff --git a/community/ddns-updater/1.0.0/ci/dondominio-values.yaml b/community/ddns-updater/1.0.0/ci/dondominio-values.yaml new file mode 100644 index 0000000000..20ee5317ce --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/dondominio-values.yaml @@ -0,0 +1,20 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: dondominio + host: "@" + domain: example.com + ipVersion: "" + donDominioUsername: user + donDominioPassword: pass + donDominioName: name diff --git a/community/ddns-updater/1.0.0/ci/dreamhost-values.yaml b/community/ddns-updater/1.0.0/ci/dreamhost-values.yaml new file mode 100644 index 0000000000..6bd56d7326 --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/dreamhost-values.yaml @@ -0,0 +1,18 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: dreamhost + host: "@" + domain: example.com + ipVersion: "" + dreamHostKey: abcdefgh12345678 diff --git a/community/ddns-updater/1.0.0/ci/duckdns-values.yaml b/community/ddns-updater/1.0.0/ci/duckdns-values.yaml new file mode 100644 index 0000000000..c908d98559 --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/duckdns-values.yaml @@ -0,0 +1,18 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: duckdns + host: subdomain + domain: example.com + duckdnsToken: abcd1234-abcd-1234-abcd-abcd1234abcd + duckdnsProviderIP: false diff --git a/community/ddns-updater/1.0.0/ci/dyndns-values.yaml b/community/ddns-updater/1.0.0/ci/dyndns-values.yaml new file mode 100644 index 0000000000..391a25cf59 --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/dyndns-values.yaml @@ -0,0 +1,19 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: dyn + host: "@" + domain: example.com + dynClientKey: key + dynUsername: user + dynProviderIP: false diff --git a/community/ddns-updater/1.0.0/ci/dynu-values.yaml b/community/ddns-updater/1.0.0/ci/dynu-values.yaml new file mode 100644 index 0000000000..db8d3f4799 --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/dynu-values.yaml @@ -0,0 +1,26 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: dynu + host: "@" + domain: example.com + dynuUsername: user + dynuPassword: password + dynuProviderIP: false + - provider: dynu + host: "@" + domain: example.com + dynuUsername: user + dynuPassword: password + dynuGroup: group + dynuProviderIP: true diff --git a/community/ddns-updater/1.0.0/ci/dynv6-values.yaml b/community/ddns-updater/1.0.0/ci/dynv6-values.yaml new file mode 100644 index 0000000000..6bcf4c867b --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/dynv6-values.yaml @@ -0,0 +1,18 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: dynv6 + host: "@" + domain: example.com + dynv6Token: token + dynv6ProviderIP: false diff --git a/community/ddns-updater/1.0.0/ci/freedns-values.yaml b/community/ddns-updater/1.0.0/ci/freedns-values.yaml new file mode 100644 index 0000000000..9afa57254f --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/freedns-values.yaml @@ -0,0 +1,18 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: freedns + host: "@" + domain: example.com + ipVersion: "" + freeDnsToken: token diff --git a/community/ddns-updater/1.0.0/ci/gandi-values.yaml b/community/ddns-updater/1.0.0/ci/gandi-values.yaml new file mode 100644 index 0000000000..f1b77eb165 --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/gandi-values.yaml @@ -0,0 +1,19 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: gandi + host: "@" + domain: example.com + ipVersion: "" + gandiKey: key + gandiTtl: 3600 diff --git a/community/ddns-updater/1.0.0/ci/gcp-values.yaml b/community/ddns-updater/1.0.0/ci/gcp-values.yaml new file mode 100644 index 0000000000..054fe6d01d --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/gcp-values.yaml @@ -0,0 +1,20 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: gcp + host: "@" + domain: example.com + ipVersion: "" + gcpProject: project + gcpZone: zone + gcpCredentials: '{"type": "service_account", "project_id": "my-id"}' diff --git a/community/ddns-updater/1.0.0/ci/godaddy-values.yaml b/community/ddns-updater/1.0.0/ci/godaddy-values.yaml new file mode 100644 index 0000000000..abaac08ac3 --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/godaddy-values.yaml @@ -0,0 +1,19 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: godaddy + host: "@" + domain: example.com + ipVersion: "" + godaddyKey: abcDE12345_abcde12345abcde12345AB + godaddySecret: secret diff --git a/community/ddns-updater/1.0.0/ci/google-values.yaml b/community/ddns-updater/1.0.0/ci/google-values.yaml new file mode 100644 index 0000000000..6ba64976b0 --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/google-values.yaml @@ -0,0 +1,18 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: he + host: "@" + domain: example.com + ipVersion: "" + hePassword: password diff --git a/community/ddns-updater/1.0.0/ci/he-values.yaml b/community/ddns-updater/1.0.0/ci/he-values.yaml new file mode 100644 index 0000000000..e3e2b6d04e --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/he-values.yaml @@ -0,0 +1,24 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: he + host: "@" + domain: example.com + ipVersion: "" + hePassword: password + heProviderIP: true + - provider: he + host: "@" + domain: example.com + ipVersion: "" + hePassword: password diff --git a/community/ddns-updater/1.0.0/ci/infomaniak-values.yaml b/community/ddns-updater/1.0.0/ci/infomaniak-values.yaml new file mode 100644 index 0000000000..58065f32b0 --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/infomaniak-values.yaml @@ -0,0 +1,27 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: infomaniak + host: "@" + domain: example.com + ipVersion: "" + infomaniakUsername: username + infomaniakPassword: password + infomaniakProviderIP: true + - provider: infomaniak + host: "@" + domain: example.com + ipVersion: "" + infomaniakUsername: username + infomaniakPassword: password + infomaniakProviderIP: false diff --git a/community/ddns-updater/1.0.0/ci/inwx-values.yaml b/community/ddns-updater/1.0.0/ci/inwx-values.yaml new file mode 100644 index 0000000000..5672e7cf04 --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/inwx-values.yaml @@ -0,0 +1,19 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: inwx + host: subdomain + domain: example.com + ipVersion: "" + inwxUsername: username + inwxPassword: password diff --git a/community/ddns-updater/1.0.0/ci/linode-values.yaml b/community/ddns-updater/1.0.0/ci/linode-values.yaml new file mode 100644 index 0000000000..a0ad58e05f --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/linode-values.yaml @@ -0,0 +1,18 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: linode + host: "@" + domain: example.com + ipVersion: "" + linodeToken: token diff --git a/community/ddns-updater/1.0.0/ci/luadns-values.yaml b/community/ddns-updater/1.0.0/ci/luadns-values.yaml new file mode 100644 index 0000000000..24ff726ca9 --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/luadns-values.yaml @@ -0,0 +1,19 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: luadns + host: "@" + domain: example.com + ipVersion: "" + luadnsToken: token + luadnsEmail: email@example.com diff --git a/community/ddns-updater/1.0.0/ci/namecheap-values.yaml b/community/ddns-updater/1.0.0/ci/namecheap-values.yaml new file mode 100644 index 0000000000..23c14bddc3 --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/namecheap-values.yaml @@ -0,0 +1,25 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: namecheap + host: subdomain + domain: example.com + ipVersion: "" + namecheapPassword: abcdef123456abcdef123456abcdef12 + namecheapProviderIP: true + - provider: namecheap + host: subdomain + domain: example.com + ipVersion: "" + namecheapPassword: abcdef123456abcdef123456abcdef12 + namecheapProviderIP: false diff --git a/community/ddns-updater/1.0.0/ci/njalla-values.yaml b/community/ddns-updater/1.0.0/ci/njalla-values.yaml new file mode 100644 index 0000000000..f381b21714 --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/njalla-values.yaml @@ -0,0 +1,25 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: njalla + host: "@" + domain: example.com + ipVersion: "" + njallaKey: key + njallaProviderIP: true + - provider: njalla + host: "@" + domain: example.com + ipVersion: "" + njallaKey: key + njallaProviderIP: false diff --git a/community/ddns-updater/1.0.0/ci/noip-values.yaml b/community/ddns-updater/1.0.0/ci/noip-values.yaml new file mode 100644 index 0000000000..23f1898b2a --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/noip-values.yaml @@ -0,0 +1,27 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: noip + host: "@" + domain: example.com + ipVersion: "" + noipUsername: username + noipPassword: password + noipProviderIP: true + - provider: noip + host: "@" + domain: example.com + ipVersion: "" + noipUsername: username + noipPassword: password + noipProviderIP: false diff --git a/community/ddns-updater/1.0.0/ci/opendns-values.yaml b/community/ddns-updater/1.0.0/ci/opendns-values.yaml new file mode 100644 index 0000000000..c6713a9490 --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/opendns-values.yaml @@ -0,0 +1,27 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: opendns + host: "@" + domain: example.com + ipVersion: "" + opendnsUsername: username + opendnsPassword: password + opendnsProviderIP: true + - provider: opendns + host: "@" + domain: example.com + ipVersion: "" + opendnsUsername: username + opendnsPassword: password + opendnsProviderIP: false diff --git a/community/ddns-updater/1.0.0/ci/ovh-values.yaml b/community/ddns-updater/1.0.0/ci/ovh-values.yaml new file mode 100644 index 0000000000..fd16c93b69 --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/ovh-values.yaml @@ -0,0 +1,49 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: ovh + host: "@" + domain: example.com + ipVersion: "" + ovhMode: dynamic + ovhUsername: username + ovhPassword: password + ovhProviderIP: true + - provider: ovh + host: "@" + domain: example.com + ipVersion: "" + ovhMode: dynamic + ovhUsername: username + ovhPassword: password + ovhProviderIP: false + - provider: ovh + host: "@" + domain: example.com + ipVersion: "" + ovhMode: api + ovhApiEndpoint: ovh-eu + ovhAppKey: applicationKey + ovhAppSecret: applicationSecret + ovhConsumerKey: consumerKey + ovhProviderIP: false + - provider: ovh + host: "@" + domain: example.com + ipVersion: "" + ovhMode: api + ovhApiEndpoint: ovh-eu + ovhAppKey: applicationKey + ovhAppSecret: applicationSecret + ovhConsumerKey: consumerKey + ovhProviderIP: true diff --git a/community/ddns-updater/1.0.0/ci/porkbun-values.yaml b/community/ddns-updater/1.0.0/ci/porkbun-values.yaml new file mode 100644 index 0000000000..e65923fefc --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/porkbun-values.yaml @@ -0,0 +1,26 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: porkbun + host: "@" + domain: example.com + ipVersion: "" + porkbunApiKey: apikey + porkbunSecretApiKey: secretapikey + - provider: porkbun + host: "@" + domain: example.com + ipVersion: "" + porkbunApiKey: apikey + porkbunSecretApiKey: secretapikey + porkbunTtl: 3600 diff --git a/community/ddns-updater/1.0.0/ci/selfhostedde-values.yaml b/community/ddns-updater/1.0.0/ci/selfhostedde-values.yaml new file mode 100644 index 0000000000..dba69a6cf9 --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/selfhostedde-values.yaml @@ -0,0 +1,27 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: selfhost.de + host: "@" + domain: example.com + ipVersion: "" + selfhostdeUsername: username + selfhostdePassword: password + selfhostdeProviderIP: true + - provider: selfhost.de + host: "@" + domain: example.com + ipVersion: "" + selfhostdeUsername: username + selfhostdePassword: password + selfhostdeProviderIP: false diff --git a/community/ddns-updater/1.0.0/ci/servercow-values.yaml b/community/ddns-updater/1.0.0/ci/servercow-values.yaml new file mode 100644 index 0000000000..585f5d81c4 --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/servercow-values.yaml @@ -0,0 +1,29 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: servercow + host: "@" + domain: example.com + ipVersion: "" + servercowUsername: username + servercowPassword: password + servercowTtl: 120 + servercowProviderIP: false + - provider: servercow + host: "@" + domain: example.com + ipVersion: "" + servercowUsername: username + servercowPassword: password + servercowTtl: 120 + servercowProviderIP: true diff --git a/community/ddns-updater/1.0.0/ci/spdyn-values.yaml.yaml b/community/ddns-updater/1.0.0/ci/spdyn-values.yaml.yaml new file mode 100644 index 0000000000..9b9d2a16a9 --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/spdyn-values.yaml.yaml @@ -0,0 +1,32 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: spdyn + host: "@" + domain: example.com + ipVersion: "" + spdynToken: token + spdynProviderIP: false + - provider: spdyn + host: "@" + domain: example.com + ipVersion: "" + spdynToken: token + spdynProviderIP: true + - provider: spdyn + host: "@" + domain: example.com + ipVersion: "" + spdynUsername: username + spdynPassword: password + spdynProviderIP: false diff --git a/community/ddns-updater/1.0.0/ci/strato-values.yaml b/community/ddns-updater/1.0.0/ci/strato-values.yaml new file mode 100644 index 0000000000..52f3e1862d --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/strato-values.yaml @@ -0,0 +1,25 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: strato + host: "@" + domain: example.com + ipVersion: "" + stratoPassword: password + stratoProviderIP: false + - provider: strato + host: "@" + domain: example.com + ipVersion: "" + stratoPassword: password + stratoProviderIP: true diff --git a/community/ddns-updater/1.0.0/ci/variomedia-values.yaml b/community/ddns-updater/1.0.0/ci/variomedia-values.yaml new file mode 100644 index 0000000000..6dc75ca002 --- /dev/null +++ b/community/ddns-updater/1.0.0/ci/variomedia-values.yaml @@ -0,0 +1,27 @@ +ddnsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + +# This disables probes. +# As we can't have for each provider +# an api key, we just run through CI +# for the linting. +ci: true + +ddnsConfig: + config: + - provider: variomedia + host: "@" + domain: example.com + ipVersion: "" + variomediaPassword: password + variomediaEmail: email@example.com + variomediaProviderIP: false + - provider: variomedia + host: "@" + domain: example.com + ipVersion: "" + variomediaPassword: password + variomediaEmail: email@example.com + variomediaProviderIP: true diff --git a/community/ddns-updater/1.0.0/ix_values.yaml b/community/ddns-updater/1.0.0/ix_values.yaml new file mode 100644 index 0000000000..c5f89104d0 --- /dev/null +++ b/community/ddns-updater/1.0.0/ix_values.yaml @@ -0,0 +1,54 @@ +image: + repository: qmcgaw/ddns-updater + pullPolicy: IfNotPresent + tag: latest + +ci: false + +resources: + limits: + cpu: 4000m + memory: 8Gi + +ddnsConfig: + period: 5m + backupPeriod: 24h + updateCooldownPeriod: 5m + httpTimeout: 10s + shoutrrrAddresses: [] + publicIpDnsTimeout: 3s + publicIpDnsProviders: + - provider: all + publicIpHttpProviders: + - provider: all + custom: "" + publicIpv4HttpProviders: + - provider: all + custom: "" + publicIpv6HttpProviders: + - provider: all + custom: "" + publicIpFetchers: + - provider: all + config: [] + # - provider: cloudflare + # host: "@" + # domain: example.com + # ipVersion: "" + # cfZoneID: asd + # cfTtl: 1 + # cfProxied: false + # cfToken: asd + + additionalEnvs: [] +ddnsNetwork: + webPort: 30000 + hostNetwork: false +ddnsRunAs: + user: 568 + group: 568 +ddnsStorage: + data: + type: ixVolume + hostPath: '' + datasetName: data diff --git a/community/ddns-updater/1.0.0/metadata.yaml b/community/ddns-updater/1.0.0/metadata.yaml new file mode 100644 index 0000000000..114f29105d --- /dev/null +++ b/community/ddns-updater/1.0.0/metadata.yaml @@ -0,0 +1,8 @@ +runAsContext: + - userName: ddns-updater + groupName: ddns-updater + gid: 568 + uid: 568 + description: DDNS Updater runs as any non-root user. +capabilities: [] +hostMounts: [] diff --git a/community/ddns-updater/1.0.0/questions.yaml b/community/ddns-updater/1.0.0/questions.yaml new file mode 100644 index 0000000000..fcf7c32961 --- /dev/null +++ b/community/ddns-updater/1.0.0/questions.yaml @@ -0,0 +1,1349 @@ +groups: + - name: DDNS Updater Configuration + description: Configure DDNS Updater + - name: User and Group Configuration + description: Configure User and Group for DDNS Updater + - name: Network Configuration + description: Configure Network for DDNS Updater + - name: Storage Configuration + description: Configure Storage for DDNS Updater + - name: Resources Configuration + description: Configure Resources for DDNS Updater + +portals: + web_portal: + protocols: + - "$kubernetes-resource_configmap_portal_protocol" + host: + - "$kubernetes-resource_configmap_portal_host" + ports: + - "$kubernetes-resource_configmap_portal_port" + path: "$kubernetes-resource_configmap_portal_path" + +questions: + - variable: TZ + group: DDNS Updater Configuration + label: Timezone + schema: + type: string + default: Etc/UTC + required: true + $ref: + - definitions/timezone + + - variable: ddnsConfig + label: "" + group: DDNS Updater Configuration + schema: + type: dict + attrs: + - variable: config + label: DNS Provider Configuration + description: | + Configuration for DDNS Updater.
+ Choose your provider in the following link for more information
+ https://github.com/qdm12/ddns-updater#configuration + schema: + type: list + min: 1 + required: true + empty: false + default: [] + items: + - variable: configEntry + label: Configuration Entry + schema: + type: dict + attrs: + - variable: provider + label: Provider + schema: + type: string + required: true + enum: + - value: aliyun + description: Aliyun + - value: allinkl + description: All-Inkl + - value: cloudflare + description: Cloudflare + - value: dd24 + description: DD24 + - value: ddnss + description: DDNSS + - value: digitalocean + description: Digital Ocean + - value: dnsomatic + description: DNS O Matic + - value: dnspod + description: DNS Pod + - value: dondominio + description: Don Dominio + - value: dreamhost + description: Dreamhost + - value: duckdns + description: Duck DNS + - value: dyn + description: DynDNS + - value: dynu + description: Dynu + - value: dynv6 + description: DynV6 + - value: freedns + description: FreeDNS + - value: gandi + description: Gandi + - value: gcp + description: GCP + - value: godaddy + description: GoDaddy + - value: google + description: Google + - value: he + description: He.net + - value: infomaniak + description: Infomaniak + - value: inwx + description: INWX + - value: linode + description: Linode + - value: luadns + description: LuaDNS + - value: namecheap + description: Namecheap + - value: njalla + description: Njalla + - value: noip + description: NoIP + - value: opendns + description: OpenDNS + - value: ovh + description: OVH + - value: porkbun + description: Porkbun + - value: selfhost.de + description: Selfhost.de + - value: servercow + description: Servercow + - value: spdyn + description: Spdyn.de + - value: strato + description: Strato + - value: variomedia + description: Variomedia + # Common to all providers + - variable: domain + label: Domain + description: | + Domain
+ For example: example.com + schema: + type: string + required: true + empty: false + - variable: ipVersion + label: IP Version + description: | + IP Version.
+ For example: IPv4 + schema: + type: string + show_if: [["provider", "=", "cloudflare"]] + default: "" + enum: + - value: ipv4 + description: IPv4 + - value: ipv6 + description: IPv6 + - value: "" + description: IPv4 and IPv6 + - variable: host + label: Host + description: | + Host.
+ For example: "@" + schema: + type: string + default: "@" + required: true + empty: false + + # Aliyun + - variable: aliyunAccessKey + label: Aliyun Access Key + description: Aliyun Access Key. + schema: + type: string + show_if: [["provider", "=", "aliyun"]] + required: true + empty: false + - variable: aliyunSecret + label: Aliyun Secret + description: Aliyun Secret. + schema: + type: string + show_if: [["provider", "=", "aliyun"]] + required: true + empty: false + + # All-Inkl + - variable: allinklUsername + label: All-Inkl Username + description: All-Inkl Username. + schema: + type: string + show_if: [["provider", "=", "allinkl"]] + required: true + empty: false + - variable: allinklPassword + label: All-Inkl Password + description: All-Inkl Password. + schema: + type: string + show_if: [["provider", "=", "allinkl"]] + required: true + empty: false + + # Cloudflare + - variable: cloudflareZoneID + label: Cloudflare Zone ID + description: | + Cloudflare Zone ID.
+ You can find it in the Overview tab of your domain. + schema: + type: string + required: true + show_if: [["provider", "=", "cloudflare"]] + - variable: cloudflareTtl + label: Cloudflare TTL + description: | + Cloudflare TTL.
+ 1 = Automatic
+ 600 = 10 minutes + schema: + type: int + min: 1 + required: true + show_if: [["provider", "=", "cloudflare"]] + default: 1 + - variable: cloudflareProxied + label: Cloudflare Proxied + description: | + Cloudflare Proxied.
+ True = Proxied
+ False = DNS Only + schema: + type: boolean + show_if: [["provider", "=", "cloudflare"]] + default: false + - variable: cloudflareToken + label: Cloudflare Token + description: Cloudflare Token. + schema: + type: string + show_if: [["provider", "=", "cloudflare"]] + - variable: cloudflareUserServiceKey + label: Cloudflare User Service Key + description: Cloudflare User Service Key. + schema: + type: string + show_if: [["provider", "=", "cloudflare"]] + - variable: cloudflareEmail + label: Cloudflare Email + description: Cloudflare Email. + schema: + type: string + show_if: [["provider", "=", "cloudflare"]] + - variable: cloudflareApiKey + label: Cloudflare API Key + description: Cloudflare API Key. + schema: + type: string + show_if: [["provider", "=", "cloudflare"]] + + # DD24 + - variable: dd24Password + label: DD24 Password + description: DD24 Password. + schema: + type: string + show_if: [["provider", "=", "dd24"]] + required: true + empty: false + + # DDNSS + - variable: ddnssUsername + label: DDNSS Username + description: DDNSS Username. + schema: + type: string + show_if: [["provider", "=", "ddnss"]] + required: true + empty: false + - variable: ddnssPassword + label: DDNSS Password + description: DDNSS Password. + schema: + type: string + show_if: [["provider", "=", "ddnss"]] + required: true + empty: false + - variable: ddnssProviderIP + label: DDNSS Provider IP + description: DDNSS Provider IP. + schema: + type: boolean + show_if: [["provider", "=", "ddnss"]] + default: false + - variable: ddnssDualStack + label: DDNSS Dual Stack + description: DDNSS Dual Stack. + schema: + type: boolean + show_if: [["provider", "=", "ddnss"]] + default: false + + # Digital Ocean + - variable: digitalOceanToken + label: Digital Ocean Token + description: Digital Ocean Token + schema: + type: string + show_if: [["provider", "=", "digitalocean"]] + required: true + empty: false + + # DNS O Matic + - variable: dnsOMaticUsername + label: DNS O Matic Username + description: DNS O Matic Username. + schema: + type: string + show_if: [["provider", "=", "dnsomatic"]] + required: true + empty: false + - variable: dnsOMaticPassword + label: DNS O Matic Password + description: DNS O Matic Password. + schema: + type: string + show_if: [["provider", "=", "dnsomatic"]] + required: true + empty: false + - variable: dnsOMaticProviderIP + label: DNS O Matic Provider IP + description: DNS O Matic Provider IP. + schema: + type: boolean + show_if: [["provider", "=", "dnsomatic"]] + default: false + + # DNS Pod + - variable: dnsPodToken + label: DNS Pod Token + description: DNS Pod Token. + schema: + type: string + show_if: [["provider", "=", "dnspod"]] + required: true + empty: false + + # Don Dominio + - variable: donDominioUsername + label: Don Dominio Username + description: Don Dominio Username. + schema: + type: string + show_if: [["provider", "=", "dondominio"]] + required: true + empty: false + - variable: donDominioPassword + label: Don Dominio Password + description: Don Dominio Password. + schema: + type: string + show_if: [["provider", "=", "dondominio"]] + required: true + empty: false + - variable: donDominioName + label: Don Dominio Name + description: Don Dominio Name. + schema: + type: string + show_if: [["provider", "=", "dondominio"]] + required: true + empty: false + + # Dreamhost + - variable: dreamHostKey + label: Dreamhost Key + description: Dreamhost Key. + schema: + type: string + show_if: [["provider", "=", "dreamhost"]] + required: true + empty: false + + # Duck DNS + - variable: duckdnsToken + label: Duck DNS Token + description: Duck DNS Token. + schema: + type: string + show_if: [["provider", "=", "duckdns"]] + required: true + empty: false + - variable: duckdnsProviderIP + label: Duck DNS Provider IP + description: Duck DNS Provider IP. + schema: + type: boolean + show_if: [["provider", "=", "duckdns"]] + default: false + + # DynDNS + - variable: dynClientKey + label: DynDNS Client Key + description: DynDNS Client Key. + schema: + type: string + show_if: [["provider", "=", "dyn"]] + required: true + empty: false + - variable: dynUsername + label: DynDNS Username + description: DynDNS Username. + schema: + type: string + show_if: [["provider", "=", "dyn"]] + required: true + empty: false + - variable: dynProviderIP + label: DynDNS Provider IP + description: DynDNS Provider IP. + schema: + type: boolean + show_if: [["provider", "=", "dyn"]] + default: false + + # Dynu + - variable: dynuUsername + label: Dynu Username + description: Dynu Username. + schema: + type: string + show_if: [["provider", "=", "dynu"]] + required: true + empty: false + - variable: dynuPassword + label: Dynu Password + description: Dynu Password. + schema: + type: string + show_if: [["provider", "=", "dynu"]] + required: true + empty: false + - variable: dynuGroup + label: Dynu Group + description: Dynu Group. + schema: + type: string + show_if: [["provider", "=", "dynu"]] + - variable: dynuProviderIP + label: Dynu Provider IP + description: Dynu Provider IP. + schema: + type: boolean + show_if: [["provider", "=", "dynu"]] + default: false + + # DynV6 + - variable: dynv6Token + label: DynV6 Token + description: DynV6 Token + schema: + type: string + show_if: [["provider", "=", "dynv6"]] + required: true + empty: false + - variable: dynv6ProviderIP + label: DynV6 Provider IP + description: DynV6 Provider IP. + schema: + type: boolean + show_if: [["provider", "=", "dynv6"]] + default: false + + # FreeDNS + - variable: freeDnsToken + label: FreeDNS Token + description: FreeDNS Token. + schema: + type: string + show_if: [["provider", "=", "freedns"]] + required: true + empty: false + + # Gandi + - variable: gandiKey + label: Gandi Key + description: Gandi Key. + schema: + type: string + show_if: [["provider", "=", "gandi"]] + required: true + empty: false + - variable: gandiTtl + label: Gandi TTL + description: Gandi TTL. + schema: + type: int + show_if: [["provider", "=", "gandi"]] + default: 3600 + required: true + + # GCP + - variable: gcpProject + label: GCP Project + description: GCP Project. + schema: + type: string + show_if: [["provider", "=", "gcp"]] + required: true + empty: false + - variable: gcpZone + label: GCP Zone + description: GCP Zone. + schema: + type: string + show_if: [["provider", "=", "gcp"]] + required: true + empty: false + - variable: gcpCredentials + label: GCP Credentials + description: | + GCP Credentials.
+ Paste the JSON content in this field + schema: + type: string + show_if: [["provider", "=", "gcp"]] + required: true + empty: false + + # GoDaddy + - variable: godaddyKey + label: GoDaddy Key + description: GoDaddy Key. + schema: + type: string + show_if: [["provider", "=", "godaddy"]] + required: true + empty: false + - variable: godaddySecret + label: GoDaddy Secret + description: GoDaddy Secret. + schema: + type: string + show_if: [["provider", "=", "godaddy"]] + required: true + empty: false + + # Google + - variable: googleUsername + label: Google Username + description: Google Username. + schema: + type: string + show_if: [["provider", "=", "google"]] + required: true + empty: false + - variable: googlePassword + label: Google Password + description: Google Password. + schema: + type: string + show_if: [["provider", "=", "google"]] + required: true + empty: false + + # He.net + - variable: hePassword + label: He.net Password + description: He.net Password. + schema: + type: string + show_if: [["provider", "=", "he"]] + required: true + empty: false + - variable: heProviderIP + label: He.net Provider IP + description: He.net Provider IP. + schema: + type: boolean + show_if: [["provider", "=", "he"]] + default: false + + # Infomaniak + - variable: infomaniakUsername + label: Infomaniak Username + description: Infomaniak Username. + schema: + type: string + show_if: [["provider", "=", "infomaniak"]] + required: true + empty: false + - variable: infomaniakPassword + label: Infomaniak Password + description: Infomaniak Password. + schema: + type: string + show_if: [["provider", "=", "infomaniak"]] + required: true + empty: false + - variable: infomaniakProviderIP + label: Infomaniak Provider IP + description: Infomaniak Provider IP. + schema: + type: boolean + show_if: [["provider", "=", "infomaniak"]] + default: false + + # INWX + - variable: inwxUsername + label: INWX Username + description: INWX Username. + schema: + type: string + show_if: [["provider", "=", "inwx"]] + required: true + empty: false + - variable: inwxPassword + label: INWX Password + description: INWX Password. + schema: + type: string + show_if: [["provider", "=", "inwx"]] + required: true + empty: false + + # Linode + - variable: linodeToken + label: Linode Token + description: Linode Token. + schema: + type: string + show_if: [["provider", "=", "linode"]] + required: true + empty: false + + # LuaDNS + - variable: luadnsToken + label: LuaDNS Token + description: LuaDNS Token. + schema: + type: string + show_if: [["provider", "=", "luadns"]] + required: true + empty: false + - variable: luadnsEmail + label: LuaDNS Email + description: LuaDNS Email. + schema: + type: string + show_if: [["provider", "=", "luadns"]] + required: true + empty: false + + # Namecheap + - variable: namecheapPassword + label: Namecheap Password + description: Namecheap Password. + schema: + type: string + show_if: [["provider", "=", "namecheap"]] + required: true + empty: false + - variable: namecheapProviderIP + label: Namecheap Provider IP + description: Namecheap Provider IP. + schema: + type: boolean + show_if: [["provider", "=", "namecheap"]] + default: false + + # Njalla + - variable: njallaKey + label: Njalla Key + description: Njalla Key. + schema: + type: string + show_if: [["provider", "=", "njalla"]] + required: true + empty: false + - variable: njallaProviderIP + label: Njalla Provider IP + description: Njalla Provider IP. + schema: + type: boolean + show_if: [["provider", "=", "njalla"]] + default: false + + # NoIP + - variable: noipUsername + label: NoIP Username + description: NoIP Username. + schema: + type: string + show_if: [["provider", "=", "noip"]] + required: true + empty: false + - variable: noipPassword + label: NoIP Password + description: NoIP Password. + schema: + type: string + show_if: [["provider", "=", "noip"]] + required: true + empty: false + - variable: noipProviderIP + label: NoIP Provider IP + description: NoIP Provider IP. + schema: + type: boolean + show_if: [["provider", "=", "noip"]] + default: false + + # OpenDNS + - variable: opendnsUsername + label: OpenDNS Username + description: OpenDNS Username. + schema: + type: string + show_if: [["provider", "=", "opendns"]] + required: true + empty: false + - variable: opendnsPassword + label: OpenDNS Password + description: OpenDNS Password. + schema: + type: string + show_if: [["provider", "=", "opendns"]] + required: true + empty: false + - variable: opendnsProviderIP + label: OpenDNS Provider IP + description: OpenDNS Provider IP. + schema: + type: boolean + show_if: [["provider", "=", "opendns"]] + default: false + + # OVH + - variable: ovhMode + label: OVH Mode + description: OVH Mode. + schema: + type: string + show_if: [["provider", "=", "ovh"]] + default: dynamic + required: true + enum: + - value: dynamic + description: Dynamic + - value: api + description: API + - variable: ovhUsername + label: OVH Username + description: OVH Username. + schema: + type: string + show_if: [["provider", "=", "ovh"]] + - variable: ovhPassword + label: OVH Password + description: OVH Password. + schema: + type: string + show_if: [["provider", "=", "ovh"]] + - variable: ovhApiEndpoint + label: OVH API Endpoint + description: OVH API Endpoint. + schema: + type: string + show_if: [["provider", "=", "ovh"]] + default: ovh-eu + - variable: ovhAppKey + label: OVH Application Key + description: OVH Application Key. + schema: + type: string + show_if: [["provider", "=", "ovh"]] + - variable: ovhAppSecret + label: OVH Application Secret + description: OVH Application Secret. + schema: + type: string + show_if: [["provider", "=", "ovh"]] + - variable: ovhConsumerKey + label: OVH Consumer Key + description: OVH Consumer Key. + schema: + type: string + show_if: [["provider", "=", "ovh"]] + + # Porkbun + - variable: porkbunApiKey + label: Porkbun API Key + description: Porkbun API Key. + schema: + type: string + show_if: [["provider", "=", "porkbun"]] + required: true + empty: false + - variable: porkbunSecretApiKey + label: Porkbun Secret API Key + description: Porkbun Secret API Key. + schema: + type: string + show_if: [["provider", "=", "porkbun"]] + required: true + empty: false + - variable: porkbunTtl + label: Porkbun TTL + description: Porkbun TTL. + schema: + type: int + show_if: [["provider", "=", "porkbun"]] + default: 3600 + + # Selfhost.de + - variable: selfhostdeUsername + label: Selfhost.de Username + description: Selfhost.de Username. + schema: + type: string + show_if: [["provider", "=", "selfhost.de"]] + required: true + empty: false + - variable: selfhostdePassword + label: Selfhost.de Password + description: Selfhost.de Password. + schema: + type: string + show_if: [["provider", "=", "selfhost.de"]] + required: true + empty: false + - variable: selfhostdeProviderIP + label: Selfhost.de Provider IP + description: Selfhost.de Provider IP. + schema: + type: boolean + show_if: [["provider", "=", "selfhost.de"]] + default: false + + # Servercow + - variable: servercowUsername + label: Servercow Username + description: Servercow Username. + schema: + type: string + show_if: [["provider", "=", "servercow"]] + required: true + empty: false + - variable: servercowPassword + label: Servercow Password + description: Servercow Password. + schema: + type: string + show_if: [["provider", "=", "servercow"]] + required: true + empty: false + - variable: servercowTtl + label: Servercow TTL + description: Servercow TTL. + schema: + type: int + show_if: [["provider", "=", "servercow"]] + default: 120 + - variable: servercowProviderIP + label: Servercow Provider IP + description: Servercow Provider IP. + schema: + type: boolean + show_if: [["provider", "=", "servercow"]] + default: false + + # Spdyn.de + - variable: spdynToken + label: Spdyn.de Token + description: Spdyn.de Token. + schema: + type: string + show_if: [["provider", "=", "spdyn"]] + required: true + empty: false + - variable: spdynUsername + label: Spdyn.de Username + description: Spdyn.de Username. + schema: + type: string + show_if: [["provider", "=", "spdyn"]] + required: true + empty: false + - variable: spdynPassword + label: Spdyn.de Password + description: Spdyn.de Password. + schema: + type: string + show_if: [["provider", "=", "spdyn"]] + required: true + empty: false + - variable: spdynProviderIP + label: Spdyn.de Provider IP + description: Spdyn.de Provider IP. + schema: + type: boolean + show_if: [["provider", "=", "spdyn"]] + default: false + + # Strato + - variable: stratoPassword + label: Strato Password + description: Strato Password. + schema: + type: string + show_if: [["provider", "=", "strato"]] + required: true + empty: false + - variable: stratoProviderIP + label: Strato Provider IP + description: Strato Provider IP. + schema: + type: boolean + show_if: [["provider", "=", "strato"]] + default: false + + # Variomedia + - variable: variomediaPassword + label: Variomedia Password + description: Variomedia Password. + schema: + type: string + show_if: [["provider", "=", "variomedia"]] + required: true + empty: false + - variable: variomediaEmail + label: Variomedia Email + description: Variomedia Email. + schema: + type: string + show_if: [["provider", "=", "variomedia"]] + required: true + empty: false + - variable: variomediaProviderIP + label: Variomedia Provider IP + description: Variomedia Provider IP. + schema: + type: boolean + show_if: [["provider", "=", "variomedia"]] + default: false + + - variable: period + label: Update Period + description: | + Default period of IP address check, following this format:
+ 5m = 5 minutes
+ 1h = 1 hour
+ 1h30m = 1 hour 30 minutes + schema: + type: string + default: 5m + required: true + - variable: updateCooldownPeriod + label: Update Cooldown Period + description: | + Duration to cooldown between updates for each record. + This is useful to avoid being rate limited or banned, + following this format:
+ 5m = 5 minutes
+ 1h = 1 hour
+ 1h30m = 1 hour 30 minutes + schema: + type: string + default: 5m + required: true + - variable: backupPeriod + label: Backup Period + description: | + Set to a period to enable zip backups of data/config.json and + data/updates.json in a zip file following this format:
+ 0 = disabled
+ 10h = 10 hours
+ 20h30m = 20 hours 30 minutes + schema: + type: string + default: 24h + required: true + - variable: httpTimeout + label: HTTP Timeout + description: | + Default timeout for HTTP requests, following this format:
+ 10s = 10 seconds
+ 1m = 1 minute
+ 1m30s = 1 minute 30 seconds + schema: + type: string + default: 10s + required: true + - variable: publicIpDnsTimeout + label: Public IP DNS Timeout + description: | + Public IP DNS query timeout, following this format:
+ 3s = 3 seconds
+ 1m = 1 minute
+ 1m30s = 1 minute 30 seconds + schema: + type: string + default: 3s + required: true + - variable: shoutrrrAddresses + label: Shoutrrr Addresses + description: | + List of Shoutrrr addresses to send notifications to.
+ See https://containrrr.dev/shoutrrr/0.7/services/overview/ for more information. + schema: + type: list + default: [] + items: + - variable: address + label: Address + schema: + type: string + required: true + empty: false + - variable: publicIpDnsProviders + label: Public IP DNS Providers + description: Providers to obtain the public IP address (IPv4 and/or IPv6) + schema: + type: list + min: 1 + required: true + empty: false + default: [{"provider": "all", "placeholder": "placeholder"}] + items: + - variable: publicIpDnsProviderEntry + label: Public IP DNS Provider Entry + schema: + type: dict + attrs: + - variable: provider + label: Provider + schema: + type: string + required: true + enum: + - value: all + description: All providers + - value: google + description: Google + - value: cloudflare + description: Cloudflare + # Workaround for a UI bug that is fixed in the next release + # (Single items in a dict inside a list was getting converted to a list of strings) + - variable: placeholder + label: placeholder + schema: + type: string + default: placeholder + required: true + hidden: true + - variable: publicIpHttpProviders + label: Public IP HTTP Providers + description: Providers to obtain the public IP address (IPv4 and/or IPv6) + schema: + type: list + min: 1 + required: true + empty: false + default: [{"provider": "all", "custom": ""}] + items: + - variable: publicIpHttpProviderEntry + label: Public IP HTTP Provider Entry + schema: + type: dict + attrs: + - variable: provider + label: Provider + schema: + type: string + required: true + enum: + - value: all + description: All providers + - value: opendns + description: opendns + - value: ifconfig + description: ifconfig + - value: ipinfo + description: ipinfo + - value: ddnss + description: ddnss + - value: google + description: google + - value: custom + description: Custom Provider + - variable: custom + label: Custom Value + schema: + type: string + show_if: [["provider", "=", "custom"]] + default: "" + required: true + - variable: publicIpv4HttpProviders + label: Public IPv4 HTTP Providers + description: Providers to obtain the public IPv4 address + schema: + type: list + min: 1 + required: true + empty: false + default: [{"provider": "all", "custom": ""}] + items: + - variable: publicIpv4HttpProviderEntry + label: Public IPv4 HTTP Provider Entry + schema: + type: dict + attrs: + - variable: provider + label: Provider + schema: + type: string + required: true + enum: + - value: all + description: All providers + - value: ipify + description: ipify + - value: noip + description: noip + - value: custom + description: Custom Provider + - variable: custom + label: Custom Value + schema: + type: string + show_if: [["provider", "=", "custom"]] + default: "" + required: true + - variable: publicIpv6HttpProviders + label: Public IPv6 HTTP Providers + description: Providers to obtain the public IPv6 address + schema: + type: list + min: 1 + required: true + empty: false + default: [{"provider": "all", "custom": ""}] + items: + - variable: publicIpv6HttpProviderEntry + label: Public IPv6 HTTP Provider Entry + schema: + type: dict + attrs: + - variable: provider + label: Provider + schema: + type: string + required: true + enum: + - value: all + description: All providers + - value: ipify + description: ipify + - value: noip + description: noip + - value: custom + description: Custom Provider + - variable: custom + label: Custom Value + schema: + type: string + show_if: [["provider", "=", "custom"]] + default: "" + required: true + - variable: publicIpFetchers + label: Public IP Fetchers + description: Fetcher types to obtain the public IP address + schema: + type: list + min: 1 + required: true + empty: false + default: [{"provider": "all", "placeholder": "placeholder"}] + items: + - variable: publicIpFetcherEntry + label: Public IP Fetcher Entry + schema: + type: dict + attrs: + - variable: provider + label: Fetcher + schema: + type: string + required: true + enum: + - value: all + description: All providers + - value: http + description: HTTP + - value: dns + description: DNS + # Workaround for a UI bug that is fixed in the next release + # (Single items in a dict inside a list was getting converted to a list of strings) + - variable: placeholder + label: placeholder + schema: + type: string + default: placeholder + required: true + hidden: true + + + - variable: additionalEnvs + label: Additional Environment Variables + description: Configure additional environment variables for DDNS Updater. + schema: + type: list + default: [] + items: + - variable: env + label: Environment Variable + schema: + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + required: true + + - variable: ddnsRunAs + label: "" + group: User and Group Configuration + schema: + type: dict + attrs: + - variable: user + label: User ID + description: The user id that DDNS Updater will run as. + schema: + type: int + min: 2 + default: 568 + required: true + - variable: group + label: Group ID + description: The group id that DDNS Updater will run as. + schema: + type: int + min: 2 + default: 568 + required: true + + - variable: ddnsNetwork + label: "" + group: Network Configuration + schema: + type: dict + attrs: + - variable: webPort + label: Web Port + description: The port for the DDNS Updater Web UI. + schema: + type: int + default: 30000 + min: 9000 + max: 65535 + required: true + - variable: hostNetwork + label: Host Network + description: | + Bind to the host network. It's recommended to keep this disabled.
+ schema: + type: boolean + default: false + + - variable: ddnsStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: data + label: DDNS Updater Data Storage + description: The path to store DDNS Updater Data. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: "ixVolume" + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: "data" + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + + - variable: resources + group: Resources Configuration + label: "" + schema: + type: dict + attrs: + - variable: limits + label: Limits + schema: + type: dict + attrs: + - variable: cpu + label: CPU + description: CPU limit for DDNS Updater. + schema: + type: string + default: "4000m" + required: true + - variable: memory + label: Memory + description: Memory limit for DDNS Updater. + schema: + type: string + default: "8Gi" + required: true diff --git a/community/ddns-updater/1.0.0/templates/NOTES.txt b/community/ddns-updater/1.0.0/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/community/ddns-updater/1.0.0/templates/_configuration.tpl b/community/ddns-updater/1.0.0/templates/_configuration.tpl new file mode 100644 index 0000000000..893310ddb1 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/_configuration.tpl @@ -0,0 +1,65 @@ +{{- define "ddns.configuration" -}} +{{- include "ddns.validation" $ }} + +configmap: + ddns-config: + enabled: true + data: + PERIOD: {{ .Values.ddnsConfig.period | quote }} + HTTP_TIMEOUT: {{ .Values.ddnsConfig.httpTimeout | quote }} + BACKUP_PERIOD: {{ .Values.ddnsConfig.backupPeriod | quote }} + UPDATE_COOLDOWN_PERIOD: {{ .Values.ddnsConfig.updateCooldownPeriod | quote }} + SHOUTRRR_ADDRESSES: {{ join "," .Values.ddnsConfig.shoutrrrAddresses | quote }} + PUBLICIP_DNS_TIMEOUT: {{ .Values.ddnsConfig.publicIpDnsTimeout | quote }} + PUBLICIP_DNS_PROVIDERS: {{ include "ddns.getPublicIpProviders" (dict "providerList" .Values.ddnsConfig.publicIpDnsProviders) }} + PUBLICIP_HTTP_PROVIDERS: {{ include "ddns.getPublicIpProviders" (dict "providerList" .Values.ddnsConfig.publicIpHttpProviders) }} + PUBLICIPV4_HTTP_PROVIDERS: {{ include "ddns.getPublicIpProviders" (dict "providerList" .Values.ddnsConfig.publicIpv4HttpProviders) }} + PUBLICIPV6_HTTP_PROVIDERS: {{ include "ddns.getPublicIpProviders" (dict "providerList" .Values.ddnsConfig.publicIpv6HttpProviders) }} + PUBLICIP_FETCHERS: {{ include "ddns.getPublicIpProviders" (dict "providerList" .Values.ddnsConfig.publicIpFetchers) }} + {{ $config := include "ddns.generateConfig" $ | fromYaml }} + CONFIG: {{ $config | toJson | quote }} +{{- end -}} + +{{- define "ddns.getPublicIpProviders" -}} + {{- $providerList := .providerList -}} + {{- $return := list -}} + + {{- range $providerList -}} + {{- if eq .provider "custom" -}} + {{- $return = append $return .custom -}} + {{- else -}} + {{- $return = append $return .provider -}} + {{- end -}} + {{- end -}} + + {{- join "," $return -}} +{{- end -}} + +{{/* Generates configuration in yaml + and then it gets converted to single line + JSON and passed as an env variable +*/}} +{{- define "ddns.generateConfig" -}} +{{- if not .Values.ddnsConfig.config -}} + {{- fail "DDNS Updater - Expected at least 1 item in DNS Provider COnfiguration" -}} +{{- end -}} +{{- $providers := (list "aliyun" "allinkl" "cloudflare" "dd24" "ddnss" "digitalocean" + "dnsomatic" "dnspod" "dondominio" "dreamhost" "duckdns" "dyn" + "dynu" "dynv6" "freedns" "gandi" "gcp" "godaddy" "google" "he" + "infomaniak" "inwx" "linode" "luadns" "namecheap" "njalla" "noip" + "opendns" "ovh" "porkbun" "selfhost.de" "servercow" "spdyn" + "strato" "variomedia") }} +settings: + {{- range $item := .Values.ddnsConfig.config -}} + {{- if not (mustHas $item.provider $providers) -}} + {{- fail (printf "DDNS Updater - DNS Provider [%v] is not supported" $item.provider) -}} + {{- end }} + - provider: {{ $item.provider }} + host: {{ $item.host | required (printf "DDNS Updater - Expected non-empty [Host] for %v provider" $item.provider) | quote }} + domain: {{ $item.domain | required (printf "DDNS Updater - Expected non-empty [Domain] for %v provider" $item.provider) | quote }} + ip_version: {{ $item.ipVersion | default "" | quote }} + {{- include (printf "ddns.config.%v" $item.provider) (dict "item" $item) | trim | nindent 4 -}} + {{- end -}} +{{- end -}} + +{{/* TODO: OVH */}} diff --git a/community/ddns-updater/1.0.0/templates/_ddns.tpl b/community/ddns-updater/1.0.0/templates/_ddns.tpl new file mode 100644 index 0000000000..6d18f322fb --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/_ddns.tpl @@ -0,0 +1,85 @@ +{{- define "ddns.workload" -}} +workload: + ddns: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: {{ .Values.ddnsNetwork.hostNetwork }} + containers: + ddns: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsUser: {{ .Values.ddnsRunAs.user }} + runAsGroup: {{ .Values.ddnsRunAs.group }} + env: + LISTENING_PORT: {{ .Values.ddnsNetwork.webPort }} + DATADIR: /updater/data + BACKUP_DIRECTORY: /updater/data + envFrom: + - configMapRef: + name: ddns-config + envList: + {{ with .Values.ddnsConfig.additionalEnvs }} + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + liveness: + enabled: {{ not .Values.ci }} + type: exec + command: + - /updater/app + - healthcheck + readiness: + enabled: {{ not .Values.ci }} + type: exec + command: + - /updater/app + - healthcheck + startup: + enabled: {{ not .Values.ci }} + type: exec + command: + - /updater/app + - healthcheck + initContainers: + {{- include "ix.v1.common.app.permissions" (dict "containerName" "01-permissions" + "UID" .Values.ddnsRunAs.user + "GID" .Values.ddnsRunAs.group + "mode" "check" + "type" "init") | nindent 8 }} + +{{/* Service */}} +service: + ddns: + enabled: true + primary: true + type: NodePort + targetSelector: ddns + ports: + webui: + enabled: true + primary: true + port: {{ .Values.ddnsNetwork.webPort }} + nodePort: {{ .Values.ddnsNetwork.webPort }} + targetSelector: ddns + +{{/* Persistence */}} +persistence: + data: + enabled: true + type: {{ .Values.ddnsStorage.data.type }} + datasetName: {{ .Values.ddnsStorage.data.datasetName | default "" }} + hostPath: {{ .Values.ddnsStorage.data.hostPath | default "" }} + targetSelector: + ddns: + ddns: + mountPath: /updater/data + 01-permissions: + mountPath: /mnt/directories/data +{{- end -}} diff --git a/community/ddns-updater/1.0.0/templates/_portal.tpl b/community/ddns-updater/1.0.0/templates/_portal.tpl new file mode 100644 index 0000000000..cbccb2518f --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/_portal.tpl @@ -0,0 +1,12 @@ +{{- define "ddns.portal" -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + path: "/" + port: {{ .Values.ddnsNetwork.webPort | quote }} + protocol: http + host: $node_ip +{{- end -}} diff --git a/community/ddns-updater/1.0.0/templates/_validation.tpl b/community/ddns-updater/1.0.0/templates/_validation.tpl new file mode 100644 index 0000000000..8a9d0cbf47 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/_validation.tpl @@ -0,0 +1,56 @@ +{{- define "ddns.validation" -}} + {{- include "ddns.validatePublicIpProviders" (dict "text" "Public IP DNS Providers" + "list" .Values.ddnsConfig.publicIpDnsProviders + "valid" (list "all" "cloudflare" "google")) -}} + + {{- include "ddns.validatePublicIpProviders" (dict "text" "Public IP HTTP Providers" + "list" .Values.ddnsConfig.publicIpHttpProviders + "valid" (list "all" "custom" "opendns" "ifconfig" "ipinfo" "ddnss" "google")) -}} + + {{- include "ddns.validatePublicIpProviders" (dict "text" "Public IPv4 HTTP Providers" + "list" .Values.ddnsConfig.publicIpv4HttpProviders + "valid" (list "all" "custom" "ipify" "noip")) -}} + + {{- include "ddns.validatePublicIpProviders" (dict "text" "Public IPv6 HTTP Providers" + "list" .Values.ddnsConfig.publicIpv6HttpProviders + "valid" (list "all" "custom" "ipify" "noip")) -}} + + {{- include "ddns.validatePublicIpProviders" (dict "text" "Public IP Fetchers" + "list" .Values.ddnsConfig.publicIpFetchers + "valid" (list "all" "http" "dns")) -}} +{{- end -}} + +{{- define "ddns.validatePublicIpProviders" -}} + {{- $text := .text -}} + {{- $list := .list -}} + {{- $valid := .valid -}} + {{- $type := .type -}} + + {{- if not $list -}} + {{- fail (printf "DDNS Updater - Expected non-empty [%v]" $text) -}} + {{- end -}} + + {{- $userProviders := list -}} + {{- range $list -}} + {{- if mustHas .provider $userProviders -}} + {{- fail (printf "DDNS Updater - Expected unique values in [%v], but got [%v] more than once" $text .provider) -}} + {{- end -}} + {{- $userProviders = mustAppend $userProviders .provider -}} + + {{- if not (mustHas .provider $valid) -}} + {{- fail (printf "DDNS Updater - [%v] valid values are [%v], but got [%v]" $text (join ", " $valid) .provider) -}} + {{- end -}} + + {{- if eq .provider "all" -}} + {{- if ne (len $list) 1 -}} + {{- fail (printf "DDNS Updater - [%v] cannot contain other values when [all] is selected" $text) -}} + {{- end -}} + {{- end -}} + + {{- if eq .provider "custom" -}} + {{- if not .custom -}} + {{- fail (printf "DDNS Updater - [%v] expected non-empty [Custom Value]" $text) -}} + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/community/ddns-updater/1.0.0/templates/common.yaml b/community/ddns-updater/1.0.0/templates/common.yaml new file mode 100644 index 0000000000..f74e6d2b57 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/common.yaml @@ -0,0 +1,10 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "ddns.workload" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "ddns.configuration" $ | fromYaml) -}} + +{{/* Create the configmap for portal manually*/}} +{{- include "ddns.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_aliyun.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_aliyun.tpl new file mode 100644 index 0000000000..b3d82fcf82 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_aliyun.tpl @@ -0,0 +1,16 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/aliyun.md */}} +{{- define "ddns.config.aliyun" -}} + {{- $item := .item }} +access_key_id: {{ $item.aliyunAccessKey | required "DDNS Updater - Expected non-empty [Access Key] for Aliyun provider" }} +access_secret: {{ $item.aliyunSecret | required "DDNS Updater - Expected non-empty [Secret] for Aliyun provider" }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: aliyun - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + aliyunAccessKey: key - Required + aliyunSecret: secret - Required +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_allinkl.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_allinkl.tpl new file mode 100644 index 0000000000..ceb779458c --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_allinkl.tpl @@ -0,0 +1,16 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/allinkl.md */}} +{{- define "ddns.config.allinkl" -}} + {{- $item := .item }} +username: {{ $item.allinklUsername | required "DDNS Updater - Expected non-empty [Username] for All-Inkl provider" }} +password: {{ $item.allinklPassword | required "DDNS Updater - Expected non-empty [Password] for All-Inkl provider" }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: allinkl - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + allinklUsername: user - Required + allinklPassword: password - Required +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_cloudflare.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_cloudflare.tpl new file mode 100644 index 0000000000..1574a75aa7 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_cloudflare.tpl @@ -0,0 +1,39 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/cloudflare.md */}} +{{- define "ddns.config.cloudflare" -}} + {{- $item := .item }} +zone_identifier: {{ $item.cloudflareZoneID | required "DDNS Updater - Expected non-empty [Zone Identifier] for Cloudflare provider" }} +ttl: {{ $item.cloudflareTtl | required "DDNS Updater - Expected non-empty [TTL] for Cloudflare provider" }} +proxied: {{ $item.cloudflareProxied | default false }} +{{- if $item.cloudflareToken }} +token: {{ $item.cloudflareToken }} +{{- else if $item.cloudflareUserServiceKey }} +user_service_key: {{ $item.cloudflareUserServiceKey }} +{{- else if and $item.cloudflareEmail $item.cloudflareApiKey }} +email: {{ $item.cloudflareEmail }} +api_key: {{ $item.cloudflareApiKey }} +{{- else -}} + {{- fail "DDNS Updater - Cloudflare provider requires either [Token] or [User Service Key] or [Email and API Key]" -}} +{{- end -}} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: cloudflare - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@") + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + cloudflareZoneID: id - Required + cloudflareTtl: 1 - Required - Valid values (>=1) + cloudflareProxied: false - Required - Valid values (true/false) + + # One of the following is required + # Token + cloudflareToken: token - Required + + # User service key + cloudflareUserServiceKey: user_service_key - Required + + # Email and API key + cloudflareEmail: email - Required + cloudflareApiKey: api_key - Required +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_dd24.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_dd24.tpl new file mode 100644 index 0000000000..f0f542f3bc --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_dd24.tpl @@ -0,0 +1,14 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/dd24.md */}} +{{- define "ddns.config.dd24" -}} + {{- $item := .item }} +password: {{ $item.dd24Password | required "DDNS Updater - Expected non-empty [Password] for dd24 provider" }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: dd24 - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + dd24Password: pass - Required +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_ddnss.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_ddnss.tpl new file mode 100644 index 0000000000..d1c6877996 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_ddnss.tpl @@ -0,0 +1,22 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/ddnss.md */}} +{{- define "ddns.config.ddnss" -}} + {{- $item := .item }} +username: {{ $item.ddnssUsername | required "DDNS Updater - Expected non-empty [Username] for DDNSS provider" }} +password: {{ $item.ddnssPassword | required "DDNS Updater - Expected non-empty [Password] for DDNSS provider" }} +provider_ip: {{ $item.ddnssProviderIP }} +{{- if not $item.ddnssProviderIP }} +dual_stack: {{ $item.ddnssDualStack | default false }} +{{- end -}} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: ddnss - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + ddnssUsername: user - Required + ddnssPassword: password - Required + ddnssProviderIP: true - Required - Valid values (true/false) + ddnssDualStack: false - Optional - Valid values (true/false) +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_digitalocean.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_digitalocean.tpl new file mode 100644 index 0000000000..11c0d3789f --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_digitalocean.tpl @@ -0,0 +1,14 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/digitalocean.md */}} +{{- define "ddns.config.digitalocean" -}} + {{- $item := .item }} +token: {{ $item.digitalOceanToken | required "DDNS Updater - Expected non-empty [Token] for Digital Ocean provider" }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: digitalocean - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + digitalOceanToken: token - Required +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_dnsPod.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_dnsPod.tpl new file mode 100644 index 0000000000..315ad259db --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_dnsPod.tpl @@ -0,0 +1,14 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/dnspod.md */}} +{{- define "ddns.config.dnspod" -}} + {{- $item := .item }} +token: {{ $item.dnsPodToken | required "DDNS Updater - Expected non-empty [Token] for DNS Pod provider" }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: dnspod - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + dnsPodToken: token - Required +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_dnsomatic.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_dnsomatic.tpl new file mode 100644 index 0000000000..519fa4a855 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_dnsomatic.tpl @@ -0,0 +1,18 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/dnsomatic.md */}} +{{- define "ddns.config.dnsomatic" -}} + {{- $item := .item }} +username: {{ $item.dnsOMaticUsername | required "DDNS Updater - Expected non-empty [Username] for DNS O Matic provider" }} +password: {{ $item.dnsOMaticPassword | required "DDNS Updater - Expected non-empty [Password] for DNS O Matic provider" }} +provider_ip: {{ $item.dnsOMaticProviderIP | default false }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: dnsomatic - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + dnsOMaticUsername: user - Required + dnsOMaticPassword: pass - Required + dnsOMaticProviderIP: true - Required - Valid values (true/false) +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_dondominio.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_dondominio.tpl new file mode 100644 index 0000000000..6f9a147a0c --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_dondominio.tpl @@ -0,0 +1,18 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/dondominio.md */}} +{{- define "ddns.config.dondominio" -}} + {{- $item := .item }} +username: {{ $item.donDominioUsername | required "DDNS Updater - Expected non-empty [Username] for Don Dominio provider" }} +password: {{ $item.donDominioPassword | required "DDNS Updater - Expected non-empty [Password] for Don Dominio provider" }} +name: {{ $item.donDominioName | required "DDNS Updater - Expected non-empty [Name] for Don Dominio provider" }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: dondominio - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + donDominioUsername: user - Required + donDominioPassword: pass - Required + donDominioName: name - Required +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_dreamhost.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_dreamhost.tpl new file mode 100644 index 0000000000..e16d659f81 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_dreamhost.tpl @@ -0,0 +1,14 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/dreamhost.md */}} +{{- define "ddns.config.dreamhost" -}} + {{- $item := .item }} +key: {{ $item.dreamHostKey | required "DDNS Updater - Expected non-empty [Key] for Dreamhost provider" }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: dreamhost - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + dreamHostKey: key - Required +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_duckdns.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_duckdns.tpl new file mode 100644 index 0000000000..5b224a1ca7 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_duckdns.tpl @@ -0,0 +1,16 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/duckdns.md */}} +{{- define "ddns.config.duckdns" -}} + {{- $item := .item }} +token: {{ $item.duckdnsToken | required "DDNS Updater - Expected non-empty [Token] for DuckDNS provider" }} +provider_ip: {{ $item.duckdnsProviderIP | default false }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: duckdns - Required + domain: "example.com" - Required + host: "subdomain" - Required - Valid value (subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + duckdnsToken: token - Required + duckdnsProviderIP: true - Required - Valid values (true/false) +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_dyndns.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_dyndns.tpl new file mode 100644 index 0000000000..ac51904e5f --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_dyndns.tpl @@ -0,0 +1,18 @@ +{{/* https://github.com/qdm12/d-updater/blob/master/docs/dyndns.md */}} +{{- define "ddns.config.dyn" -}} + {{- $item := .item }} +client_key: {{ $item.dynClientKey | required "DDNS Updater - Expected non-empty [Client Key] for DynDNS provider" }} +username: {{ $item.dynUsername | required "DDNS Updater - Expected non-empty [Username] for DynDNS provider" }} +provider_ip: {{ $item.dynProviderIP | default false }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: dyn - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + dynClientKey: key - Required + dynUsername: username - Required + dynProviderIP: true - Required - Valid values (true/false) +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_dynu.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_dynu.tpl new file mode 100644 index 0000000000..3688e2f41f --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_dynu.tpl @@ -0,0 +1,22 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/dynu.md */}} +{{- define "ddns.config.dynu" -}} + {{- $item := .item }} +username: {{ $item.dynuUsername | required "DDNS Updater - Expected non-empty [Username] for Dynu provider" }} +password: {{ $item.dynuPassword | required "DDNS Updater - Expected non-empty [Password] for Dynu provider" }} +{{- if $item.dynuGroup }} +group: {{ $item.dynuGroup }} +{{- end }} +provider_ip: {{ $item.dynuProviderIP | default false }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: dynu - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + dynuUsername: username - Required + dynuPassword: password - Required + dynuGroup: group - Optional + dynuProviderIP: true - Required - Valid values (true/false) +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_dynv6.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_dynv6.tpl new file mode 100644 index 0000000000..6a16561239 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_dynv6.tpl @@ -0,0 +1,16 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/dynv6.md */}} +{{- define "ddns.config.dynv6" -}} + {{- $item := .item }} +token: {{ $item.dynv6Token | required "DDNS Updater - Expected non-empty [Token] for DynV6 provider" }} +provider_ip: {{ $item.dynv6ProviderIP | default false }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: dynu - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + dynv6Token: token - Required + dynv6ProviderIP: true - Required - Valid values (true/false) +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_freedns.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_freedns.tpl new file mode 100644 index 0000000000..b39f8db12e --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_freedns.tpl @@ -0,0 +1,14 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/freedns.md */}} +{{- define "ddns.config.freedns" -}} + {{- $item := .item }} +token: {{ $item.freeDnsToken | required "DDNS Updater - Expected non-empty [Token] for FreeDNS provider" }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: freedns - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + freeDnsToken: token - Required +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_gandi.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_gandi.tpl new file mode 100644 index 0000000000..26451ad2b8 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_gandi.tpl @@ -0,0 +1,16 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/gandi.md */}} +{{- define "ddns.config.gandi" -}} + {{- $item := .item }} +key: {{ $item.gandiKey | required "DDNS Updater - Expected non-empty [Key] for Gandi provider" }} +ttl: {{ $item.gandiTtl | required "DDNS Updater - Expected non-empty [TTL] for Gandi provider" }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: gandi - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + gandiKey: key - Required + gandiTtl: 3600 - Required +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_gcp.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_gcp.tpl new file mode 100644 index 0000000000..f02b2f201b --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_gcp.tpl @@ -0,0 +1,18 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/gcp.md */}} +{{- define "ddns.config.gcp" -}} + {{- $item := .item }} +project: {{ $item.gcpProject | required "DDNS Updater - Expected non-empty [Project] for GCP provider" }} +zone: {{ $item.gcpZone | required "DDNS Updater - Expected non-empty [Zone] for GCP provider" }} +credentials: {{ $item.gcpCredentials | required "DDNS Updater - Expected non-empty [Credentials] for GCP provider" }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: gcp - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + gcpProject: my-project-id - Required + gcpZone: my-zone - Required + gcpCredentials: '{"type": "service_account", ...}' - Required +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_godaddy.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_godaddy.tpl new file mode 100644 index 0000000000..0094176a96 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_godaddy.tpl @@ -0,0 +1,16 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/godaddy.md */}} +{{- define "ddns.config.godaddy" -}} + {{- $item := .item }} +key: {{ $item.godaddyKey | required "DDNS Updater - Expected non-empty [Key] for GoDaddy provider" }} +secret: {{ $item.godaddySecret | required "DDNS Updater - Expected non-empty [TTL] for GoDaddy provider" }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: godaddy - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + godaddyKey: key - Required + godaddySecret: secret - Required +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_google.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_google.tpl new file mode 100644 index 0000000000..a6a1fea707 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_google.tpl @@ -0,0 +1,16 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/google.md */}} +{{- define "ddns.config.google" -}} + {{- $item := .item }} +username: {{ $item.googleUsername | required "DDNS Updater - Expected non-empty [Username] for Google provider" }} +password: {{ $item.googlePassword | required "DDNS Updater - Expected non-empty [Password] for Google provider" }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: google - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + googleUsername: username - Required + googlePassword: password - Required +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_he.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_he.tpl new file mode 100644 index 0000000000..8b06940e53 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_he.tpl @@ -0,0 +1,16 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/he.net.md */}} +{{- define "ddns.config.he" -}} + {{- $item := .item }} +password: {{ $item.hePassword | required "DDNS Updater - Expected non-empty [Password] for He.net provider" }} +provider_ip: {{ $item.heProviderIP | default false }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: he - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + hePassword: password - Required + heProviderIP: true - Required - Valid values (true/false) +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_infomaniak.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_infomaniak.tpl new file mode 100644 index 0000000000..384cdafbd4 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_infomaniak.tpl @@ -0,0 +1,18 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/infomaniak.md */}} +{{- define "ddns.config.infomaniak" -}} + {{- $item := .item }} +username: {{ $item.infomaniakUsername | required "DDNS Updater - Expected non-empty [Username] for Infomaniak provider" }} +password: {{ $item.infomaniakPassword | required "DDNS Updater - Expected non-empty [Password] for Infomaniak provider" }} +provider_ip: {{ $item.infomaniakProviderIP | default false }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: infomaniak - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + infomaniakUsername: user - Required + infomaniakPassword: password - Required + infomaniakProviderIP: true - Required - Valid values (true/false) +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_inwx.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_inwx.tpl new file mode 100644 index 0000000000..a9b01f3826 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_inwx.tpl @@ -0,0 +1,16 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/inwx.md */}} +{{- define "ddns.config.inwx" -}} + {{- $item := .item }} +username: {{ $item.inwxUsername | required "DDNS Updater - Expected non-empty [Username] for INWX provider" }} +password: {{ $item.inwxPassword | required "DDNS Updater - Expected non-empty [Password] for INWX provider" }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: inwx - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + inwxUsername: user - Required + inwxPassword: password - Required +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_linode.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_linode.tpl new file mode 100644 index 0000000000..7ceac4924a --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_linode.tpl @@ -0,0 +1,14 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/linode.md */}} +{{- define "ddns.config.linode" -}} + {{- $item := .item }} +token: {{ $item.linodeToken | required "DDNS Updater - Expected non-empty [Token] for Linode provider" }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: linode - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + linodeToken: token - Required +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_luadns.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_luadns.tpl new file mode 100644 index 0000000000..e6708bc055 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_luadns.tpl @@ -0,0 +1,16 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/luadns.md */}} +{{- define "ddns.config.luadns" -}} + {{- $item := .item }} +token: {{ $item.luadnsToken | required "DDNS Updater - Expected non-empty [Token] for LuaDNS provider" }} +email: {{ $item.luadnsEmail | required "DDNS Updater - Expected non-empty [Email] for LuaDNS provider" }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: luadns - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + luadnsToken: token - Required + luadnsEmail: email@example.com - Required +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_namecheap.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_namecheap.tpl new file mode 100644 index 0000000000..7fef823e6c --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_namecheap.tpl @@ -0,0 +1,16 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/namecheap.md */}} +{{- define "ddns.config.namecheap" -}} + {{- $item := .item }} +password: {{ $item.namecheapPassword | required "DDNS Updater - Expected non-empty [Password] for Namecheap provider" }} +provider_ip: {{ $item.namecheapProviderIP }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: namecheap - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + namecheapPassword: password - Required + namecheapProviderIP: false - Required - Valid values (true/false) +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_njalla.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_njalla.tpl new file mode 100644 index 0000000000..03b07eb950 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_njalla.tpl @@ -0,0 +1,16 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/njalla.md */}} +{{- define "ddns.config.njalla" -}} + {{- $item := .item }} +key: {{ $item.njallaKey | required "DDNS Updater - Expected non-empty [Key] for Njalla provider" }} +provider_ip: {{ $item.njallaProviderIP }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: njalla - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + njallaKey: key - Required + njallaProviderIP: false - Required - Valid values (true/false) +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_noip.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_noip.tpl new file mode 100644 index 0000000000..b50d6184ef --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_noip.tpl @@ -0,0 +1,18 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/noip.md */}} +{{- define "ddns.config.noip" -}} + {{- $item := .item }} +username: {{ $item.noipUsername | required "DDNS Updater - Expected non-empty [Username] for NoIP provider" }} +password: {{ $item.noipPassword | required "DDNS Updater - Expected non-empty [Password] for NoIP provider" }} +provider_ip: {{ $item.noipProviderIP }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: noip - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + noipUsername: username - Required + noipPassword: password - Required + noipProviderIP: false - Required - Valid values (true/false) +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_opendns.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_opendns.tpl new file mode 100644 index 0000000000..965c97b501 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_opendns.tpl @@ -0,0 +1,18 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/opendns.md */}} +{{- define "ddns.config.opendns" -}} + {{- $item := .item }} +username: {{ $item.opendnsUsername | required "DDNS Updater - Expected non-empty [Username] for OpenDNS provider" }} +password: {{ $item.opendnsPassword | required "DDNS Updater - Expected non-empty [Password] for OpenDNS provider" }} +provider_ip: {{ $item.opendnsProviderIP }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: opendns - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + opendnsUsername: username - Required + opendnsPassword: password - Required + opendnsProviderIP: false - Required - Valid values (true/false) +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_ovh.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_ovh.tpl new file mode 100644 index 0000000000..6a4af7f8c3 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_ovh.tpl @@ -0,0 +1,38 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/ovh.md */}} +{{- define "ddns.config.ovh" -}} + {{- $item := .item }} +mode: {{ $item.ovhMode | required "DDNS Updater - Expected non-empty [Mode] for OVH provider" }} +{{- if eq $item.ovhMode "dynamic" }} +username: {{ $item.ovhUsername | required "DDNS Updater - Expected non-empty [Username] for OVH provider on [dynamic] mode" }} +password: {{ $item.ovhPassword | required "DDNS Updater - Expected non-empty [Password] for OVH provider on [dynamic] mode" }} +{{- else if eq $item.ovhMode "api" }} +api_endpoint: {{ $item.ovhApiEndpoint | required "DDNS Updater - Expected non-empty [API Endpoint] for OVH provider on [api] mode" }} +app_key: {{ $item.ovhAppKey | required "DDNS Updater - Expected non-empty [App Key] for OVH provider on [api] mode" }} +app_secret: {{ $item.ovhAppSecret | required "DDNS Updater - Expected non-empty [App Secret] for OVH provider on [api] mode"}} +consumer_key: {{ $item.ovhConsumerKey | required "DDNS Updater - Expected non-empty [Consumer Key] for OVH provider on [api] mode" }} +{{- else -}} + {{- fail (printf "DDNS Updater - Expected [Mode] to be one of [Dynamic, API], but got [%v]" $item.ovhMode) -}} +{{- end }} +provider_ip: {{ $item.ovhProviderIP }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: ovh - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + ovhMode: dynamic - Required - Valid values (dynami/api) + + # Dynamic Mode + ovhUsername: username - Required + ovhPassword: password - Required + + # API Mode + ovhApiEndpoint: endpoint - Required + ovhAppKey: appKey - Required + ovhAppSecret: appSecret - Required + ovhConsumerKey: consumerKey - Required + + ovhProviderIP: false - Required - Valid values (true/false) +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_porkbun.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_porkbun.tpl new file mode 100644 index 0000000000..a7d59a2d6f --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_porkbun.tpl @@ -0,0 +1,20 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/porkbun.md */}} +{{- define "ddns.config.porkbun" -}} + {{- $item := .item }} +api_key: {{ $item.porkbunApiKey | required "DDNS Updater - Expected non-empty [API Key] for Porkbun provider" }} +secret_api_key: {{ $item.porkbunSecretApiKey | required "DDNS Updater - Expected non-empty [Secret API Key] for Porkbun provider" }} +{{- if $item.porkbunTtl }} +ttl: {{ $item.porkbunTtl }} +{{- end }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: opendns - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + porkbunApiKey: apikey - Required + porkbunSecretApiKey: secretapikey - Required + porkbunTtl: 300 - Optional +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_selfhostde.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_selfhostde.tpl new file mode 100644 index 0000000000..bbd0083f21 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_selfhostde.tpl @@ -0,0 +1,18 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/selfhost.de.md */}} +{{- define "ddns.config.selfhost.de" -}} + {{- $item := .item }} +username: {{ $item.selfhostdeUsername | required "DDNS Updater - Expected non-empty [Username] for Selfhost.de provider" }} +password: {{ $item.selfhostdePassword | required "DDNS Updater - Expected non-empty [Password] for Selfhost.de provider" }} +provider_ip: {{ $item.selfhostdeProviderIP }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: selfhosted.de - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + selfhostdeUsername: username - Required + selfhostdePassword: password - Required + selfhostdeProviderIP: false - Required - Valid values (true/false) +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_servercow.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_servercow.tpl new file mode 100644 index 0000000000..4deb8ca8f9 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_servercow.tpl @@ -0,0 +1,20 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/servercow.md */}} +{{- define "ddns.config.servercow" -}} + {{- $item := .item }} +username: {{ $item.servercowUsername | required "DDNS Updater - Expected non-empty [Username] for Servercow provider" }} +password: {{ $item.servercowPassword | required "DDNS Updater - Expected non-empty [Password] for Servercow provider" }} +ttl: {{ $item.servercowTtl | required "DDNS Updater - Expected non-empty [TTL] for Servercow provider" }} +provider_ip: {{ $item.servercowProviderIP }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: servercow - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + servercowUsername: username - Required + servercowPassword: password - Required + servercowTtl: 120 - Required + servercowProviderIP: false - Required - Valid values (true/false) +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_spdyn.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_spdyn.tpl new file mode 100644 index 0000000000..106b1a1093 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_spdyn.tpl @@ -0,0 +1,30 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/spdyn.md */}} +{{- define "ddns.config.spdyn" -}} + {{- $item := .item }} +{{- if $item.spdynToken }} +token: {{ $item.spdynToken }} +{{- else if and $item.spdynUsername $item.spdynPassword }} +username: {{ $item.spdynUsername }} +password: {{ $item.spdynPassword }} +{{- else -}} + {{- fail "DDNS Updater - Spdyn.de provider requires either [Token] or [Username and Password]" -}} +{{- end }} +provider_ip: {{ $item.spdynProviderIP | default false }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: spdyn - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@") + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + spdynProviderIP: false - Required - Valid values (true/false) + + # One of the following is required + # Token + spdynToken: token + + # Username and Password + spdynUsername: username + spdynPassword: password +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_strato.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_strato.tpl new file mode 100644 index 0000000000..23d1d15786 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_strato.tpl @@ -0,0 +1,16 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/strato.md */}} +{{- define "ddns.config.strato" -}} + {{- $item := .item }} +password: {{ $item.stratoPassword | required "DDNS Updater - Expected non-empty [Password] for Strato provider" }} +provider_ip: {{ $item.stratoProviderIP }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: strato - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + stratoPassword: password - Required + stratoProviderIP: false - Required - Valid values (true/false) +*/}} diff --git a/community/ddns-updater/1.0.0/templates/dnsProviders/_variomedia.tpl b/community/ddns-updater/1.0.0/templates/dnsProviders/_variomedia.tpl new file mode 100644 index 0000000000..214af9c740 --- /dev/null +++ b/community/ddns-updater/1.0.0/templates/dnsProviders/_variomedia.tpl @@ -0,0 +1,18 @@ +{{/* https://github.com/qdm12/ddns-updater/blob/master/docs/variomedia.md */}} +{{- define "ddns.config.variomedia" -}} + {{- $item := .item }} +password: {{ $item.variomediaPassword | required "DDNS Updater - Expected non-empty [Password] for Variomedia provider" }} +email: {{ $item.variomediaEmail | required "DDNS Updater - Expected non-empty [Email] for Variomedia provider" }} +provider_ip: {{ $item.variomediaProviderIP }} +{{- end -}} +{{/* +ddnsConfig: + config: + - provider: strato - Required + domain: "example.com" - Required + host: "@" - Required - Valid value ("@" or subdomain) + ipVersion: "" - Required - Valid values (ipv4/ipv6/"") + variomediaPassword: password - Required + variomediaEmail: email - Required + variomediaProviderIP: false - Required - Valid values (true/false) +*/}} diff --git a/community/ddns-updater/1.0.0/upgrade_strategy_disable b/community/ddns-updater/1.0.0/upgrade_strategy_disable new file mode 100755 index 0000000000..fe8f0f89bb --- /dev/null +++ b/community/ddns-updater/1.0.0/upgrade_strategy_disable @@ -0,0 +1,31 @@ +#!/usr/bin/python3 +import json +import re +import sys + +from catalog_update.upgrade_strategy import semantic_versioning + + +RE_STABLE_VERSION = re.compile(r'latest') + + +def newer_mapping(image_tags): + key = list(image_tags.keys())[0] + tags = {t: t for t in image_tags[key] if RE_STABLE_VERSION.fullmatch(t)} + version = semantic_versioning(list(tags)) + if not version: + return {} + + return { + 'tags': {key: tags[version]}, + 'app_version': version, + } + + +if __name__ == '__main__': + try: + versions_json = json.loads(sys.stdin.read()) + except ValueError: + raise ValueError('Invalid json specified') + + print(json.dumps(newer_mapping(versions_json))) diff --git a/community/ddns-updater/item.yaml b/community/ddns-updater/item.yaml new file mode 100644 index 0000000000..ec7fc9b879 --- /dev/null +++ b/community/ddns-updater/item.yaml @@ -0,0 +1,6 @@ +icon_url: https://raw.githubusercontent.com/qdm12/ddns-updater/master/readme/ddnsgopher.svg +categories: + - network +tags: + - ddns + - ddns-updater