mirror of
https://github.com/alexbelgium/hassio-addons.git
synced 2026-10-09 01:31:36 +02:00
Compare commits
1 Commits
55dcc50db5
...
create-pul
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
41f76f0d29 |
11
.github/stargazer_countries.csv
vendored
11
.github/stargazer_countries.csv
vendored
@@ -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
|
||||
|
||||
|
BIN
.github/stargazer_map.png
vendored
BIN
.github/stargazer_map.png
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 329 KiB After Width: | Height: | Size: 61 KiB |
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
0
emby/rootfs/etc/services.d/nginx/run
Normal file → Executable 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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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]"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
50
epicgamesfree/rootfs/templates/config.yaml
Normal file
50
epicgamesfree/rootfs/templates/config.yaml
Normal 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
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "filebrowser/filebrowser:s6",
|
||||
"amd64": "filebrowser/filebrowser:s6"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "filebrowser/filebrowser:s6",
|
||||
"amd64": "filebrowser/filebrowser:s6"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
## 2.3.1-3 (23-11-2025)
|
||||
- Minor bugs fixed
|
||||
## 2.3.1-2 (22-11-2025)
|
||||
- Minor bugs fixed
|
||||
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
## 2.3.1-3 (23-11-2025)
|
||||
- Minor bugs fixed
|
||||
## 2.3.1-2 (22-11-2025)
|
||||
- Minor bugs fixed
|
||||
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "troglobit/inadyn:latest",
|
||||
"amd64": "troglobit/inadyn:latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "troglobit/inadyn:latest",
|
||||
"amd64": "troglobit/inadyn:latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
0
jellyfin/rootfs/etc/services.d/nginx/run
Normal file → Executable 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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
0
nzbget/rootfs/etc/services.d/nginx/run
Normal file → Executable 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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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##*/}."
|
||||
|
||||
40
qbittorrent/rootfs/etc/s6-overlay/s6-rc.d/svc-qbittorrent/run
Normal file → Executable file
40
qbittorrent/rootfs/etc/s6-overlay/s6-rc.d/svc-qbittorrent/run
Normal file → Executable 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
8
qbittorrent/rootfs/etc/services.d/nginx/run
Normal file → Executable 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
0
qbittorrent/rootfs/etc/services.d/timer/run
Normal file → Executable 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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}" "$@"
|
||||
|
||||
@@ -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
0
readarr/rootfs/etc/services.d/nginx/run
Normal file → Executable 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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "senexcrenshaw/xteve:latest",
|
||||
"amd64": "senexcrenshaw/xteve:latest"
|
||||
}
|
||||
"build_from": {
|
||||
"aarch64": "senexcrenshaw/xteve:latest",
|
||||
"amd64": "senexcrenshaw/xteve:latest"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user