Archives de catégorie : Administration

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

Regshot : Analyser les changements dans la base de registre

Vous avez peut être constaté que j'apprécie d'attaquer directement la base de registre de Windows pour apporter les modifications qui vont bien sur mes postes.

Je partage avec vous ma découverte du jour : Regshot.

Ce logiciel facile d'accès permet de faire une capture de la base de registre avant et après des événements, et d'en analyser les différences sous forme textuelle.

Utilisation

D'abord on le télécharge : https://sourceforge.net/projects/regshot/

Puis on le décompresse, et on le lance :

On exécute un 1er cliché :

On apporte les modifications sur le poste puis on effectue un 2ème cliché.

Enfin, on demande à comparer les deux clichés :

On obtient un fichier texte avec les clés / valeurs ajoutées, effacées ou modifiées.

Script VBS pour renommer un dossier

J'ai un petit défaut de préparation d'une image disque : un logiciel (SolidWorks) se lance automatiquement avec un complément (EFICN) alors que je n'en ai pas besoin... D'une part il est lent à se lancer, et en plus il demande un paramétrage : ça a tendance à gonfler les utilisateurs qui ne comprennent pas et perdent leur temps.

Plutôt que de refaire et redéployer l'image immédiatement, j'ai recherché à supprimer le lancement automatique de ce complément.

Après avoir analysé les éventuels changements dans la base de registre pour voir si je pouvais jouer la dessus (au passage, j'ai découverte Regshot pour analyser la BDR avant / après action), j'ai pu observer qu'un simple renommage du répertoire contenant EFICN suffisait... Reste à déployer ça par GPO.

Le script ci dessous renomme le répertoire C:\Program Files\EFICAD en C:\Program Files\EFICAD.old, et le tour est joué !

Rename_EFICN_folder.vbs

' --------------------------------------------------------
' Modifie le nom d'un répertoire s'il est présent sur
' le disque.
' 
' Author : Éric Bugnet - eric.bugnet.fr
' --------------------------------------------------------

Option Explicit

' Déclaration
dim Fso, Folder, FolderName, NewName
set Fso = CreateObject( "Scripting.FileSystemObject" )

' Dossier à vérifier / modifier
FolderName = "C:\Program Files\EFICAD"

' Si le dossier existe
if (Fso.FolderExists(FolderName )) then
    ' Renome le dossier en xxx.old
    Set Folder = Fso.GetFolder (FolderName)
    NewName = Folder.Name & ".old"
    Folder.Name = NewName
else
    ' Sinon rien à faire
    ' MsgBox "RAS"
end if

Il ne reste plus qu'à le lancer par GPO au démarrage de la machine (comme je l'ai déjà expliqué dans plusieurs articles de ce site).

Créer des évènements pour tester les alertes sur Zabbix

Il est parfois nécessaire de tester les effets d'un changement de configuration de votre Zabbix... Mais ça serait bien de pouvoir faire autrement qu'en arrêtant un serveur de production et attendre que votre outil préféré réagisse !

Bref, voici une méthode pour déclencher une alerte sur Zabbix à volonté (source).

Lire la suite de l'article « Créer des évènements pour tester les alertes sur Zabbix »

Envoyer les alertes mail Zabbix par Gmail et G-Suite

Mon établissement utilise G-Suite (anciennement les Google Apps), et je souhaite faire en sorte que mon serveur Zabbix envoi les mails par l'intermédiaire de Google mail (oui, je sais, c'est maaaaaal !).

Jusqu'à là ça peut paraitre simple, mais je n'ai pas réussi à paramétrer Zabbix pour cet envoi... Pourtant, tout semble être présent dans les paramétrage d'envois mail : serveur SMTP, port, adresse d'envoi, identifiant et mot de passe, TLS/SSL...

Après quelques recherche, j'ai trouvé une petite astuce permettant de contourner le problème.

La source est ici, mais en anglais et pas à jour avec la version actuelle.

Alors voici son actualisation in French dans le texte.

Lire la suite de l'article « Envoyer les alertes mail Zabbix par Gmail et G-Suite »