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


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
Auteur

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

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
Auteur

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.

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

youstra
Auteur

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

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

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.