[SCRIPT] create-autorun.sh

Beschreibung

Dies ist ein einmal auszuführendes BASH-Skript, um eine Autorun-Umgebung auf Ihrem QNAP NAS zu erstellen. Damit können Sie eigene Skripte automatisch ausführen lassen, wenn das NAS hochfährt.

Ziel dieses Projekts ist es, alle QNAP NAS-Modelle und alle QTS- & QuTS hero-Versionen zu unterstützen. Bitte geben Sie Bescheid, falls Sie beim Ausführen auf Ihrem NAS Fehler feststellen.

Funktionsweise

Dieses Installationsskript schreibt einen autorun.sh-Prozessor in Ihr Standardvolume, unterhalb des .system-Verzeichnisses. Anschließend wird ein Symlink vom DOM zurück zu Ihrem Standard-Datenvolume erstellt, sodass das Skript beim NAS-Start ausgeführt wird. Das bedeutet, Sie müssen die DOM-Partition nicht jedes Mal laden, wenn Sie den Inhalt von autorun.sh ändern möchten.

Das Autorun-Gerät und die Partition werden von diesem Skript automatisch ermittelt.

So erstellen Sie Ihre autorun.sh

curl -skL https://git.io/create-autorun | sudo bash

Hinweise

  • Falls Sie zuvor keine autorun.sh-Datei hatten, enthält die von diesem Tool erstellte autorun.sh-Datei einen Skriptverzeichnis-Prozessor und stellt ein Skriptverzeichnis für Ihre eigenen Shell-Skripte bereit. Alles in diesem Skriptverzeichnis wird (in Reihenfolge) während des NAS-Starts von der standardmäßig erstellten autorun.sh-Datei ausgeführt. Die untenstehenden Hinweise gelten nur für die von diesem Tool geschriebene autorun.sh. Falls Sie bereits eine andere autorun.sh-Datei hatten, bleibt diese bestehen und wird stattdessen verwendet; die folgenden Hinweise gelten dann nicht.

  • Der Speicherort des Autorun-Systems hängt vom Namen Ihres Standardvolumes ab. Beispiel: Wenn Ihr Standardvolume CACHEDEV1_DATA heißt, wird der automatische Skriptprozessor erstellt unter:

/share/CACHEDEV1_DATA/.system/autorun/autorun.sh

… und das Skriptverzeichnis wird erstellt unter:

/share/CACHEDEV1_DATA/.system/autorun/scripts/
  • autorun.sh wird zu einem bestimmten Zeitpunkt während des NAS-Starts ausgelöst und führt dann jede ausführbare Datei im Skriptverzeichnis in der Standard-Dateinamenreihenfolge aus. Wenn Sie ein Skript vor einem anderen ausführen möchten, versehen Sie es mit einer Nummer, z. B.:

10-example.sh 20-example.sh 25-example.sh 30-example.sh

  • Während der Ausführung von autorun.sh wird eine Logdatei erstellt. Sie befindet sich unter /var/log/autorun.log und enthält Datum/Uhrzeit sowie den Namen jedes ausführbaren Skripts, das im Skriptverzeichnis gefunden und ausgeführt wurde, zusammen mit jeglicher von diesen Skripten erzeugten stdout und stderr.

  • Den Quellcode dieses Projekts finden Sie auf GitHub

Die Installation auf QTS 5.2.5 funktioniert, aber wenn ich versuche, meine Skripte auszuführen, erhalte ich einen „command not found“-Fehler. Es scheint, dass die autorun.sh ausgeführt wird, bevor alle QPKGs gestartet sind, sodass die entsprechenden Befehle nicht gefunden werden. Wenn ich sie später manuell ausführe, funktioniert alles wie erwartet. Ein „sleep“-Befehl am Anfang hat keine Wirkung (außer dem „sleep“).

Beste Grüße …

Korrekt. autorun.sh wird ausgeführt, bevor QPKGs gestartet werden.

sleep hilft nicht, da es den Bootvorgang nur verzögert, bis autorun abgeschlossen ist, was das Starten der QPKGs einschließt.

Ich habe später das RunLast QPKG erstellt, um dieses Problem zu umgehen, aber es funktioniert seit QTS 5.2.0 nicht mehr, da QNAP Änderungen vorgenommen hat, um QPKGs asynchron zu starten.

Derzeit gibt es keine Möglichkeit, nach dem Start Skripte auszuführen, die auf QPKGs angewiesen sind.

Das ist nicht ganz richtig.
Ich habe inzwischen eine Lösung gefunden, indem ich „RunLast“ aus dem „MyQNAP“-Repository verwendet habe. Es hat mich überrascht, dass zunächst derselbe Fehler auftrat. Also habe ich etwas recherchiert. Ich habe herausgefunden, dass die QNAP-Dienste nicht ausschließlich asynchron gestartet werden und vor allem nicht immer auf das erfolgreiche Starten der Abhängigkeiten warten.
Deshalb habe ich mein Startskript so angepasst, dass es dies berücksichtigt.
Das hängt teilweise damit zusammen, wie QNAP seine Binärdateien und Bibliotheken je nach installierten Apps ein- und ausbindet.
Zum Beispiel schlägt „autostart.sh“ meistens fehl, weil die meisten Bibliotheken und Binärdateien noch nicht „verlinkt“ sind. Das gilt teilweise auch für „RunLast“.
Bitte hört aber nicht auf, „RunLast“ weiterzuentwickeln. Es verfolgt bereits den richtigen Ansatz, insbesondere wegen der schönen Struktur der SysV-Startskripte. Damit kann man fast alles zum Laufen bringen, wenn man die Abhängigkeiten der eigenen Anwendung zu anderen QPGG’s berücksichtigt und sich ein wenig aus deren Startskripten abschaut. Ich habe ein einfaches Beispiel für mein ClamD, das ich für mein Xeams verwende:

Beste Grüße,

Mandragor59

***** Es gibt keine Probleme, es gibt nur Herausforderungen *****

#!/bin/sh
# Name: /share/CACHEDEV1_DATA/.qpkg/RunLast/init.d/S10-ClamD_Service
# Stelle sicher, dass der Daemon eine clamd.pid-Datei in /var/run erstellt und Socket sowie IP in clamd.conf für Instream-Scanning anpasst
# Zweck: Dieses Skript startet, stoppt und startet den ClamD-Dienst neu.
# Autor: Mandragor59 (A.Lechte)
# ------------------------------------------------------------------------------

# ClamAV-Umgebung setzen

export QNAP_QPKG=ClamAV
QPKG_NAME=$QNAP_QPKG
QPKG_DIR=`/sbin/getcfg $QPKG_NAME Install_Path -d NULL -f /etc/config/qpkg.conf`

# Falls nicht installiert, nichts tun

if [ ! -d ${QPKG_DIR} ]
	then
        exit 1
fi

# Also los, oder auch nicht 

case "$1" in
  
  start)
	
	echo -n $"Starte ClamAV-Daemon: "
	
# Abhängigkeiten prüfen und notwendige Dateien verlinken (aus clamav-Start übernommen)

	/bin/ln -sf ${QPKG_DIR}/usr/lib/libclamav.so.9.0.5 /usr/lib/libclamav.so.9.0.5 > /dev/null 2>&1
    /bin/ln -sf ${QPKG_DIR}/usr/lib/libclammspack.so.0.1.0 /usr/lib/libclammspack.so.0.1.0 > /dev/null 2>&1
    /bin/ln -sf ${QPKG_DIR}/usr/lib/libclamunrar.so.9.0.5 /usr/lib/libclamunrar.so.9.0.5 > /dev/null 2>&1
    /bin/ln -sf ${QPKG_DIR}/usr/lib/libclamunrar_iface.so.9.0.5 /usr/lib/libclamunrar_iface.so.9.0.5 > /dev/null 2>&1
    /bin/ln -sf ${QPKG_DIR}/usr/lib/libfreshclam.so.2.0.1 /usr/lib/libfreshclam.so.2.0.1 > /dev/null 2>&1
    /bin/ln -sf ${QPKG_DIR}/usr/lib/libcharset.so.1.0.0 /usr/lib/libcharset.so.1.0.0 > /dev/null 2>&1
	
    /sbin/ldconfig
    
	/bin/ln -sf ${QPKG_DIR}/usr/local/bin/freshclam /usr/local/bin/freshclam > /dev/null 2>&1
    /bin/ln -sf ${QPKG_DIR}/usr/local/bin/clamscan /usr/local/bin/clamscan > /dev/null 2>&1
    /bin/ln -sf ${QPKG_DIR}/usr/local/bin/sigtool /usr/local/bin/sigtool > /dev/null 2>&1
    /bin/ln -sf ${QPKG_DIR}/usr/local/sbin/clamd /usr/local/sbin/clamd > /dev/null 2>&1
    /bin/ln -sf ${QPKG_DIR}/usr/local/bin/clamscan_cli /usr/local/bin/clamscan_cli > /dev/null 2>&1
    /bin/ln -sf ${QPKG_DIR}/usr/local/bin/clamav_cli /usr/local/bin/clamav_cli > /dev/null 2>&1
    /bin/ln -sf ${QPKG_DIR}/etc/init.d/antivirus_qpkg.sh /etc/init.d/antivirus_qpkg.sh > /dev/null 2>&1

# ClamD starten
	
    /usr/local/sbin/clamd 2>/var/log/clamd.log
	
	echo $"..... erledigt."
	
    ;;
	
  stop)
  
    echo -n $"Beende ClamAV-Daemon: "
	
	killall -9 clamd
	rm /var/run/clamd.pid > /dev/null 2>&1
	
	echo $"..... erledigt."
	
    ;;

  status)
	
    PROC_PID=`cat /var/run/clamd.pid`
	if [ -e /proc/$PROC_PID/status ]
		then
			cat /proc/$PROC_PID/status | grep State
		else
			echo $"ClamAV-Daemon läuft nicht!"
	fi
	
    ;;
	
  *)
  
    echo "Verwendung: $0 {start|stop|status}"
    exit 1
  
	;;

esac

Nein, es ist genau richtig. Denn es gibt derzeit keine allgemeine Unterstützung dafür, Skripte nach QPKGs auszuführen.

Jeder kann eine maßgeschneiderte Lösung für ein bestimmtes Paket entwickeln, aber das hilft nur einem Teil der Community, der dieses Paket verwendet. :nerd_face:

Du hast geantwortet:

„Jeder kann eine maßgeschneiderte Lösung für ein bestimmtes Paket entwickeln, aber das hilft nur einem Teil der Community, der dieses Paket verwendet.“ :nerd_face:

… und daher ist es nicht GANZ richtig! :winking_face_with_tongue:

Hm… vielleicht sollte ich stattdessen über die Semantik der deutschen Sprache diskutieren? Deutsch ist zwar nicht meine Muttersprache, aber wenn ich deinem Beispiel folge, sollte mich das nicht davon abhalten. :wink: