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