Compare commits

..
Author SHA1 Message Date
github-actions[bot] b0c45804fe Update stargazer map & cache 2025-11-23 01:08:15 +00:00
52 changed files with 297 additions and 286 deletions

No files matched your search

+11
View File
@@ -197,6 +197,7 @@ Fabian-Eigenherd,Germany
Faithfinder,Canada Faithfinder,Canada
FallsSteven, FallsSteven,
Felitendo, Felitendo,
Filipza,
Flipsoo, Flipsoo,
FloppiTuna,United States FloppiTuna,United States
Fluffy-Bunny-23, Fluffy-Bunny-23,
@@ -487,6 +488,7 @@ Rapozillha,Portugal
Raw2x2, Raw2x2,
RdN-J, RdN-J,
RealJustMe, RealJustMe,
Redmno,
Reiqu,Germany Reiqu,Germany
RemcoSchrijver,Netherlands RemcoSchrijver,Netherlands
Rene2302, Rene2302,
@@ -494,6 +496,7 @@ RescueWolf-Dreamwalker,
RhaaKaye, RhaaKaye,
RicLund,Canada RicLund,Canada
Richyread, Richyread,
RimmeVG,
Rimpla, Rimpla,
Robbot,Ireland Robbot,Ireland
RobertZwets, RobertZwets,
@@ -581,6 +584,7 @@ Syuq,
T-I-M-O-T, T-I-M-O-T,
TCTnz, TCTnz,
THENEXTBIGTIME, THENEXTBIGTIME,
TS-1709,
TarrX,Germany TarrX,Germany
Tche333, Tche333,
Tchoupinax, Tchoupinax,
@@ -814,6 +818,7 @@ bigsby-exe,United Kingdom
bilak,Czechia bilak,Czechia
bitDealer, bitDealer,
bjackerman,United States bjackerman,United States
bjoe10,
bkuri,Mexico bkuri,Mexico
blackshoals, blackshoals,
blairun, blairun,
@@ -946,6 +951,7 @@ ctrlaltprocrastinate,
ctyfrank, ctyfrank,
cuza,Cuba cuza,Cuba
cvladan, cvladan,
cvroque,
cwmoriarty, cwmoriarty,
cy1798, cy1798,
cyberjohn60, cyberjohn60,
@@ -1051,6 +1057,7 @@ dtrochow,
duckduckuk,United Kingdom duckduckuk,United Kingdom
duhaijian, duhaijian,
dumbledorethor, dumbledorethor,
dutzi88,
duydo,Viet Nam duydo,Viet Nam
dwainegallimore,United Kingdom dwainegallimore,United Kingdom
dykandDK, dykandDK,
@@ -1094,6 +1101,7 @@ ettoreboy,
euneuneu, euneuneu,
evalevil,China evalevil,China
everconnectcn, everconnectcn,
everestlion,
evertonerik, evertonerik,
evnb,United States evnb,United States
excodex,United Kingdom excodex,United Kingdom
@@ -1358,6 +1366,7 @@ jokob-sk,
joluas, joluas,
jonaslang1,Germany jonaslang1,Germany
jonathanweinberg, jonathanweinberg,
jonbeckman,
jonssonjunior94, jonssonjunior94,
joostiphone, joostiphone,
jopacar1, jopacar1,
@@ -1959,6 +1968,7 @@ starbuck93,United States
steef84, steef84,
stef-th, stef-th,
stefangries, stefangries,
steinmaerivoet,Belgium
stephenjharrington, stephenjharrington,
stepping-razor,Czechia stepping-razor,Czechia
stetho,United Kingdom stetho,United Kingdom
@@ -2179,5 +2189,6 @@ zjw57,China
zking7, zking7,
zonorti,Germany zonorti,Germany
zr-idt, zr-idt,
zuranthus,Sweden
zweehn, zweehn,
zymotik,Germany zymotik,Germany
1 username country
197 Faithfinder Canada
198 FallsSteven
199 Felitendo
200 Filipza
201 Flipsoo
202 FloppiTuna United States
203 Fluffy-Bunny-23
488 Raw2x2
489 RdN-J
490 RealJustMe
491 Redmno
492 Reiqu Germany
493 RemcoSchrijver Netherlands
494 Rene2302
496 RhaaKaye
497 RicLund Canada
498 Richyread
499 RimmeVG
500 Rimpla
501 Robbot Ireland
502 RobertZwets
584 T-I-M-O-T
585 TCTnz
586 THENEXTBIGTIME
587 TS-1709
588 TarrX Germany
589 Tche333
590 Tchoupinax
818 bilak Czechia
819 bitDealer
820 bjackerman United States
821 bjoe10
822 bkuri Mexico
823 blackshoals
824 blairun
951 ctyfrank
952 cuza Cuba
953 cvladan
954 cvroque
955 cwmoriarty
956 cy1798
957 cyberjohn60
1057 duckduckuk United Kingdom
1058 duhaijian
1059 dumbledorethor
1060 dutzi88
1061 duydo Viet Nam
1062 dwainegallimore United Kingdom
1063 dykandDK
1101 euneuneu
1102 evalevil China
1103 everconnectcn
1104 everestlion
1105 evertonerik
1106 evnb United States
1107 excodex United Kingdom
1366 joluas
1367 jonaslang1 Germany
1368 jonathanweinberg
1369 jonbeckman
1370 jonssonjunior94
1371 joostiphone
1372 jopacar1
1968 steef84
1969 stef-th
1970 stefangries
1971 steinmaerivoet Belgium
1972 stephenjharrington
1973 stepping-razor Czechia
1974 stetho United Kingdom
2189 zking7
2190 zonorti Germany
2191 zr-idt
2192 zuranthus Sweden
2193 zweehn
2194 zymotik Germany
Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 329 KiB

+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "ghcr.io/hassio-addons/base-python/aarch64:stable", "aarch64": "ghcr.io/hassio-addons/base-python/aarch64:stable",
"amd64": "ghcr.io/hassio-addons/base-python/amd64:stable" "amd64": "ghcr.io/hassio-addons/base-python/amd64:stable"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "ghcr.io/autobrr/autobrr:latest", "aarch64": "ghcr.io/autobrr/autobrr:latest",
"amd64": "ghcr.io/autobrr/autobrr:latest" "amd64": "ghcr.io/autobrr/autobrr:latest"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "ghcr.io/mralucarddante/baikal-docker-hass:latest", "aarch64": "ghcr.io/mralucarddante/baikal-docker-hass:latest",
"amd64": "ghcr.io/mralucarddante/baikal-docker-hass:latest" "amd64": "ghcr.io/mralucarddante/baikal-docker-hass:latest"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/bazarr:arm64v8-latest", "aarch64": "lscr.io/linuxserver/bazarr:arm64v8-latest",
"amd64": "lscr.io/linuxserver/bazarr:amd64-latest" "amd64": "lscr.io/linuxserver/bazarr:amd64-latest"
} }
} }
@@ -112,7 +112,6 @@ def automatic_mqtt_publish(file, detection, path):
mqttc.publish(mqtt_topic, json_bird, 1) mqttc.publish(mqtt_topic, json_bird, 1)
log.info("Posted to MQTT: ok") log.info("Posted to MQTT: ok")
# Create MQTT client using legacy callback API when available for # Create MQTT client using legacy callback API when available for
# compatibility with paho-mqtt >= 2.0 # compatibility with paho-mqtt >= 2.0
callback_api = getattr(mqtt, "CallbackAPIVersion", None) callback_api = getattr(mqtt, "CallbackAPIVersion", None)
View File
File mode changed.
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "m4dm4rtig4n/myelectricaldata:latest", "aarch64": "m4dm4rtig4n/myelectricaldata:latest",
"amd64": "m4dm4rtig4n/myelectricaldata:latest" "amd64": "m4dm4rtig4n/myelectricaldata:latest"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "m4dm4rtig4n/myelectricaldata:latest-dev", "aarch64": "m4dm4rtig4n/myelectricaldata:latest-dev",
"amd64": "m4dm4rtig4n/myelectricaldata:latest-dev" "amd64": "m4dm4rtig4n/myelectricaldata:latest-dev"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "filebrowser/filebrowser:s6", "aarch64": "filebrowser/filebrowser:s6",
"amd64": "filebrowser/filebrowser:s6" "amd64": "filebrowser/filebrowser:s6"
} }
} }
+2 -1
View File
@@ -3,7 +3,8 @@ arch:
- amd64 - amd64
backup_exclude: backup_exclude:
- "**/machine-learning/*" - "**/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: devices:
- /dev/dri - /dev/dri
- /dev/dxg - /dev/dxg
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "troglobit/inadyn:latest", "aarch64": "troglobit/inadyn:latest",
"amd64": "troglobit/inadyn:latest" "amd64": "troglobit/inadyn:latest"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/jackett:arm64v8-latest", "aarch64": "lscr.io/linuxserver/jackett:arm64v8-latest",
"amd64": "lscr.io/linuxserver/jackett:amd64-latest" "amd64": "lscr.io/linuxserver/jackett:amd64-latest"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/jellyfin:arm64v8-latest", "aarch64": "lscr.io/linuxserver/jellyfin:arm64v8-latest",
"amd64": "lscr.io/linuxserver/jellyfin:amd64-latest" "amd64": "lscr.io/linuxserver/jellyfin:amd64-latest"
} }
} }
View File
File mode changed.
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/lidarr:arm64v8-latest", "aarch64": "lscr.io/linuxserver/lidarr:arm64v8-latest",
"amd64": "lscr.io/linuxserver/lidarr:amd64-latest" "amd64": "lscr.io/linuxserver/lidarr:amd64-latest"
} }
} }
+9 -9
View File
@@ -166,7 +166,7 @@ if [[ "${MEILISEARCH_LOCAL}" == true ]]; then
bashio::log.error "${message}" bashio::log.error "${message}"
if [ -n "${S6_SVSCANCTL_BIN}" ]; then 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" bashio::log.error "Unable to signal s6-svscanctl to stop services"
fi fi
else else
@@ -181,7 +181,7 @@ if [[ "${MEILISEARCH_LOCAL}" == true ]]; then
} }
meilisearch_ensure_running() { meilisearch_ensure_running() {
if kill -0 "${MEILISEARCH_PID}" 2> /dev/null; then if kill -0 "${MEILISEARCH_PID}" 2>/dev/null; then
return 0 return 0
fi fi
@@ -201,12 +201,12 @@ if [[ "${MEILISEARCH_LOCAL}" == true ]]; then
} }
MEILISEARCH_CMD=( MEILISEARCH_CMD=(
env env \
MEILI_ENV="${MEILISEARCH_ENVIRONMENT}" MEILI_ENV="${MEILISEARCH_ENVIRONMENT}" \
MEILI_NO_ANALYTICS="${MEILISEARCH_NO_ANALYTICS}" MEILI_NO_ANALYTICS="${MEILISEARCH_NO_ANALYTICS}" \
meilisearch meilisearch \
--http-addr "${MEILISEARCH_ADDR}" --http-addr "${MEILISEARCH_ADDR}" \
--db-path "${MEILISEARCH_DB_PATH}" --db-path "${MEILISEARCH_DB_PATH}"
) )
if [ -n "${MEILISEARCH_ENV_KEY}" ]; then if [ -n "${MEILISEARCH_ENV_KEY}" ]; then
@@ -218,7 +218,7 @@ if [[ "${MEILISEARCH_LOCAL}" == true ]]; then
bashio::log.info "Waiting for Meilisearch TCP socket" bashio::log.info "Waiting for Meilisearch TCP socket"
for attempt in $(seq 1 30); do 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 break
fi fi
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/mylar3:arm64v8-latest", "aarch64": "lscr.io/linuxserver/mylar3:arm64v8-latest",
"amd64": "lscr.io/linuxserver/mylar3:amd64-latest" "amd64": "lscr.io/linuxserver/mylar3:amd64-latest"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "ghcr.io/jokob-sk/netalertx:latest", "aarch64": "ghcr.io/jokob-sk/netalertx:latest",
"amd64": "ghcr.io/jokob-sk/netalertx:latest" "amd64": "ghcr.io/jokob-sk/netalertx:latest"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/nzbget:arm64v8-latest", "aarch64": "lscr.io/linuxserver/nzbget:arm64v8-latest",
"amd64": "lscr.io/linuxserver/nzbget:amd64-latest" "amd64": "lscr.io/linuxserver/nzbget:amd64-latest"
} }
} }
View File
File mode changed.
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/ombi:arm64v8-latest", "aarch64": "lscr.io/linuxserver/ombi:arm64v8-latest",
"amd64": "lscr.io/linuxserver/ombi:amd64-latest" "amd64": "lscr.io/linuxserver/ombi:amd64-latest"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "organizr/organizr:linux-arm64", "aarch64": "organizr/organizr:linux-arm64",
"amd64": "organizr/organizr:linux-amd64" "amd64": "organizr/organizr:linux-amd64"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/piwigo:arm64v8-latest", "aarch64": "lscr.io/linuxserver/piwigo:arm64v8-latest",
"amd64": "lscr.io/linuxserver/piwigo:amd64-latest" "amd64": "lscr.io/linuxserver/piwigo:amd64-latest"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/plex:arm64v8-latest", "aarch64": "lscr.io/linuxserver/plex:arm64v8-latest",
"amd64": "lscr.io/linuxserver/plex:amd64-latest" "amd64": "lscr.io/linuxserver/plex:amd64-latest"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "ghcr.io/hassio-addons/base/aarch64:16.0.0", "aarch64": "ghcr.io/hassio-addons/base/aarch64:16.0.0",
"amd64": "ghcr.io/hassio-addons/base/amd64:16.0.0" "amd64": "ghcr.io/hassio-addons/base/amd64:16.0.0"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "ghcr.io/hassio-addons/base/aarch64:11.1.0", "aarch64": "ghcr.io/hassio-addons/base/aarch64:11.1.0",
"amd64": "ghcr.io/hassio-addons/base/amd64:11.1.0" "amd64": "ghcr.io/hassio-addons/base/amd64:11.1.0"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "ghcr.io/immich-app/postgres:15-vectorchord0.4.3-pgvectors0.3.0", "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" "amd64": "ghcr.io/immich-app/postgres:15-vectorchord0.4.3-pgvectors0.3.0"
} }
} }
@@ -50,7 +50,7 @@ if [ -z "${wireguard_config:-}" ]; then
fi fi
fi fi
dos2unix "${wireguard_config}" > /dev/null 2>&1 || true dos2unix "${wireguard_config}" >/dev/null 2>&1 || true
interface_name="$(basename "${wireguard_config}" .conf)" interface_name="$(basename "${wireguard_config}" .conf)"
if [[ -z "${interface_name}" ]]; then if [[ -z "${interface_name}" ]]; then
@@ -60,7 +60,7 @@ fi
wireguard_runtime_config="${WIREGUARD_STATE_DIR}/${interface_name}.conf" wireguard_runtime_config="${WIREGUARD_STATE_DIR}/${interface_name}.conf"
cp "${wireguard_config}" "${wireguard_runtime_config}" 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.' bashio::log.info 'Prepared WireGuard runtime configuration for initial connection attempt.'
echo "${wireguard_runtime_config}" > "${WIREGUARD_STATE_DIR}/config" echo "${wireguard_runtime_config}" > "${WIREGUARD_STATE_DIR}/config"
+10 -10
View File
@@ -29,11 +29,11 @@ else
fi fi
wireguard_config="$(cat "${WIREGUARD_STATE_DIR}/config")" 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 if ip link show "${wireguard_interface}" &> /dev/null; then
bashio::log.warning "WireGuard interface ${wireguard_interface} already exists. Attempting to reset it." 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 fi
bashio::log.info "Starting WireGuard interface ${wireguard_interface} using ${wireguard_config##*/}." bashio::log.info "Starting WireGuard interface ${wireguard_interface} using ${wireguard_config##*/}."
@@ -44,12 +44,12 @@ else
mkdir -p "${legacy_bin_dir}" mkdir -p "${legacy_bin_dir}"
for cmd in iptables iptables-save iptables-restore ip6tables ip6tables-save ip6tables-restore; do 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}" ln -sf "$(command -v "${cmd}-legacy")" "${legacy_bin_dir}/${cmd}"
fi fi
done 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}" export PATH="${legacy_bin_dir}:${PATH}"
bashio::log.warning 'Retrying WireGuard bring-up using iptables-legacy wrappers.' bashio::log.warning 'Retrying WireGuard bring-up using iptables-legacy wrappers.'
} }
@@ -67,8 +67,8 @@ else
fi fi
if echo "${output}" | grep -qiE 'iptables-restore|ip6tables-restore|xtables'; then 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 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 wg-quick down "${config_path}" >/dev/null 2>&1 || true
_wireguard_prepare_iptables_legacy _wireguard_prepare_iptables_legacy
output=$(wg-quick up "${config_path}" 2>&1) output=$(wg-quick up "${config_path}" 2>&1)
status=$? status=$?
@@ -87,7 +87,7 @@ else
ipv4_config="${WIREGUARD_STATE_DIR}/${wireguard_interface}-ipv4.conf" ipv4_config="${WIREGUARD_STATE_DIR}/${wireguard_interface}-ipv4.conf"
echo -n > "${ipv4_config}" 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 while IFS= read -r line; do
if [[ "${line}" =~ ^Endpoint ]]; then if [[ "${line}" =~ ^Endpoint ]]; then
@@ -109,7 +109,7 @@ else
fi fi
done < "${wireguard_config}" 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 if ! _wireguard_up_with_iptables_fallback "${ipv4_config}"; then
bashio::log.error 'WireGuard failed to establish a connection after IPv4-only retry.' bashio::log.error 'WireGuard failed to establish a connection after IPv4-only retry.'
@@ -129,9 +129,9 @@ else
bashio::log.info "WireGuard interface ${wireguard_interface} is up." bashio::log.info "WireGuard interface ${wireguard_interface} is up."
# Refresh DNS resolver configuration if resolvconf is present # 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.' 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.' bashio::log.warning 'resolvconf -u failed. DNS configuration may not have been updated.'
fi fi
else else
+4 -4
View File
@@ -38,7 +38,7 @@ get_ip_info() {
# Outputs: "<ip> <country>" on success # Outputs: "<ip> <country>" on success
local json ip country 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}." bashio::log.warning "Unable to reach VPN info service at ${VPN_INFO_URL}."
return 1 return 1
fi fi
@@ -173,7 +173,7 @@ trap '
# Monitoring loop # Monitoring loop
while true; do while true; do
# If nginx died, stop this service and let s6 handle restart policy # 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." bashio::log.error "nginx process exited unexpectedly; leaving service."
exit 1 exit 1
fi fi
@@ -193,8 +193,8 @@ while true; do
if [[ -n "${REAL_IP}" ]] && [[ "${current_ip}" == "${REAL_IP}" ]]; then 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 "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." bashio::log.error "Stopping nginx and exiting so the supervisor can restart the add-on."
kill "${nginx_pid}" 2> /dev/null || true kill "${nginx_pid}" 2>/dev/null || true
wait "${nginx_pid}" 2> /dev/null || true wait "${nginx_pid}" 2>/dev/null || true
exit 1 exit 1
fi fi
done done
View File
File mode changed.
+60 -60
View File
@@ -7,80 +7,80 @@ BACKUP_FILE="${STATE_DIR}/resolv.conf.backup"
mkdir -p "${STATE_DIR}" mkdir -p "${STATE_DIR}"
if [ "$#" -eq 0 ]; then if [ "$#" -eq 0 ]; then
exit 0 exit 0
fi fi
command="$1" command="$1"
shift || true shift || true
restore_backup() { restore_backup() {
if [ -f "${BACKUP_FILE}" ]; then if [ -f "${BACKUP_FILE}" ]; then
cat "${BACKUP_FILE}" >/etc/resolv.conf cat "${BACKUP_FILE}" > /etc/resolv.conf
fi fi
} }
apply_dns() { apply_dns() {
iface="$1" iface="$1"
shift || true shift || true
# Skip optional arguments such as -m <metric> or -x # Skip optional arguments such as -m <metric> or -x
while [ "$#" -gt 0 ]; do while [ "$#" -gt 0 ]; do
case "$1" in case "$1" in
-m | -p | -w) -m|-p|-w)
shift 2 || true shift 2 || true
;; ;;
-x | -y | -Z) -x|-y|-Z)
shift 1 || true shift 1 || true
;; ;;
--) --)
shift shift
break break
;; ;;
*) *)
break break
;; ;;
esac esac
done done
tmp_file="${STATE_DIR}/${iface}.conf" tmp_file="${STATE_DIR}/${iface}.conf"
cat >"${tmp_file}" cat > "${tmp_file}"
if [ ! -f "${BACKUP_FILE}" ]; then if [ ! -f "${BACKUP_FILE}" ]; then
cp /etc/resolv.conf "${BACKUP_FILE}" 2>/dev/null || true cp /etc/resolv.conf "${BACKUP_FILE}" 2>/dev/null || true
fi fi
{ {
echo "# Generated by WireGuard add-on resolvconf shim" echo "# Generated by WireGuard add-on resolvconf shim"
cat "${tmp_file}" cat "${tmp_file}"
} >/etc/resolv.conf } > /etc/resolv.conf
} }
case "${command}" in case "${command}" in
-a) -a)
if [ "$#" -eq 0 ]; then if [ "$#" -eq 0 ]; then
exit 0 exit 0
fi fi
apply_dns "$@" apply_dns "$@"
;; ;;
-d) -d)
if [ "$#" -gt 0 ]; then if [ "$#" -gt 0 ]; then
rm -f "${STATE_DIR}/$1.conf" rm -f "${STATE_DIR}/$1.conf"
fi fi
restore_backup restore_backup
;; ;;
-u) -u)
latest_conf="$(find "${STATE_DIR}" -maxdepth 1 -type f -name '*.conf' -print | head -n 1 || true)" latest_conf="$(find "${STATE_DIR}" -maxdepth 1 -type f -name '*.conf' -print | head -n 1 || true)"
if [ -n "${latest_conf}" ] && [ -f "${latest_conf}" ]; then if [ -n "${latest_conf}" ] && [ -f "${latest_conf}" ]; then
{ {
echo "# Generated by WireGuard add-on resolvconf shim" echo "# Generated by WireGuard add-on resolvconf shim"
cat "${latest_conf}" cat "${latest_conf}"
} >/etc/resolv.conf } > /etc/resolv.conf
else else
restore_backup restore_backup
fi fi
;; ;;
*) *)
# Treat other commands as successful no-ops to remain compatible with wg-quick. # Treat other commands as successful no-ops to remain compatible with wg-quick.
exit 0 exit 0
;; ;;
esac esac
@@ -3,68 +3,68 @@ set -euo pipefail
REAL_IP6TABLES_RESTORE="/sbin/ip6tables-restore" REAL_IP6TABLES_RESTORE="/sbin/ip6tables-restore"
if [[ ! -x "${REAL_IP6TABLES_RESTORE}" ]]; then if [[ ! -x "${REAL_IP6TABLES_RESTORE}" ]]; then
REAL_IP6TABLES_RESTORE="/usr/sbin/ip6tables-restore" REAL_IP6TABLES_RESTORE="/usr/sbin/ip6tables-restore"
fi fi
cleanup() { cleanup() {
[[ -n "${RULES_FILE:-}" && -f "${RULES_FILE}" ]] && rm -f "${RULES_FILE}" [[ -n "${RULES_FILE:-}" && -f "${RULES_FILE}" ]] && rm -f "${RULES_FILE}"
[[ -n "${SANITIZED_FILE:-}" && -f "${SANITIZED_FILE}" ]] && rm -f "${SANITIZED_FILE}" [[ -n "${SANITIZED_FILE:-}" && -f "${SANITIZED_FILE}" ]] && rm -f "${SANITIZED_FILE}"
} }
trap cleanup EXIT trap cleanup EXIT
RULES_FILE="$(mktemp)" RULES_FILE="$(mktemp)"
cat >"${RULES_FILE}" cat > "${RULES_FILE}"
ipv6_unavailable() { ipv6_unavailable() {
local message="$1" local message="$1"
[[ $message =~ [Tt]able[[:space:]]does[[:space:]]not[[:space:]]exist ]] && return 0 [[ $message =~ [Tt]able[[:space:]]does[[:space:]]not[[:space:]]exist ]] && return 0
[[ $message =~ address[[:space:]]family[[:space:]]not[[:space:]]supported ]] && 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 =~ can[[:punct:]]t[[:space:]]initialize[[:space:]]ip6tables[[:space:]]table ]] && return 0
[[ $message =~ IPv6[[:space:]]support[[:space:]]not[[:space:]]available ]] && return 0 [[ $message =~ IPv6[[:space:]]support[[:space:]]not[[:space:]]available ]] && return 0
return 1 return 1
} }
# First attempt with the original ruleset # First attempt with the original ruleset
output="" output=""
if output="$(${REAL_IP6TABLES_RESTORE} "$@" <"${RULES_FILE}" 2>&1)"; then if output="$(${REAL_IP6TABLES_RESTORE} "$@" < "${RULES_FILE}" 2>&1)"; then
[[ -n "${output}" ]] && printf '%s\n' "${output}" >&2 [[ -n "${output}" ]] && printf '%s\n' "${output}" >&2
exit 0 exit 0
fi fi
status=$? status=$?
# Retry without comment matches if the kernel is missing the comment module # Retry without comment matches if the kernel is missing the comment module
SANITIZED_FILE="$(mktemp)" 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="" retry_output=""
if retry_output="$(${REAL_IP6TABLES_RESTORE} "$@" <"${SANITIZED_FILE}" 2>&1)"; then 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' "ip6tables-restore failed with comment matches; reapplied without comments." >&2
printf '%s\n' "Original error: ${output}" >&2 printf '%s\n' "Original error: ${output}" >&2
[[ -n "${retry_output}" ]] && printf '%s\n' "${retry_output}" >&2 [[ -n "${retry_output}" ]] && printf '%s\n' "${retry_output}" >&2
exit 0 exit 0
fi fi
retry_status=$? retry_status=$?
# Final fallback: try legacy backend if available # Final fallback: try legacy backend if available
legacy_output="" legacy_output=""
for legacy in /sbin/ip6tables-restore-legacy /usr/sbin/ip6tables-restore-legacy; do for legacy in /sbin/ip6tables-restore-legacy /usr/sbin/ip6tables-restore-legacy; do
if [[ -x "${legacy}" ]]; then if [[ -x "${legacy}" ]]; then
if legacy_output="$(${legacy} "$@" <"${RULES_FILE}" 2>&1)"; then if legacy_output="$(${legacy} "$@" < "${RULES_FILE}" 2>&1)"; then
printf '%s\n' "ip6tables-restore failed; succeeded using legacy backend." >&2 printf '%s\n' "ip6tables-restore failed; succeeded using legacy backend." >&2
printf '%s\n' "Original error: ${output}" >&2 printf '%s\n' "Original error: ${output}" >&2
[[ -n "${legacy_output}" ]] && printf '%s\n' "${legacy_output}" >&2 [[ -n "${legacy_output}" ]] && printf '%s\n' "${legacy_output}" >&2
exit 0 exit 0
fi fi
fi fi
done done
if ipv6_unavailable "${output}" || ipv6_unavailable "${retry_output}" || ipv6_unavailable "${legacy_output}"; then 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' "IPv6 firewall support not detected; skipping IPv6 ruleset restore and continuing." >&2
printf '%s\n' "Original error: ${output}" >&2 printf '%s\n' "Original error: ${output}" >&2
[[ -n "${retry_output}" ]] && printf '%s\n' "Sanitized retry error: ${retry_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 [[ -n "${legacy_output}" ]] && printf '%s\n' "Legacy backend error: ${legacy_output}" >&2
exit 0 exit 0
fi fi
printf '%s\n' "ip6tables-restore failed and fallbacks were unsuccessful." >&2 printf '%s\n' "ip6tables-restore failed and fallbacks were unsuccessful." >&2
@@ -3,47 +3,47 @@ set -euo pipefail
REAL_IPTABLES_RESTORE="/sbin/iptables-restore" REAL_IPTABLES_RESTORE="/sbin/iptables-restore"
if [[ ! -x "${REAL_IPTABLES_RESTORE}" ]]; then if [[ ! -x "${REAL_IPTABLES_RESTORE}" ]]; then
REAL_IPTABLES_RESTORE="/usr/sbin/iptables-restore" REAL_IPTABLES_RESTORE="/usr/sbin/iptables-restore"
fi fi
cleanup() { cleanup() {
[[ -n "${RULES_FILE:-}" && -f "${RULES_FILE}" ]] && rm -f "${RULES_FILE}" [[ -n "${RULES_FILE:-}" && -f "${RULES_FILE}" ]] && rm -f "${RULES_FILE}"
[[ -n "${SANITIZED_FILE:-}" && -f "${SANITIZED_FILE}" ]] && rm -f "${SANITIZED_FILE}" [[ -n "${SANITIZED_FILE:-}" && -f "${SANITIZED_FILE}" ]] && rm -f "${SANITIZED_FILE}"
} }
trap cleanup EXIT trap cleanup EXIT
RULES_FILE="$(mktemp)" RULES_FILE="$(mktemp)"
cat >"${RULES_FILE}" cat > "${RULES_FILE}"
# First attempt with the original ruleset # First attempt with the original ruleset
if output="$(${REAL_IPTABLES_RESTORE} "$@" <"${RULES_FILE}" 2>&1)"; then if output="$(${REAL_IPTABLES_RESTORE} "$@" < "${RULES_FILE}" 2>&1)"; then
[[ -n "${output}" ]] && printf '%s\n' "${output}" >&2 [[ -n "${output}" ]] && printf '%s\n' "${output}" >&2
exit 0 exit 0
fi fi
status=$? status=$?
# Retry without comment matches if the kernel is missing the comment module # Retry without comment matches if the kernel is missing the comment module
SANITIZED_FILE="$(mktemp)" 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 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' "iptables-restore failed with comment matches; reapplied without comments." >&2
printf '%s\n' "Original error: ${output}" >&2 printf '%s\n' "Original error: ${output}" >&2
[[ -n "${retry_output}" ]] && printf '%s\n' "${retry_output}" >&2 [[ -n "${retry_output}" ]] && printf '%s\n' "${retry_output}" >&2
exit 0 exit 0
fi fi
retry_status=$? retry_status=$?
# Final fallback: try legacy backend if available # Final fallback: try legacy backend if available
for legacy in /sbin/iptables-restore-legacy /usr/sbin/iptables-restore-legacy; do for legacy in /sbin/iptables-restore-legacy /usr/sbin/iptables-restore-legacy; do
if [[ -x "${legacy}" ]]; then if [[ -x "${legacy}" ]]; then
if legacy_output="$(${legacy} "$@" <"${RULES_FILE}" 2>&1)"; then if legacy_output="$(${legacy} "$@" < "${RULES_FILE}" 2>&1)"; then
printf '%s\n' "iptables-restore failed; succeeded using legacy backend." >&2 printf '%s\n' "iptables-restore failed; succeeded using legacy backend." >&2
printf '%s\n' "Original error: ${output}" >&2 printf '%s\n' "Original error: ${output}" >&2
[[ -n "${legacy_output}" ]] && printf '%s\n' "${legacy_output}" >&2 [[ -n "${legacy_output}" ]] && printf '%s\n' "${legacy_output}" >&2
exit 0 exit 0
fi fi
fi fi
done done
printf '%s\n' "iptables-restore failed and fallbacks were unsuccessful." >&2 printf '%s\n' "iptables-restore failed and fallbacks were unsuccessful." >&2
+6 -6
View File
@@ -3,15 +3,15 @@ set -euo pipefail
REAL_SYSCTL="/sbin/sysctl" REAL_SYSCTL="/sbin/sysctl"
if [[ ! -x "${REAL_SYSCTL}" ]]; then if [[ ! -x "${REAL_SYSCTL}" ]]; then
REAL_SYSCTL="/usr/sbin/sysctl" REAL_SYSCTL="/usr/sbin/sysctl"
fi fi
if [[ "$#" -ge 2 && "$1" == "-q" && "$2" == "net.ipv4.conf.all.src_valid_mark=1" ]]; then if [[ "$#" -ge 2 && "$1" == "-q" && "$2" == "net.ipv4.conf.all.src_valid_mark=1" ]]; then
if "${REAL_SYSCTL}" "$@" >/dev/null 2>&1; then if "${REAL_SYSCTL}" "$@" >/dev/null 2>&1; then
exit 0 exit 0
fi fi
# Suppress failure for this specific key to keep wg-quick from aborting in unprivileged environments. # Suppress failure for this specific key to keep wg-quick from aborting in unprivileged environments.
exit 0 exit 0
fi fi
exec "${REAL_SYSCTL}" "$@" exec "${REAL_SYSCTL}" "$@"
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/radarr:arm64v8-latest", "aarch64": "lscr.io/linuxserver/radarr:arm64v8-latest",
"amd64": "lscr.io/linuxserver/radarr:amd64-latest" "amd64": "lscr.io/linuxserver/radarr:amd64-latest"
} }
} }
View File
File mode changed.
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "thomst08/requestrr:arm64-latest", "aarch64": "thomst08/requestrr:arm64-latest",
"amd64": "thomst08/requestrr:linux-latest" "amd64": "thomst08/requestrr:linux-latest"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "franchetti/seafile-arm:latest", "aarch64": "franchetti/seafile-arm:latest",
"amd64": "franchetti/seafile-arm:latest" "amd64": "franchetti/seafile-arm:latest"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "ghcr.io/signalk/signalk-server:latest", "aarch64": "ghcr.io/signalk/signalk-server:latest",
"amd64": "ghcr.io/signalk/signalk-server:latest" "amd64": "ghcr.io/signalk/signalk-server:latest"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/sonarr:arm64v8-develop", "aarch64": "lscr.io/linuxserver/sonarr:arm64v8-develop",
"amd64": "lscr.io/linuxserver/sonarr:amd64-develop" "amd64": "lscr.io/linuxserver/sonarr:amd64-develop"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "ghcr.io/gabe565/castsponsorskip:latest", "aarch64": "ghcr.io/gabe565/castsponsorskip:latest",
"amd64": "ghcr.io/gabe565/castsponsorskip:latest" "amd64": "ghcr.io/gabe565/castsponsorskip:latest"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "ertagh/teamspeak3-server:latest-predownloaded", "aarch64": "ertagh/teamspeak3-server:latest-predownloaded",
"amd64": "ertagh/teamspeak3-server:x64-latest-predownloaded" "amd64": "ertagh/teamspeak3-server:x64-latest-predownloaded"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "ghcr.io/hassio-addons/base:17.2.0", "aarch64": "ghcr.io/hassio-addons/base:17.2.0",
"amd64": "ghcr.io/hassio-addons/base:17.2.0" "amd64": "ghcr.io/hassio-addons/base:17.2.0"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/transmission:arm64v8-latest", "aarch64": "lscr.io/linuxserver/transmission:arm64v8-latest",
"amd64": "lscr.io/linuxserver/transmission:amd64-latest" "amd64": "lscr.io/linuxserver/transmission:amd64-latest"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "haugene/transmission-openvpn:latest", "aarch64": "haugene/transmission-openvpn:latest",
"amd64": "haugene/transmission-openvpn:latest" "amd64": "haugene/transmission-openvpn:latest"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "senexcrenshaw/xteve:latest", "aarch64": "senexcrenshaw/xteve:latest",
"amd64": "senexcrenshaw/xteve:latest" "amd64": "senexcrenshaw/xteve:latest"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/code-server:arm64v8-latest", "aarch64": "lscr.io/linuxserver/code-server:arm64v8-latest",
"amd64": "lscr.io/linuxserver/code-server:amd64-latest" "amd64": "lscr.io/linuxserver/code-server:amd64-latest"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/papermerge:arm64v8-latest", "aarch64": "lscr.io/linuxserver/papermerge:arm64v8-latest",
"amd64": "lscr.io/linuxserver/papermerge:amd64-latest" "amd64": "lscr.io/linuxserver/papermerge:amd64-latest"
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"build_from": { "build_from": {
"aarch64": "lscr.io/linuxserver/plex-meta-manager:arm64v8-latest", "aarch64": "lscr.io/linuxserver/plex-meta-manager:arm64v8-latest",
"amd64": "lscr.io/linuxserver/plex-meta-manager:amd64-latest" "amd64": "lscr.io/linuxserver/plex-meta-manager:amd64-latest"
} }
} }