Archives de catégorie : Administration

Dupliquer un fichier et le nommer d’après une liste

J'aurais aussi pu intituler cet article : « Créer un fichier Excel® par candidat »

Je reviens d'une séance de correction d'épreuve... Désormais, l'évaluation se faisant par compétences, nous devons remplir une feuille Excel® par candidat.

On pourrait envisager une seule feuille Excel© avec autant d'onglets que de candidat, ça simplifierait la récolte pour analyse finale et la génération des onglets en interne par script, mais comme nous sommes plusieurs correcteurs nous ne pouvons pas tous travailler sur le même document (je sais qu'il existe des alternatives, mais on ne fait pas toujours ce qu'on veut).

Donc un fichier Excel® par candidat... soit  un peu moins de 250 fichiers à créer. Cette fois ci nous les avons fait à la main : copier le modèle / coller / renommer pour chacun des candidats par le premier correcteur de la copie.

De retour, je me dis que je vais croiser cette situation de plus en plus régulièrement maintenant, et qui si je pouvais automatiser ça ce serait pratique. Ça pourrait aussi me servir à d'autres occasions.

Lire la suite de l'article « Dupliquer un fichier et le nommer d’après une liste »

Déployer une application au format MSI par GPO (exemple avec 7-zip)

Pour mon boulot j'ai parfois besoin de déployer sur un « grand nombre » de postes (trop grand pour le faire un à un) des applications. Cas concret de la semaine : mise à jour de sécurité de 7-zip sur une partie de mon parc... que je viens de réinstaller deux semaines plus tôt !

Si les développeur proposent des fichiers au format msi, ça simplifie grandement les choses : nul besoin de scripter.

Voici les différentes étapes que j'applique en prenant exemple sur le déploiement de 7-zip nouvelle version :

  1. Récupérez le fichier msi correspondant chez les développeurs : https://www.7-zip.org/download.html et testez le sur un client
  2. Créez un répertoire partagé dans lequel vous déposez le fichier .msi et accessible par tous les utilisateurs : « \\serveur\deploy\7zip\ »
  3. Créez une GPO nommée : « APP - install 7-zip »
  4. Assignez le fichier msi à la GPO (ici appliqué à un ordinateur, mais peut être fait sur un utilisateur) :
    • Clic droit sur la GPO > Modifier
    • Configuration ordinateur > Stratégies > Paramètres du logiciel > Installation de logiciel
    • Clic droit dans la zone blanche > Nouveau > Package
    • Indiquer le chemin UNC complet du fichier : \\serveur\deploy\7zip\7z1805-x64.msi puis cliquez sur Ouvrir
    • Sélectionnez Attribué
    • Validez avec OK
  5. Liez la GPO à un groupe d'ordinateur de test, et testez...

Le logiciel devrait s'installer au démarrage de la machine.

Quelques remarques supplémentaires :

  • Les modifications de stratégies de groupe peuvent prendre du temps, vous pouvez forcer sa prise en compte sur un client en faisant un : « gpudpate /force » dans l'invite de commande.
  • La commande « gpresult » permet de savoir ce qui est appliqué sur un client. Par exemple : « gpresult /H c:\gpresult.html »générera un fichier html avec le résultat de votre commande GPResult
  • Pour redéployer un package déjà déployé, retournez sur la GPO jusqu'au package, puis faites un clic droit sur le package > Toutes les taches > Redéploiement des applications
  • Pour supprimer un package déployé, retournez sur la GPO jusqu'au package, puis faites un clic droit sur le package > Toutes les taches > Supprimer

Migration d’un Moodle sur un autre serveur

Je partage avec vous un retour d'expérience sur la migration d'un Moodle installé sur un Ubuntu 14 version un nouveau serveur sur un OS Ubuntu LTS.

J'ai voulu profiter de cette migration pour faire une remise à zéro : mon ancien Moodle commence à dater (2005) et à subi quelques soucis de débutants et modifications de code à la main qui peuvent apporter des instabilités, voir des problèmes de sécurité. Je n'ai donc pas opté pour simplement copier le répertoire et la base de donnée.

Avant tout : assurer une sauvegarde complète et fonctionnelle du site.

Lire la suite de l'article « Migration d’un Moodle sur un autre serveur »

Mise à jour Moodle par git : problème de git

Sur une toute nouvelle installation de Moodle, mon git pull ne voulait pas fonctionner :

error: Your local changes to the following files would be overwritten by checkout: [list of files changed in the active branch] Please, commit your changes or stash them before you can switch branches. Aborting

Pour savoir ce qui se passe, j'ai fait un git status, puis un git diff.

old mode 100755  
new mode 100644

Ça m'a permis de comprendre que le problème ne venait pas des fichiers en eux même, mais des droits apposés aux fichiers qui ne correspondaient pas.

J'ai donc configuré git pour ne pas prendre en compte les changements de mod.

git config core.filemode false

 

Contourner le « Matériel non pris en charge » sous Windows© 7

Surprise...

Installation d'une salle informatique sous Windows© 7 en juillet pour préparer la rentrée de septembre (tout marche bien), petite update fin aout = la salle informatique qui ne veut plus fonctionner correctement sous Windows© 7 à la rentrée : plus de mise à jour possible car les processeurs sont trop récents !

Bref : légère incitation à passer à Windows© 10.

Non de diou... plus de mise à jour de sécurité... pour votre bien les gars... Ils sont pas un peu tarés ?

J'ai enfin fait une petite recherche pour contourner le problème (car l'achat de licences Windows© 10 est pas encore totalement clair chez nous), et je suis tombé sur ça : WuFuc (soit Windows Update F...).

Installation simple, et ça semble fonctionner... Merci Zeffi.

J'hésite à déployer...

Nota : il faut utiliser la version v0.7.1.81, car la suivante plante.

PS : Pour anticiper, la mise à jour gratuite (et forcée) entre 7 à 10 ça marche bien pour les particuliers. Coté entreprise avec les licences de groupées, c'est pas pareil.

Superviser les ordinateurs de votre salle de cours avec Veyon

Veyon est le successeur officiel d'iTALC, dont j'avais fait quelques articles précédemment et qui n'est plus maintenu.

J'ai été surpris de voir que le développement avait repris et qu'il mène à un produit bien sympa.

À quoi ça sert ?

Une fois le client Veyon installé sur le poste de vos étudiants, vous pouvez voir les écrans de vos ouailles avec le Veyon Master (pour savoir s'ils glandent ou travaillent).

Pour l'aspect moral, légal et politique, je m'auto-réfère à mon article sur iTALC : mon avis n'a pas changé.

Image honteusement pompée du site Veyon.io

Mais encore ?

  • voir les écrans des élèves
  • verrouiller les écrans des élèves
  • envoyer votre écran sur celui des élèves
  • contrôler les ordinateurs des élèves
  • allumer / redémarrer / déconnecter l'utilisateur ou éteindre l'ordinateur (pratique en début et fin de séance)
  • envoyer un message texte sur les écrans des élèves
  • ouvrir une page internet
  • lancer un programme
  • il manque pour l'instant la connexion directe qu'on avait sur iTALC à un moment

Et le petit plus : ça marche sur Windows et Linux, car ça utilise simplement VNC.

Ha... et c'est bien sûr open source, disponible sur github, et gratuit...

Mais c'est comme iTALC ?

Ben, oui mais non, y'a des trucs qui sont revenus, d'autres disparus, et un petit plus génial que je vous réserve pour plus tard (suspens...).

Lire la suite de l'article « Superviser les ordinateurs de votre salle de cours avec Veyon »

Script pour remplacer iTALC par Veyon

Veyon est le remplaçant officiel d'iTALC : un logiciel qui permet de superviser les écrans de vos étudiants.

J'ai créé un script VBS permettant de :

  1. supprimer iTALC
  2. installer Veyon (client)
  3. configurer Veyon

Je lance ce script par GPO au démarrage de l'ordinateur.

Il faut au préalable créer un répertoire partagé contenant :

  • le fichier d'installation de Veyon : \\serveur\veyon$\veyon-4.0.1.0-win64-setup.exe
  • un dossier config comprenant le fichier de configuration : \\serveur\veyon$\config\config.json

Script : Install Veyon.vbs

' --------------------------------------------------------
' Install Veyon (with iTalc removing)
' 
' Author : Éric Bugnet - eric.bugnet.fr
' --------------------------------------------------------

Option Explicit
On Error Resume Next

' Declaration
Dim objShell, objFSO, WshShell, FolderName
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.shell")
Set WshShell = CreateObject("WScript.Shell")

' Check if Veyon is already installed
FolderName = "C:\Program Files\Veyon"

' If exist
if (objFSO.FolderExists(FolderName )) then
 ' Veyon found, nothing to do
 
else

' Delete iTalc if finded
 FolderName = "C:\Program Files\iTALC"
 if (objFSO.FolderExists(FolderName )) then
 Set objShell = CreateObject("WScript.shell")
 objShell.run """C:\Program Files\iTALC\uninstall.exe"" /S", 1, True
 WScript.Sleep 30000
 end if
 
 'Install Veyon
 Set objShell = CreateObject("WScript.shell")
 objShell.run """\\serveur\veyon$\veyon-4.0.1.0-win64-setup.exe"" /S /NoMaster /ApplyConfig=""\\serveur\veyon$\config\config.json""", 1, True
 WScript.Sleep 30000


end if

Colorer le prompt pour distinguer les serveurs

Je travaille régulièrement avec plusieurs fenêtres SSH ouvertes, chacune correspondant à un serveur différent.

Pour faciliter la distinction entre les différents serveurs et limiter les risques d'erreur, j'ai mis en place la solution qui consiste à colorer une partie du terminal.

Mise en forme

Syntaxe originale :

\u@\h:\w\$
  •  \u : nom de l'utilisateur
  • \h : nom de l’hôte
  • \w : arborescence
  • \$ : affiche # si root, $ sinon
  • [\t] : heure locale

Voici un exemple de ce que j'utilise :

Lire la suite de l'article « Colorer le prompt pour distinguer les serveurs »

Résolution du problème des règles d’évitement de logcheck pour sSMTP

Logcheck est un logiciel qui analyse les logs du serveur et renvoi par mail des infos sur les problèmes rencontrés.

Malgré le paramétrage qui semble être correct, les règles d'évitement (ignorance) des log de sSMTP n'étaient pas appliquées et je recevais toutes les heures un message du type :

System Events
=-=-=-=-=-=-=
Mar 28 07:02:06 hostname sSMTP[32192]: Creating SSL connection to host
Mar 28 07:02:07 hostname sSMTP[32192]: SSL connection using RSA_AES_128_CBC_SHA1
Mar 28 07:02:09 hostname sSMTP[32192]: Sent mail for mail@domain.com (221 2.0.0 closing connection t19071wmt.23 - gsmtp) uid=110 username=logcheck outbytes=1437

J'ai trouvé la solution sur cet article :

Étape 1

Le fichier dans lequel les règles sont inscrites n'a pas les même droits que les autres... Vérifiez en faisant :

cd /etc/logcheck/ignore.d.server
ll

Chez moi, le fichier ssmtp n'a pas les mêmes autorisations que ses copains.

Pour corriger ça :

chown root:logcheck /etc/logcheck/ignore.d.server/ssmtp
chmod 644 /etc/logcheck/ignore.d.server/ssmtp

Étape 2

L'expression des règles est incomplète. J'utilise maintenant celles proposées dans l'article cité.

nano /etc/logcheck/ignore.d.server/ssmtp

Y coller les règles suivantes :

# My custom pattern
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ sSMTP\[[0-9]+\]: Creating SSL connection to host$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ sSMTP\[[0-9]+\]: SSL connection using [._[:alnum:]-]+$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ sSMTP\[[0-9]+\]: Sent mail for .*$
# End of custom pattern

Sauvegarde de mon serveur web

Le serveur hébergeant entre autres Moodle et GLPI est une machine virtuelle située dans notre établissement.

Voici notre politique de sauvegarde et les scripts associés.

Principe de la sauvegarde

Chaque nuit, les BDD et les répertoires critiques de mon serveur sont copiés sur un espace disque partagé et sécurisé. Il en résulte donc un répertoire par jour d'environ 200 Go avec une navigation rapide dans l'arborescence si nécessaire.

Chaque semaine, ces même sauvegardes (mais pas seulement) sont copiées sur un disque externe, puis mise dans un coffre fort situé dans un autre bâtiment. Deux disques jouent ce rôle l'un après l'autre.

Il en résulte donc 3 semaines de sauvegarde facilement accessibles et relativement bien protégées.

J'ai hérité de scripts de sauvegarde que j'ai adapté à mes besoins pour gagner en efficacité et rapidité de traitement.

Prérequis

Un répertoire réseau partagé

Les copies seront dans un premier temps placées dans un répertoire réseau  partagé avec accès par un utilisateur en écriture correspondant à la machine qui crée la sauvegarde.

Un utilisateur MySQL dédié

Par sécurité, chaque base de donnée à un accès en écriture par un utilisateur différent (je n'utilise pas l'utilisateur root...). Je crée donc un utilisateur « dump » dédié à la tache de copier la base et qui n'a besoin que d'un accès en lecture à chacune des base.

mysql -u root -p -e "CREATE USER 'dump'@'localhost' IDENTIFIED BY 'LEMOTDEPASSE';"
mysql -u root -p -e "GRANT SELECT , SHOW DATABASES , LOCK TABLES , SHOW VIEW ON * . * TO 'dump'@'localhost' IDENTIFIED BY 'LEMOTDEPASSE' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;"

Les fichiers qui vont bien

Script de sauvegarde

Petite explication des étapes :

  1. D'abord, on déclare les variables de travail.
  2. Je demande que les erreurs soient logguées dans un fichier error.log.
  3. D'un autre coté, je logue chaque étape dans un fichier backup.log avec les horaires correspondants.
  4. Je baisse la priorité de l'action de manière à ce que si des utilisateurs veulent accéder au serveur, il puisse répondre convenablement.
  5. Pour le dump des bases de données, la seule particularité réside dans le fait que je dump en local pour en faire une copie des fichiers ensuite : charge le serveur moins longtemps.
  6. Je monte ensuite le disque de manière faire mes copies.
  7. Pour la copie des fichiers, j'utilise rsync qui fait une copie « simple » lors de la première sauvegarde (4h30 pour 200 Go, soit les 7 premiers jours) mais qui ensuite ne fera qu'une synchronisation (durée ramenée à 30 minutes environ). Dans les options de rsync, j'utilise selon les cas :
    • --stats : affiche les statistiques de l'opération
    • --progress : affiche la progression de l'opération
    • --copy-links : copie les fichiers cibles des liens symbolique en tant que fichiers
    • --delete-after : qui supprime sur la destination les fichiers ayant été supprimés dans la source, en fin d'opération.
    • --exclude-from : qui indique un fichier texte dans lequel j'écris les répertoires et fichiers à ne pas synchroniser.
  8. Je copie les fichiers de log sur le répertoire distant.
  9. Je démonte le disque réseau.
  10. J'envoie un rapport par mail.

sauvegarde.sh

#!/bin/bash

# Création des variables
# Globales
MAIL='mail@domaine.fr'
HOSTNAME='computer name'
SAVE_DIR='//192.168.1.1/backup'
MOUNTED_DIR='/mnt/sauvegarde'
LOCAL_SQL_DIR='/home/scripts/dump_sql'
LOG_FILE='/home/scripts/backup.log'
ERROR_LOG_FILE='/home/scripts/error.log'
# User for external disk usage
EXT_USER='user'
EXT_PASS='password'
EXT_DOMAIN='domain'
# SQL user informations
SQL_USER='dump'
SQL_PASS='pass_sql'
SQL_EXCLUSION='(information_schema|performance_schema)'

# Dates
NOW=$(date +"%Y-%m-%d")
DAY=$(date +"%A")
MOUNTH=$(date +"%m")
WEEK=$(date +"%V")
YEAR=$(date +"%Y")

# Destination directory
DEST_DIR=$MOUNTED_DIR/$DAY 

# Error log
echo "Error log for $NOW :">$ERROR_LOG_FILE
exec 2>> $ERROR_LOG_FILE

# Low priority
ionice -c3 -p$$ &>/dev/null
renice -n 19 -p $$ &>/dev/null

## Let's go
echo "Backup for $NOW on $HOSTNAME :">$LOG_FILE
echo " ">>$LOG_FILE

# Local MySQL dump
echo "Local MySQL dump">>$LOG_FILE

# Make local directory if not exist
 mkdir -p $LOCAL_SQL_DIR;
 
 # Get bases name
 databases="$(mysql -u$SQL_USER -p$SQL_PASS -Bse 'show databases' | grep -v -E $SQL_EXCLUSION)"
 
 # Dump
 for database in ${databases} 
 do
 echo "$(date +"%H:%M:%S") : dump $database">>$LOG_FILE
 mysqldump -u$SQL_USER -p$SQL_PASS $database > $LOCAL_SQL_DIR/${database}.sql
 done

# End local MySQL dump
echo "$(date +"%H:%M:%S") : dump finished">>$LOG_FILE
echo "------------------------------------">>$LOG_FILE

# Directory sync 
echo "Files sync">>$LOG_FILE

# Make mounted directory if not exist
 mkdir -p $MOUNTED_DIR;

# Mount
 echo "$(date +"%H:%M:%S") : mount $MOUNTED_DIR">>$LOG_FILE
 mount -t cifs -o username=$EXT_USER,pass=$EXT_PASS,domain=$EXT_DOMAIN $SAVE_DIR $MOUNTED_DIR

# Make destination directory if not exist
 mkdir -p $DEST_DIR;

# Sync files
 echo "$(date +"%H:%M:%S") : sync $LOCAL_SQL_DIR">>$LOG_FILE
 rsync -a --stats --progress --delete-after $LOCAL_SQL_DIR $DEST_DIR

echo "$(date +"%H:%M:%S") : sync /var/www/html">>$LOG_FILE
 rsync -a --stats --progress --exclude-from=/home/scripts/excludes_html.txt --delete-after /var/www/html $DEST_DIR

echo "$(date +"%H:%M:%S") : sync /root">>$LOG_FILE
 rsync -a --stats --progress --copy-links --delete-after /root $DEST_DIR

echo "$(date +"%H:%M:%S") : sync /etc">>$LOG_FILE
 rsync -a --stats --progress --copy-links --delete-after /etc $DEST_DIR

echo "$(date +"%H:%M:%S") : sync /home/moodledata">>$LOG_FILE
 rsync -a --stats --progress --exclude-from=/home/scripts/excludes_moodledata.txt --delete-after /home/moodledata $DEST_DIR

# End directory sync
echo "$(date +"%H:%M:%S") : sync finished">>$LOG_FILE
echo "------------------------------------">>$LOG_FILE

# Synchronisation des buffers des disques 
sync

# Log file copy
echo "$(date +"%H:%M:%S") : copy log file">>$LOG_FILE
cp $LOG_FILE $DEST_DIR/
echo "$(date +"%H:%M:%S") : copy error file">>$LOG_FILE
cp $ERROR_LOG_FILE $DEST_DIR/

# Umount 
echo "$(date +"%H:%M:%S") : unmount $MOUNTED_DIR">>$LOG_FILE
umount $MOUNTED_DIR

# Ended
echo "$(date +"%H:%M:%S") : -- Backup done ! --">>$LOG_FILE

# Send mail report
mail -s "$HOSTNAME : $NOW backup report" $MAIL < $LOG_FILE
mail -s "$HOSTNAME : $NOW error log" $MAIL < $ERROR_LOG_FILE

 

Fichier d'exclusion pour le répertoire Moodledata

J'enlève les fichiers bak et log, les fichiers de sessions et temporaires de moodle (peut être un héritage des anciennes versions d'ailleurs).

excludes_moodledata.txt

*.bak
*.log
/moodledata/sessions
/moodledata/temp

Fichier d'exclusion pour le répertoire html

J'enlève les fichiers bak et log, les fichiers de sessions de GLPI, et quelques répertoires situés dans /var/www/html commençant par _.

excludes_html.txt

*.bak
*.log
/html/glpi/files/_sessions
/html/_*

Automatisation

Après essais et ajustement, et surtout vérification que les fichiers de la sauvegarde soient bien présents et utilisables, je demande à un cron d’exécuter ce script chaque nuit à 23h00.

00 23 * * * sh /home/scripts/sauvegarde.sh

Édition :

  • Edit suite à la remarque de Cascador : mkdir -p

Sources d'inspiration :

  • http://david.mercereau.info/script-de-sauvegarde-mysql-par-base-mysql_dump-sh/
  • http://linuxfocus.org/Francais/March2004/article326.shtml