Exécution de script bash depuis app Symfony

Par youstra, il y a 3 ans


Bonsoir à tous.
Je veux créer des vhost (apache2) à partir de mon application symfony. Pour ce faire je dois exécuter un script bash dans lequel il y a bien évidenment des commande (root) depuis symfony.
Voici mon code php (un service)

public function registerTenantDomain( string $from, string $to, string $subject, string $template, array $context, string $domainName, string $enterpriseName ): void { $pathToHelloWorldScript = __DIR__ . "/../../addImmoTenantScript.sh"; $pathToHelloWorldScript = "/home/username/Projects/immo/immo-project/addImmoTenantScript.sh"; $process = new Process(['sh', $pathToHelloWorldScript, '-p 80 -d ' . $domainName . ' -s ' . $enterpriseName]); try { $process->mustRun(); $result = $process->getOutput(); $this->sendMail->send($from, $to, $subject, $template, $context); } catch (ProcessFailedException $exception) { throw new ProcessFailedException($process); } }

Mon script bash

#!/bin/bash while getopts p:d:s: flag do case "${flag}" in p) port=${OPTARG};; d) domaineName=${OPTARG};; s) organisationName=${OPTARG};; esac done echo "<VirtualHost *:$port> ServerAdmin webmaster@localhost DocumentRoot /var/www/$domaineName ServerName $domaineName ErrorLog /home/username/www/log-apache/error_$organisationName.log CustomLog /home/username/www/log-apache/access_$organisationName.log combined <Directory /var/www/$domaineName/> Options +Indexes +FollowSymLinks AllowOverride All </Directory> </VirtualHost>" > /etc/apache2/sites-available/$organisationName.conf echo "server.ip.address $domaineName" >> /etc/hosts a2ensite /etc/apache2/sites-available/$organisationName.conf service apache2 reload ln -s /home/username/Projects/immo/immo-project/public/ /var/www/$domaineName

et mon fichier sudoers

Cmnd_Alias ADD_IMMO_TENANT = /home/username/Projects/immo/immo-project/addImmoTenantScript.sh * # User privilege specification root ALL=(ALL:ALL) ALL username ALL=(ALL:ALL) ALL, NOPASSWD: ADD_IMMO_TENANT

Ce que j'obtiens

Lorsque j'appelle mon service, non seulement un mot de passe m'est demandé pour le rechargement d'apache mais aussi je ne vois aucun changement dans le ficher /etc/hosts, le fichier du vhost n'est pas créé et le lien symbolique non plus ne l'ai pas.

Pouvez-vous me donner des pistes ?

8 réponses

jeanMat, il y a 3 ans

Bien que tu aies ajouté ta commande et ton user dans le fichier sudoers, je me demande si il ne faut tout de même pas que tu lance ton script.sh avec un sudo devant

youstra, il y a 3 ans

Quand je lance avec le sudo devant, ça ne fait de moulinner des secondes durant. Et après j'ai un timeout qui s'affiche

jeanMat, il y a 3 ans

je ne parle pas de lancer le script php avec sudo, mais bien d'ajouter sudo au niveau des diverses commandes à l'intérieur de ton fichier addImmoTenantScript.sh

sudo echo "server.ip.address $domaineName" >> /etc/hosts
sudo a2ensite /etc/apache2/sites-available/$organisationName.conf
sudo service apache2 reload
sudo ln -s /home/username/Projects/immo/immo-project/public/ /var/www/$domaineName

youstra, il y a 3 ans

C'est toujours la même erreur :

The process "'sh' '/home/username/Projects/immo/immo-project/addImmoTenantScript.sh' '-p 80 -d test-immo.immo.ci -s test_immo'" exceeded the timeout of 60 seconds.
jeanMat, il y a 3 ans

et quand tu lances depuis ton terminal
/home/username/Projects/immo/immo-project/addImmoTenantScript.sh
ça fonctionne bien ?

youstra, il y a 3 ans

En ligne de commande, quand je lance

sudo /home/username/Projects/immo/immo-project/addImmoTenantScript.sh -p 80 -d test-immo.immo.ci -s test_immo

il me crée tous les fichier et lien mais j'ai cette erreur :

ERROR: Site /etc/apache2/sites-available/test_immo does not exist!

Et pourtant le fichier test_immo.conf existe bien.

Je précise que j'ai enlevé le sudo devant les commandes dans mon fichier script

jeanMat, il y a 3 ans

Il me semble que tu as juste à faire

a2ensite $organisationName.conf

et non

a2ensite /etc/apache2/sites-available/$organisationName.conf

Peu importe le dossier dans lequel tu te trouves

jeanMat, il y a 3 ans

L'autre point c'est de savoir avec quel user tourne ton PHP. Avec Apache, par défault, c'est www-data. c'est donc ce user qu'il faut mettre dans le sudoers.
Mais peut etre que tu l'as personnalisé en utilisant le module php-fpm.
En tout cas c'est sans doute un problème de user.