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 ?
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
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
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 ?
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.