[NAS Typ:] bedingt alle
[Firmware:] (ab 2.0.0)
[Getestet:] ja, mit TS-109 und TS-239
[Sonstige Modifikationen:] Anpassung der Hosts-Liste
[Autor:] Eraser-EMC2- / Stefan
Wenn alle aufgeführten Clients nicht mehr erreichbar sind, fährt der Server herunter.
Beispiel der Config-Datei:
Client-Liste (mit Leerzeichen getrennt) in der /etc/config/wait4pc.conf:
Die richtige IP-Adresse wird im Script zusammengefaßt.
Mit dem Eintrag "CHECK = Y" wird das Script aktiv.
Von der Kommandozeile kann man es mit "wait4pc.sh -s on" aktivieren bzw. mit "wait4pc.sh -s off" deaktivieren.
Die vorhandenen Shutdown-Einträge werden automatisch angepaßt.
Installiert wird es zB. mit "/share/HDA_DATA/Public/wait4pc.sh -i".
Das Script wird nun grundsätzlich alle 5 Minuten zur Überprüfung gestartet.
Es wird zusätzlich 1 Eintrag in die crontab vorgenommen:
${INSTPATH} wird durch den Pfad ersetzt, aus dem das Script gestartet wurde,
danach sollte man ohne Anpassung der Crontab die Script-Datei nicht verschieben.
Weitere Überprüfungen können über das Menü "/share/HDA_DATA/Public/wait4pc.sh -m" oder direkt angesteuert
Hiermit bekommt man eine Kommando-Übersicht : "/share/HDA_DATA/Public/wait4pc.sh -?"
Es kann die Überprüfung der Downloads über Qdownload/Qget
und ein Eintrag in die QNAP-NAS-Log aktiviert werden.
#!/bin/shDATUM=`date '+%Y-%m-%d_%H-%M'`;SYSLOG=`which write_log`CUT=`which cut`GETCFG=`which getcfg`SETCFG=`which setcfg`UPPERCASE=`which uppercase`LOWERCASE=`which lowercase`PS=`which ps`GREP=`which grep`WC=`which wc`PING=`which ping`SMBNET="/usr/local/samba/bin/net"WAITCONF="/etc/config/wait4pc.conf"ULINUX="/etc/config/uLinux.conf"DOWNLOADLIST="/etc/config/downloadlist"CRONTAB="/etc/config/crontab"CRONTAB_NEW="/tmp/crontab"INSTPATH=`pwd`log () { [ "x${bWATCHLOG}" = "xY" ] && ${SYSLOG} "$1" 4; echo "$1"}func_set_ping_on() { ${SETCFG} GENERAL PING Y -f ${WAITCONF} log "Host-Überprüfung aktiviert"}func_set_ping_off() { ${SETCFG} GENERAL PING N -f ${WAITCONF} log "Host-Überprüfung deaktiviert"}func_set_qdownload_on() { ${SETCFG} GENERAL QDOWNLOAD Y -f ${WAITCONF} log "Qdownload-Überprüfung aktiviert"}func_set_qdownload_off() { ${SETCFG} GENERAL QDOWNLOAD N -f ${WAITCONF} log "Qdownload-Überprüfung deaktiviert"}func_set_samba_on() { ${SETCFG} GENERAL SAMBA Y -f ${WAITCONF} log "Samba-Überprüfung aktiviert"}func_set_samba_off() { ${SETCFG} GENERAL SAMBA N -f ${WAITCONF} log "Samba-Überprüfung deaktiviert"}func_set_rsync_on() { ${SETCFG} GENERAL RSYNC Y -f ${WAITCONF} log "rsync-Überprüfung aktiviert"}func_set_rsync_off() { ${SETCFG} GENERAL RSYNC N -f ${WAITCONF} log "rsync-Überprüfung deaktiviert"}func_set_shutdown_on() { ${SETCFG} GENERAL CHECK Y -f ${WAITCONF} log "automatischer Shutdown aktiviert"}func_set_shutdown_off() { ${SETCFG} GENERAL CHECK N -f ${WAITCONF} log "automatischer Shutdown deaktiviert"}func_set_log_on() { ${SETCFG} GENERAL LOG Y -f ${WAITCONF} log "Script-Log aktiviert"}func_set_log_off() { ${SETCFG} GENERAL LOG N -f ${WAITCONF} log "Script-Log deaktiviert"}func_get_check() { bCHECK=`${GETCFG} GENERAL CHECK -f ${WAITCONF} -d N`}func_get_ping() { bPING=`${GETCFG} GENERAL PING -f ${WAITCONF} -d N`}func_get_qdownload() { bQDOWNLOAD=`${GETCFG} GENERAL QDOWNLOAD -f ${WAITCONF} -d N`}func_get_samba() { bSAMBA=`${GETCFG} GENERAL SAMBA -f ${WAITCONF} -d N`}func_get_rsync() { bRSYNC=`${GETCFG} GENERAL RSYNC -f ${WAITCONF} -d N`}func_get_log() { bWATCHLOG=`${GETCFG} GENERAL LOG -f ${WAITCONF} -d N`}func_get_sessions() { iSESSIONS=`${SMBNET} status sessions parseable | wc -l`}func_get_subnet() { sSUBNET=`${GETCFG} GENERAL SUBNET -f ${WAITCONF}`}func_get_hosts() { sHOSTS=`${GETCFG} GENERAL HOSTS -f ${WAITCONF}`}func_get_nas() { NAS=`${GETCFG} System Model -f /etc/config/uLinux.conf`}func_menu() {clearwhile [ "$CHOICE" != "x" ]&&[ "$CHOICE" != "X" ]; do func_get_check echo "-----------------------------------------------------" if [ "x${bCHECK}" = "xY" ]; then echo " [ 1 ] automatischer Shutdown [ on ] " else echo " [ 1 ] automatischer Shutdown [ off ]" fi func_get_ping if [ "x${bPING}" = "xY" ]; then echo " [ 2 ] Host-Überwachung ( ping ) [ on ]" else echo " [ 2 ] Host-Überwachung ( ping ) [ off ]" fi func_get_qdownload if [ "x${bQDOWNLOAD}" = "xY" ]; then echo " [ 3 ] QDownload überwachen [ on ]" else echo " [ 3 ] QDownload überwachen [ off ]" fi func_get_samba if [ "x${bSAMBA}" = "xY" ]; then echo " [ 4 ] Samba überwachen [ on ]" else echo " [ 4 ] Samba überwachen [ off ]" fi func_get_rsync if [ "x${bRSYNC}" = "xY" ]; then echo " [ 5 ] rsync überwachen [ on ]" else echo " [ 5 ] rsync überwachen [ off ]" fi func_get_log if [ "x${bWATCHLOG}" = "xY" ]; then echo " [ 6 ] Script-Log [ on ]" else echo " [ 6 ] Script-Log [ off ] " fi echo " " echo " [ p ] Crontab-Einträge prüfen [ x ]" echo " " func_get_subnet echo " IP-Bereich : [ ${sSUBNET} ] " func_get_hosts echo " Host-Adressen : [ ${sHOSTS} ]" func_get_sessions echo " SAMBA-Verbindungen : ["${iSESSIONS}" ] " RSYNC=`${GETCFG} System "Rsync Support" -f ${ULINUX} -d FALSE` if [ "x${RSYNC}" = "xTRUE" ]; then COUNT2=`${PS} | ${GREP} rsync | ${WC} -l` COUNT2=`expr ${COUNT2} - 2` echo " Rsync-Prozesse : [ ${COUNT2} ]" fi echo " " echo " [ u ] Wait4pc deinstallieren [ x ]" echo " " echo " [ x ] Exit " echo "-----------------------------------------------------" read CHOICE clear case ${CHOICE} in 1) echo "---> " case ${bCHECK} in "N") func_set_shutdown_on ;; "Y") func_set_shutdown_off ;; esac echo "---> Done" ;; 2) echo "---> " case ${bPING} in "N") func_set_ping_on ;; "Y") func_set_ping_off ;; esac echo "---> Done" ;; 3) echo "---> " case ${bQDOWNLOAD} in "N") func_set_qdownload_on ;; "Y") func_set_qdownload_off ;; esac echo "---> Done" ;; 4) echo "---> " case ${bSAMBA} in "N") func_set_samba_on ;; "Y") func_set_samba_off ;; esac echo "---> Done" ;; 5) echo "---> " case ${bRSYNC} in "N") func_set_rsync_on ;; "Y") func_set_rsync_off ;; esac echo "---> Done" ;; 6) echo "---> " case ${bWATCHLOG} in "N") func_set_log_on ;; "Y") func_set_log_off ;; esac echo "---> Done" ;; p) echo "---> " func_check echo "---> Done" ;; i) echo "---> " func_install echo "---> Done" ;; u) echo "---> " func_uninstall echo "---> Done" ;; x|X) echo "---> Done" ;; esacdone}func_run() { func_get_check if [ "${bCHECK}" = "Y" ]; then COUNT2=0 func_get_subnet func_get_hosts func_get_qdownload func_get_samba func_get_rsync func_get_ping if [ "x${bQDOWNLOAD}" = "xY" ]; then while read URL STATUS PCID UNKOWN1 DATEEND DLID UNKOWN2 do if [ "x${URL}" != "x" ]; then case ${STATUS} in "run"|"pause") ((COUNT2++)) ;; esac fi done < ${DOWNLOADLIST} if [ ${COUNT2} != 0 ]; then log "es ist min. ein Download-Auftrag noch aktiv" fi fi if [ ${COUNT2} = 0 ]&&[ "x${bSAMBA}" = "xY" ]; then func_get_sessions COUNT2=${iSESSIONS} echo "Anzahl offener Verbindungen : ${COUNT2}" fi if [ ${COUNT2} = 0 ]&&[ "x${bRSYNC}" = "xY" ]; then COUNT2=`${PS} | ${GREP} rsync | ${WC} -l` COUNT2=`expr ${COUNT2} - 2` echo "Anzahl offener Verbindungen : ${COUNT2}" fi if [ ${COUNT2} = 0 ]&&[ "x${bPING}" = "xY" ]; then for HOST in ${sHOSTS} do ${PING} -q -c 1 "${sSUBNET}${HOST}" &> /dev/null if [ "$?" -eq 0 ]; then echo "${sSUBNET}${HOST} ist noch erreichbar" ((COUNT2++)) break; else echo "${sSUBNET}${HOST} ist offline" fi done fi if [ ${COUNT2} = 0 ]; then log "Keine Clients gefunden" log "Server wird heruntergefahren : ${NAS}" func_set_shutdown_off ${SHUTDOWN} else echo "NAS bleibt online" fi else echo "automatischer Shutdown deaktiviert" fi}func_check() { NEW_COMMAND="${INSTPATH}/wait4pc.sh -s on" func_crontab "MODIFY" ${SHUTDOWN} echo "crontab auf neue shutdown-Einträge überprüft"}func_install() { cp /etc/config/crontab /etc/config/crontab.bak echo "Eine Sicherung der 'crontab' erstellt" touch ${WAITCONF} func_set_ping_on func_set_shutdown_off func_set_qdownload_off func_set_samba_off func_set_rsync_off func_set_log_off WAITIP=`echo ${SSH_CLIENT} | ${CUT} -d ' ' -f 1` WAITHOST=`echo ${WAITIP} | ${CUT} -d '.' -f 4` WAITSUBNET=${WAITIP/.$WAITHOST/.} ${SETCFG} GENERAL HOSTS ${WAITHOST} -f ${WAITCONF} ${SETCFG} GENERAL SUBNET ${WAITSUBNET} -f ${WAITCONF} ln -s ${INSTPATH}/wait4pc.sh /bin/wait4pc.sh NEW_COMMAND="${INSTPATH}/wait4pc.sh -s on" func_crontab "MODIFY" ${SHUTDOWN} func_crontab "ADD" "*/5 * * * * ${INSTPATH}/wait4pc.sh" echo "Wait4pc ist erfolgreich installiert"}func_uninstall() { NEW_COMMAND=${SHUTDOWN} func_crontab "MODIFY" "${INSTPATH}/wait4pc.sh -s on" func_crontab "DELETE" "${INSTPATH}/wait4pc.sh"}func_crontab() {OPTION=${1}SEARCH=${2}if [ "x${OPTION}" = "xADD" ]; then echo "${SEARCH}" >> ${CRONTAB}else while read MINUTE HOUR DAYOFMONTH MONTH DAYOFWEEK COMMAND do if [ "x${COMMAND/*${SEARCH}*/FOUND}x" = "xFOUNDx" ]; then echo ${COMMAND} case ${OPTION} in "MODIFY") if [ "x${NEW_HOUR}" != "x" ]; then HOUR=${NEW_HOUR} fi if [ "x${NEW_MINUTE}" != "x" ]; then MINUTE=${NEW_MINUTE} fi if [ "x${NEW_COMMAND}" != "x" ]; then COMMAND=${NEW_COMMAND} fi echo "${MINUTE} ${HOUR} ${DAYOFMONTH} ${MONTH} ${DAYOFWEEK} ${COMMAND}" >> ${CRONTAB_NEW} ;; "REMOVE") echo "command removed" ;; esac FOUND=1 else echo "${MINUTE} ${HOUR} ${DAYOFMONTH} ${MONTH} ${DAYOFWEEK} ${COMMAND}" >> ${CRONTAB_NEW} fi done < ${CRONTAB} mv ${CRONTAB_NEW} ${CRONTAB}ficrontab ${CRONTAB}}usage() {cat << EOFusage: $0 optionsOPTIONS: -h Show this message -p on|off Host überwachen (ping) -d on|off Downloads überwachen -s on|off Shutdown de/aktivieren -f on|off SAMBA berücksichtigen -l on|off Script-Log de/aktivieren -r on|off Rsync überwachen -i Basiskonfiguration einrichten -u Ursprungszustand der crontab herstellen -t Status -c crontab überprüfen -m KonfigurationsmenüEOF}func_get_logfunc_get_nasecho "Model :${NAS}"case $NAS in"TS-119"|"TS-219"|"TS-419") SHUTDOWN=`which halt`;;"TS-109"|"TS-209"|"TS-409") SHUTDOWN=`which halt`;;"TS-110"|"TS-210"|"TS-410") SHUTDOWN=`which halt`; echo "Ich weiß nicht, ob halt oder poweroff";;"TS-239"|"TS-439"|"TS-509"|"TS-639"|"TS-809") SHUTDOWN=`which poweroff`;;esacwhile getopts "?cd:ims:tuhp:f:l:r:" OPTIONdo case ${OPTION} in \?|h) usage exit 1 ;; p) COMMAND="ping"; ACTION=${OPTARG} ;; d) COMMAND="qdownload"; ACTION=${OPTARG};; f) COMMAND="samba"; ACTION=${OPTARG} ;; r) COMMAND="rsync"; ACTION=${OPTARG} ;; s) COMMAND="shutdown"; ACTION=${OPTARG} ;; l) COMMAND="scriptlog"; ACTION=${OPTARG};; i) COMMAND="install" ;; u) COMMAND="uninstall" ;; t) COMMAND="status" ;; c) COMMAND="check" ;; m) COMMAND="menu" ;; esacdonecase ${COMMAND} in"ping") case ${ACTION} in "start"|"on"|"y"|"Y") func_set_ping_on ;; "stop"|"off"|"n"|"N") func_set_ping_off ;; esac;;"qdownload") case ${ACTION} in "start"|"on"|"y"|"Y") func_set_qdownload_on ;; "stop"|"off"|"n"|"N") func_set_qdownload_off ;; esac;;"samba") case ${ACTION} in "start"|"on"|"y"|"Y") func_set_samba_on ;; "stop"|"off"|"n"|"N") func_set_samba_off ;; esac;;"rsync") case ${ACTION} in "start"|"on"|"y"|"Y") func_set_rsync_on ;; "stop"|"off"|"n"|"N") func_set_rsync_off ;; esac;;"shutdown") case ${ACTION} in "start"|"on"|"y"|"Y") func_set_shutdown_on ;; "stop"|"off"|"n"|"N") func_set_shutdown_off ;; esac;;"scriptlog") case ${ACTION} in "start"|"on"|"y"|"Y") func_set_log_on ;; "stop"|"off"|"n"|"N") func_set_log_off;; esac;;"status") echo "-" func_get_check case ${bCHECK} in "Y") echo "[ on ] automatischer Shutdown" ;; "N") echo "[ off ] automatischer Shutdown" ;; esac echo "-" func_get_ping case ${bPING} in "Y") echo "[ on ] Host - Überprüfung" ;; "N") echo "[ off ] Host - Überprüfung" ;; esac echo "-" func_get_qdownload case ${bQDOWNLOAD} in "Y") echo "[ on ] Qdownload - Überprüfung" ;; "N") echo "[ off ] Qdownload - Überprüfung" ;; esac echo "-" func_get_samba case ${bSAMBA} in "Y") echo "[ on ] Samba - Überprüfung" func_get_sessions echo "[ ${iSESSIONS/* /} ] Anzahl offener Verbindungen" ;; "N") echo "[ off ] Samba - Überprüfung" ;; esac echo "-" func_get_log case ${bWATCHLOG} in "Y") echo "[ on ] Script-Log" ;; "N") echo "[ off ] Script-Log" ;; esac echo "-" RSYNC=`${GETCFG} System "Rsync Support" -f ${ULINUX} -d FALSE` if [ "x${RSYNC}" = "xTRUE" ]; then COUNT2=`${PS} | ${GREP} rsync | ${WC} -l` COUNT2=`expr ${COUNT2} - 2` echo "[ on ] Rsync " echo "[ ${COUNT2} ] rsync-Prozess(e) ( ohne Rsync-Server )" echo "-" fi;;"check") func_check;;"uninstall") func_uninstall;;"install") func_install;;"menu") func_menu;;*) if [ ! -f "${WAITCONF}" ]; then func_install func_menu fi func_run;;esac
Damit das Script aufgerufen werden kann,
muß es nach dem Entpacken auf dem NAS die Ausführberechtigung bekommen ( chmod +x wait4pc.sh ) .
Danach mit "/share/HDA_DATA/Public/wait4pc.sh -i" das Script installieren
und in dem nachfolgenden Menü weiter konfigurieren.
Menü:
Model :TS-239-[ off ] automatischer Shutdown-[ off ] Host - Überprüfung-[ on ] Qdownload - Überprüfung-[ on ] Samba - Überprüfung[ 2 ] Anzahl offener Verbindungen-[ off ] Script-Log-[ on ] Rsync[ 0 ] rsync-Prozess(e) ( ohne Rsync-Server )-
Script-Parameter:
Model :TS-239
usage: ./wait4pc.sh options
OPTIONS:
-h Show this message
-p on|off Host überwachen (ping)
-d on|off Downloads überwachen
-s on|off Shutdown de/aktivieren
-f on|off SAMBA berücksichtigen
-l on|off Script-Log de/aktivieren
-r on|off Rsync überwachen
-i Basiskonfiguration einrichten
-u Ursprungszustand der crontab herstellen
-t Status
-c crontab überprüfen
-m Konfigurationsmenü
Alles anzeigen
Anleitung zum vi-Editor
Die Nutzung des Scriptes nur auf eigene Gefahr !!!
EDIT 1.)
Habe die Abfrage korrigiert, da der Server schon herunterfuhr, wenn schon eine IP-Adresse nicht erreichbar war.
EDIT 2.)
2. Variante hinzugefügt
EDIT 3.
Fehler (im "$COUNT2"!= "0" ) in der 2ten Variante behoben.
EDIT 4.
Script-Auruf optimiert.
EDIT 5. (26.10.2009)
Script überarbeitet-
EDIT 6. (30.10.2009)
Script stark erweitert
EDIT 7. (31.10.2009)
Kleinen Fehler im Script bei "wait4pc.sh -s on" behoben, war vorher "wait4pc.sh -start".
EDIT 8. (05.11.2009)
SAMBA und Rsync (Test)-Überwachung hinzugefügt, Scriptstruktur angepaßt
EDIT 9. (06.11.2009)
Fehler in der Ping-Überwachung und 3 weitere Schreibfehler behoben