mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2024-12-22 14:22:23 +00:00
Synology Docker: update entrypoint.sh (#1704)
* update entrypoint.sh - propagate TERM/QUIT/INT signals - add some basic logging - check for unbound variables - update "route helper" - run as subshell, exit if zerotier-one is unavailable so pod can be restarted - only call `zerotier-cli` once, avoids race conditions - only add default routes if allowDefault is enabled for that network - add some more error handling - sleep after all networks are processed * switch to polling ZT service at startup Co-authored-by: Daniel Quinlan <dq@chaosengine.net>
This commit is contained in:
parent
e83c7e6691
commit
fac212fafa
@ -2,13 +2,12 @@
|
|||||||
|
|
||||||
FROM alpine:latest as builder
|
FROM alpine:latest as builder
|
||||||
|
|
||||||
RUN apk add --no-cache rust cargo
|
WORKDIR /src
|
||||||
RUN apk add openssl-dev
|
RUN apk add --no-cache rust cargo \
|
||||||
|
&& apk add openssl-dev \
|
||||||
RUN apk add --update alpine-sdk linux-headers \
|
&& apk add --update alpine-sdk linux-headers \
|
||||||
&& git clone --quiet https://github.com/zerotier/ZeroTierOne.git /src \
|
&& git clone --quiet https://github.com/zerotier/ZeroTierOne.git /src \
|
||||||
&& git -C src reset --quiet --hard ${ZTO_COMMIT} \
|
&& git reset --quiet --hard ${ZTO_COMMIT} \
|
||||||
&& cd /src \
|
|
||||||
&& make -f make-linux.mk
|
&& make -f make-linux.mk
|
||||||
|
|
||||||
FROM alpine:latest
|
FROM alpine:latest
|
||||||
@ -18,6 +17,7 @@ LABEL description="ZeroTier One docker image for Synology NAS"
|
|||||||
RUN apk add --update --no-cache bash jq libc6-compat libstdc++
|
RUN apk add --update --no-cache bash jq libc6-compat libstdc++
|
||||||
|
|
||||||
EXPOSE 9993/udp
|
EXPOSE 9993/udp
|
||||||
|
ENV MAX_WAIT_SECS SLEEP_TIME
|
||||||
|
|
||||||
COPY --from=builder /src/zerotier-one /usr/sbin/
|
COPY --from=builder /src/zerotier-one /usr/sbin/
|
||||||
RUN mkdir -p /var/lib/zerotier-one \
|
RUN mkdir -p /var/lib/zerotier-one \
|
||||||
|
@ -1,29 +1,81 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -uo pipefail
|
||||||
|
|
||||||
|
trap 'trap " " SIGTERM; kill 0; wait' SIGTERM SIGQUIT SIGINT
|
||||||
|
|
||||||
|
echo "Starting Zerotier-One"
|
||||||
zerotier-one -d
|
zerotier-one -d
|
||||||
|
|
||||||
# Wait for ZT service to come online before attempting queries
|
echo "Wait for ZT service to come online before attempting queries..."
|
||||||
sleep 15
|
MAX_WAIT_SECS="${MAX_WAIT_SECS:-90}"
|
||||||
|
SLEEP_TIME="${SLEEP_TIME:-15}"
|
||||||
|
if [[ "$SLEEP_TIME" -le 0 ]]
|
||||||
|
then
|
||||||
|
SLEEP_TIME=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
iterations=$((MAX_WAIT_SECS/SLEEP_TIME))
|
||||||
|
online=false
|
||||||
|
|
||||||
|
for ((s=0; s<=iterations; s++))
|
||||||
|
do
|
||||||
|
online="$(zerotier-cli -j info | jq '.online' 2>/dev/null)"
|
||||||
|
if [[ "$online" == "true" ]]
|
||||||
|
then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep "$SLEEP_TIME"
|
||||||
|
echo " ."
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ "$online" != "true" ]]
|
||||||
|
then
|
||||||
|
echo "Waited $MAX_WAIT_SECS for zerotier-one to start, exiting." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "done."
|
||||||
|
|
||||||
|
(
|
||||||
|
echo "Starting route helper"
|
||||||
while true
|
while true
|
||||||
do
|
do
|
||||||
NETWORK_COUNT=$(zerotier-cli -j listnetworks | jq -r '. | length')
|
if ! NETWORK_LIST="$(zerotier-cli -j listnetworks)"
|
||||||
if [ "$NETWORK_COUNT" -gt 0 ]; then
|
then
|
||||||
|
echo "Route helper: $NETWORK_LIST" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
NETWORK_COUNT="$(jq -r '. | length' <<< "$NETWORK_LIST")"
|
||||||
|
if [[ "$NETWORK_COUNT" -gt 0 ]]
|
||||||
|
then
|
||||||
for ((j=0; j<=$((NETWORK_COUNT-1)); j++))
|
for ((j=0; j<=$((NETWORK_COUNT-1)); j++))
|
||||||
do
|
do
|
||||||
ROUTE_COUNT=$(zerotier-cli -j listnetworks | jq -r '.['$j'].routes | length')
|
ALLOW_DEFAULT="$(jq -r '.['$j'].allowDefault' <<< "$NETWORK_LIST")"
|
||||||
|
ROUTE_COUNT="$(jq -r '.['$j'].routes | length' <<< "$NETWORK_LIST")"
|
||||||
for ((k=0; k<=$((ROUTE_COUNT-1)); k++))
|
for ((k=0; k<=$((ROUTE_COUNT-1)); k++))
|
||||||
do
|
do
|
||||||
ROUTE=$(zerotier-cli -j listnetworks | jq -r '.['$j'].routes['$k'].target')
|
ROUTE="$(jq -r '.['$j'].routes['$k'].target' <<< "$NETWORK_LIST")"
|
||||||
EXIST=$(ip route show $ROUTE | wc -l)
|
if [[ -n "$ROUTE" ]]
|
||||||
if [ $EXIST -eq 0 ];
|
|
||||||
then
|
then
|
||||||
IFNAME=$(zerotier-cli -j listnetworks | jq -r '.['$j'] | .portDeviceName')
|
# check if route is default and allowDefault enabled for this network
|
||||||
ip route add $ROUTE dev $IFNAME
|
if [[ "$ROUTE" == "0.0.0.0/0" && "$ALLOW_DEFAULT" == "false" ]]
|
||||||
|
then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
EXIST="$(ip -o route show "$ROUTE")"
|
||||||
|
if [[ -z "${EXIST}" ]]
|
||||||
|
then
|
||||||
|
IFNAME="$(jq -r '.['$j'] | .portDeviceName' <<< "$NETWORK_LIST")"
|
||||||
|
echo " Adding route $ROUTE to dev $IFNAME"
|
||||||
|
ip route add "$ROUTE" dev "$IFNAME"
|
||||||
# Routes will be deleted when ZT brings the interface down
|
# Routes will be deleted when ZT brings the interface down
|
||||||
fi
|
fi
|
||||||
done
|
|
||||||
done
|
|
||||||
sleep 15
|
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
sleep 15
|
||||||
|
done ) &
|
||||||
|
|
||||||
|
wait
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user