119 lines
3.3 KiB
Bash
Executable File
119 lines
3.3 KiB
Bash
Executable File
#! /usr/bin/env bash
|
|
# 2014, Moritz Kaspar Rudert (mortzu) <mr@planetcyborg.de>.
|
|
# All rights reserved.
|
|
|
|
# Redistribution and use in source and binary forms, with or without modification, are
|
|
# permitted provided that the following conditions are met:
|
|
#
|
|
# * Redistributions of source code must retain the above copyright notice, this list of
|
|
# conditions and the following disclaimer.
|
|
#
|
|
# * Redistributions in binary form must reproduce the above copyright notice, this list
|
|
# of conditions and the following disclaimer in the documentation and/or other materials
|
|
# provided with the distribution.
|
|
#
|
|
# * The names of its contributors may not be used to endorse or promote products derived
|
|
# from this software without specific prior written permission.
|
|
#
|
|
# * Feel free to send Club Mate to support the work.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
|
|
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
|
|
# AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
# POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
# PID file
|
|
RUN_FILE='/run/update-dns-nodes.run'
|
|
|
|
# getting workingdir of scripts
|
|
WORK_DIR="$(dirname $(readlink -nf $0))"
|
|
|
|
# set safe path
|
|
PATH="${WORK_DIR}:/sbin:/usr/sbin:/bin:/usr/bin"
|
|
|
|
# alfred data file
|
|
ALFRED_DATA_FILE='/var/cache/ffhb/alfred.json'
|
|
|
|
# create alfred data directory
|
|
mkdir -p "$(dirname $ALFRED_DATA_FILE)"
|
|
|
|
# define variable to count loops
|
|
declare -i NUM=0
|
|
|
|
# tmp file
|
|
TMP_FILE="$(mktemp)"
|
|
|
|
# if creation of tmp file failed
|
|
# exit
|
|
if [ -z "$TMP_FILE" ]; then
|
|
exit 1
|
|
fi
|
|
|
|
# names of zones
|
|
ZONEFILE=/var/lib/nsd/net.freifunk.bremen.nodes.zone
|
|
RZONEFILE=/var/lib/nsd/arpa.ip6.f.d.2.f.5.1.1.9.0.f.2.c.zone
|
|
|
|
function on_exit() {
|
|
# remove tmp files
|
|
for FILE in "$TMP_FILE" "$RUN_FILE"; do
|
|
if [ -n "$FILE" ]; then
|
|
rm -f "$FILE"
|
|
fi
|
|
done
|
|
}
|
|
|
|
trap on_exit EXIT SIGTERM SIGINT
|
|
|
|
# write run file
|
|
if [ -f "$RUN_FILE" ]; then
|
|
echo 'Script already running!' >&2
|
|
exit 1
|
|
else
|
|
touch "$RUN_FILE"
|
|
fi
|
|
|
|
# loop until data received
|
|
while true; do
|
|
# increment counter
|
|
NUM=$(($NUM+1))
|
|
|
|
# get data from alfred
|
|
# but limit the time
|
|
timeout -s KILL 30s alfred-json -z -r 158 >"$TMP_FILE" 2>/dev/null
|
|
|
|
# on success leave loop
|
|
if [ $? -eq 0 ]; then
|
|
break
|
|
fi
|
|
|
|
# if the 240th run has reached kill script
|
|
if [ $NUM -gt 240 ]; then
|
|
# exit with error code
|
|
exit 1
|
|
fi
|
|
|
|
# sleep to be safe CPU load don't getting higher
|
|
sleep 1
|
|
done
|
|
|
|
# generate forward zone
|
|
if zonegen.py <"$TMP_FILE" >"${ZONEFILE}.new"; then
|
|
mv "${ZONEFILE}.new" "${ZONEFILE}"
|
|
fi
|
|
|
|
# generate reverse zone
|
|
if rzonegen.py 0.0.0.0.c.2.f.0.9.1.1.5.f.2.d.f.ip6.arpa <"$TMP_FILE" >"${RZONEFILE}.new"; then
|
|
mv "${RZONEFILE}.new" "${RZONEFILE}"
|
|
fi
|
|
|
|
# reload nameserver
|
|
nsd-control reload > /dev/null
|
|
|
|
# copy alfred file
|
|
cp "$TMP_FILE" "$ALFRED_DATA_FILE"
|