ShutdownOnLan SOL
Ziel des Projektes ist es einem normalen User das Herunterfahren der DS zu ermöglichen, ohne ihm einen DSM Administrator Zugang einrichten zu müssen.
Das Script soll aber auch verhindern, dass ein solcher User anderen Usern oder mir als admin, den Saft abdreht während auf der DS gearbeitet wird.
Umgesetzt wird dies durch ein Script, das durch einen Zertifikatbasierten Login mit z.B. Putty automatsich aufgerufen wird und der User keine Eingaben machen kann.
Vorarbeiten die gemacht werden müssen:
Als erstes muss der SSH-Zugang mittels Schlüssel eingerichtet werden.
Das Vorgehen wird im Wiki in folgendem Artikel erleutert:
http://www.synology-wiki.de/index.php/Ssh_mit_Zertifikaten_absichern
Wenn man das gemacht hat, verwendet man entweder den erstellten Schlüssel oder erstellt sich für das Shutdown-Script nochmal einen neuen mittels Putty KeyGen.
Nun muss man diesen in die
eintragen.
und setzt davor:
Rich (BBCode):
command="/root/testscript.sh",no-port-forwarding,no-agent-forwarding
sodass die entsprechende Zeile dann ungefähr so aussieht:
Rich (BBCode):
command="/root/testscript.sh",no-port-forwarding,no-agent-forwarding ssh-rsa ABBAB3................................iE= rsa-key-20110520
In diesem Fall heißt das Script testscript.sh und liegt im /root Verzeichnis. Das kann angepasst werdem. Vielleicht in shutdown.sh o.ä.
Die Punkte beim rsa schlüssel sind natürlich bei euch Zeichen eures Schlüssels.
Danach müsst ihr SSH neustarten.
!!! Bitte beachtet den Hinweis im WIKI bezüglich des Hintertürchens Telnet, das man sich vorher aufmachen sollte. Mir wäre es auch fast passiert.!!!
So nun das eigentliche Script, in meinem Falle also der Inhalt von /root/testscript.sh
Rich (BBCode):
#!/bin/ash
# Die Erste Abfrage dient dazu zu klären ob ein Pyload download läuft, wenn ihr andere pyload Pfade habt müsst ihr das entsprechend anpassen. Wenn ihr pyload nicht nutzt und diese abfrage nicht braucht könnt ihr
# von hier bis zu netstat alles löschen, müsst dann aber weiter unten bei der Berechnung von STRINGGESAMT $STRING0 rausnehmen und bei if [ $SRINGGESAMT = 2 ]; eintragen
if [ -z "$(/opt/bin/python /opt/pyload/pyLoadCli.py status)" ]; then
echo "Kein Download = ok"
STRING0="1"
else
echo "Download aktiv"
STRING0="0"
fi
if [ "$STRING0" == '0' ]; then
echo 'DS wird nicht heruntergefahren, es ist ein Download aktiv.'
sleep 5
exit
fi
# Nun die Abfrage ob Clients aus dem angegebenen Ip Bereich mit der DS verbunden sind, je genauer Ihr den Ip Bereich angebt, desto strenger wird die Abfrage.
# Man könnte also auch nur einen Pc z.b. 192.168.1.10 angeben. Ip muss an eure Bedürfnisse angepasst werden
netstat -n | grep -q -n 192.168.1
if [ $? -ne 0 ];
then
echo 'Es wurden keine PCs aus dem Heimnetzwerk oder VPN gefunden, die mit der Diskstation verbunden sind = ok'
STRING1="1"
else
echo 'Es wurden Pcs aus dem Heimnetzwerk oder VPN gefunden, die in Verbindung mit der Diskstation stehen. Die Diskstation wird deshalb nicht heruntergefahren'
STRING1="0"
fi
if [ "$STRING1" == '0' ]; then
echo 'DS wird nicht heruntergefahren'
sleep 5
exit
fi
# Jetzt noch die Abfrage ob ein Zugriff auf Samba Freigaben der DS erfolgt. Hier müsst ihr auch wieder den von euch gewünschten Ip-Bereich festlegen.
if [ "$(smbstatus -q|grep 192.168.1 )" == '' ];
then
echo "Keine SAMBA Datei-Verbindung zur Diskstation offen = ok"
STRING2="1"
else echo "Es ist eine SAMBA Dateiverbindung mit der Diskstaion geoeffnet. DS wird nicht heruntergefahren."
STRING2="0"
fi
#Am Schluss die Berechnung ob die DS heruntergefahren werden soll oder nicht. Wenn ihr eines der Argumente oben rausnehmt oder ein weiteres hinzufügt müsst ihr das hier berücksichtigen.
let STRINGGESAMT="$STRING0 + $STRING1 + $STRING2"
if [ $STRINGGESAMT = 3 ];
then echo 'DIE DS WIRD NUN RUNTERGEFAHREN!'
"/sbin/poweroff"
sleep 10
else echo 'DIE DS WIRD ANBLEIBEN!'
fi
sleep 5
Bitte beachtet, das im Script einige IPs etc. an eure Umgebung angepasst werden müssen!
So therotsich können noch weiter Abfragen eingebaut werden.
Bei meiner netstat Abfrage habe ich meinen VPN Adressbereich noch nicht eingetragen, weil ich mir da Codetechnisch nicht sicher bin, wenn mir da jemand noch einen hinweis geben könnte wäre es toll. Es soll einfach zusätzlich zum Ip Bereich 192.168.x auch noch nach 10.0.x suchen.
Wie ich das mit dem selbst wieder aufrufen machen kann muss ich schauen, wäre ja doof wenn das Terminal dann solange offen bleiben würde.
Wenn ihr jetzt in Putty das entsprechend ind der authorized_keys fesgelegte Zertifikat angebt und euch damit auf die DS verbindet sollte euer Script ausgeführt werden.
Bin für weitere Verbesserungsvorschläge dankbar.
Grüße Wessix