File: //usr/syno/lib/systemd/scripts/ssdp.sh
#!/bin/sh
PATH="$PATH:/bin/" # cat, echo, mkdir
PATH="$PATH:/usr/bin" # basename
MINISSDP_ARGS_FILE="/run/ssdp/minissdp_args.tmp"
usage() {
cat <<EOF
Usage: $(basename "$0") [pre-start | start | post-start | post-stop]
EOF
}
enum_interface() {
#only bind eth*, ovs_eth*, bond*, ovs_bond*, and br*
#TODO <DSM>#120952 Maybe we can use ifconfig to replace this binary.
/usr/syno/bin/list_network_interfaces \
| grep -e '^eth.*\|^ovs_eth.*\|^bond.*\|^ovs_bond.*\|^br.*'
return
}
enum_service() {
local dir="/usr/syno/etc/ssdp/*.conf"
if [ "$(ls $dir 2>/dev/null | wc -l)" -ne 0 ]; then
# shellcheck disable=SC2066 # According to its caller usage, it seems like by design.
for i in "${dir}"; do
echo $i;
done
fi
dir="/usr/local/etc/ssdp/*.conf"
if [ "$(ls $dir 2>/dev/null | wc -l)" -ne 0 ] ; then
# shellcheck disable=SC2066 # According to its caller usage, it seems like by design.
for i in "${dir}"; do
echo $i;
done
fi
}
map_to_subnet() { # ifaces
local i=
for i in "$@"; do
ip -4 addr show dev "$i" | grep -o 'inet [^ ]*' | cut -d' ' -f2
done
}
gen_nginx_conf() { # ifaces
local subnet=
echo "location ~ ^/ssdp/ {"
for subnet in $(map_to_subnet "$@" | sort -t/ -k2 -r | uniq); do
echo " allow $subnet;"
done
echo " deny all;"
echo " root /tmp;"
echo " access_log off;"
echo " log_not_found off;"
echo "}"
}
gen_minissdp_args_file() { # ifaces
local i=
local envIfaces=
for i in "$@"; do
envIfaces="$envIfaces -i $i"
done
echo "INTERFACE=\"$envIfaces\""
}
conf_gen() {
mkdir -p /usr/syno/synoman/ssdp/
local ifaces=
ifaces="$(enum_interface)"
mkdir -p /run/ssdp/
gen_nginx_conf $ifaces > /run/ssdp/dsm.ssdp.conf
gen_minissdp_args_file $ifaces | tee "${MINISSDP_ARGS_FILE}"
/usr/syno/bin/synow3tool --reg-nginx-confd=/run/ssdp/dsm.ssdp.conf
}
reload_nginx() {
/usr/syno/bin/synosystemctl reload nginx
}
pre_start() {
if ! conf_gen; then
return 1
fi
if ! /usr/syno/bin/synow3tool --enable-nginx-confd=dsm.ssdp.conf; then
return 1
fi
if ! reload_nginx; then
return 1
fi
return 0
}
start() {
local interface
interface=$(/bin/get_key_value "${MINISSDP_ARGS_FILE}" "INTERFACE")
/usr/bin/minissdpd $interface
}
post_start() {
local reg_service="/usr/syno/bin/reg_ssdp_service"
local i=""
for i in $(enum_service); do
echo $reg_service $i
$reg_service $i
done
cp -rf /usr/syno/synoman/ssdp/ /tmp/ssdp
touch /tmp/ssdp/dummy.xml
}
post_stop() {
/bin/rm -rf /usr/syno/synoman/ssdp
/bin/rm -rf /tmp/ssdp
if ! /usr/syno/bin/synow3tool --disable-nginx-confd=dsm.ssdp.conf; then
return 1
fi
if ! reload_nginx; then
return 1
fi
return 0
}
case "$1" in
pre-start) pre_start;;
start) start;;
post-start) post_start;;
post-stop) post_stop;;
*) usage >&2 ; exit 1 ;;
esac