Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Raspberry Pi Discussion :

Problème de montage de disque via php


Sujet :

Raspberry Pi

  1. #1
    Membre actif
    Problème de montage de disque via php
    Bonjour à tous,

    J'ai un soucis, pour explication j'ai un apache v2.4.38 avec php v7.3.14 sur mon Pi, j'ai créé une page simple avec 2 boutons ON/OFF.
    Quand je clique sur ON, ça lance une commande system qui via les GPIO ferme un relais afin d'envoyer le courant sur mon disque dur externe (relié à mon Pi en USB), attend 10s et monte le disque. Quand je clique sur OFF, ça démonte et coupe le relais.

    Le script php :
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php
     
        system("gpio -g mode 4 out");
     
        if($_POST['executer'] == 'ON')
        {
            system("gpio -g write 4 1");
            system("sleep 10");
            system("pmount -t ntfs /dev/sda1 mondisque");
        }
        else
        {
            system("pumount mondisque");
            system("sleep 5");
            system("gpio -g write 4 0");
        }
     
        header('Location: index.php');
     
    ?>


    Au moment du ON, le relais s'active bien et mon disque s'allume. Par contre le montage ne se fait pas.
    Si je lance la même commande (pmount -t ntfs /dev/sda1 mondisque) depuis le shell du user www-data (user apache), aucun problème.

    Log messages sur le ON (je ne vois d'erreur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Mar  6 15:04:23 raspberrypi kernel: [ 2361.840142] scsi 0:0:0:0: Direct-Access     Toshiba  StorE HDD        0000 PQ: 0 ANSI: 4
    Mar  6 15:04:23 raspberrypi kernel: [ 2361.841866] sd 0:0:0:0: [sda] 3907029168 512-byte logical blocks: (2.00 TB/1.82 TiB)
    Mar  6 15:04:23 raspberrypi kernel: [ 2361.848293] sd 0:0:0:0: [sda] Write Protect is off
    Mar  6 15:04:23 raspberrypi kernel: [ 2361.864901] sd 0:0:0:0: Attached scsi generic sg0 type 0
    Mar  6 15:04:23 raspberrypi kernel: [ 2361.909772]  sda: sda1
    Mar  6 15:04:23 raspberrypi kernel: [ 2361.925011] sd 0:0:0:0: [sda] Attached SCSI disk
    Mar  6 15:04:25 raspberrypi kernel: [ 2363.961300] fuse init (API version 7.27)
    Le df qui ne remonte pas mon disque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    root@raspberrypi:/var/www/html# df -h
    Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur
    /dev/root           29G    1,5G   27G   6% /
    devtmpfs           841M       0  841M   0% /dev
    tmpfs              970M       0  970M   0% /dev/shm
    tmpfs              970M    9,4M  961M   1% /run
    tmpfs              5,0M    4,0K  5,0M   1% /run/lock
    tmpfs              970M       0  970M   0% /sys/fs/cgroup
    /dev/mmcblk0p1     253M     52M  201M  21% /boot
    tmpfs              194M       0  194M   0% /run/user/1000
    J'ai le process du mount en status Ss :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    root@raspberrypi:/var/www/html# ps -aux | grep mount | grep -v grep
    root      1004  0.0  0.0   3044  1692 ?        Ss   15:04   0:00 /sbin/mount.ntfs /dev/sda1 /media/mondisque -o rw,nosuid,nodev,noexec,uid=33,gid=33,umask=077,user
    Rien dans le mount non plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    root@raspberrypi:/var/www/html# cat /proc/mounts | egrep "sda|mondisque"

    Une idée je cale là...? (j'ai essayé via sudo idem)
    "Un pessimiste voit la difficulté dans chaque opportunité, un optimiste voit l'opportunité dans chaque difficulté."
    Winston Churchill

  2. #2
    Expert éminent sénior
    Salut ChMuX.

    Citation Envoyé par ChMuX
    Quand je clique sur ON, ça lance une commande system qui via les GPIO ferme un relais afin d'envoyer le courant sur mon disque dur externe (relié à mon Pi en USB), attend 10s et monte le disque. Quand je clique sur OFF, ça démonte et coupe le relais.
    A votre place, j'aurai fait deux scripts BASH, dont l'un correspond à votre "on" et l'autre à votre "off".
    En PHP, on peut exécuter un script qui n'est pas du PHP, par la commande "shell_exec()".
    --> https://www.php.net/manual/fr/functi...shell-exec.php

    Le problème est que l'on ne peut pas tester si le bouton "on/off" s'est exécuté correctement.
    Mais est-ce si important que cela ? A priori, non.

    Mais ce que vous pouvez faire, c'est laisser le système raspbian gérer le montage et le démontage de votre périphérique.
    Comment ? Par UDEV (userspace /dev) :
    --> https://fr.wikipedia.org/wiki/Udev

    Un exemple :
    --> https://raspberrypi.stackexchange.co...lready-running

    A vous de faire la recherche sur le net pour compléter vos connaissances sur udev.

    Sinon, la commande pour monter un périphérique est "mount" et non "pmount".

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Membre actif
    Bonjour Artemus,

    Merci pour votre aide, je vais tenter via un script Bash lancé depuis php comme vous le préconisez !

    Pour le pmount, si ça existe, ça me permet de m'affranchir de sudo pour faire un mount depuis un autre user que root, il suffit en fait d'ajouter le user au group "plugdev" et le pmount passe

    Je reviens par ici quand j'aurai pu tester !
    "Un pessimiste voit la difficulté dans chaque opportunité, un optimiste voit l'opportunité dans chaque difficulté."
    Winston Churchill

  4. #4
    Membre actif
    Bon j'ai pu test via lancement script bash, dans tous les sens, en rajoutant le setuid bit, même problème, process mount en Ss...
    Je cale là....
    "Un pessimiste voit la difficulté dans chaque opportunité, un optimiste voit l'opportunité dans chaque difficulté."
    Winston Churchill

  5. #5
    Expert éminent sénior
    Salut ChMuX.

    La seule autre explication que je peux donner est un problème de droit.
    Le script bash doit être en ROOT:ROOT et être lancé soit depuis le compte root ou soit avec sudo devant.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #6
    Membre actif
    Déjà test, c'est non
    J'ai trouvé sur le net un mec qui a fait comme moi mais lui ça marche, la seule différence : j'ai php 7 lui php 5
    "Un pessimiste voit la difficulté dans chaque opportunité, un optimiste voit l'opportunité dans chaque difficulté."
    Winston Churchill

  7. #7
    Expert éminent sénior
    Salut ChMuX.

    Désolé de ne pouvoir faire plus.
    Je ne travaille pas avec php mais avec bash et langage C.

    Pour le montage automatique de votre disque dur, je le fais à partir de UDEV, comme je l'ai indiqué dans mon premier message.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  8. #8
    Membre actif
    Je vais me pencher là dessus, mais c'est vrai que je n'avais pas jeter un œil car je voulais effectuer le montage via mon script ...
    Merci pour votre aide
    "Un pessimiste voit la difficulté dans chaque opportunité, un optimiste voit l'opportunité dans chaque difficulté."
    Winston Churchill

  9. #9
    Membre actif
    Pour info, j'ai résolu le problème en ouvrant une connexion ssh via php et exécuté la commande, bon ok c'est bien moisi mais ça marche ...
    Ci-dessous le code :
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?php
      system("gpio -g mode 4 out");
     
      if($_POST['executer'] == 'ON')
      {
        system("gpio -g write 4 1");
        system("sleep 10");
        $connection = ssh2_connect('192.168.1.17', 22);
        ssh2_auth_password($connection, 'pi', 'MONMOTDEPASSE');
        $stream = ssh2_exec($connection, 'pmount -t ntfs /dev/sda1 mondisque');
      }
      else
        {
          $connection = ssh2_connect('192.168.1.17', 22);
          ssh2_auth_password($connection, 'pi', 'MONMOTDEPASSE');
          $stream = ssh2_exec($connection, 'pumount mondisque');
          system("sleep 5");
          system("gpio -g write 4 0");
        }
     
      header('Location: index.php');
    ?>


    (vu que je passe par "pmount", ne pas oublier de rajouter le user (ici "pi" pour moi) au groupe "plugdev"
    "Un pessimiste voit la difficulté dans chaque opportunité, un optimiste voit l'opportunité dans chaque difficulté."
    Winston Churchill