Nettoyage d’une tête d’impression d’une imprimante Canon MG 5650

Impression impossible car le cartouche noire (de grande capacité) ne sort plus : c'est bon pour les couleurs, mais tout ce qui est bureautique ne sort plus du coup.

Le coup classique, c'est la tête d'impression qui se bouche. J'avoue, je prends des cartouches d'encre compatibles car je trouve aberrant le prix de vente des cartouches constructeurs (certains pensent qu'elles ont tendance à plus facilement boucher la tête d'impression).

Après maintes « nettoyage des têtes » en profondeur (et fort gaspillage d'encre) c'est pas mieux.

À 60€ ~ 80€ l'imprimante neuve... quand elle tombe en panne, il est tentant de la poubelliser (surtout qu'acheter une tête c'est plus cher qu'une imprimante neuve).

Mais quand on a quelques cartouches en réserve, et qu'en plus on adhère pas au mouvement « j'achète / je jette / j'achète », on prend le temps d'essayer de réparer (et je parle pas de l'aspect écolo).

De toute façon, au pire : elle ne marche pas ! Donc je ne risque rien.

Allez, on démonte la bête et on voit ce qu'il y a dedans.

Lire la suite de l'article « Nettoyage d’une tête d’impression d’une imprimante Canon MG 5650 »

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 »

Gamification Moodle : dialogues façon SMS

J'ai inséré dans mon Moodle la possibilité d'afficher des dialogues façon SMS, joyeusement adapté de ce codepen.

Pour l'instant, je ne gère que dialogue gauche ou droite... J'envisage d'en créer plus en ajoutant des personnages (avatar + couleur) afin de créer des histoires plus élaborées.

Pour cela, j'ai ajouté des règles CSS à mon thème, en passant par : Administration > Présentation > Thèmes > More, puis dans le champ CSS personnalisée.

Lire la suite de l'article « Gamification Moodle : dialogues façon SMS »

Gamification Moodle : personnaliser les textes

Je viens de créer un filtre pour Moodle (en phase de test pour l'instant) qui permet d'intégrer dans vos textes Moodle des informations sur l'utilisateur « lecteur » du dit texte.

Par exemple, insérer son prénom, son adresse mail, son avatar, le nom de son groupe... et ainsi pouvoir afficher des textes type : « Bonjour Éric, comment vas-tu aujourd'hui ? », ou « Bienvenue dans l'équipe des Magiciens » ...

L'idée est de pouvoir personnaliser les textes pour créer un contenu qui s'adapte à l'utilisateur, et ainsi répondre à un des besoins de la gamification.

L'usage est simple : le filtre remplace des balises par les informations de l'utilisateur. Par exemple :

  • [USER:firstname] → prénom de l'utilisateur
  • [USER:picture] → avatar de l'utilisateur
  • [USER:group_name] → nom du groupe

Le filtre profite aussi de la possibilité d'ajouter des champs utilisateurs.

Pour télécharger, installer et tester le plugin : https://github.com/ebugnet/moodle-filter_userinfo.

Dans mes cartons, la possibilité d'insérer les champs de manière plus simple par l'ajout d'un plugin atto... mais tellement d'autres idées en tête !

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