Compare commits

..

1 Commits

Author SHA1 Message Date
alexbelgium
41f76f0d29 fix: auto-fix linting issues 2025-11-23 00:35:42 +00:00
66 changed files with 394 additions and 488 deletions

View File

@@ -197,7 +197,6 @@ Fabian-Eigenherd,Germany
Faithfinder,Canada
FallsSteven,
Felitendo,
Filipza,
Flipsoo,
FloppiTuna,United States
Fluffy-Bunny-23,
@@ -488,7 +487,6 @@ Rapozillha,Portugal
Raw2x2,
RdN-J,
RealJustMe,
Redmno,
Reiqu,Germany
RemcoSchrijver,Netherlands
Rene2302,
@@ -496,7 +494,6 @@ RescueWolf-Dreamwalker,
RhaaKaye,
RicLund,Canada
Richyread,
RimmeVG,
Rimpla,
Robbot,Ireland
RobertZwets,
@@ -584,7 +581,6 @@ Syuq,
T-I-M-O-T,
TCTnz,
THENEXTBIGTIME,
TS-1709,
TarrX,Germany
Tche333,
Tchoupinax,
@@ -818,7 +814,6 @@ bigsby-exe,United Kingdom
bilak,Czechia
bitDealer,
bjackerman,United States
bjoe10,
bkuri,Mexico
blackshoals,
blairun,
@@ -951,7 +946,6 @@ ctrlaltprocrastinate,
ctyfrank,
cuza,Cuba
cvladan,
cvroque,
cwmoriarty,
cy1798,
cyberjohn60,
@@ -1057,7 +1051,6 @@ dtrochow,
duckduckuk,United Kingdom
duhaijian,
dumbledorethor,
dutzi88,
duydo,Viet Nam
dwainegallimore,United Kingdom
dykandDK,
@@ -1101,7 +1094,6 @@ ettoreboy,
euneuneu,
evalevil,China
everconnectcn,
everestlion,
evertonerik,
evnb,United States
excodex,United Kingdom
@@ -1366,7 +1358,6 @@ jokob-sk,
joluas,
jonaslang1,Germany
jonathanweinberg,
jonbeckman,
jonssonjunior94,
joostiphone,
jopacar1,
@@ -1968,7 +1959,6 @@ starbuck93,United States
steef84,
stef-th,
stefangries,
steinmaerivoet,Belgium
stephenjharrington,
stepping-razor,Czechia
stetho,United Kingdom
@@ -2189,6 +2179,5 @@ zjw57,China
zking7,
zonorti,Germany
zr-idt,
zuranthus,Sweden
zweehn,
zymotik,Germany
1 username country
197 Faithfinder Canada
198 FallsSteven
199 Felitendo
Filipza
200 Flipsoo
201 FloppiTuna United States
202 Fluffy-Bunny-23
487 Raw2x2
488 RdN-J
489 RealJustMe
Redmno
490 Reiqu Germany
491 RemcoSchrijver Netherlands
492 Rene2302
494 RhaaKaye
495 RicLund Canada
496 Richyread
RimmeVG
497 Rimpla
498 Robbot Ireland
499 RobertZwets
581 T-I-M-O-T
582 TCTnz
583 THENEXTBIGTIME
TS-1709
584 TarrX Germany
585 Tche333
586 Tchoupinax
814 bilak Czechia
815 bitDealer
816 bjackerman United States
bjoe10
817 bkuri Mexico
818 blackshoals
819 blairun
946 ctyfrank
947 cuza Cuba
948 cvladan
cvroque
949 cwmoriarty
950 cy1798
951 cyberjohn60
1051 duckduckuk United Kingdom
1052 duhaijian
1053 dumbledorethor
dutzi88
1054 duydo Viet Nam
1055 dwainegallimore United Kingdom
1056 dykandDK
1094 euneuneu
1095 evalevil China
1096 everconnectcn
everestlion
1097 evertonerik
1098 evnb United States
1099 excodex United Kingdom
1358 joluas
1359 jonaslang1 Germany
1360 jonathanweinberg
jonbeckman
1361 jonssonjunior94
1362 joostiphone
1363 jopacar1
1959 steef84
1960 stef-th
1961 stefangries
steinmaerivoet Belgium
1962 stephenjharrington
1963 stepping-razor Czechia
1964 stetho United Kingdom
2179 zking7
2180 zonorti Germany
2181 zr-idt
zuranthus Sweden
2182 zweehn
2183 zymotik Germany

Binary file not shown.

Before

Width:  |  Height:  |  Size: 329 KiB

After

Width:  |  Height:  |  Size: 61 KiB

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "ghcr.io/hassio-addons/base-python/aarch64:stable",
"amd64": "ghcr.io/hassio-addons/base-python/amd64:stable"
}
"build_from": {
"aarch64": "ghcr.io/hassio-addons/base-python/aarch64:stable",
"amd64": "ghcr.io/hassio-addons/base-python/amd64:stable"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "ghcr.io/autobrr/autobrr:latest",
"amd64": "ghcr.io/autobrr/autobrr:latest"
}
"build_from": {
"aarch64": "ghcr.io/autobrr/autobrr:latest",
"amd64": "ghcr.io/autobrr/autobrr:latest"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "ghcr.io/mralucarddante/baikal-docker-hass:latest",
"amd64": "ghcr.io/mralucarddante/baikal-docker-hass:latest"
}
"build_from": {
"aarch64": "ghcr.io/mralucarddante/baikal-docker-hass:latest",
"amd64": "ghcr.io/mralucarddante/baikal-docker-hass:latest"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "lscr.io/linuxserver/bazarr:arm64v8-latest",
"amd64": "lscr.io/linuxserver/bazarr:amd64-latest"
}
"build_from": {
"aarch64": "lscr.io/linuxserver/bazarr:arm64v8-latest",
"amd64": "lscr.io/linuxserver/bazarr:amd64-latest"
}
}

View File

@@ -112,6 +112,7 @@ def automatic_mqtt_publish(file, detection, path):
mqttc.publish(mqtt_topic, json_bird, 1)
log.info("Posted to MQTT: ok")
# Create MQTT client using legacy callback API when available for
# compatibility with paho-mqtt >= 2.0
callback_api = getattr(mqtt, "CallbackAPIVersion", None)

0
emby/rootfs/etc/services.d/nginx/run Normal file → Executable file
View File

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "m4dm4rtig4n/myelectricaldata:latest",
"amd64": "m4dm4rtig4n/myelectricaldata:latest"
}
"build_from": {
"aarch64": "m4dm4rtig4n/myelectricaldata:latest",
"amd64": "m4dm4rtig4n/myelectricaldata:latest"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "m4dm4rtig4n/myelectricaldata:latest-dev",
"amd64": "m4dm4rtig4n/myelectricaldata:latest-dev"
}
"build_from": {
"aarch64": "m4dm4rtig4n/myelectricaldata:latest-dev",
"amd64": "m4dm4rtig4n/myelectricaldata:latest-dev"
}
}

View File

@@ -1,11 +1,4 @@
## debian-2025-11-19 (2025-11-19)
- Recreate a default config.json when only a legacy config.yaml is present so upgrades keep a usable configuration file
## debian-2025-11-18 (2025-11-18)
- Restore the default configuration template to config.json with the expected sample values
- Recreate a default config.json when only a legacy config.yaml is present so upgrades keep a usable configuration file
## debian-2025-11-16 (2025-11-16)
- Update to latest version from charlocharlie/epicgames-freegames
## "debian-2025-11-09" (09-11-2025)

View File

@@ -28,13 +28,13 @@ This addon is based on the docker image https://hub.docker.com/r/charlocharlie/e
## Configuration
Addon options expose the `env_vars` field for passing extra environment variables; all other configuration is done via the JSON file.
Addon options expose the `env_vars` field for passing extra environment variables; all other configuration is done via JSON files.
### Configuration Files
Configuration files are stored in `/config/addons_config/epicgamesfree/`:
- **config.json**: Main configuration file
- **config.yaml**: Main configuration file
- **cookies.json**: Authentication cookies (optional)
If these files don't exist, they will be created at first boot with default settings.
@@ -43,26 +43,23 @@ If these files don't exist, they will be created at first boot with default sett
### Basic Configuration
Create `/config/addons_config/epicgamesfree/config.json`:
Create `/config/addons_config/epicgamesfree/config.yaml`:
```json
{
"runOnStartup": true,
"cronSchedule": "0 */6 * * *",
"logLevel": "info",
"webPortalConfig": {
"baseUrl": "https://epic.example.com"
},
"accounts": [
{
"email": "your-epic-email@example.com",
"email": "your-epic-email@example.com",
"password": "your-password",
"totp": "OPTIONAL_2FA_SECRET"
}
],
"notifiers": [
{
"type": "email",
"intervalHours": 24,
"onlyWeekly": false,
"searchStrategy": "purchase",
"browserNavigationTimeout": 300000,
"notifications": {
"email": {
"smtpHost": "smtp.gmail.com",
"smtpPort": 587,
"emailSenderAddress": "notifications@example.com",
@@ -74,7 +71,7 @@ Create `/config/addons_config/epicgamesfree/config.json`:
"pass": "your-app-password"
}
}
]
}
}
```
@@ -83,52 +80,51 @@ Create `/config/addons_config/epicgamesfree/config.json`:
| Option | Type | Description |
|--------|------|-------------|
| `accounts` | array | List of Epic Games accounts |
| `cronSchedule` | string | Cron schedule to claim games (default: `0 */6 * * *`) |
| `runOnStartup` | boolean | Run a claim cycle when the add-on starts |
| `logLevel` | string | Application log level |
| `webPortalConfig.baseUrl` | string | Base URL used by the included web portal |
| `notifiers` | array | Notification targets such as email, Discord, Telegram, Apprise, etc. |
| `intervalHours` | number | Check interval in hours (default: 24) |
| `onlyWeekly` | boolean | Only claim weekly free games |
| `searchStrategy` | string | Search strategy: "purchase" or "claim" |
| `browserNavigationTimeout` | number | Browser timeout in milliseconds |
| `notifications` | object | Notification settings (email, webhook, etc.) |
### Account Configuration
For each account in the `accounts` array:
```yaml
email: account@example.com
password: password
totp: TOTP_SECRET
onlyWeekly: true
```json
{
"email": "account@example.com",
"password": "password",
"totp": "TOTP_SECRET",
"onlyWeekly": true
}
```
### Notification Methods
#### Email Notifications
```yaml
notifications:
email:
smtpHost: smtp.gmail.com
smtpPort: 587
emailSenderAddress: sender@example.com
emailRecipientAddress: recipient@example.com
secure: false
auth:
user: sender@example.com
pass: app-password
```json
"notifications": {
"email": {
"smtpHost": "smtp.gmail.com",
"smtpPort": 587,
"emailSenderAddress": "sender@example.com",
"emailRecipientAddress": "recipient@example.com",
"secure": false,
"auth": {
"user": "sender@example.com",
"pass": "app-password"
}
}
}
```
#### Webhook Notifications
```json
{
"notifiers": [
{
"type": "webhook",
"url": "https://your-webhook-url.com",
"events": [
"purchase-success",
"already-owned"
]
}
]
"notifications": {
"webhook": {
"url": "https://your-webhook-url.com",
"events": ["purchase-success", "already-owned"]
}
}
```
@@ -148,11 +144,9 @@ For detailed cookie import instructions, see: https://github.com/claabs/epicgame
### Troubleshooting
#### Timeout Errors
Add the following to your config.json:
Add the following to your config.yaml:
```json
{
"browserNavigationTimeout": 300000
}
"browserNavigationTimeout": 300000
```
#### Login Issues
@@ -178,7 +172,7 @@ The installation of this add-on is pretty straightforward and not different in c
### Timeout error
Please try adding `"browserNavigationTimeout": 300000,` to your config.json (https://github.com/alexbelgium/hassio-addons/issues/675#issuecomment-1407675351)
Please try adding `"browserNavigationTimeout": 300000,` to your config.yaml (https://github.com/alexbelgium/hassio-addons/issues/675#issuecomment-1407675351)
### Other errors

View File

@@ -86,5 +86,5 @@ schema:
slug: epicgamesfree
udev: true
url: https://github.com/alexbelgium/hassio-addons
version: "debian-2025-11-19"
version: "debian-2025-11-16"
webui: "[PROTO:ssl]://[HOST]:[PORT:3000]"

View File

@@ -7,22 +7,15 @@ set -e
##############
HOME="/config/addons_config/epicgamesfree"
CONFIG_JSON="$HOME/config.json"
LEGACY_YAML="$HOME/config.yaml"
if [ ! -f "$CONFIG_JSON" ]; then
if [ -f "$LEGACY_YAML" ]; then
bashio::log.warning "A legacy config.yaml was found. A default config.json will be created. Please migrate your settings to the new file format and restart the add-on"
fi
if [ ! -f "$HOME"/config.json ]; then
# Copy default config.json
cp /templates/config.json "$CONFIG_JSON"
chmod 755 "$CONFIG_JSON"
bashio::log.warning "A default config.json file was copied in $HOME. Please customize according to https://github.com/claabs/epicgames-freegames-node#configuration and restart the add-on"
cp /templates/config.json "$HOME"/config.json
chmod 755 "$HOME"/config.json
bashio::log.warning "A default config.json file was copied in $HOME. Please customize according to https://github.com/claabs/epicgames-freegames-node#json-configuration and restart the add-on"
sleep 5
bashio::exit.nok
else
bashio::log.warning "The config.json file found in $HOME will be used. Please customize according to https://github.com/claabs/epicgames-freegames-node#configuration and restart the add-on"
bashio::log.warning "The config.json file found in $HOME will be used. Please customize according to https://github.com/claabs/epicgames-freegames-node#json-configuration and restart the add-on"
fi
# Permissions

View File

@@ -1,78 +0,0 @@
{
"runOnStartup":true,
"cronSchedule":"0 */6 * * *",
"logLevel":"info",
"webPortalConfig":{
"baseUrl":"https://epic.example.com"
},
"accounts":[
{
"email":"example@gmail.com"
}
],
"notifiers":[
{
"type":"email",
"smtpHost":"smtp.gmail.com",
"smtpPort":587,
"emailSenderAddress":"hello@gmail.com",
"emailSenderName":"Epic Games Captchas",
"emailRecipientAddress":"hello@gmail.com",
"secure":false,
"auth":{
"user":"hello@gmail.com",
"pass":"abc123"
}
},
{
"type":"discord",
"webhookUrl":"https://discord.com/api/webhooks/123456789123456789/A-abcdefghijklmn-abcdefghijklmnopqrst12345678-abcdefghijklmnop123456",
"mentionedUsers":[
"914360712086843432"
],
"mentionedRoles":[
"734548250895319070"
]
},
{
"type":"telegram",
"apiUrl":"https://api.telegram.org",
"token":"644739147:AAGMPo-Jz3mKRnHRTnrPEDi7jUF1vqNOD5k",
"chatId":"-987654321"
},
{
"type":"apprise",
"apiUrl":"http://192.168.1.2:8000",
"urls":"mailto://user:pass@gmail.com"
},
{
"type":"pushover",
"token":"a172fyyl9gw99p2xi16tq8hnib48p2",
"userKey":"uvgidym7l5ggpwu2r8i1oy6diaapll"
},
{
"type":"gotify",
"apiUrl":"https://gotify.net",
"token":"SnL-wAvmfo_QT"
},
{
"type":"homeassistant",
"instance":"https://homeassistant.example.com",
"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c",
"notifyservice":"mobile_app_smartphone_name"
},
{
"type":"bark",
"key":"xxxxxxxxxxxxxxxxxxxxxx",
"title":"epicgames-freegames",
"group":"epicgames-freegames",
"apiUrl":"https://api.day.app"
},
{
"type":"ntfy",
"webhookUrl":"https://ntfy.example.com/mytopic",
"priority":"urgent",
"token":"tk_mytoken"
}
]
}

View File

@@ -0,0 +1,50 @@
runOnStartup: true
cronSchedule: 0 */6 * * *
logLevel: info
webPortalConfig:
baseUrl: https://epic.example.com
accounts:
- email: example@gmail.com
notifiers:
- type: email
smtpHost: smtp.gmail.com
smtpPort: 587
emailSenderAddress: hello@gmail.com
emailSenderName: Epic Games Captchas
emailRecipientAddress: hello@gmail.com
secure: false
auth:
user: hello@gmail.com
pass: abc123
- type: discord
webhookUrl: https://discord.com/api/webhooks/123456789123456789/A-abcdefghijklmn-abcdefghijklmnopqrst12345678-abcdefghijklmnop123456
mentionedUsers:
- "914360712086843432"
mentionedRoles:
- "734548250895319070"
- type: telegram
apiUrl: https://api.telegram.org
token: 644739147:AAGMPo-Jz3mKRnHRTnrPEDi7jUF1vqNOD5k
chatId: "-987654321"
- type: apprise
apiUrl: http://192.168.1.2:8000
urls: mailto://user:pass@gmail.com
- type: pushover
token: a172fyyl9gw99p2xi16tq8hnib48p2
userKey: uvgidym7l5ggpwu2r8i1oy6diaapll
- type: gotify
apiUrl: https://gotify.net
token: SnL-wAvmfo_QT
- type: homeassistant
instance: https://homeassistant.example.com
token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
notifyservice: mobile_app_smartphone_name
- type: bark
key: xxxxxxxxxxxxxxxxxxxxxx
title: epicgames-freegames
group: epicgames-freegames
apiUrl: https://api.day.app
- type: ntfy
webhookUrl: https://ntfy.example.com/mytopic
priority: urgent
token: tk_mytoken

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "filebrowser/filebrowser:s6",
"amd64": "filebrowser/filebrowser:s6"
}
"build_from": {
"aarch64": "filebrowser/filebrowser:s6",
"amd64": "filebrowser/filebrowser:s6"
}
}

View File

@@ -1,5 +1,3 @@
## 2.3.1-3 (23-11-2025)
- Minor bugs fixed
## 2.3.1-2 (22-11-2025)
- Minor bugs fixed

View File

@@ -141,6 +141,6 @@ slug: immich
udev: true
url: https://github.com/alexbelgium/hassio-addons
usb: true
version: 2.3.1-3
version: 2.3.1-2
video: true
webui: http://[HOST]:[PORT:8080]

View File

@@ -1,5 +1,3 @@
## 2.3.1-3 (23-11-2025)
- Minor bugs fixed
## 2.3.1-2 (22-11-2025)
- Minor bugs fixed

View File

@@ -3,8 +3,7 @@ arch:
- amd64
backup_exclude:
- "**/machine-learning/*"
description:
Self-hosted photo and video backup solution directly from your mobile phone
description: Self-hosted photo and video backup solution directly from your mobile phone
devices:
- /dev/dri
- /dev/dxg
@@ -140,6 +139,6 @@ slug: immich_noml
udev: true
url: https://github.com/alexbelgium/hassio-addons
usb: true
version: 2.3.1-3
version: 2.3.1-2
video: true
webui: http://[HOST]:[PORT:8080]

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "troglobit/inadyn:latest",
"amd64": "troglobit/inadyn:latest"
}
"build_from": {
"aarch64": "troglobit/inadyn:latest",
"amd64": "troglobit/inadyn:latest"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "lscr.io/linuxserver/jackett:arm64v8-latest",
"amd64": "lscr.io/linuxserver/jackett:amd64-latest"
}
"build_from": {
"aarch64": "lscr.io/linuxserver/jackett:arm64v8-latest",
"amd64": "lscr.io/linuxserver/jackett:amd64-latest"
}
}

View File

@@ -1,8 +1,3 @@
## breaking_versions: 10.11.3-1 (23-11-2025)
- Minor bugs fixed
## 10.11.3-1 (23-11-2025)
- Fix optional `i915_enable_guc` setting so the add-on no longer requires a value after updates.
## 10.11.3 (22-11-2025)
- Update to latest version from linuxserver/docker-jellyfin (changelog : https://github.com/linuxserver/docker-jellyfin/releases)

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "lscr.io/linuxserver/jellyfin:arm64v8-latest",
"amd64": "lscr.io/linuxserver/jellyfin:amd64-latest"
}
"build_from": {
"aarch64": "lscr.io/linuxserver/jellyfin:arm64v8-latest",
"amd64": "lscr.io/linuxserver/jellyfin:amd64-latest"
}
}

View File

@@ -91,6 +91,7 @@ options:
PGID: 0
PUID: 0
data_location: /share/jellyfin
i915_enable_guc: null
panel_admin: false
panel_icon: mdi:billiards-rack
ports:
@@ -125,5 +126,5 @@ schema:
slug: jellyfin
udev: true
url: https://github.com/alexbelgium/hassio-addons
version: "10.11.3-1"
version: "10.11.3"
video: true

0
jellyfin/rootfs/etc/services.d/nginx/run Normal file → Executable file
View File

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "lscr.io/linuxserver/lidarr:arm64v8-latest",
"amd64": "lscr.io/linuxserver/lidarr:amd64-latest"
}
"build_from": {
"aarch64": "lscr.io/linuxserver/lidarr:arm64v8-latest",
"amd64": "lscr.io/linuxserver/lidarr:amd64-latest"
}
}

View File

@@ -166,7 +166,7 @@ if [[ "${MEILISEARCH_LOCAL}" == true ]]; then
bashio::log.error "${message}"
if [ -n "${S6_SVSCANCTL_BIN}" ]; then
if ! "${S6_SVSCANCTL_BIN}" -t "${S6_SUPERVISED_DIR}" 2>/dev/null; then
if ! "${S6_SVSCANCTL_BIN}" -t "${S6_SUPERVISED_DIR}" 2> /dev/null; then
bashio::log.error "Unable to signal s6-svscanctl to stop services"
fi
else
@@ -181,7 +181,7 @@ if [[ "${MEILISEARCH_LOCAL}" == true ]]; then
}
meilisearch_ensure_running() {
if kill -0 "${MEILISEARCH_PID}" 2>/dev/null; then
if kill -0 "${MEILISEARCH_PID}" 2> /dev/null; then
return 0
fi
@@ -201,12 +201,12 @@ if [[ "${MEILISEARCH_LOCAL}" == true ]]; then
}
MEILISEARCH_CMD=(
env \
MEILI_ENV="${MEILISEARCH_ENVIRONMENT}" \
MEILI_NO_ANALYTICS="${MEILISEARCH_NO_ANALYTICS}" \
meilisearch \
--http-addr "${MEILISEARCH_ADDR}" \
--db-path "${MEILISEARCH_DB_PATH}"
env
MEILI_ENV="${MEILISEARCH_ENVIRONMENT}"
MEILI_NO_ANALYTICS="${MEILISEARCH_NO_ANALYTICS}"
meilisearch
--http-addr "${MEILISEARCH_ADDR}"
--db-path "${MEILISEARCH_DB_PATH}"
)
if [ -n "${MEILISEARCH_ENV_KEY}" ]; then
@@ -218,7 +218,7 @@ if [[ "${MEILISEARCH_LOCAL}" == true ]]; then
bashio::log.info "Waiting for Meilisearch TCP socket"
for attempt in $(seq 1 30); do
if bash -c "cat < /dev/null > /dev/tcp/${MEILISEARCH_HOST}/${MEILISEARCH_PORT}" 2>/dev/null; then
if bash -c "cat < /dev/null > /dev/tcp/${MEILISEARCH_HOST}/${MEILISEARCH_PORT}" 2> /dev/null; then
break
fi

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "lscr.io/linuxserver/mylar3:arm64v8-latest",
"amd64": "lscr.io/linuxserver/mylar3:amd64-latest"
}
"build_from": {
"aarch64": "lscr.io/linuxserver/mylar3:arm64v8-latest",
"amd64": "lscr.io/linuxserver/mylar3:amd64-latest"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "ghcr.io/jokob-sk/netalertx:latest",
"amd64": "ghcr.io/jokob-sk/netalertx:latest"
}
"build_from": {
"aarch64": "ghcr.io/jokob-sk/netalertx:latest",
"amd64": "ghcr.io/jokob-sk/netalertx:latest"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "lscr.io/linuxserver/nzbget:arm64v8-latest",
"amd64": "lscr.io/linuxserver/nzbget:amd64-latest"
}
"build_from": {
"aarch64": "lscr.io/linuxserver/nzbget:arm64v8-latest",
"amd64": "lscr.io/linuxserver/nzbget:amd64-latest"
}
}

0
nzbget/rootfs/etc/services.d/nginx/run Normal file → Executable file
View File

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "lscr.io/linuxserver/ombi:arm64v8-latest",
"amd64": "lscr.io/linuxserver/ombi:amd64-latest"
}
"build_from": {
"aarch64": "lscr.io/linuxserver/ombi:arm64v8-latest",
"amd64": "lscr.io/linuxserver/ombi:amd64-latest"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "organizr/organizr:linux-arm64",
"amd64": "organizr/organizr:linux-amd64"
}
"build_from": {
"aarch64": "organizr/organizr:linux-arm64",
"amd64": "organizr/organizr:linux-amd64"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "lscr.io/linuxserver/piwigo:arm64v8-latest",
"amd64": "lscr.io/linuxserver/piwigo:amd64-latest"
}
"build_from": {
"aarch64": "lscr.io/linuxserver/piwigo:arm64v8-latest",
"amd64": "lscr.io/linuxserver/piwigo:amd64-latest"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "lscr.io/linuxserver/plex:arm64v8-latest",
"amd64": "lscr.io/linuxserver/plex:amd64-latest"
}
"build_from": {
"aarch64": "lscr.io/linuxserver/plex:arm64v8-latest",
"amd64": "lscr.io/linuxserver/plex:amd64-latest"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "ghcr.io/hassio-addons/base/aarch64:16.0.0",
"amd64": "ghcr.io/hassio-addons/base/amd64:16.0.0"
}
"build_from": {
"aarch64": "ghcr.io/hassio-addons/base/aarch64:16.0.0",
"amd64": "ghcr.io/hassio-addons/base/amd64:16.0.0"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "ghcr.io/hassio-addons/base/aarch64:11.1.0",
"amd64": "ghcr.io/hassio-addons/base/amd64:11.1.0"
}
"build_from": {
"aarch64": "ghcr.io/hassio-addons/base/aarch64:11.1.0",
"amd64": "ghcr.io/hassio-addons/base/amd64:11.1.0"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "ghcr.io/immich-app/postgres:15-vectorchord0.4.3-pgvectors0.3.0",
"amd64": "ghcr.io/immich-app/postgres:15-vectorchord0.4.3-pgvectors0.3.0"
}
"build_from": {
"aarch64": "ghcr.io/immich-app/postgres:15-vectorchord0.4.3-pgvectors0.3.0",
"amd64": "ghcr.io/immich-app/postgres:15-vectorchord0.4.3-pgvectors0.3.0"
}
}

View File

@@ -1,6 +1,3 @@
## 5.1.2-16 (23-11-2025)
- Cycle through ip providers to avoid rate limiting api
## 5.1.2-13 (19-11-2025)
- Add IPv4 fallback for WireGuard connections

View File

@@ -145,4 +145,4 @@ schema:
slug: qbittorrent
udev: true
url: https://github.com/alexbelgium/hassio-addons
version: 5.1.2-16
version: 5.1.2-13

View File

@@ -15,9 +15,7 @@ if bashio::config.true 'openvpn_enabled'; then
bashio::log.info "----------------------------"
# Get current ip
( curl -fsS --max-time 10 https://ifconfig.co/ip \
|| curl -fsS --max-time 10 https://api64.ipify.org \
|| curl -fsS --max-time 10 https://ipecho.net/plain ) > /currentip
curl -s ipecho.net/plain > /currentip
# Function to check for files path
function check_path() {

View File

@@ -50,7 +50,7 @@ if [ -z "${wireguard_config:-}" ]; then
fi
fi
dos2unix "${wireguard_config}" >/dev/null 2>&1 || true
dos2unix "${wireguard_config}" > /dev/null 2>&1 || true
interface_name="$(basename "${wireguard_config}" .conf)"
if [[ -z "${interface_name}" ]]; then
@@ -60,7 +60,7 @@ fi
wireguard_runtime_config="${WIREGUARD_STATE_DIR}/${interface_name}.conf"
cp "${wireguard_config}" "${wireguard_runtime_config}"
chmod 600 "${wireguard_runtime_config}" 2>/dev/null || true
chmod 600 "${wireguard_runtime_config}" 2> /dev/null || true
bashio::log.info 'Prepared WireGuard runtime configuration for initial connection attempt.'
echo "${wireguard_runtime_config}" > "${WIREGUARD_STATE_DIR}/config"
@@ -77,8 +77,6 @@ else
fi
# Get current ip
( curl -fsS --max-time 10 https://ifconfig.co/ip \
|| curl -fsS --max-time 10 https://api64.ipify.org \
|| curl -fsS --max-time 10 https://ipecho.net/plain ) > /currentip
curl -s ipecho.net/plain > /currentip
bashio::log.info "WireGuard prepared with interface ${interface_name} using configuration ${wireguard_config##*/}."

View File

@@ -5,18 +5,6 @@ WEBUI_PORT=${WEBUI_PORT:-8080}
export PATH="/usr/local/sbin:/usr/local/bin:${PATH}"
# --- New helper: get public IP with rate-limiting fallbacks ---
_get_public_ip() {
local ip
ip=$(
curl -fsS --max-time 10 https://ifconfig.co/ip \
|| curl -fsS --max-time 10 https://api64.ipify.org \
|| curl -fsS --max-time 10 https://ipecho.net/plain
) || return 1
printf '%s\n' "${ip}"
}
if bashio::config.true 'silent'; then
sed -i 's|/proc/1/fd/1 hassio;|off;|g' /etc/nginx/nginx.conf
fi
@@ -41,11 +29,11 @@ else
fi
wireguard_config="$(cat "${WIREGUARD_STATE_DIR}/config")"
wireguard_interface="$(cat "${WIREGUARD_STATE_DIR}/interface" 2>/dev/null || echo 'wg0')"
wireguard_interface="$(cat "${WIREGUARD_STATE_DIR}/interface" 2> /dev/null || echo 'wg0')"
if ip link show "${wireguard_interface}" &> /dev/null; then
bashio::log.warning "WireGuard interface ${wireguard_interface} already exists. Attempting to reset it."
wg-quick down "${wireguard_config}" >/dev/null 2>&1 || true
wg-quick down "${wireguard_config}" > /dev/null 2>&1 || true
fi
bashio::log.info "Starting WireGuard interface ${wireguard_interface} using ${wireguard_config##*/}."
@@ -56,12 +44,12 @@ else
mkdir -p "${legacy_bin_dir}"
for cmd in iptables iptables-save iptables-restore ip6tables ip6tables-save ip6tables-restore; do
if command -v "${cmd}-legacy" >/dev/null 2>&1; then
if command -v "${cmd}-legacy" > /dev/null 2>&1; then
ln -sf "$(command -v "${cmd}-legacy")" "${legacy_bin_dir}/${cmd}"
fi
done
chmod 700 "${legacy_bin_dir}" 2>/dev/null || true
chmod 700 "${legacy_bin_dir}" 2> /dev/null || true
export PATH="${legacy_bin_dir}:${PATH}"
bashio::log.warning 'Retrying WireGuard bring-up using iptables-legacy wrappers.'
}
@@ -79,8 +67,8 @@ else
fi
if echo "${output}" | grep -qiE 'iptables-restore|ip6tables-restore|xtables'; then
if command -v iptables-legacy >/dev/null 2>&1 || command -v ip6tables-legacy >/dev/null 2>&1; then
wg-quick down "${config_path}" >/dev/null 2>&1 || true
if command -v iptables-legacy > /dev/null 2>&1 || command -v ip6tables-legacy > /dev/null 2>&1; then
wg-quick down "${config_path}" > /dev/null 2>&1 || true
_wireguard_prepare_iptables_legacy
output=$(wg-quick up "${config_path}" 2>&1)
status=$?
@@ -99,7 +87,7 @@ else
ipv4_config="${WIREGUARD_STATE_DIR}/${wireguard_interface}-ipv4.conf"
echo -n > "${ipv4_config}"
chmod 600 "${ipv4_config}" 2>/dev/null || true
chmod 600 "${ipv4_config}" 2> /dev/null || true
while IFS= read -r line; do
if [[ "${line}" =~ ^Endpoint ]]; then
@@ -121,7 +109,7 @@ else
fi
done < "${wireguard_config}"
wg-quick down "${wireguard_config}" >/dev/null 2>&1 || true
wg-quick down "${wireguard_config}" > /dev/null 2>&1 || true
if ! _wireguard_up_with_iptables_fallback "${ipv4_config}"; then
bashio::log.error 'WireGuard failed to establish a connection after IPv4-only retry.'
@@ -140,18 +128,10 @@ else
bashio::log.info "WireGuard interface ${wireguard_interface} is up."
# Example usage of the helper: get VPN-protected IP and store it
if vpn_ip="$(_get_public_ip)"; then
echo "${vpn_ip}" > /vpn_ip
bashio::log.info "Detected VPN public IP: ${vpn_ip}"
else
bashio::log.warning 'Unable to determine VPN public IP (all IP services failed).'
fi
# Refresh DNS resolver configuration if resolvconf is present
if command -v resolvconf >/dev/null 2>&1; then
if command -v resolvconf > /dev/null 2>&1; then
bashio::log.info 'Refreshing DNS resolver configuration via resolvconf -u.'
if ! resolvconf -u >/dev/null 2>&1; then
if ! resolvconf -u > /dev/null 2>&1; then
bashio::log.warning 'resolvconf -u failed. DNS configuration may not have been updated.'
fi
else

8
qbittorrent/rootfs/etc/services.d/nginx/run Normal file → Executable file
View File

@@ -38,7 +38,7 @@ get_ip_info() {
# Outputs: "<ip> <country>" on success
local json ip country
if ! json="$(curl -fsS --max-time 10 "${VPN_INFO_URL}" 2>/dev/null)"; then
if ! json="$(curl -fsS --max-time 10 "${VPN_INFO_URL}" 2> /dev/null)"; then
bashio::log.warning "Unable to reach VPN info service at ${VPN_INFO_URL}."
return 1
fi
@@ -173,7 +173,7 @@ trap '
# Monitoring loop
while true; do
# If nginx died, stop this service and let s6 handle restart policy
if ! kill -0 "${nginx_pid}" 2>/dev/null; then
if ! kill -0 "${nginx_pid}" 2> /dev/null; then
bashio::log.error "nginx process exited unexpectedly; leaving service."
exit 1
fi
@@ -193,8 +193,8 @@ while true; do
if [[ -n "${REAL_IP}" ]] && [[ "${current_ip}" == "${REAL_IP}" ]]; then
bashio::log.error "IP LEAK DETECTED: current external IP ${current_ip} matches real IP ${REAL_IP}."
bashio::log.error "Stopping nginx and exiting so the supervisor can restart the add-on."
kill "${nginx_pid}" 2>/dev/null || true
wait "${nginx_pid}" 2>/dev/null || true
kill "${nginx_pid}" 2> /dev/null || true
wait "${nginx_pid}" 2> /dev/null || true
exit 1
fi
done

0
qbittorrent/rootfs/etc/services.d/timer/run Normal file → Executable file
View File

View File

@@ -7,80 +7,80 @@ BACKUP_FILE="${STATE_DIR}/resolv.conf.backup"
mkdir -p "${STATE_DIR}"
if [ "$#" -eq 0 ]; then
exit 0
exit 0
fi
command="$1"
shift || true
restore_backup() {
if [ -f "${BACKUP_FILE}" ]; then
cat "${BACKUP_FILE}" > /etc/resolv.conf
fi
if [ -f "${BACKUP_FILE}" ]; then
cat "${BACKUP_FILE}" >/etc/resolv.conf
fi
}
apply_dns() {
iface="$1"
shift || true
iface="$1"
shift || true
# Skip optional arguments such as -m <metric> or -x
while [ "$#" -gt 0 ]; do
case "$1" in
-m|-p|-w)
shift 2 || true
;;
-x|-y|-Z)
shift 1 || true
;;
--)
shift
break
;;
*)
break
;;
esac
done
# Skip optional arguments such as -m <metric> or -x
while [ "$#" -gt 0 ]; do
case "$1" in
-m | -p | -w)
shift 2 || true
;;
-x | -y | -Z)
shift 1 || true
;;
--)
shift
break
;;
*)
break
;;
esac
done
tmp_file="${STATE_DIR}/${iface}.conf"
cat > "${tmp_file}"
tmp_file="${STATE_DIR}/${iface}.conf"
cat >"${tmp_file}"
if [ ! -f "${BACKUP_FILE}" ]; then
cp /etc/resolv.conf "${BACKUP_FILE}" 2>/dev/null || true
fi
if [ ! -f "${BACKUP_FILE}" ]; then
cp /etc/resolv.conf "${BACKUP_FILE}" 2>/dev/null || true
fi
{
echo "# Generated by WireGuard add-on resolvconf shim"
cat "${tmp_file}"
} > /etc/resolv.conf
{
echo "# Generated by WireGuard add-on resolvconf shim"
cat "${tmp_file}"
} >/etc/resolv.conf
}
case "${command}" in
-a)
if [ "$#" -eq 0 ]; then
exit 0
fi
apply_dns "$@"
;;
-d)
if [ "$#" -gt 0 ]; then
rm -f "${STATE_DIR}/$1.conf"
fi
restore_backup
;;
-u)
latest_conf="$(find "${STATE_DIR}" -maxdepth 1 -type f -name '*.conf' -print | head -n 1 || true)"
if [ -n "${latest_conf}" ] && [ -f "${latest_conf}" ]; then
{
echo "# Generated by WireGuard add-on resolvconf shim"
cat "${latest_conf}"
} > /etc/resolv.conf
else
restore_backup
fi
;;
*)
# Treat other commands as successful no-ops to remain compatible with wg-quick.
exit 0
;;
-a)
if [ "$#" -eq 0 ]; then
exit 0
fi
apply_dns "$@"
;;
-d)
if [ "$#" -gt 0 ]; then
rm -f "${STATE_DIR}/$1.conf"
fi
restore_backup
;;
-u)
latest_conf="$(find "${STATE_DIR}" -maxdepth 1 -type f -name '*.conf' -print | head -n 1 || true)"
if [ -n "${latest_conf}" ] && [ -f "${latest_conf}" ]; then
{
echo "# Generated by WireGuard add-on resolvconf shim"
cat "${latest_conf}"
} >/etc/resolv.conf
else
restore_backup
fi
;;
*)
# Treat other commands as successful no-ops to remain compatible with wg-quick.
exit 0
;;
esac

View File

@@ -3,68 +3,68 @@ set -euo pipefail
REAL_IP6TABLES_RESTORE="/sbin/ip6tables-restore"
if [[ ! -x "${REAL_IP6TABLES_RESTORE}" ]]; then
REAL_IP6TABLES_RESTORE="/usr/sbin/ip6tables-restore"
REAL_IP6TABLES_RESTORE="/usr/sbin/ip6tables-restore"
fi
cleanup() {
[[ -n "${RULES_FILE:-}" && -f "${RULES_FILE}" ]] && rm -f "${RULES_FILE}"
[[ -n "${SANITIZED_FILE:-}" && -f "${SANITIZED_FILE}" ]] && rm -f "${SANITIZED_FILE}"
[[ -n "${RULES_FILE:-}" && -f "${RULES_FILE}" ]] && rm -f "${RULES_FILE}"
[[ -n "${SANITIZED_FILE:-}" && -f "${SANITIZED_FILE}" ]] && rm -f "${SANITIZED_FILE}"
}
trap cleanup EXIT
RULES_FILE="$(mktemp)"
cat > "${RULES_FILE}"
cat >"${RULES_FILE}"
ipv6_unavailable() {
local message="$1"
[[ $message =~ [Tt]able[[:space:]]does[[:space:]]not[[:space:]]exist ]] && return 0
[[ $message =~ address[[:space:]]family[[:space:]]not[[:space:]]supported ]] && return 0
[[ $message =~ can[[:punct:]]t[[:space:]]initialize[[:space:]]ip6tables[[:space:]]table ]] && return 0
[[ $message =~ IPv6[[:space:]]support[[:space:]]not[[:space:]]available ]] && return 0
return 1
local message="$1"
[[ $message =~ [Tt]able[[:space:]]does[[:space:]]not[[:space:]]exist ]] && return 0
[[ $message =~ address[[:space:]]family[[:space:]]not[[:space:]]supported ]] && return 0
[[ $message =~ can[[:punct:]]t[[:space:]]initialize[[:space:]]ip6tables[[:space:]]table ]] && return 0
[[ $message =~ IPv6[[:space:]]support[[:space:]]not[[:space:]]available ]] && return 0
return 1
}
# First attempt with the original ruleset
output=""
if output="$(${REAL_IP6TABLES_RESTORE} "$@" < "${RULES_FILE}" 2>&1)"; then
[[ -n "${output}" ]] && printf '%s\n' "${output}" >&2
exit 0
if output="$(${REAL_IP6TABLES_RESTORE} "$@" <"${RULES_FILE}" 2>&1)"; then
[[ -n "${output}" ]] && printf '%s\n' "${output}" >&2
exit 0
fi
status=$?
# Retry without comment matches if the kernel is missing the comment module
SANITIZED_FILE="$(mktemp)"
sed -E 's/-m[[:space:]]+comment[[:space:]]+--comment[[:space:]]+"[^"]*"//g' "${RULES_FILE}" > "${SANITIZED_FILE}"
sed -E 's/-m[[:space:]]+comment[[:space:]]+--comment[[:space:]]+"[^"]*"//g' "${RULES_FILE}" >"${SANITIZED_FILE}"
retry_output=""
if retry_output="$(${REAL_IP6TABLES_RESTORE} "$@" < "${SANITIZED_FILE}" 2>&1)"; then
printf '%s\n' "ip6tables-restore failed with comment matches; reapplied without comments." >&2
printf '%s\n' "Original error: ${output}" >&2
[[ -n "${retry_output}" ]] && printf '%s\n' "${retry_output}" >&2
exit 0
if retry_output="$(${REAL_IP6TABLES_RESTORE} "$@" <"${SANITIZED_FILE}" 2>&1)"; then
printf '%s\n' "ip6tables-restore failed with comment matches; reapplied without comments." >&2
printf '%s\n' "Original error: ${output}" >&2
[[ -n "${retry_output}" ]] && printf '%s\n' "${retry_output}" >&2
exit 0
fi
retry_status=$?
# Final fallback: try legacy backend if available
legacy_output=""
for legacy in /sbin/ip6tables-restore-legacy /usr/sbin/ip6tables-restore-legacy; do
if [[ -x "${legacy}" ]]; then
if legacy_output="$(${legacy} "$@" < "${RULES_FILE}" 2>&1)"; then
printf '%s\n' "ip6tables-restore failed; succeeded using legacy backend." >&2
printf '%s\n' "Original error: ${output}" >&2
[[ -n "${legacy_output}" ]] && printf '%s\n' "${legacy_output}" >&2
exit 0
fi
fi
if [[ -x "${legacy}" ]]; then
if legacy_output="$(${legacy} "$@" <"${RULES_FILE}" 2>&1)"; then
printf '%s\n' "ip6tables-restore failed; succeeded using legacy backend." >&2
printf '%s\n' "Original error: ${output}" >&2
[[ -n "${legacy_output}" ]] && printf '%s\n' "${legacy_output}" >&2
exit 0
fi
fi
done
if ipv6_unavailable "${output}" || ipv6_unavailable "${retry_output}" || ipv6_unavailable "${legacy_output}"; then
printf '%s\n' "IPv6 firewall support not detected; skipping IPv6 ruleset restore and continuing." >&2
printf '%s\n' "Original error: ${output}" >&2
[[ -n "${retry_output}" ]] && printf '%s\n' "Sanitized retry error: ${retry_output}" >&2
[[ -n "${legacy_output}" ]] && printf '%s\n' "Legacy backend error: ${legacy_output}" >&2
exit 0
printf '%s\n' "IPv6 firewall support not detected; skipping IPv6 ruleset restore and continuing." >&2
printf '%s\n' "Original error: ${output}" >&2
[[ -n "${retry_output}" ]] && printf '%s\n' "Sanitized retry error: ${retry_output}" >&2
[[ -n "${legacy_output}" ]] && printf '%s\n' "Legacy backend error: ${legacy_output}" >&2
exit 0
fi
printf '%s\n' "ip6tables-restore failed and fallbacks were unsuccessful." >&2

View File

@@ -3,47 +3,47 @@ set -euo pipefail
REAL_IPTABLES_RESTORE="/sbin/iptables-restore"
if [[ ! -x "${REAL_IPTABLES_RESTORE}" ]]; then
REAL_IPTABLES_RESTORE="/usr/sbin/iptables-restore"
REAL_IPTABLES_RESTORE="/usr/sbin/iptables-restore"
fi
cleanup() {
[[ -n "${RULES_FILE:-}" && -f "${RULES_FILE}" ]] && rm -f "${RULES_FILE}"
[[ -n "${SANITIZED_FILE:-}" && -f "${SANITIZED_FILE}" ]] && rm -f "${SANITIZED_FILE}"
[[ -n "${RULES_FILE:-}" && -f "${RULES_FILE}" ]] && rm -f "${RULES_FILE}"
[[ -n "${SANITIZED_FILE:-}" && -f "${SANITIZED_FILE}" ]] && rm -f "${SANITIZED_FILE}"
}
trap cleanup EXIT
RULES_FILE="$(mktemp)"
cat > "${RULES_FILE}"
cat >"${RULES_FILE}"
# First attempt with the original ruleset
if output="$(${REAL_IPTABLES_RESTORE} "$@" < "${RULES_FILE}" 2>&1)"; then
[[ -n "${output}" ]] && printf '%s\n' "${output}" >&2
exit 0
if output="$(${REAL_IPTABLES_RESTORE} "$@" <"${RULES_FILE}" 2>&1)"; then
[[ -n "${output}" ]] && printf '%s\n' "${output}" >&2
exit 0
fi
status=$?
# Retry without comment matches if the kernel is missing the comment module
SANITIZED_FILE="$(mktemp)"
sed -E 's/-m[[:space:]]+comment[[:space:]]+--comment[[:space:]]+"[^"]*"//g' "${RULES_FILE}" > "${SANITIZED_FILE}"
sed -E 's/-m[[:space:]]+comment[[:space:]]+--comment[[:space:]]+"[^"]*"//g' "${RULES_FILE}" >"${SANITIZED_FILE}"
if retry_output="$(${REAL_IPTABLES_RESTORE} "$@" < "${SANITIZED_FILE}" 2>&1)"; then
printf '%s\n' "iptables-restore failed with comment matches; reapplied without comments." >&2
printf '%s\n' "Original error: ${output}" >&2
[[ -n "${retry_output}" ]] && printf '%s\n' "${retry_output}" >&2
exit 0
if retry_output="$(${REAL_IPTABLES_RESTORE} "$@" <"${SANITIZED_FILE}" 2>&1)"; then
printf '%s\n' "iptables-restore failed with comment matches; reapplied without comments." >&2
printf '%s\n' "Original error: ${output}" >&2
[[ -n "${retry_output}" ]] && printf '%s\n' "${retry_output}" >&2
exit 0
fi
retry_status=$?
# Final fallback: try legacy backend if available
for legacy in /sbin/iptables-restore-legacy /usr/sbin/iptables-restore-legacy; do
if [[ -x "${legacy}" ]]; then
if legacy_output="$(${legacy} "$@" < "${RULES_FILE}" 2>&1)"; then
printf '%s\n' "iptables-restore failed; succeeded using legacy backend." >&2
printf '%s\n' "Original error: ${output}" >&2
[[ -n "${legacy_output}" ]] && printf '%s\n' "${legacy_output}" >&2
exit 0
fi
fi
if [[ -x "${legacy}" ]]; then
if legacy_output="$(${legacy} "$@" <"${RULES_FILE}" 2>&1)"; then
printf '%s\n' "iptables-restore failed; succeeded using legacy backend." >&2
printf '%s\n' "Original error: ${output}" >&2
[[ -n "${legacy_output}" ]] && printf '%s\n' "${legacy_output}" >&2
exit 0
fi
fi
done
printf '%s\n' "iptables-restore failed and fallbacks were unsuccessful." >&2

View File

@@ -3,15 +3,15 @@ set -euo pipefail
REAL_SYSCTL="/sbin/sysctl"
if [[ ! -x "${REAL_SYSCTL}" ]]; then
REAL_SYSCTL="/usr/sbin/sysctl"
REAL_SYSCTL="/usr/sbin/sysctl"
fi
if [[ "$#" -ge 2 && "$1" == "-q" && "$2" == "net.ipv4.conf.all.src_valid_mark=1" ]]; then
if "${REAL_SYSCTL}" "$@" >/dev/null 2>&1; then
exit 0
fi
# Suppress failure for this specific key to keep wg-quick from aborting in unprivileged environments.
exit 0
if "${REAL_SYSCTL}" "$@" >/dev/null 2>&1; then
exit 0
fi
# Suppress failure for this specific key to keep wg-quick from aborting in unprivileged environments.
exit 0
fi
exec "${REAL_SYSCTL}" "$@"

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "lscr.io/linuxserver/radarr:arm64v8-latest",
"amd64": "lscr.io/linuxserver/radarr:amd64-latest"
}
"build_from": {
"aarch64": "lscr.io/linuxserver/radarr:arm64v8-latest",
"amd64": "lscr.io/linuxserver/radarr:amd64-latest"
}
}

0
readarr/rootfs/etc/services.d/nginx/run Normal file → Executable file
View File

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "thomst08/requestrr:arm64-latest",
"amd64": "thomst08/requestrr:linux-latest"
}
"build_from": {
"aarch64": "thomst08/requestrr:arm64-latest",
"amd64": "thomst08/requestrr:linux-latest"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "franchetti/seafile-arm:latest",
"amd64": "franchetti/seafile-arm:latest"
}
"build_from": {
"aarch64": "franchetti/seafile-arm:latest",
"amd64": "franchetti/seafile-arm:latest"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "ghcr.io/signalk/signalk-server:latest",
"amd64": "ghcr.io/signalk/signalk-server:latest"
}
"build_from": {
"aarch64": "ghcr.io/signalk/signalk-server:latest",
"amd64": "ghcr.io/signalk/signalk-server:latest"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "lscr.io/linuxserver/sonarr:arm64v8-develop",
"amd64": "lscr.io/linuxserver/sonarr:amd64-develop"
}
"build_from": {
"aarch64": "lscr.io/linuxserver/sonarr:arm64v8-develop",
"amd64": "lscr.io/linuxserver/sonarr:amd64-develop"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "ghcr.io/gabe565/castsponsorskip:latest",
"amd64": "ghcr.io/gabe565/castsponsorskip:latest"
}
"build_from": {
"aarch64": "ghcr.io/gabe565/castsponsorskip:latest",
"amd64": "ghcr.io/gabe565/castsponsorskip:latest"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "ertagh/teamspeak3-server:latest-predownloaded",
"amd64": "ertagh/teamspeak3-server:x64-latest-predownloaded"
}
"build_from": {
"aarch64": "ertagh/teamspeak3-server:latest-predownloaded",
"amd64": "ertagh/teamspeak3-server:x64-latest-predownloaded"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "ghcr.io/hassio-addons/base:17.2.0",
"amd64": "ghcr.io/hassio-addons/base:17.2.0"
}
"build_from": {
"aarch64": "ghcr.io/hassio-addons/base:17.2.0",
"amd64": "ghcr.io/hassio-addons/base:17.2.0"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "lscr.io/linuxserver/transmission:arm64v8-latest",
"amd64": "lscr.io/linuxserver/transmission:amd64-latest"
}
"build_from": {
"aarch64": "lscr.io/linuxserver/transmission:arm64v8-latest",
"amd64": "lscr.io/linuxserver/transmission:amd64-latest"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "haugene/transmission-openvpn:latest",
"amd64": "haugene/transmission-openvpn:latest"
}
"build_from": {
"aarch64": "haugene/transmission-openvpn:latest",
"amd64": "haugene/transmission-openvpn:latest"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "senexcrenshaw/xteve:latest",
"amd64": "senexcrenshaw/xteve:latest"
}
"build_from": {
"aarch64": "senexcrenshaw/xteve:latest",
"amd64": "senexcrenshaw/xteve:latest"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "lscr.io/linuxserver/code-server:arm64v8-latest",
"amd64": "lscr.io/linuxserver/code-server:amd64-latest"
}
"build_from": {
"aarch64": "lscr.io/linuxserver/code-server:arm64v8-latest",
"amd64": "lscr.io/linuxserver/code-server:amd64-latest"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "lscr.io/linuxserver/papermerge:arm64v8-latest",
"amd64": "lscr.io/linuxserver/papermerge:amd64-latest"
}
"build_from": {
"aarch64": "lscr.io/linuxserver/papermerge:arm64v8-latest",
"amd64": "lscr.io/linuxserver/papermerge:amd64-latest"
}
}

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "lscr.io/linuxserver/plex-meta-manager:arm64v8-latest",
"amd64": "lscr.io/linuxserver/plex-meta-manager:amd64-latest"
}
"build_from": {
"aarch64": "lscr.io/linuxserver/plex-meta-manager:arm64v8-latest",
"amd64": "lscr.io/linuxserver/plex-meta-manager:amd64-latest"
}
}