1
Files
qnap-rc-scripts/avahi.sh
2016-09-04 22:20:40 +03:00

526 lines
16 KiB
Bash
Executable File

#!/bin/sh
AVAHI_SRC=/mnt/ext/opt/avahi0630
DBUS_DAEMON=/usr/sbin/dbus-daemon
AVAHI_DAEMON=/usr/sbin/avahi-daemon
AVAHI_CONF_DIR=/etc/avahi/services
AVAHI_TM_CONF_FILE=${AVAHI_CONF_DIR}/timemachine.service
MYCLOUDNAS_CONF="/etc/config/qnapddns.conf"
Project_Name=`/sbin/getcfg Project Name -f /var/default`
/sbin/test -f ${AVAHI_DAEMON} || exit 0
set_avahi_conf()
{
/bin/rm -rf ${AVAHI_CONF_DIR}/web.service \
${AVAHI_CONF_DIR}/samba.service \
${AVAHI_CONF_DIR}/afp.service \
${AVAHI_CONF_DIR}/ssh.service \
${AVAHI_CONF_DIR}/sftp-ssh.service \
${AVAHI_CONF_DIR}/https.service \
${AVAHI_CONF_DIR}/upnp.service \
${AVAHI_CONF_DIR}/itunes.service \
${AVAHI_CONF_DIR}/printer.service \
${AVAHI_CONF_DIR}/qmobile.service \
${AVAHI_CONF_DIR}/qdiscover.service \
${AVAHI_CONF_DIR}/csco.service \
${AVAHI_CONF_DIR}/ftp.service >&/dev/null
MAC_ADDR=`/sbin/getcfg "MAC" "eth0" -f "/var/MacAddress" | /bin/tr '[a-z]' '[A-Z]'`
WEB_PORT=`/sbin/getcfg System "Web Access Port" -d 8080`
HTTPS_PORT=`/sbin/getcfg "Stunnel" "Port" -d "443"`
HOSTNAME=`/sbin/getcfg System "Server Name"`
MYCLOUDNAS_NAME=`/sbin/getcfg "QNAP DDNS Service" "Host Name" -f "${MYCLOUDNAS_CONF}"`
MYCLOUDNAS_DN=`/sbin/getcfg "QNAP DDNS Service" "Domain Name Server" -f "${MYCLOUDNAS_CONF}"`
FW_VER=`/sbin/getcfg "System" "Version" -d --`
FW_BN=`/sbin/getcfg System "Build Number" -d --`
SN=`/sbin/get_hwsn`
DISPLAY_MODEL=`/sbin/get_display_name`
MODEL=`/sbin/getcfg "System" "Model" -d NAS`
if [ "x$HOSTNAME" = "x" ]; then
/sbin/gen_hostname
/bin/sync
HOSTNAME=`/sbin/getcfg System "Server Name"`
fi
if [ `/sbin/getcfg "Bonjour Service" Web -u -d 1` = 1 ]; then
BROWSENAME=`/sbin/getcfg "Bonjour Service" "Web Service Name" -d "$HOSTNAME"`
/bin/cat > ${AVAHI_CONF_DIR}/web.service <<__EOF__
<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">$BROWSENAME</name>
<service>
<type>_http._tcp</type>
<port>${WEB_PORT}</port>
<txt-record>path=/</txt-record>
</service>
</service-group>
__EOF__
fi
if [ `/sbin/getcfg "Bonjour Service" SAMBA -u -d 1` = 1 ]; then
BROWSENAME=`/sbin/getcfg "Bonjour Service" "SAMBA Service Name" -d "$HOSTNAME(SMB)"`
/bin/cat > ${AVAHI_CONF_DIR}/samba.service <<__EOF__
<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">$BROWSENAME</name>
<service>
<type>_smb._tcp</type>
<port>445</port>
</service>
</service-group>
__EOF__
fi
if [ `/sbin/getcfg "Bonjour Service" AFP -u -d 0` = 1 ]; then
BROWSENAME=`/sbin/getcfg "Bonjour Service" "AFP Service Name" -d "$HOSTNAME(AFP)"`
/bin/cat > ${AVAHI_CONF_DIR}/afp.service <<__EOF__
<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">$BROWSENAME</name>
<service>
<type>_afpovertcp._tcp</type>
<port>548</port>
</service>
<service>
<type>_device-info._tcp</type>
<port>0</port>
<txt-record>model=Mac</txt-record>
</service>
</service-group>
__EOF__
fi
if [ `/sbin/getcfg "Bonjour Service" SSH -u -d 0` = 1 ]; then
BROWSENAME=`/sbin/getcfg "Bonjour Service" "SSH Service Name"`
SSH_PORT=`/sbin/getcfg LOGIN "SSH Port"`
/bin/cat > ${AVAHI_CONF_DIR}/ssh.service <<__EOF__
<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">$BROWSENAME</name>
<service>
<type>_ssh._tcp</type>
<port>${SSH_PORT}</port>
</service>
</service-group>
__EOF__
fi
if [ `/sbin/getcfg "Bonjour Service" FTP -u -d 0` = 1 ]; then
BROWSENAME=`/sbin/getcfg "Bonjour Service" "FTP Service Name"`
FTP_PORT=`/sbin/getcfg FTP Port`
/bin/cat > ${AVAHI_CONF_DIR}/ftp.service <<__EOF__
<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">$BROWSENAME</name>
<service>
<type>_ftp._tcp</type>
<port>${FTP_PORT}</port>
<txt-record>model=path=/</txt-record>
</service>
</service-group>
__EOF__
fi
if [ `/sbin/getcfg "Bonjour Service" HTTPS -u -d 0` = 1 ]; then
BROWSENAME=`/sbin/getcfg "Bonjour Service" "HTTPS Service Name"`
/bin/cat > ${AVAHI_CONF_DIR}/https.service <<__EOF__
<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">$BROWSENAME</name>
<service>
<type>_https._tcp</type>
<port>${HTTPS_PORT}</port>
<txt-record>model=path=/</txt-record>
</service>
</service-group>
__EOF__
fi
if [ `/sbin/getcfg "Bonjour Service" UPNP -u -d 0` = 1 ]; then
BROWSENAME=`/sbin/getcfg "Bonjour Service" "UPNP Service Name" -d "$HOSTNAME(DLNA)"`
UPNP_PORT=`/sbin/getcfg "TwonkyMedia" "Port" -d 9000`
/bin/cat > ${AVAHI_CONF_DIR}/upnp.service <<__EOF__
<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">$BROWSENAME</name>
<service>
<type>_upnp._tcp</type>
<port>${UPNP_PORT}</port>
</service>
</service-group>
__EOF__
fi
if [ `/sbin/getcfg "Bonjour Service" "QMobile" -u -d 1` = 1 ]; then
BROWSENAME=`/sbin/getcfg "Bonjour Service" "QMobile Service Name" -d "$HOSTNAME(Apps)"`
QMOBILE_PORT=`/sbin/getcfg "QMobile" "Port" -d 3986`
/bin/cat > ${AVAHI_CONF_DIR}/qmobile.service <<__EOF__
<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">$BROWSENAME</name>
<service>
<type>_qmobile._tcp</type>
<port>${QMOBILE_PORT}</port>
</service>
</service-group>
__EOF__
fi
if [ `/sbin/getcfg "Bonjour Service" QNAP -u -d 1` = 1 ]; then
BROWSENAME=`/sbin/getcfg "Bonjour Service" QNAP -d "$HOSTNAME"`
atype="http";
aport=${WEB_PORT};
if [ `/sbin/getcfg "Stunnel" "Enable" -u -d 1` = 1 -a `/sbin/getcfg "System" "Force SSL" -u -d 0` = 1 ]; then
atype="https"
aport=${HTTPS_PORT}
fi
qTXT="accessType=${atype},accessPort=${aport},model=${MODEL},displayModel=${DISPLAY_MODEL},fwVer=${FW_VER},fwBuildNum=${FW_BN}"
if [ x != x"$SN" ]; then
qTXT="${qTXT},serialNum=${SN}"
fi
if [ x != x"$MYCLOUDNAS_NAME" -a x != x"$MYCLOUDNAS_DN" ]; then
qTXT="${qTXT},myCloudNASName=${MYCLOUDNAS_NAME},myCloudNASDomain=${MYCLOUDNAS_DN}"
fi
/bin/cat > ${AVAHI_CONF_DIR}/qdiscover.service <<__EOF__
<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">$BROWSENAME</name>
<service>
<type>_qdiscover._tcp</type>
<port>${WEB_PORT}</port>
<txt-record>$qTXT</txt-record>
</service>
</service-group>
__EOF__
fi
if [ `/sbin/getcfg iTune Enable -u -d FALSE` = TRUE ]; then
_iTunes_ID=`/sbin/get_hwsn`
if [ $? != 0 ]; then
_iTunes_ID=`/sbin/uuidgen | /bin/cut -c 1-8`
fi
if [ "x`/sbin/getcfg iTune "Password Enabled" -u -d 0`" = "x1" ]; then
export _Passowrd=true
else
export _Passowrd=false
fi
/bin/cat > ${AVAHI_CONF_DIR}/itunes.service <<__EOF__
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">$HOSTNAME(iTunes)</name>
<service>
<type>_daap._tcp</type>
<port>3689</port>
<txt-record>txtvers=1</txt-record>
<txt-record>Machine Name=$HOSTNAME(iTunes)</txt-record>
<txt-record>Database ID=${_iTunes_ID}</txt-record>
<txt-record>iTSh Version=131073</txt-record>
<txt-record>Version=196610</txt-record>
<txt-record>Passowrd=${_Passowrd}</txt-record>
</service>
</service-group>
__EOF__
fi
if [ `/sbin/getcfg "Bonjour Service" CSCO -u -d 0` = 1 ]; then
service_name=`/sbin/getcfg "Bonjour Service" "Web Service Name" -d $HOSTNAME`"(csco-sb)"
/sbin/setcfg "Bonjour Service" "CSCO Service Name" $service_name
model_name=`/sbin/getcfg "System" "Model"`
devicedescr=`/bin/echo "$model_name" | /bin/tr -d '[a-z][A-Z]'`
[ ${model_name} = "NSS324R" ] && devicedescr="324R"
fmVersion=`/sbin/getcfg "System" "Version"`
hdVersion=`/sbin/get_hwver`
[ ${model_name} = "NSS324R" ] && hdVersion="1.0"
vid=`/bin/echo "${hdVersion} 10" | awk '{ printf("%g", $1 * $2);}'`
vid=$(($vid - 10 + 1 ))
if [ ${vid} -lt 10 ]; then
vid="0$vid"
fi
MACAddress=`/sbin/getcfg "MAC" "eth0" -f "/var/MacAddress" | /bin/tr '[a-z]' '[A-Z]' | /bin/tr -d ':'`
serialNo=`/sbin/get_hwsn`
hostname=`/bin/hostname`
mdf_id=""
if [ ${model_name} = "NSS322" ]; then
mdf_id="282984440"
elif [ ${model_name} = "NSS324" ]; then
mdf_id="282984441"
elif [ ${model_name} = "NSS326" ]; then
mdf_id="282984448"
elif [ ${model_name} = "NSS324R" ]; then
mdf_id="282984441"
fi
accesstype="noaccess";
if [ `/sbin/getcfg "Stunnel" "Enable" -u -d 1` = 1 ]; then
if [ "x$accesstype" = "xnoaccess" ]; then
accesstype="https"
else
accesstype="$accesstype, https"
fi
fi
if [ `/sbin/getcfg "System" "Force SSL" -u -d 0` = 0 ]; then
if [ "x$accesstype" = "xnoaccess" ]; then
accesstype="http"
else
accesstype="$accesstype, http"
fi
else
if [ "x$accesstype" = "xnoaccess" ]; then
accesstype="http"
fi
fi
if [ `/sbin/getcfg "LOGIN" "SSH Enable" -u -d TRUE` = TRUE ]; then
if [ "x$accesstype" = "xnoaccess" ]; then
accesstype="ssh"
else
accesstype="$accesstype, ssh"
fi
fi
if [ `/sbin/getcfg "LOGIN" "TELNET Enable" -u -d FALSE` = TRUE ]; then
if [ "x$accesstype" = "xnoaccess" ]; then
accesstype="telnet"
else
accesstype="$accesstype, telnet"
fi
fi
/bin/cat > ${AVAHI_CONF_DIR}/csco.service <<__EOF__
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">%h(csco)</name>
<service>
<type>_csco-sb._tcp</type>
<port>${WEB_PORT}</port>
<txt-record>version=1.0</txt-record>
<txt-record>model=${model_name}</txt-record>
<txt-record>deviceType=NAS</txt-record>
<txt-record>deviceDescr=Cisco NSS ${devicedescr} Smart Storage</txt-record>
<txt-record>fmVersion=$fmVersion</txt-record>
<txt-record>PIDVID=${model_name} V${vid}</txt-record>
<txt-record>MACAddress=${MACAddress}</txt-record>
<txt-record>serialNo=${serialNo}</txt-record>
<txt-record>hostname=${hostname}</txt-record>
<txt-record>MDFID=${mdf_id}</txt-record>
<txt-record>accessType=${accesstype}</txt-record>
</service>
</service-group>
__EOF__
fi
for i in 1 2 3 4 5 6 7; do
[ $i -eq 1 ] && i=""
if [ `/sbin/getcfg "Bonjour Service" "PRINTER$i" -u -d 0` = 1 ]; then
local phy_exist=`/sbin/getcfg "Printers" "Phy exist$i"`
[ "x$phy_exist" = "x" ] || [ $phy_exist -eq 0 ] && continue
local status=`/sbin/getcfg "Printers" "Status$i"`
[ $status -eq 4 ] && continue
local service_name=`/sbin/getcfg "Bonjour Service" "PRINTER Service Name$i"`
local printer_port=`/bin/cat /etc/config/cups/cupsd.conf|/bin/grep "Listen"|/bin/cut -d':' -f 2|/usr/bin/head -n 1`
local printer_name=`/sbin/getcfg "Printers" "Name$i"`
local manufacture=`/sbin/getcfg "Printers" "Manufacture$i"`
local model=`/sbin/getcfg "Printers" "Model$i"`
/bin/cat > ${AVAHI_CONF_DIR}/printer.service <<__EOF__
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">%h(Airprint)</name>
<service>
<type>_ipp._tcp</type>
<subtype>_universal._sub._ipp._tcp</subtype>
<port>$printer_port</port>
<txt-record>txtvers=1</txt-record>
<txt-record>qtotal=1</txt-record>
<txt-record>priority=0</txt-record>
<txt-record>rp=printers/$printer_name</txt-record>
<txt-record>ty=$manufacture $model</txt-record>
<txt-record>note=$manufacture $model</txt-record>
<txt-record>product=(GPL Ghostscript)</txt-record>
<txt-record>pdl=application/pdf,application/postscript,application/vnd.cups-raster,application/octet-stream,image/png</txt-record>
<txt-record>URF=none</txt-record>
</service>
</service-group>
__EOF__
fi
done
}
dbus_start()
{
if [ -L /var/run/dbus ] || [ -d ${AVAHI_SRC}/var/run/dbus ]; then
/bin/rm -rf /var/run/dbus
/bin/rm -rf ${AVAHI_SRC}/var/run/dbus
fi
DBUS_PID=`/bin/ps | /bin/grep dbus | /bin/grep -v grep | /bin/awk '{print $1}'`
if [ ! -z "$DBUS_PID" ]; then
/bin/echo "Dbus is still running ... restart dbus ..."
kill -9 $DBUS_PID
fi
/bin/mkdir -p ${AVAHI_SRC}/var/run/dbus
/bin/ln -sf ${AVAHI_SRC}/var/run/dbus /var/run/dbus
/bin/echo -n "Starting Dbus ... "
${DBUS_DAEMON} --system
/bin/sleep 1
/bin/kill -HUP `/bin/cat /var/run/dbus/pid`
/bin/sleep 1
/bin/echo "Dbus Started"
}
dbus_stop()
{
DBUS_PID=`/bin/ps | /bin/grep dbus | /bin/grep -v grep | /bin/awk '{print $1}'`
if [ -z "$DBUS_PID" ]; then
/bin/echo "Dbus is not running ..."
else
/bin/echo -n "Stopping Dbus ... "
/bin/kill -9 $DBUS_PID
/bin/sleep 1
/bin/echo "Stopped."
fi
/bin/rm -rf /var/run/dbus
/bin/rm -rf $AVAHI_SRC/var/run/dbus
}
PUBLIC_SHARE=`/sbin/getcfg SHARE_DEF defPublic -d Public -f /etc/config/def_share.info`
#Determine BASE installation location according to smb.conf
BASE=
publicdir=`/sbin/getcfg $PUBLIC_SHARE path -f /etc/config/smb.conf`
if [ ! -z $publicdir ] && [ -d $publicdir ];then
publicdirp1=`/bin/echo $publicdir | /bin/cut -d "/" -f 2`
publicdirp2=`/bin/echo $publicdir | /bin/cut -d "/" -f 3`
publicdirp3=`/bin/echo $publicdir | /bin/cut -d "/" -f 4`
if [ ! -z $publicdirp1 ] && [ ! -z $publicdirp2 ] && [ ! -z $publicdirp3 ]; then
[ -d "/${publicdirp1}/${publicdirp2}/${PUBLIC_SHARE}" ] && BASE="/${publicdirp1}/${publicdirp2}"
fi
fi
#Determine BASE installation location by checking where the Public folder is.
if [ -z $BASE ]; then
for datadirtest in /share/HDA_DATA /share/HDB_DATA /share/HDC_DATA /share/HDD_DATA /share/MD0_DATA; do
[ -d $datadirtest/$PUBLIC_SHARE ] && BASE="/${publicdirp1}/${publicdirp2}"
done
fi
if [ -z $BASE ] ; then
echo "The Public share not found."
exit 1
fi
case "$1" in
start)
if [ -f /tmp/avahi0630.lock ]; then
/bin/kill -INT `/bin/ps | /bin/grep avahi-daemon | /bin/grep -v grep | /bin/grep running | /bin/awk '{print $1}'` 2>/dev/null 1>/dev/null
/bin/rm -rf /tmp/avahi0630.lock
fi
if [ -f /etc/config/timemachine.conf ]; then
cp /etc/config/timemachine.conf /etc/config/timemachine.conf-pre_avahi
fi
[ -f ${AVAHI_DAEMON} ] || exit 1
#/etc/init.d/bonjour.sh stop
/bin/echo "Try to shutting down AVAHI services first"
/bin/kill -INT `/bin/ps | /bin/grep avahi-daemon | /bin/grep -v grep | /bin/grep running | /bin/awk '{print $1}'` 2>/dev/null 1>/dev/null
/bin/rm -rf /var/run/avahi-daemon
/bin/rm -rf ${AVAHI_SRC}/var/run/avahi-daemon
mkdir -p ${AVAHI_SRC}/var/run/avahi-daemon
ln -sf ${AVAHI_SRC}/var/run/avahi-daemon /var/run/avahi-daemon
/etc/init.d/timemachine.sh stop
/bin/sleep 3
# create the lock file
touch /tmp/avahi0630.lock
# starting Dbus
dbus_start
/sbin/ldconfig
#starting AVAHI
set_avahi_conf
if [ "x"`/sbin/getcfg TimeMachine Enabled -d FALSE` = "xTRUE" ]; then
/etc/init.d/timemachine.sh start
fi
/bin/sleep 2
#${AVAHI_DAEMON} --debug
${AVAHI_DAEMON} -D
#/bin/sleep 3
#CURRENT_AVAHI_PID=`/bin/ps | /bin/grep avahi-daemon | /bin/grep -v grep | /bin/grep running | /bin/awk '{print $1}'`
#if [ -z "$CURRENT_AVAHI_PID" ] ; then
#/bin/echo "Error: Avahi failed to start."
#/sbin/write_log "Error: Avahi failed to start." 1
#fi
;;
stop)
/bin/echo "Stop Avahi"
if [ ! -f /tmp/avahi0630.lock ]; then
/bin/echo "Avahi hasn't been enabled or started ..."
exit 0
fi
/bin/echo -n "Shutting down services: "
/bin/kill -INT `/bin/ps | /bin/grep avahi-daemon | /bin/grep -v grep | /bin/grep running | /bin/awk '{print $1}'` 2>/dev/null 1>/dev/null
/bin/rm -rf /var/run/avahi-daemon/pid
/bin/rm -rf /var/run/avahi-daemon/socket
/etc/init.d/timemachine.sh stop
#Stopping Dbus
dbus_stop
/bin/sleep 1
/bin/rm -rf /etc/config/timemachine.conf-pre_avahi
/bin/rm -rf /tmp/avahi0630.lock
;;
restart)
$0 stop
$0 start
;;
reload)
CURRENT_AVAHI_PID=`/bin/ps | /bin/grep avahi-daemon | /bin/grep "local]" | /bin/awk '{print $1}'`
if [ ! -z "$CURRENT_AVAHI_PID" ]; then
if [ -f /var/lock/avahi_set_conf.lock ]; then
exit 0;
fi
touch /var/lock/avahi_set_conf.lock
set_avahi_conf
/bin/kill -HUP $CURRENT_AVAHI_PID
rm /var/lock/avahi_set_conf.lock
fi
;;
*)
/bin/echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0