HEX
Server: Apache/2.2.34 (Unix) mod_fastcgi/mod_fastcgi-SNAP-0910052141
System: Linux Kou-Etsu-Dou 4.4.59+ #25556 SMP PREEMPT Thu Mar 4 18:03:46 CST 2021 x86_64
User: hosam (1026)
PHP: 7.2.29
Disabled: NONE
Upload Files
File: //var/packages/DNSServer/scripts/start-stop-status
#!/bin/sh

# customized items of package
PACKAGE_NAME=$SYNOPKG_PKGNAME
DSM_VERSION_NUMBER=$SYNOPKG_DSM_VERSION_BUILD
DSM_VERSION_MAJOR=$SYNOPKG_DSM_VERSION_MAJOR
PKG_STATUS=$SYNOPKG_PKG_STATUS
SZF_TMP_DNS_LOG="/tmp/dnslog"
DSM_STATUS_DEMO=`/usr/syno/bin/synogetkeyvalue /etc.defaults/synoinfo.conf support_demomode`

# For Compatibility between DNS Server and DHCP Server(process named and dnsmasq conflict on port 53)
COUNT_DNSMASQ=`/bin/ps ax | /bin/grep -c dnsmasq`
SZD_DHCPD="/etc/dhcpd"
SZF_DHCP_DNSMSQ_CONF="${SZD_DHCPD}/dhcpd-dns-dns.conf"
SZF_DHCP_DNSMSQ_INFO="${SZD_DHCPD}/dhcpd-dns-dns.info"

# DNS Server
PRIVATE_LOCATION="/var/packages/DNSServer/target"
PKG_APP_PATH="${PRIVATE_LOCATION}/app"
DNS_PID=$PRIVATE_LOCATION"/named/var/run/named/named.pid"
DNS_LOG=$PRIVATE_LOCATION"/named/var/log/SYNODNSLOGDB"
DNS_LOG_MIGRATE=$PRIVATE_LOCATION"/script/logmigrate.py"
SZF_DNS_RNDC_KEY="${PRIVATE_LOCATION}/named/rndc.key"
SZD_DNS_BACKUP="${PRIVATE_LOCATION}/backup"
SZD_DNS_RESTORE="${PRIVATE_LOCATION}/restore"
SZD_DNS_VAR_TMP="${PRIVATE_LOCATION}/named/var/tmp"

# Before bind9 start, we need check 1.interface lo is up (if not up, open lo) 2.
SZV_IFCONFIG_LO=`ifconfig | awk '{print $1}' | grep lo`

# general routines
DSM_INDEX_ADD="/usr/syno/bin/pkgindexer_add"
DSM_INDEX_DEL="/usr/syno/bin/pkgindexer_del"
PACKAGE_ENABLED="/var/packages/${PACKAGE_NAME}/enabled"

ChrootDir="/var/packages/DNSServer/target/named"
EtcDir="/var/packages/DNSServer/target/etc"
BinDir="/var/packages/DNSServer/target/bin"
RunAsUser="DNSServer"

AD_PRIVATE="/var/packages/DNSServer/target/named/etc/samba/private/"

# syslog-ng config
SZF_DNS_SYSLOG_CONF="/usr/local/etc/syslog-ng/patterndb.d/DNSServer.conf"

ChDirGrp()
{
	FROM_GROUP="bind"
	TO_GROUP="DNSServer"
	if [ -e "$1" ]; then
		cd "$1"
		stat -c '%G %n' * | grep ${FROM_GROUP} | cut -d' ' -f2 | xargs -r chgrp ${TO_GROUP}
		cd ..
	fi
}

ChangeOwner()
{
	/bin/find ${ChrootDir} -print  | /bin/grep -v "etc/samba/private/*" | /bin/grep -v "lib/*" | /bin/grep -v "usr/lib/*" | /bin/xargs chown DNSServer:DNSServer
	chown DNSServer:DNSServer ${ChrootDir}
	chown DNSServer:DNSServer ${EtcDir} -R
	chmod 700 ${ChrootDir}/etc/key

	# For Active Directory 0032 or below: dns registering
	ChDirGrp "${AD_PRIVATE}"
	ChDirGrp "${AD_PRIVATE}/dns"
	ChDirGrp "${AD_PRIVATE}/dns/sam.ldb.d"
	ChDirGrp "${AD_PRIVATE}/sam.ldb.d"
}

InitDirectory()
{
	if [ ! -f "${ChrootDir}/var/run/named" ]; then
		mkdir -p ${ChrootDir}/var/run/named
	fi
	if [ ! -f "${ChrootDir}/var/log" ]; then
		mkdir -p ${ChrootDir}/var/log
	fi
	if [ ! -d "${ChrootDir}/etc/key" ]; then
		mkdir -p ${ChrootDir}/etc/key
	fi
	if [ ! -f "${ChrootDir}/etc/zone/master" ]; then
		mkdir -p ${ChrootDir}/etc/zone/master
	fi
	if [ ! -f "${ChrootDir}/etc/zone/slave" ]; then
		mkdir ${ChrootDir}/etc/zone/slave
	fi
	if [ ! -f "${ChrootDir}/etc/zone/data" ]; then
		mkdir ${ChrootDir}/etc/zone/data
	fi
	if [ ! -f "${ChrootDir}/dev" ]; then
		mkdir ${ChrootDir}/dev
	fi
	if [ ! -f "${ChrootDir}/tmp" ]; then
		mkdir ${ChrootDir}/tmp
	fi
	if [ ! -f "${ChrootDir}/etc/samba" ]; then
		/bin/mkdir -p ${ChrootDir}/etc/samba
	fi
}

initial()
{
	InitDirectory

	if [ ! -f "${ChrootDir}/etc/localtime" ]; then
		 cp /etc/localtime ${ChrootDir}/etc/
	fi

	if [ ! -c "${ChrootDir}/dev/null"  ]; then
		mknod  ${ChrootDir}/dev/null c 1 3
	fi

	if [ ! -c "${ChrootDir}/dev/random" ]; then
		mknod  ${ChrootDir}/dev/random c 1 8
	fi

	if [ ! -c "${ChrootDir}/dev/urandom" ]; then
		mknod  ${ChrootDir}/dev/urandom c 1 9
	fi

	if [ ! -c "${ChrootDir}/dev/zero" ]; then
		mknod  ${ChrootDir}/dev/zero c 1 5
	fi
}

DNS_START_DHCPCheck()
{
	if [ ! -d "${SZD_DHCPD}" ]; then
		mkdir ${SZD_DHCPD}
	fi
	# create a conf file and an info file to avoid port conflict between DHCP Server and DNS Server
	/bin/echo "dhcp-option=tag:dns,option:dns-server,127.0.0.1" > ${SZF_DHCP_DNSMSQ_CONF}
	/bin/echo "dhcp-option=tag:dns,option:router,127.0.0.1" >> ${SZF_DHCP_DNSMSQ_CONF}
	/bin/echo "port=0" >> ${SZF_DHCP_DNSMSQ_CONF}
	/bin/echo "interface=dns" >> ${SZF_DHCP_DNSMSQ_CONF}
	/bin/echo "dhcp-range=set:dns,127.0.0.1,127.0.0.1,255.255.255.0,86400" >> ${SZF_DHCP_DNSMSQ_CONF}
	/bin/echo "enable=\"yes\"" > ${SZF_DHCP_DNSMSQ_INFO}
	# restart dhcp if dnsmasq is active
	if [ 1 -lt ${COUNT_DNSMASQ} ]; then
		/etc/rc.network nat-restart-dhcp
	fi
}

DNS_STOP_DHCPCheck()
{
	# remove conf and info file
	/bin/rm ${SZF_DHCP_DNSMSQ_CONF}
	/bin/rm ${SZF_DHCP_DNSMSQ_INFO}
	# restart dhcp if dnsmasq is active
	if [ 1 -lt ${COUNT_DNSMASQ} ]; then
		/etc/rc.network nat-restart-dhcp
	fi
}

DNS_LoopBack_Interface_Check()
{
	# before start named, we need check if interface lo is up, otherwise rndc command will failed
	if [ "${SZV_IFCONFIG_LO}" != "lo" ]; then
		/bin/echo "Network interface lo is not enable, please check your network status" > ${SYNOPKG_TEMP_LOGFILE}
		exit 1
	fi
}

DNS_PORT_CHECK()
{
	PORT_STATUS=`netstat -lntu | grep LISTEN | awk '{print $4}' | grep ':53$'`
	# before start named, use netstat to check if port 53 is listen by other process.
	if [ "x${PORT_STATUS}" != "x" ]; then
		/bin/echo "Port 53 is used by other process, please make sure port 53 is avaliable on all interface before start DNS Server" > ${SYNOPKG_TEMP_LOGFILE}
		exit 1
	fi
}

start_bind9()
{
	/sbin/initctl start pkg-DNSServer
	if [ 0 -ne $? ]; then
		/bin/echo "DNS Server start failed" > ${SYNOPKG_TEMP_LOGFILE}
		DNS_STOP_DHCPCheck
		exit 1
	fi
}

fix_view_include_partial_dlz()
{
	local -r mark_file="${PRIVATE_LOCATION}/need_fix_view_partial_include_dlz"
	if [ ! -f "${mark_file}" ]; then
		return 0
	fi

	echo "Fix view include partial dlz"
	if ! ${PKG_APP_PATH}/synodnstool --fix-view-partial-include-dlz; then
		echo "Fail to fix view include partial dlz"
		return 1
	fi
	rm "${mark_file}"
	return 0
}

start()
{
	#kill named if pid exist
	if [ -f ${DNS_PID} ]; then
		${BinDir}/rndc -k ${SZF_DNS_RNDC_KEY} sync -clean
		kill -TERM `cat ${DNS_PID}`
	fi

	#reset directory
	rm -rf ${SZD_DNS_BACKUP}
	rm -rf ${SZD_DNS_RESTORE}
	rm -rf ${SZD_DNS_VAR_TMP}
	mkdir -p ${SZD_DNS_BACKUP}
	mkdir -p ${SZD_DNS_RESTORE}
	mkdir -p ${SZD_DNS_VAR_TMP}
	chown DNSServer:DNSServer ${SZD_DNS_BACKUP}
	chown DNSServer:DNSServer ${SZD_DNS_RESTORE}
	chown DNSServer:DNSServer ${SZD_DNS_VAR_TMP}

	# create a key for rndc if key not exist
	if [ ! -f ${SZF_DNS_RNDC_KEY} ]; then
		${BinDir}/rndc-confgen -a -b 512 -r /dev/urandom -s 127.0.0.1 -c /var/packages/DNSServer/target/named/rndc.key -u root
	fi
	chown DNSServer:DNSServer ${SZF_DNS_RNDC_KEY}
	chmod 770 ${SZF_DNS_RNDC_KEY}

	# create log db if not exist, and if default-log.x exist, migrate into log db
	${PKG_APP_PATH}/synodnstool --log-db-init
	${DNS_LOG_MIGRATE} & # log may large, run in bg

	if [ ! -f "${SZF_DNS_SYSLOG_CONF}" ] ; then
		/bin/cp "${PRIVATE_LOCATION}"/syslog_conf/synodnslog.conf "${SZF_DNS_SYSLOG_CONF}"
		/sbin/initctl reload syslog-ng
	fi

	# initial and check run env for bind9
	initial
	ChangeOwner
	fix_view_include_partial_dlz
	case ${DSM_STATUS_DEMO} in
		[Yy][Ee][Ss])
			echo "allow-recursion {none;};" > ${PRIVATE_LOCATION}/named/etc/conf/named.options.resolution.conf
			echo "blackhole {any;};" >> ${PRIVATE_LOCATION}/named/etc/conf/named.options.resolution.conf
			# disable auto initial process
			/usr/syno/bin/synosetkeyvalue ${PRIVATE_LOCATION}/etc/synodns.conf need_initial no
			/usr/syno/bin/synosetkeyvalue ${PRIVATE_LOCATION}/etc/synodns.conf resolve_enable no
			${BinDir}/named -t ${ChrootDir} -u $RunAsUser
			;;
		*)
			${PKG_APP_PATH}/synodnstool --fix-redefined

			# check env for named
			DNS_LoopBack_Interface_Check
			# start bind9 if not demo mode
			DNS_START_DHCPCheck
			# check if port 53 is listen by other process
			DNS_PORT_CHECK
			# call named start DNS server
			start_bind9

			# initial resolution conf
			${PKG_APP_PATH}/synodnstool --init-resolution-conf
			if [ 0 -ne $? ]; then
				/bin/echo "DNS Server initialize failed" > ${SYNOPKG_TEMP_LOGFILE}
				DNS_STOP_DHCPCheck
				exit 1
			fi

			# apply dlz setting
			${PKG_APP_PATH}/synodnstool --dlz-apply

			# register local subnet ip for allowing recursive query
			if [ -e "/var/packages/DNSServer/target/hook_scripts/synodns_hook.sh" ]; then
				. /var/packages/DNSServer/target/hook_scripts/synodns_hook.sh
				IsRouterMode
				LoadDnsMasqSubnetListToAllowRecursive $?
			fi
			;;
	esac
}

stop()
{
	#stop bind9
	${BinDir}/rndc -k ${SZF_DNS_RNDC_KEY} sync -clean
	/sbin/initctl stop pkg-DNSServer

	#dlz umount
	${PKG_APP_PATH}/synodnstool --dlz-release-resource

	# do DNS_STOP_DHCPCheck after bind9 stop
	DNS_STOP_DHCPCheck

	# [workaround] remove syslog-ng config due to log socket file in volume
	# To prevent syslong-ng start fail due to volume not ready when booting
	# or after SHA, XA switch over.
	if [ -f "${SZF_DNS_SYSLOG_CONF}" ]; then
		/bin/rm -f "${SZF_DNS_SYSLOG_CONF}"
	fi
}

case $1 in
	start)
		# start routine
		start
		exit 0
		;;
	stop)
		stop
		exit 0
		;;
	status)
		# don't check pid on demo mode
		case ${DSM_STATUS_DEMO} in
			[Yy][Ee][Ss])
				if [ -f ${PACKAGE_ENABLED} ]; then
					exit 0
				else
					exit 1
				fi
				;;
			*)
				COUNT_DNS=`/bin/ps ax | grep -c named`
				if [ -f ${DNS_PID} ] && [ 0 -lt ${COUNT_DNS} ]; then
					exit 0
				else
					exit 1
				fi
				;;
		esac
	;;
	killall)
		;;
	log)
		echo ${DNS_LOG}
		exit 0
		;;
esac