Script Exec-todolist

Un article de Wikiserveur.

Jump to: navigation, search
Cet article est une ébauche à compléter.

[modifier] Problématique : comment automatiser les taches à effectuer sur un serveur d'hébergement ?

Créer un nouveau compte d'hébergement, changer un mot de passe utilisateur ou ajouter un sous-domaine sont autant de tache que l'on a besoin d'automatiser sur un serveur d'hebergement.

Ces taches peuvent être réalisées par des scripts shell par exemple.

Mais comment les appeler ? Ces scripts necessitent souvent les droits de root et je rechigne à les appeler directement depuis un script PHP qui s'execute avec l'utilisateur nobody de toute facon...

Une solution est d'utiliser une TODO liste, on entre dedans une tache à effectuer puis un script est appelé à intervalle régulier depuis la contab pour l'executer avec les droits de root. Ceci à l'avantage de pouvoir differer les taches à effectuer tout en continuant à en ajouter en queue.

[modifier] Solution n°1 : utiliser un fichier pour la liste

#! /bin/sh

################################################
#     SCRIPT D'EXECUTION DE LA TO DO LIST      #
################################################

#Deroulement du script :
# Copier la liste en cours dans un fichier temporaire.
# Recharger une nouvelle liste vide.
# Executer le fichier temporaire.
# Supprimer le fichier temporaire.

# Emplacement de la to do list
TODO="/home/admin/var/todo.sh"

# Copie de la liste en cours dans un fichier temporaire.
cp $TODO $TODO.tmp

# Vidage de la liste
echo "#! /bin/sh
################################################
#                   TO DO LIST                 #
################################################
" > $TODO

# Execute les commandes de l'ancienne liste
$TODO.tmp

# Efface l'ancienne liste
rm $TODO.tmp

exit 0

Necessite un fichier executable todo.sh.

Probleme : si ce fichier est en acces libre (par exemple pour permettre à un script PHP d'ecrire dedans), n'importe qui peut y ajouter des commandes. Grave faille de sécurité.

[modifier] Solution n°2 : utiliser une base de donnée pour la liste

#! /bin/sh

################################################
#     SCRIPT D'EXECUTION DE LA TO DO LIST      #
################################################

#Deroulement du script :
# Creation d'un fichier temporaire contenant la todo list
# Transferer dans ce fichier la todo list de la base de donnee
# Vider la todo list de la base de donnee
# Executer la todo list du fichier temporaire
# Effacer ce fichier

# Variable d'administration de la liste
admin="nom de l'utilisateur mysql de la base"
passAdmin="mot de passe de l'utilisateur"
base="nom de la base"

# Emplacement de la liste temporaire
todo="/home/vincent/var/todo.sh"

# Creation du fichier temporaire
/bin/echo "#! /bin/sh
################################################
#                   TO DO LIST                 #
################################################
" > $todo

# On le rend executable
/bin/chmod u+x $todo

# On y ajoute la listes des taches a effectuer
/usr/bin/mysql -u $admin -p$passAdmin $base -N --batch >>$todo <<EOF 
CREATE TEMPORARY TABLE 'listemp' AS SELECT * FROM 'list';
DELETE FROM 'list' WHERE 1;
SELECT 'command' FROM 'listemp' WHERE 1;
EOF

# Execute les taches
$todo

# Efface le fichier temporaire
/bin/rm $todo

exit 0

Ce script demande la creation d'une base de donnée contenant une table list ainsi que d'une colone command contenant les commandes à executer (ici des appels aux differents scripts d'administration de compte). Il demande aussi la creation d'un utilisateur pour l'administrer bien que l'on puisse se servir du compte root pour cela.

Voici un petit script pour creer ce qui est demander :

#! /bin/sh

################################################
#     SCRIPT DE CREATION DE LA TO DO LIST      #
################################################

# Mot de passe root
passRoot="mot de passe root"

# Variable d'administration de la liste
admin="nom de l'utilisateur mysql de la base"
passAdmin="mot de passe de l'utilisateur"
base="nom de la base"

/usr/bin/mysql -u root --password=$passRoot mysql <<EOF
CREATE DATABASE '$base';
GRANT SELECT , INSERT , UPDATE , DELETE, CREATE ,
CREATE TEMPORARY TABLES ON '$base.*' TO "$admin"@"localhost" IDENTIFIED BY '$passAdmin';
FLUSH PRIVILEGES;
USE '$base';
CREATE TABLE 'list' (
'id' INT( 10 ) NOT NULL AUTO_INCREMENT ,
'datetime' DATETIME NOT NULL ,
'user' VARCHAR( 20 ) NOT NULL ,
command VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY ( 'id' )
);
EOF

exit 0