Jump to content
  • 0

Exécution D'un Script Perso À L'extinction Du Nas


M@ttew

Question

Bonjour à tous et Bonne Année...

 

Je souhaite exécuter un script à l'extinction et/ou avant redémarrage de mon NAS.

En effet, celui-ci possède un partage NFS dans /share/HDA_DATA/raspberry destiné à héberger le RootFS de ma Framboise... afin d'éviter l'utilisation intensive et corruptible de la carte SD de cette dernière.

Par conséquent, il me faut impérativement ordonner l'extinction du Raspberry Pi+ avant que le NAS ne s'éteigne, sinon je ne fais que reporter le problème.

J'ai donc tout naturellement créé un script "launch_pioff.sh" qui exécute la commande "sudo shutdown -h now" via ssh sur l'IP de RPi+ et l'aide de clés privés/publiques.

Le lancement manuel du script est fonctionnel et conforme à mes attentes.

Il ne me reste plus qu'à trouver le moyen de le faire exécuter par le système lors de son extinction, et là, la seule documentation trouvée pour le QNAP se trouve sur ce site.

En modifiant le fichier suivant:

/etc/config/qpkg.conf

J'y ai ajouté ceci:

[MyPackage]

Shell = /share/HDA_DATA/homes/admin/scripts/launch_pioff.sh

Or selon l'auteur, le redémarrage du NAS devrait créer les liens symboliques suivants:
/etc/init.d/launch_pioff.sh -> /share/HDA_DATA/homes/admin/scripts/launch_pioff.sh
/etc/rcS.d/QSxxxlaunch_pioff.sh -> /share/HDA_DATA/homes/admin/scripts/launch_pioff.sh
/etc/rcK_init.d/QKxxxlaunch_pioff.sh -> /share/HDA_DATA/homes/admin/scripts/launch_pioff.sh
où aux vues du listing suivant, xxx devrait être égal à 104 chez moi...
[/etc/rcK.d] # ll         
…
lrwxrwxrwx    1 admin    administ        46 Jan  4 17:44 QK100phpMyAdmin -> /share/HDA_DATA/.qpkg/phpMyAdmin/phpMyAdmin.sh*
lrwxrwxrwx    1 admin    administ        18 Jan  4 17:44 QK101DownloadStation -> /etc/init.d/btd.sh*
lrwxrwxrwx    1 admin    administ        21 Oct 31 20:47 QK101opentftp -> ../init.d/opentftp.sh*
lrwxrwxrwx    1 admin    administ        52 Jan  4 17:44 QK103MusicStation -> /mnt/HDA_ROOT/update_pkg/MusicStation/qpkg_musics.sh*
lrwxrwxrwx    1 admin    administ        25 Oct 31 20:47 QK107Symform -> ../init.d/init_symform.sh*
[/etc/rcK.d] # ll /etc/rcK_init.d/
drwxr-xr-x    2 admin    administ      1.0k Nov 21  2006 ./
drwxr-xr-x   23 admin    administ      2.0k Jan  4 22:29 ../

Hélas, rien de tout cela, et le redémarrage n'a rien créé du tout.

Du coup, j'ai moi-même créé les liens symboliques en question et ordonné le redémarrage du système.

Comme il fallait s'y attendre, le script ne s'est pas exécuté (j'ai un fichier de log qui s'incrémente sur le NAS à chaque exécution du script et le RPi+ ne s'est pas arrêté...) et "étrangement", les liens symboliques ont disparu après l'opération, comme s'ils n'avaient jamais existé?!...

Je suis donc au point mort, pourtant la méthode me paraissait intéressante et plausible. Le seul doute réside dans le fait qu'elle date de 2008 (6 ans déjà), et le firmware du NAS en question (un TS-209 II) n'est pas précisé mais doit être bien différent de celui d'aujourd'hui sur mon TS-119 P+

 

Voilà, si quelqu'un sait comment exécuter un script perso à l'extinction, je suis preneur...

 

Merci à tous,

 

@+, M@ttew

 

Link to comment
Share on other sites

6 answers to this question

Recommended Posts

  • 0

Super, maintenant tout fonctionne grâce à vos conseils.

Je poste ici le script déclencheur définitif qui va gérer les différents cas, à savoir:

Start,

Stop,

Reboot,

Others

[/share/HDA_DATA/.qpkg/launch_pioff] # cat launch_pioff.sh 
#!/bin/sh

USER="pi"
SERVER="192.168.1.31"
SHELL=/bin/bash
CHEMIN="/share/HDA_DATA/.qpkg/launch_pioff"

case "$1" in
    start)
	#On ne fait rien en cas de démarrage du NAS
    ;;
    stop)
	#On execute l'extinction du RPi+ a l'arret du NAS
		#Copier l'ancien fichier log avant creation du nouveau
		        /bin/cp $CHEMIN/log/LastPiOff.log $CHEMIN/log/tmp.log
        	#Copier contenu de pioff et le transferer au shell du RPi+ via ssh et recuperer le contenu dans le log LastPiOff	
			#ssh -p $PORT $USER@$SERVER bash < $CHEMIN/pioff.sh
        		/bin/cat $CHEMIN/pioff.sh | /usr/bin/ssh $USER@$SERVER $SHELL > $CHEMIN/log/LastPiOff.log 2>&1
		#Copier tmp a la fin de LastPiOff
        		/bin/cat $CHEMIN/log/tmp.log >> $CHEMIN/log/LastPiOff.log
		#Effacer tmp et attendre 30 sec pour laisser du temps au RPi+ pour s'arreter
			/bin/rm $CHEMIN/log/tmp.log
			sleep 30
    ;;
    restart)
        #On ne fait rien en cas de Reboot du NAS
        	#En effet, si le RPi+ fonctionne sans être sollicité, le volume NFS sur lequel il tourne peut disparaitre le temps d'un Reboot...
    ;;
    *)
	#On ne fait rien dans tous les autres cas
		echo "Je suis le cas où il ne se passe jamais rien..."
    ;;
esac

exit 0

J'ai ajouté une temporisation de 30 sec pour permettre l'extinction propre du RPi+ avant la disparition du volume NFS partagé /share/HDA_DATA/raspberry utilisé pour hébergé son RootFS.

 

Le script déclenché qui ordonne l'extinction du RPi+ (classique, en fait...)

[~] # cat /share/HDA_DATA/.qpkg/launch_pioff/pioff.sh 
#!/bin/sh

#Creation variable date
DATE=$(date +"%Y_%m_%d_%Hh%Mm%Ss")
#Detection du compte utilisateur
COMPTE=$(whoami)
echo $DATE"  <<>>  Raspberry Pi has been shutdown by '"$COMPTE"' user from QNAP NAS TS-119P+"
sudo shutdown -h now

exit

Les différents liens symboliques créés grâce à la modification du fichier /etc/config/qpkg.conf

[/etc] # ls -la config/qpkg.conf 
-rw-r--r--    1 admin    administ      1641 Jan  5 14:38 config/qpkg.conf

[/etc] # cat config/qpkg.conf
...
[launch_pioff]
Name = launch_pioff
Version = 1.0
Author = M@ttew
Date = 2015-01-05
Shell = /share/HDA_DATA/.qpkg/launch_pioff/launch_pioff.sh
Install_Path = /share/HDA_DATA/.qpkg/launch_pioff
Enable = TRUE

[/etc] # ls -la init.d
drwxr-xr-x    2 admin    administ      4096 Jan  5 14:37 ./
drwxr-xr-x   23 admin    administ      2048 Jan  5 15:02 ../
-rwxr-xr-x    1 admin    administ     37184 Oct 31 20:21 ImRd.sh*
...
lrwxrwxrwx    1 admin    administ        50 Jan  5 14:37 launch_pioff.sh -> /share/HDA_DATA/.qpkg/launch_pioff/launch_pioff.sh*
...
lrwxrwxrwx    1 admin    administ        44 Jan  5 10:35 mtp_run.sh -> /mnt/ext/opt/mtpBinary/etc/init.d/mtp_run.sh*
...
lrwxrwxrwx    1 admin    administ        46 Jan  5 14:37 phpMyAdmin.sh -> /share/HDA_DATA/.qpkg/phpMyAdmin/phpMyAdmin.sh*
...
lrwxrwxrwx    1 admin    administ        52 Jan  5 14:37 qpkg_musics.sh -> /mnt/HDA_ROOT/update_pkg/MusicStation/qpkg_musics.sh*
...
-rwxr-xr-x    1 admin    administ     19093 Jul  9 08:21 wireless_modules.sh*

[/etc] # ls -la rcS.d/     
drwxrwxr-x    2 admin    administ      1024 Jan  5 14:37 ./
drwxr-xr-x   23 admin    administ      2048 Jan  5 14:48 ../
lrwxrwxrwx    1 admin    administ        52 Jan  5 14:37 QS100MusicStation -> /mnt/HDA_ROOT/update_pkg/MusicStation/qpkg_musics.sh*
lrwxrwxrwx    1 admin    administ        18 Jan  5 14:37 QS102DownloadStation -> /etc/init.d/btd.sh*
lrwxrwxrwx    1 admin    administ        46 Jan  5 14:37 QS103phpMyAdmin -> /share/HDA_DATA/.qpkg/phpMyAdmin/phpMyAdmin.sh*
lrwxrwxrwx    1 admin    administ        50 Jan  5 14:37 QS104launch_pioff -> /share/HDA_DATA/.qpkg/launch_pioff/launch_pioff.sh*
lrwxrwxrwx    1 admin    administ        17 Oct 31 20:47 S55urandom -> ../init.d/urandom*
...
lrwxrwxrwx    1 admin    administ        22 Oct 31 20:47 S99z_antivirus -> ../init.d/antivirus.sh*

[/etc] # ls -la rcK.d/     
drwxrwxr-x    2 admin    administ      1024 Jan  5 14:38 ./
drwxr-xr-x   23 admin    administ      2048 Jan  5 14:46 ../
lrwxrwxrwx    1 admin    administ        17 Oct 31 20:47 K01ldap -> ../init.d/ldap.sh*
...
lrwxrwxrwx    1 admin    administ        22 Oct 31 20:47 K80init_disk -> ../init.d/init_disk.sh*
lrwxrwxrwx    1 admin    administ        50 Jan  5 14:37 QK100launch_pioff -> /share/HDA_DATA/.qpkg/launch_pioff/launch_pioff.sh*
lrwxrwxrwx    1 admin    administ        21 Oct 31 20:47 QK101opentftp -> ../init.d/opentftp.sh*
lrwxrwxrwx    1 admin    administ        46 Jan  5 14:37 QK101phpMyAdmin -> /share/HDA_DATA/.qpkg/phpMyAdmin/phpMyAdmin.sh*
lrwxrwxrwx    1 admin    administ        18 Jan  5 14:37 QK102DownloadStation -> /etc/init.d/btd.sh*
lrwxrwxrwx    1 admin    administ        52 Jan  5 14:37 QK104MusicStation -> /mnt/HDA_ROOT/update_pkg/MusicStation/qpkg_musics.sh*
lrwxrwxrwx    1 admin    administ        25 Oct 31 20:47 QK107Symform -> ../init.d/init_symform.sh* 

Remarque: On voit bien que mon script (en dernière position dans le fichier qpkg.conf) est lancé en dernier QS104 au démarrage et lancé en premier QK100 à l'extinction du système, ce qui est cohérent (dernier démarré, premier stoppé => notion de priorité des services j'imagine...)

 

Encore une fois, votre pédagogie est excellente en ne donnant que quelques pistes plutôt que d'avoir un script tout fait auquel on ne comprend rien du tout!

A très bientôt, car j'imagine que je ne vais pas m'arrêter là?!...  ;)

 

M@ttew

Link to comment
Share on other sites

  • 0

Bonjour,

 

Peut-être auriez vous du cherchez ici (sur ce forum) ... il existe au moins 1 (et plus si affinités) fil de discussion sur lancer un services / serveur au démarrage (ou arrêt normal) du QNAP, incomplet, car il existe bien des solutions (dont les FakeQPKG) ... ou sur le forum de Taïwan ou les exemples se comptent par dizaines ...

 

Vous ne mettez pas votre shell ... donc est-il conforme aux règles des QPKG ?

 

/etc est en RAM et régénéré à chaque démarrage ... donc les liens vers le shell dans init.d , rcS.d et rcK.s sont crées par la procédure de boot à chaque fois ... donc non persistant ...

 

La section QPKG ce doit d'être légèrement plus fourni ... dont name, Install_Path, Enable ...

 

Enfin ... le shell n'est PAS exécuté dans un environnement de bash utilisateur ... mais par init ... ce qui implique, pas de chemin et pas d’accès à certaines librairies ...  et pas de variables d’environnement comme le USER, HOME, etc.

 

Merci de nous fournir un peu plus d'informations ...

 

QNAP assure une bonne (à très) compatibilité ascendante ... donc ce qui était valide en 2008 le reste ... sur les principes, car les ajouts et modification de structure ont fait évoluer certains points ...

 

Philippe.

Link to comment
Share on other sites

  • 0

Bonjour,

 

Merci pour votre rapidité!

Pour commencer, j'ai cherché _ en vain _ sur ce forum et n'est pas trouvé mon bonheur, donc preneur du (ou des) fils de discussion s'y rapportant.

Recherche.png

Se faisant, une recherche sur Google (en l'occurrence, un autre moteur, étant réfractaire aux droïds...) m'a envoyé sur le site que je mentionne dans mon 1er post.

La méthode semblait efficace, sachant qu'au départ, j'avais jeté un oeil sur les "runlevels" hélas non utilisés par le Linux embarqué des QNAP à l'inverse d'une Debian classique.

Donc, j'ai voulu tout simplement transposer cette méthode à ma situation.

 

Je suis débutant en script et totalement novice en QPKG. Et j'ignorais justement que /etc se trouvait en RAM avec les conséquences évoquées (du coup, je ne comprends pas bien comment il réussit à faire ce qu'il dit sur son post?!...)

 

Idem quant à la description de la section QPKG.

 

Voici le script que je souhaite lancer à l'extinction du NAS:

launch_pioff.sh

#!/bin/sh

USER="pi"
SERVER="192.168.1.31"

        shell=/bin/bash
        #Copier l'ancien fichier log avant creation du nouveau
        cp /share/HDA_DATA/homes/admin/log/LastPiOff.log /share/HDA_DATA/homes/admin/log/tmp.log
        #ssh -p $PORT $USER@$SERVER bash < /share/HDA_DATA/homes/admin/scripts/pioff.sh
        cat /share/HDA_DATA/homes/admin/scripts/pioff.sh | ssh $USER@$SERVER $shell > /share/HDA_DATA/homes/admin/log/LastPiOff.log
        cat /share/HDA_DATA/homes/admin/log/tmp.log >> /share/HDA_DATA/homes/admin/log/LastPiOff.log
        rm /share/HDA_DATA/homes/admin/log/tmp.log
        cp /share/HDA_DATA/homes/admin/log/LastPiOff.log /share/HDA_DATA/Web/logs/pioff

exit

Et celui déclenché par le NAS pour éteindre le RPi+:

pioff.sh

#!/bin/sh

sudo shutdown -h now
#Creation variable date
DATE=$(date +"%Y_%m_%d_%Hh%Mm%Ss")
#Detection du compte utilisateur
COMPTE=$(whoami)
echo $DATE"  <<>>  Raspberry Pi has been shutdown by '"$COMPTE"' user from QNAP NAS TS-119P+"

exit

Et une saisie de mon dossier hébergeant ces scripts:

[/share/HDA_DATA/homes/admin/scripts] # ls -la             
drwxr-xr-x    3 admin    administ      4096 Jan  4 16:35 ./
drwxrwxrwx    7 admin    administ      4096 Dec 29 17:45 ../
drwxrwxrwx    2 admin    administ      4096 Dec 17 16:20 .upload_cache/
-r-x------    1 admin    administ       211 Dec 13 15:31 horodatage.sh*
-r-x------    1 admin    administ       638 Jan  4 16:30 launch_pioff.sh*
-r-x------    1 admin    administ       241 Jan  4 16:35 pioff.sh*
-r-x------    1 admin    administ      1366 Dec 15 14:56 updatepydio.sh*

Comme précisé dans le post initial, le lancement du script: # launch_pioff.sh depuis le terminal s'exécute sans soucis et le RPi+ s'éteint correctement.

Reste donc à trouver le moyen d'interpréter ces 2 scripts dans la procédure d'extinction normale du QNAP.

 

Merci de me consacrer du temps,

 

Cordialement,

 

M@ttew

Link to comment
Share on other sites

  • 0

Bonjour,

 

La distribution Linux du QNAP est, en effet, comme dans la plupart des système embarqué ... très spécifique ... car le but est de pouvoir avoir un système fonctionnel (shell et commande incluses) même sans disque ...

 

QNAP a choisi de reconstruire à chaque bot l’environnement d’exécution ... Mais votre référence ... reste valide ...

 

Je n'ai pas de remarque sur le shell lui-même ... sauf que je n'utiliserai QUE des chemin complet ... que ce soit pour cp ou ssh ou autre ...

 

Je vais (d'ici demain, je suis occupé) faire un simple fakeQPKG pour vous donner un exemple fonctionnel ... (avec un shell qui ne fera que dire "hello")

Une fois le shell bien lancé et les liens automatiques en rcS.d et rcK.d crées ... ... il suffira de "remplir" les scripts ... je vais essayer de faire cela sur mon 219 qui est le plus proche de votre 119

 

désolé de ne pouvoir faire plus vite ...

Pour des liens : 

par exemple, sans cherchez loin ... le Wiki de QNAP ... ici, lire (tout c'est mieux) surtout le paragraphe 5 sur la méthode basé sur des QPKG

http://wiki.qnap.com/wiki/Running_Your_Own_Application_at_Startup

sinon sur ce forum : (ici en partie ... etc. etc.)

 

 

Philippe.

Link to comment
Share on other sites

  • 0

Merci, je suis arrivé au même document sur le Wiki du QNAP et je suis en train d'adapter mon script avec la méthode des FakeQPKG.

# cat /etc/config/qpkg.conf
...
...

[launch_pioff]
Name = launch_pioff
Version = 0.1
Author = M@ttew
Date = 2015-01-05
Shell = /share/HDA_DATA/.qpkg/launch_pioff/launch_pioff.sh
Install_Path = /share/HDA_DATA/.qpkg/launch_pioff
Enable = TRUE
 

Petite question: pour cat, rm et cp, j'utilise bien /bin/cat, /bin/rm, /bin/cp mais je n'ai pas trouvé le chemin complet pour ssh, /bin/ssh n'existe pas?!...

#!/bin/sh

USER="pi"
SERVER="192.168.1.31"

        shell=/bin/bash
        #Copier l'ancien fichier log avant creation du nouveau
        /bin/cp /share/HDA_DATA/.qpkg/launch_pioff/log/LastPiOff.log /share/HDA_DATA/.qpkg/launch_pioff/log/tmp.log
        #ssh -p $PORT $USER@$SERVER bash < /share/HDA_DATA/.qpkg/launch_pioff/pioff.sh
        /bin/cat /share/HDA_DATA/.qpkg/launch_pioff/pioff.sh | ssh $USER@$SERVER $shell > /share/HDA_DATA/.qpkg/launch_pioff/log/LastPiOff.log
        /bin/cat /share/HDA_DATA/.qpkg/launch_pioff/log/tmp.log >> /share/HDA_DATA/.qpkg/launch_pioff/log/LastPiOff.log
        /bin/rm /share/HDA_DATA/.qpkg/launch_pioff/log/tmp.log

exit 

Enfin, sachant que je souhaite stopper le RPi+ uniquement à l'extinction du NAS et ne rien faire au démarrage de ce dernier, comment empêcher la création du lien automatique en rcS.d ? J'imagine que c'est inévitable et qu'il faut créer une condition d'exécution dans le script uniquement dans le cas de l'extinction, non?!...

Link to comment
Share on other sites

  • 0

Bonjour,

 

Pour trouver le chemin d'un programme vous entrez dans une console la commande :

which

which ssh retourne : /usr/bin/ssh

 

 

TOUT script d'init est du type :

case $1 ($1 paramètres)

start) ... ça c'est la valeur de $1

...... vos instructions

;; ça c'est pour finir le bloc QUI PEUT être vide (2 fois ; )

stop) ça ce sera celui pour les K

....... vos instructions

;;

*) par défaut si ni start ni stop

...... vos instructions , généralement des echo de help ...

;;

esac (fin de case)

 

A chaque démarrage (et fin) les shells sont lancés avec comme paramètre start pour les S et stop pour les K

 

Pour vous laissez vide la partie start ... mais gardez là (au cas où et par cohérence) n'oubliez PAS les 2 ; ";;" pour finir un bloc ...

 

Philippe.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...