HEX
Server: Apache/2.4.63 (Unix)
System: Linux TOMS-220NAS 4.4.302+ #86009 SMP Wed Nov 26 18:19:17 CST 2025 x86_64
User: flavio87 (1026)
PHP: 8.3.27
Disabled: NONE
Upload Files
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