Projet

Général

Profil

Scripts et taches planifiees » Historique » Version 22

Version 21 (Florent Torregrosa, 04/08/2013 15:59) → Version 22/118 (Florent Torregrosa, 04/08/2013 16:06)

Afin de gagner du temps et d'éviter les erreurs humaines, des scripts ont été écrits tout au long du projet. Certains sont même exécutés automatiquement toutes les semaines.

{{>toc}}

h1. Les tâches planifiées

Pour exécuter ces tâches régulièrement, on utilise le "crontab":http://fr.wikipedia.org/wiki/Crontab. Il s'agit d'un programme installé sur notre serveur.

Pour voir et modifier la liste des actions :
# se connecter au serveur : <code>ssh assos@sas1.centrale-marseille</code>
# taper la commande pour voir le crontab <code>crontab -l</code>
# taper la commande pour modifier le crontab <code>crontab -e</code>. /!\ Ne pas effectuer cette opération avant de s'être renseigné sur "vi":http://fr.wikipedia.org/wiki/Vi (l'éditeur de texte utilisé qui n'est pas vraiment intuitif :p) et sur "la syntaxe du crontab":http://fr.wikipedia.org/wiki/Crontab#Modification !

Voici la liste des tâches effectuées régulièrement.

h2. La mise à jour des projets

Voici les différentes étapes réalisées :
# Activer partout le module _update_. C'est lui qui gère la vérification des versions, l'envoi de notifications par mail ainsi que les mises à jour via drush, il est donc indispensable qu'il soit activé.
# Lancer le cron pour que les sites sachent s'il y a des mises à jour à faire
# Supprimer le cache des sites pour réduire drastiquement la taille des bases de données sauvegardées.
# Exécuter le [[Scripts_et_taches_planifiees#dump.sh_and_co|script de sauvegarde des bases de données]]
# Vérifier les versions des projets et au besoin, mettre à jour leur code
# Exécuter la [[Utilisation_de_Drupal_multi-site#Mise_à_jour_de_la_base_de_données|mise à jour des bases de données]]
# Exécuter une nouvelle fois le cron
# Exécuter le [[Scripts_et_taches_planifiees#taille.sh|script de rapport sur la taille utilisée du disque]] et l'envoyer par mail au club Drupal
# Dater les logs et les sauvegarder au bon endroit
# Désactiver le module _update_ (vu qu'il est réactivé avant la mise à jour et que celle-ci a lieu toutes les semaines, il y a peu d'intérêt à le garder activé le reste du temps)

h2. La mise à jour des traductions

Sur les installations d6 et d7 : une fois par semaine le jeudi.

Voici les étapes effectuées :
# Activer partout le module _l10n_update_. C'est lui qui gère la mise à jour des traductions
# Vérifier s'il y a des nouvelles chaînes traduites disponibles
# Ajouter les nouvelles traductions disponibles
# Désactiver le module _l10n_update_

Pour drupal 6, les différentes instructions sont écrites directement dans le crontab. Pour drupal 7, on utilise [[Scripts_et_taches_planifiees#drush_maj_trad|l'alias drush perso <code>drush maj_trad</code>]] dans le crontab.

h2. La réinitialisation des droits d'accès

Sur les installations d6 et d7 : toutes les semaines, après les D&D du club drupal

Cette tâche utilise le script [[Scripts_et_taches_planifiees#ch_mdp|ch_mdp]] afin de rétablir les droits d'accès recommandés par drupal sur
* les dossiers des sites
* les settings.php des sites

h2. La réinitialisation des variables dangeureuses

Sur l'installation d7 principalement : une fois par semaine

Cette tâche consiste à réinitialiser certaines variables qui donnent des droits considérés comme trop permissifs donc dangereux aux administrateurs des sites. En voici la liste :
<pre>
<code class="bash">
drushall_atest vset error_level 0 --yes
</code>
</pre>

Cette commande permet de ne pas afficher les messages d'erreurs aux utilisateurs autre que les administrateurs. En effet, ils contiennent parfois des informations sensibles sur l'installation et ne doivent donc pas être divulgués à n'importe qui.
<pre>
<code class="php">
drushall_atest php-eval variable_set\(\'allow_authorize_operations\',FALSE\)\;
</code>
</pre>

Cette commande permet de ne pas autoriser les utilisateurs à installer et mettre à jour des modules via l'interface du site (fonctionnalité introduite dans drupal7). En effet, seul le club Drupal maintient les codes des projet, afin d'en garantir la pérennité.

<pre
<code class="php">
drushall_atest vset --always-set reverse_proxy TRUE
drushall_atest vset --always-set --format=json reverse_proxy_addresses '["147.94.19.16","147.94.19.17"]'
</code>
</pre>

Ces commandes permettent de déclarer à drupal les serveurs proxy du CRI afin d'éviter qu'il ne répertorie tous les visiteurs comme ayant l'adresse des sus-cités serveurs. **Pas fini : voir http://assos.centrale-marseille.fr/content/t%C3%A2che/d%C3%A9clarer-les-proxy-du-cri-%C3%A0-drupal**

h3. Comment le lancer ?

N'importe où, taper <code>reinit_var.sh</code>.

h2. La sauvegarde des bases de données

Sur les installations d6 et d7 : une fois par semaine

On utilise les [[Scripts_et_taches_planifiees#Tout-sauvegarder|scripts de sauvegarde créés par le club Drupal]].

h2. La purge des sauvegardes de bdd

Sur les installations d6 et d7 : toutes les semaines

Cette tâche utilise le script de [[Scripts_et_taches_planifiees#purge_des_sauvegardes.sh|purge des sauvegardes]] afin de libérer de l'espace disque en supprimant les sauvegardes de bdd les plus vieilles.

h1. Liste des scripts à disposition

Les scripts utilisés sont hébergés dans le répertoire bin du compte assos.

h2. all-reset-permissions.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh

# This script puts the correct permissions to sites folders, settings.php and scripts.

######### drupal 6
for dir in `find $d6_dir_sites -type d -maxdepth 1 -mindepth 1 ! -name all ! -name images ! -name languages` ; do
chmod 755 $dir
chmod 400 $dir/settings.php
done

######### drupal 7
for dir in `find $d7_dir_sites -type d -maxdepth 1 -mindepth 1 ! -name all` ; do
chmod 755 $dir
chmod 400 $dir/settings.php
done

####### bin
chmod -R 700 $dir_scripts
</code>
</pre>

h2. contrib-usage.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh
. scripts-utils.sh

# ARGS: Drupal_version, project_status, project_name
# List sites that have the project_name with the corresponding project_status.

check_arguments $# 3

if [ $1 = d6 ] ; then
cd $d6_dir_sites
else
cd $d7_dir_sites
fi

for dir in `find . -maxdepth 1 -mindepth 1 -type d ! -name all ! -name languages ! -name images` ; do
# List non-core projects that correspond to the status.
# Keep project_name if listed.
# Count line result. 0 if not listed or 1 if listed.
# Print site_dir if listed.

cd $dir;
if [ 1 -eq `drush pml --no-core --status=$2 | grep $3 | wc -l` ] ; then
echo $dir;
fi
done
</code>
</pre>

h2. d6-all-drush.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh
. scripts-utils.sh

# ARGS: drush_command

check_arguments $# 1

for dir in `find $d6_dir_sites -maxdepth 1 -mindepth 1 -type d ! -name all ! -name languages ! -name images` ; do
cd $dir
echo $dir
drush $*
done
</code>
</pre>

h2. d6-all-dump-full.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh

current_date=`date "+%Y-%m-%d-%Hh%Mm%Ss"`

# Dump D6 database with webassos user.
mysqldump --single-transaction webassos -h myweb.serv.int -u webassos --password=HBVH2ljgyZCA0AP251DY > $d6_dir_full_backup/webassos/$current_date.webassos.sql

# Dump D6 form database with forum user.
mysqldump forum -h myweb.serv.int -u forum --password=dtcAltF12 > $d6_dir_full_backup/forum/$current_date.forum.sql
</code>
</pre>

h2. d6-all-update-contrib.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh

d6-all-drush.sh -y en update
# Launch cron to check for updates.
d6-all-drush.sh -q cron

d6-all-drush.sh cc all
d6-all-dump-full.sh

d6-all-drush.sh -y upc --no-core
d6-all-drush.sh -y updb

d6-all-drush.sh -y dis update

# Cron report.
d6-all-drush.sh cron
</code>
</pre>

h2. d6-dump-individual.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh

# ARGS: auto or manual, site_prefix
# WARNING : backup are regularly flushed, put your backup in a safe place.

cd $dir_individual_backup

#récupération des tables du site dans le fichier liste_tables.temp
tables='_%'
liste="$1$tables"

mysql -h myweb.serv.int -u webassos --password=HBVH2ljgyZCA0AP251DY -BNe "show tables like '"$liste"'" webassos | tr '\r\n' ' ' > liste_tables.temp

#transformation de cette liste en une variable
var=$(cat liste_tables.temp)

#sauvegarde de toutes ces tables
current_date=`date "+%Y-%m-%d-%Hh%Mm%Ss"`
suffixe="_dump$current_date.sql"
fichier="$1$suffixe"

if [ $1 = 'auto' ] ; then
mysqldump webassos -h myweb.serv.int -u webassos --password=HBVH2ljgyZCA0AP251DY $var > $d6_dir_individual_auto_backup/$fichier
else
mysqldump webassos -h myweb.serv.int -u webassos --password=HBVH2ljgyZCA0AP251DY $var > $d6_dir_individual_manual_backup/$fichier
fi

#suppression du fichier temporaire utilisé
rm liste_tables.temp
</code>
</pre>

h2. d6-reset-variables.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh

cd $d6_dir_sites
d6-all-drush.sh vset --always-set reverse_proxy TRUE
d6-all-drush.sh vset --always-set --format=json reverse_proxy_addresses '["147.94.19.16","147.94.19.17"]'
drush @sites ev "variable_set('update_notify_emails', array($email_multi_assos));" --yes
</code>
</pre>

h2. d7-all-drush-logged.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh
. scripts-utils.sh

# ARGS: drush_command

check_arguments $# 1

for dir in `find $d7_dir_sites -maxdepth 1 -mindepth 1 -type d ! -name all` ; do
cd $dir
current_date=`date "+%Y-%m-%d_%Hh:%Mm"`
echo "======$current_date======" >> $d7_dir_log/$x.log
echo "Arguments are: $* " >> $d7_dir_log/$x.log
drush $* >> $d7_dir_log/$x.log
#To have the same caracters limit we needed 'end' that have 4 caracters, we used the Croate language for this ! LOL
echo -e "=============KRAJ=============\n" >> $d7_dir_log/$x.log
done
</code>
</pre>

h2. d7-all-drush.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh
. scripts-utils.sh

# ARGS: drush_command

check_arguments $# 1

for dir in `find $d7_dir_sites -maxdepth 1 -mindepth 1 -type d ! -name all` ; do
cd $dir
echo $dir
drush $*
done
</code>
</pre>

h2. d7-all-dump-full.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh

current_date=`date "+%Y-%m-%d-%Hh%Mm%Ss"`

# Dump D7 databases at once.
mysqldump -h $db_server -u $db_user -pNoNo82jJ --all-databases > $d7_dir_full_backup/myassos/$current_date.d7_full.sql
</code>
</pre>

h2. d7-all-dump-individual.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh

# ARGS: auto or manual

current_date=`date "+%Y-%m-%d-%Hh%Mm%Ss"`

for dir in `find $d7_dir_sites -maxdepth 1 -mindepth 1 -type d ! -name all` ; do
cd $dir
drush cc all
if [ $1 = 'auto' ] ; then
drush sql-dump --result-file="$d7_dir_individual_auto_backup/$dir/$current_date.$dir.sql"
else
drush sql-dump --result-file="$d7_dir_individual_manual_backup/$dir/$current_date.$dir.sql"
fi
done
</code>
</pre>

h2. d7-all-releases-info.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh

# List version of a module or theme that exists in sites/all/*
# and all versions that are available for same project on drupal.org

# modules
for dir in `find $d7_dir_sites/all/modules -maxdepth 1 -mindepth 1 -type d` ; do
drush pm-releases $dir
done

# themes
for dir in `find $d7_dir_sites/all/themes -maxdepth 1 -mindepth 1 -type d` ; do
drush pm-releases $dir
done
</code>
</pre>

h2. d7-all-reset-variables.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh

for dir in `find $d7_dir_sites -maxdepth 1 -mindepth 1 -type d ! -name all` ; do
cd $dir
echo $dir
d7-reset-variables.sh
done
</code>
</pre>

h2. d7-all-security-review.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh

# grep -v success to keep site_name and error lines.
bash -c 'd7-all-drush.sh security-review |& grep -v success | mail -s "Security review" $email_multi_assos'
</code>
</pre>

h2. d7-all-update-contrib.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh

d7-all-drush.sh -y en update
# Launch cron to check for updates.
d7-all-drush.sh -q cron

d7-all-drush.sh cc all
d7-all-dump-individual.sh

d7-all-drush-logged.sh -y upc --no-core
d7-all-drush.sh -y updb

d7-all-drush.sh -y dis update

# Cron report.
d7-all-drush.sh cron | mail -s "Cron report: d7-all-update-contrib.sh" $email_multi_assos
</code>
</pre>

h2. d7-all-update-localisation.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh

d7-all-drush.sh -y en l10n_update
d7-all-drush.sh l10n-update-refresh
d7-all-drush.sh l10n-update
d7-all-drush.sh -y dis l10n_update
</code>
</pre>

h2. d7-create-site.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh
. scripts-config-site.sh $1
. scripts-utils.sh

# ARGS: site name

######## Exceptions
check_arguments $# 1

# "-" is forbidden because it provokes database error.
if `echo $1 | grep -` ; then
echo '"-" is forbidden in the site name'
exit 1
fi

# Site name length must be lower or equal to 16 due to database limitations.
if [ $(echo $1 | wc -n) -le 16 ] ; then
echo "site name can't have more than 16 characters"
exit 1
fi

###### Initialisation
cd $d7_dir
db_password=`ask_password_db $db_server $db_user`
site_password=`gen_password`

# Check if site database already exists.
if mysql -h $db_server -u $db_user -e "USE $d7_site_name" -p$db_password 2>/dev/null ; then
echo "Database $d7_site_name already exists"
exit 1
fi

# Check if site folder already exists.
if [ -d $d7_site_dir ] ; then
echo "Folder $d7_site_dir already exists"
exit 1
fi

###### Main
mkdir $d7_site_dir

# Backup requirements
mkdir $d7_dir_individual_auto_backup/$d7_site_name
mkdir $d7_dir_individual_manual_backup/$d7_site_name
current_date=`date "+%Y-%m-%d-%Hh%Mm%Ss"`

touch $d7_dir_individual_auto_backup/$d7_site_name/$current_date.sql
touch $d7_dir_individual_auto_backup/$d7_site_name/$current_date.sql
touch $d7_dir_individual_auto_backup/$d7_site_name/$current_date.sql

# Create and grant privileges on database
mysql -h $db_server -u $db_user -e "CREATE DATABASE $d7_site_name" -p$db_password
mysql -h $db_server -u $db_user -e "GRANT ALL PRIVILEGES ON $d7_site_name.* TO '$d7_site_name'@'%' IDENTIFIED BY '$site_password'" -p$db_password

# Create settings.php
sed "s/\%\%DBUSER\%\%/$d7_site_name/ ; s/\%\%DBNAME\%\%/$d7_site_name/ ; s/\%\%DBPASS\%\%/$site_password/ ; s/\%\%nomsite\%\%/$d7_site_name/" < $d7_settings_template > $d7_site_settings

# Create symbolic link
cd $d7_dir
ln -s . $d7_site_name

# Next Instructions
echo "Go to http://assos.centrale-marseille.fr/$d7_site_name/install.php to continue."
echo "Press enter when ready to go on."
read key

# Init variables
d7-reset-variables.sh $d7_site_name

# Permissions
chmod -R 755 $d7_site_dir
chmod 400 $d7_site_settings

# Last instructions
echo "Last instructions:"
echo "- Advice the webmaster to close account creation on the website"
echo "- Give the webmaster a link to the club Drupal's tutorials "
echo "- Create a node of type \"Site\" on default"
echo "- Register the webmaster on webmasters@listes.centrale-marseille.fr"
</code>
</pre>

h2. d7-delete-site.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh
. scripts-config-site.sh $1
. scripts-utils.sh

# ARGS: site name.

check_arguments $# 1

db_password=`ask_password_db $db_server $db_user`

# Delete database.
mysql -h $db_server -u $db_user -p$db_password -e "IF EXISTS DROP DATABASE $d7_site_name"

# Delete MYSQL user.
mysql -h $db_server -u $db_user -p$db_password -e "DROP USER '$d7_site_name'@'%'"

# Delete site's folder.
chmod -R 700 $d7_site_dir
rm -r $d7_site_dir

# Delete symbolic link.
rm $d7_dir/$d7_site_name

# Delete database backups.
rm -r $d7_dir_individual_auto_backup/assos.centrale-marseille.fr.$d7_site_name
rm -r $d7_dir_individual_manual_backup/assos.centrale-marseille.fr.$d7_site_name

echo "Don't forget to:"
echo "- Refresh node site on default"
echo "- Check particular behavior (normally detailed on site node)"
</code>
</pre>

h2. d7-reset-variables.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh

# ARGS: [site_name]

if [ ! -z $1 ] ; then
. scripts-config-site.sh $1
cd $d7_site_dir
fi

current_timestamp=`date "+%s"`

####### General variables
drush -y vset --always-set reverse_proxy TRUE
drush -y vset --always-set --format=json reverse_proxy_addresses '["147.94.19.16","147.94.19.17"]'
drush -y ev "variable_set('update_notify_emails', array($email_multi_assos));"
drush -y vset error_level 0

###### Hidden captcha
drush -y en hidden_captcha
# Log wrong answers.
drush -y vset captcha_log_wrong_responses 1
# Use hidden captcha for all forms.
drush -y sqlq --db-prefix "UPDATE {captcha_points} SET module = 'hidden_captcha', captcha_type = 'Hidden CAPTCHA' WHERE module is NULL;"
# Flush captcha cache.
drush -y vdel captcha_placement_map_cache
# Randomely generate a math question as the label of the hidden captcha field.
drush -y vset hidden_captcha_label "$RANDOM + $RANDOM"

####### Piwik
drush -y en piwik
drush -y vset piwik_site_id "101"
drush -y vset piwik_url_http "http://piwik.centrale-marseille.fr/"
drush -y vset piwik_url_https "https://piwik.centrale-marseille.fr/"
# Piwik cache.
drush -y vset piwik_cache 1
drush -y vset piwik_visibility_roles "1"
# Anonymous and authenticated statistics.
drush -y vset --format=json piwik_roles '{"1":0,"2":0}'
drush -y vset piwik_page_title_hierarchy 1
# Activate local search.
drush -y vset piwik_site_search 1

###### Security review
# For untrusted roles:
# 1 : anonymous user
# 2 : authenticated user
# 3 : administrator
drush -y en security_review
drush -y ev "variable_set('security_review_untrusted_roles', array('1'));"
# Security review can't check for files permissions on multi_assos.
drush -y sqlq --db-prefix "UPDATE {security_review} SET skip = '1', skiptime = $current_timestamp, skipuid= '1' WHERE reviewcheck IN ('file_perms');"
drush -y sqlq --db-prefix "UPDATE {security_review} SET skip = '0', skiptime = 0, skipuid= NULL WHERE reviewcheck NOT IN ('file_perms');"
</code>
</pre>

h2. delete-temporary-files.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh

find $dir_multi_assos -name '*~' -delete
</code>
</pre>

h2. disk-usage.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh

echo -e "Quotas: 9.1 GB\n"

echo "Assos:"
du -hcs $dir_multi_assos | grep total
echo -e "\n"

echo "D6:"
cd $d6_dir_sites
du -h -d 1
echo -e "\n"

echo "D7:"
cd $d7_dir_sites
du -h -d 1
echo -e "\n"

echo "Logs:"
du -hcs $dir_log | grep total
echo -e "\n"

echo "Backups:"
cd $dir_backup
du -h -d 2
</code>
</pre>

h2. flush-files.sh

<pre>
<code class="php">
#!/bin/sh

# ARGS: number of files to keep, email address
# usage: flush files from a folder except a number equal to argument.

# Check if scripts-config.sh is imported.
if [ -z $scripts_utils ] ; then
echo "Import of scripts-utils.sh required."
exit 1
fi

check_arguments $# 2

backups_number=`ls | wc -l`
let "number_of_backups_to_delete = backups_number - $1"

if [ $number_of_backups_to_delete -gt 0 ] ; then
ls | head -$number_of_backups_to_delete | xargs rm
else
dir=`pwd`
echo "There are not enough files in $dir to Flush it. Check if backup script works fine." | mail -s "[db] $dir has a backup problem" $2
fi
</code>
</pre>

h2. flush-full-databases-backups.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh

# ARGS: Drupal version

cd $dir_full_backup/$1

for dir in `ls` ; do
cd $dir
flush-files.sh $db_full_backup_number $email_multi_assos
done
</code>
</pre>

h2. flush-individual-databases-backups.sh

<pre>
<code class="php">
#!/bin/sh

. scripts-config.sh

# ARGS: manual or auto, Drupal version

cd $dir_individual_backup/$1/$2

for dir in `ls` ; do
cd $dir
if [ $1 = 'auto' ] ; then
flush-files.sh $db_individual_auto_backup_number $email_multi_assos
else
flush-files.sh $db_individual_manual_backup_number $email_multi_assos
fi
done
</code>
</pre>

h2. scripts-config-site.sh

<pre>
<code class="php">
#!/bin/sh

# Sets useful variables of a site.
# ARGS: site_name
# Requires scripts-config.sh

# Check if scripts-config.sh is imported.
if [ -z $scripts_config ] ; then
echo "Import of scripts-config.sh required."
exit 1
fi

if [ -z $1 ] ; then
echo "This script needs a site name as argument."
exit 1
fi

scripts_config_site='imported'

d7_site_name=$1
d7_site_dir="$d7_dir_sites/assos.centrale-marseille.fr.$d7_site_name"
d7_site_settings="$d7_site_dir/settings.php"
</code>
</pre>

h2. scripts-config.sh

<pre>
<code class="php">
#!/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/users/guest/assos/bin
PATH=$PATH:/usr/guest/assos/bin

scripts_config='imported'

email_multi_assos="assos@centrale-marseille.fr"

dir_multi_assos='/users/guest/assos'
dir_scripts="$dir_multi_assos/bin"
dir_template="$dir_multi_assos/Desktop"

###### Database
db_server="myassos.serv.int"
db_user="assos"
dir_log="$dir_multi_assos/log"

###### Backup
db_full_backup_number=3
db_individual_manual_backup_number=3
db_individual_auto_backup_number=3

dir_backup="$dir_multi_assos/backup"
dir_full_backup="$dir_backup/full"
dir_individual_backup="$dir_backup/individual"
dir_individual_manual_backup="$dir_individual_backup/manual"
dir_individual_auto_backup="$dir_individual_backup/auto"

###### D7 variables
d7_dir="$dir_multi_assos/htmltest"
d7_dir_sites="$d7_dir/sites"

### Log
d7_dir_log="$dir_log/d7"

### Backup
d7_dir_full_backup="$dir_full_backup/d7"
d7_dir_individual_manual_backup="$dir_individual_manual_backup/d7"
d7_dir_individual_auto_backup="$dir_individual_auto_backup/d7"

### Template
d7_settings_template_name="settings-D7-bddinde-template.php"
d7_settings_template="$dir_template/$d7_settings_template_name"

###### D6 variables
d6_dir="$dir_multi_assos/html"
d6_dir_sites="$d6_dir/sites"

### Backup
d6_dir_full_backup="$dir_full_backup/d6"
d6_dir_individual_manual_backup="$dir_individual_manual_backup/d6"
d6_dir_individual_auto_backup="$dir_individual_auto_backup/d6"
</code>
</pre>

h2. scripts-utils.sh

<pre>
<code class="php">
#!/bin/sh

# This script contains useful functions for other scripts.

# Check if scripts-config.sh is imported.
if [ -z $scripts_config ] ; then
echo "Import of scripts-config.sh required."
exit 1
fi

scripts_utils='imported'

ask_password() {
# read -s doesn't work with sh.
# usage: pass=`ask_password "password please:"`
echo $1 >&2
echo -n ">" >&2
stty_avant=`stty -g`
stty -echo
read p
stty $stty_avant
echo "$p"
unset p
}

ask_password_db() {
# ARGS: server_name, user_name
local db_password="pour_boucler"
# empty db request to validate password
while ! mysql -h $1 -u $2 -p$db_password -e "" 2>/dev/null ; do
db_password=`ask_password "database password:"`
echo ""
done
}

generate_password(){
# ARGS: [password_length]
# The password contains special characters. '/' must be excluded to avoid sed malfunction.

local site_password='/'

if [ -z $1 ] ; then
local password_length=20
else
local password_length=$1
fi

while echo "$site_password" | grep -Fq '/' ; do
site_password=`dd if=/dev/urandom count=1 | uuencode -m - | head -n 2 | tail -n 1 | cut -c-$password_length`
done

echo $site_password
}

count_d7_sites(){
find $d7_dir_sites -type d ! -name all -maxdepth 1 | wc -l
}

check_arguments() {
# ARGS: number of arguments passed to script, number of arguments required
if [ $1 -le $2 ] ; then
echo "Number of arguments insuffisant."
exit 1
fi
}
</code>
</pre>

h2. ch_mdp

Il a été écrit pour permettre de prendre acte de la modification du mot de passe de la base de données rapidement dans tous les settings.php (pour l’installation de drupal 6 uniquement, les sites drupal 7 étant chacun dans leur base de données).

Pour effectuer cette action, il faut donner l'ancien et le nouveau mot de passe en argument puis lancer le script.

Plus d'info sur comment ça marche en lisant http://fr.wikipedia.org/wiki/Stream_Editor#Utilisation_la_documentation_de_la_commande_sed et les commentaires laissés dans le code du script.

h3. Comment le lancer ?

Il suffit de taper <code>ch_mdp</code> n'importe où dans le compte assos.

h3. À quoi ça ressemble ?

<pre>
<code class="bash">
cd [drupal directory]/sites

for x in $(ls -1 | grep -v 'all'); do
cd $x;
fichier="settings.php"
chmod 600 $fichier
mv $fichier $fichier.old
#remplacer la première chaine après le / par l'ancien mot de passe, et la seconde chaine (après le deuxième /) par le nouveau mot de passe
sed "s/$1/$2/g" < $fichier.old > $fichier
chmod 400 $fichier
echo "Verifier que le site fonctionne et appuyer sur la touche Entree pour continuer"
read fake_variable
rm $fichier.old
cd ..
done
</code>
</pre>

h2. chk_perm

Ce script rétablit les permissions des dossiers des sites, des scripts et des settings.php. Il se lance tous les jours grâce au cron.

Il ressemble à ça :

<pre>
<code class="bash">
cd [drupal directory]/sites

for dir in $(find . -type d -maxdepth 1 ! -name all)
do
chmod 755 $dir
cd $dir
chmod 400 settings.php
cd -
done
</code>
</pre>

h2. dis_tiers.sh et en_tiers.sh

Créé en juillet 2011 dans le cadre de [[De_Drupal6_vers_Drupal7|la migration de d6 à d7]], ces scripts permettent respectivement de désactiver et réactiver tous les modules tiers (c'est-à-dire les modules qui ne font pas partie du noyau / core de drupal, ceux qui sont installé dans sites/all/modules).

En effet, il s'agit de deux étapes indipensables pour la migration d'un site.

h3. Comment les lancer ?

Il suffit de taper "dis_tiers.sh" ou "en_tiers.sh" dans le dossier du site en question.

h3. À quoi ça ressemble ?

<pre>
<code class="bash">
##dis_tiers.sh
#écrire le nom des modules non core dans un fichier
drush pml |grep -v Core* | grep Module | grep Enabled > fichier.temp
sed -e 's/\(.*(\)\(.*\)\().*\)/\2/' fichier.temp > modules_tiers.txt
#désactiver ces modules
for line in $(cat modules_tiers.txt); do drush dis -y "$line" ; done
#effacer les fichiers créés
rm fichier.temp

##en_tiers.sh
#activer ces modules du fichier texte
for line in $(cat modules_tiers.txt); do drush en -y "$line" ; done
</code>
</pre>

NB : dis_tiers.sh crée un fichier texte contenant la liste des modules tiers qui étaient activés sur le site. Il faut donc :
* Avoir des droits d'écriture sur le dossier du site pour l'exécuter
* Penser à supprimer ce fichier et à remettre les droits correctement (par exemple en lançant le script [[Scripts_et_taches_planifiees#ch_mdp|ch_mdp ]]) après.

h2. drushall and co

Pour administrer tous les sites du multi-site en une seule fois, nous avons créé un script à partir de drush.
Il s'utilise comme drush, mais effectue la commande drush tapée sur tous les sites de l'installation un par un.

h3. Comment on le lance ?

Sur l'installation d6, on lance <code>drushall</code> n'importe où.

Sur l'installation d7, on lance <code>drushall_atest</code> n'importe où.

h3. À quoi ça ressemble ?

<pre>
<code class="bash">
#~/bin/sh
# si pas d'arguments :
if [ $# -lt 1 ]; then
echo "usage: $0 <drush args>"
exit 1
fi

cd [drupal directory]/sites

for x in $(ls -1 | grep -v 'all'); do
if [ -d $x -a ! -L $x ]; then
cd $x;
echo $x
drush $*
cd -;
fi
done
</code>
</pre>

h2. drushcronone

h3. Histoire

Ce script a été introduit pour la version 6 du projet essentiellement pour améliorer les performances : au lieu de faire un wget sur le cron.php d'un site, valait mieux exécuter le script _en interne_.

h3. Besoin

La version 7 du projet en a besoin plus que jamais ! puisque le cron.php n'est plus 'wget'able sans une chaîne de codes à ajouter à l'url publique, sinon il faut avoir les droits nécessaires.

h3. Usage

Donc pour exécuter le cron pour un seul site, il suffit de donner le nom du répertoire.
Exemple : <code>drushcronone assos.centrale-marseille.fr.cac13</code>

Q : Où est ce que ce script est le plus utilisé ?

R : Dans les tâches planifiés (crontab) bien sûr !

h2. dump.sh and co

Tous ces scripts se lancent n'importe où.

h3. Dump pour drupal 6

h4. Sauvegarder uniquement les tables d'un site

On a créé des scripts qui permettent de sauvegarder uniquement les tables associés à un site (et non toute la base).

Ils se lancent n'importe où (mais attention, la sauvegarde est effectuée là où il est lancé, donc à ne pas lancer dans dossier accessible par n'importe qui !) en tapant <code>dump_site nom_de_site</code> (d6) ou <code>dump_site_atest nom_du_site</code> (d7). Le nom du site à fournir est le préfixe utilisé dans la base de données.

Ils **ressemblent** à :
<pre>
<code class="bash">
#récupération des tables du site dans le fichier liste_tables.temp
tables='_%'
liste="$1$tables"

mysql -h serveur -u utilisateur --password=super_mot-de-passe -BNe "show tables like '"$liste"'" base_de_données | tr '\r\n' ' ' > liste_tables.temp

#transformation de cette liste en une variable
var=$(cat liste_tables.temp)

#sauvegarde de toutes ces tables
suffixe="_dump.sql"
fichier="$1$suffixe"

mysqldump base_de_données -h serveur -u utilisateur --password=super_mot-de-passe $var > $fichier

#suppression du fichier temporaire utilisé
rm liste_tables.temp
</code>
</pre>

h4. Tout sauvegarder

Pour drupal 6, on a un script qui réalise la sauvegarde de toute la base en une seule fois : <code> dump.sh</code>. Il **ressemble** à ça :
<pre>
<code class="bash">
mysqldump nom_de_la_base -h serveur -u utilisateur --password=super_mot_de_passe_trop_bien > ~/chemin_vers_la/sauvegarde.dump.sql
</code>
</pre>

h3. Dump pour drupal 7

Pour drupal 7, on a un script plus complet : <code>dump_site_atest_all</code> qui repose sur @drush sql-dump@ :

<pre>
<code class="bash">
#!/bin/sh
PATH=/usr/local/bin:/usr/bin:/bin:/users/guest/assos/bin

sites_dir=~/htmltest/sites
backup_dir=~/Desktop/dump_d7
date=`date "+%Y-%m-%d-%Hh%Mm%Ss"`

cd $sites_dir

#Cherche dans le sous répertoire du répertoire courant sauf dans le sous répertoire
# all et dans les liens.
for dir in $(find . -maxdepth 1 -mindepth 1 -type d ! -name all )
do
cd $dir
drush sql-dump --result-file="$backup_dir/$dir.dump$date.sql"
cd -
done
</code>
</pre>

Ce script s’exécute une fois par semaine.

h2. maj.sh

Ce script est principalement constitué d'une suite de commandes drush et d'appels à d'autres scripts du projet.

Plus d'info sur les étapes précises dans les commentaires du script lui-même et dans le [[Scripts_et_taches_planifiees#la_mise_à_jour_des_projets|paragraphe suivant]].

h3. Comment le lancer ?

<code>maj.sh</code> ou <code>maj_d7.sh</code>, n'importe où.

NB : il faut que le module _update_ soit activé sur tous les sites de l'installation pour que ce script fonctionne.

h2. usep

Ce script a été créé dans le cadre de la [[De_Drupal6_vers_Drupal7|migration de drupal 6 à drupal 7]] mais peut être utilisé pour des tas de choses : il permet de savoir quels sont les sites qui utilisent (c'est-à-dire qui ont activé) un projet donné.

Pour le moment, il n'est fonctionnel que pour drupal 6, mais peut être adapté sans mal à drupal 7.

h3. Comment le lancer ?

Taper <code>usep projet</code> dans n'importe quel dossier de site de l'installation drupal 6.

h3. À quoi ça ressemble ?

(quelques commentaires sont également dispo directement dans le script pour mieux comprendre son fonctionnement)
<pre>
<code class="bash">
#si pas d'argument donnés :
if [ $# -lt 1 ]; then
echo "usage: $0 <drush args>"
exit 1
fi

cd [drupal_directory]/sites

for x in $(ls -1 | grep -v 'all' | grep -v file-*); do
if [ -d $x -a ! -L $x ]; then
cd $x;
if [ 1 = `drush pml --no-core --status=enabled | grep $1 | wc -l` ]; then
echo $x;
fi
cd -;
fi
done
</code>
</pre>

h2. Taille.sh

Ce script utilise la commande <code>du -hcs</code> pour retourner l'espace disque utilisé sur le compte assos, ainsi que sa répartition dans les différents répertoires des sites).

Ce script est notamment utilisé à la fin du script de mise à jour de projet ; son résultat est envoyé par mail au club drupal pour vérification.

h2. init_var.sh

Ce script permet d'initialiser des configurations et variables dangereuses, pour l'installation drupal 7. Il faut le lancer après chaque installation de sous-site.

h3. Comment le lancer ?

Taper <code>init_var.sh</code> (ou <code>drush init</code>) dans le dossier du site.

h3. À quoi ça ressemble ?

<pre>
<code class="bash">
drush vset error_level 0 --yes
</code>
</pre>

Cette commande permet de ne pas afficher les messages d'erreurs aux utilisateurs autre que les administrateurs. En effet, ils contiennent parfois des informations sensibles sur l'installation et ne doivent donc pas être divulguées à n'importe qui.

<pre>
<code class="php">
drush php-eval variable_set\(\'allow_authorize_operations\',FALSE\)\;
</code>
</pre>

Cette commande permet de ne pas autoriser les utilisateurs à installer et mettre à jour des modules via l'interface du site (fonctionnalité introduite dans drupal7). En effet, seul le club Drupal maintient les codes des projet, afin d'en garantir la pérennité.

<pre>
<code class="bash">
drush vset --always-set reverse_proxy TRUE
drush vset --always-set --format=json reverse_proxy_addresses '["147.94.19.16","147.94.19.17"]'
</code>
</pre>

Ces commandes permettent de déclarer à drupal les serveurs proxy du CRI afin d'éviter qu'il ne répertorie tous les visiteurs comme ayant l'adresse des sus-cités serveurs. Pour plus d'info, voir le mail de dgeo du 15 mai 2012.
<pre>
<code>
drush ev "variable_set('update_notify_emails', array('coucouuu@example.com'));"
</code>
</pre>

Cette commande permet de modifier l'adresse de la personne qui recevra des notifications lorsqu'une nouvelle mise à jour (projet ou noyau drupal) est disponible (NB : c'est le module (du noyau) _update_ qui gère ces envois, s'il est désactivé, aucune vérification des versions n'est effectuée)
Pour ne pas déranger les webmasters avec ceci, il faut mettre l'adresse du club drupal.

h2. reinit_var.sh

Ce script est utilisé pour réinitialiser des configurations et variables dangereuses sur tous les sites.

Des informations détaillées sont disponibles dans [[Scripts_et_taches_planifiees#la_réinitialisation_des_variables_dangeureuses|ce paragraphe]].

h3. Comment le lancer ?

Taper <code>reinit_var.sh</code> n'importe où.

h2. purge_des_sauvegardes.sh

Ce script permet de supprimer les vieilles sauvegardes de base de données, afin de libérer de l'espace disque.

Le script nettoie les sauvegardes de sites individuels et les sauvegardes des bases de données complètes d6 et d7.

h3. Comment le lancer ?

Il suffit de taper <code>purge_des_sauvegardes.sh</code> n'importe où dans le compte assos.

h3. À quoi ça ressemble ?

<pre>
<code class="bash">
cd [dump directory]

if [ $(ls -l | wc -l) -gt YY ] ; then # s'il y a plus de YY fichiers alors

ls -tr | head -XX | xargs rm; #supprime les XX fichiers les plus vieux

else # sinon, alerte

echo "mon message d'erreur" | mail -s "[dump assos] mon message d'erreur" assos@centrale-marseille.fr ;

fi
</code>
</pre>

{{important(Ce script supprime les x sauvegardes les plus vieilles de chaque catégorie (sites d7, tout d6, tout d7), sans aucune notion de temps. Cela implique que si des sauvegardes ont été faites manuellement, des sauvegardes automatiques plus vieilles seront supprimées (alors qu'elles ne sont pas nécessairement périmées !))}}

h2. drushall_atest_logged

Pour faire des commandes drush et quelles soient logguées par site dans le dossier Desktop/log/d7/nom_du_site.log

h1. Anciennes entrées du crontab

Ces entrées ne sont plus nécessaires mais conservées pour archive :

* 03 03 * * * /users/guest/assos/bin/drushall cron
* * */23 * * * echo "le crontab sas1 fonctionne, supprimer celui de scylla mnt !" | mail -s "sas1 is talking to you" assos