Tout admin sera confronté un jour à un embêtant problème de mélange de charsets dans des documents texte sur le disque. Comme il n'est pas très pratique de convertir chaque fichier à la main, nous allons utiliser
iconv pour convertir de façon automatisée tous les fichiers vers l'encodage voulu (ici ISO-8859-1 ou Latin1). Le script prend en paramètre le nom du dossier contenant les fichiers à convertir, et il est possible de spécifier une liste d'extensions. Si un fichier est déjà au bon format, il ne sera pas converti.
#!/bin/bash
CONVPATH="$1"
EXTENSIONS=".php .txt"
if [ ! "$CONVPATH" ]; then
echo "Usage: $0 <path>"
exit
fi
echo "Converting from $CONVPATH..."
cd "$CONVPATH"
for ONESEARCH in $EXTENSIONS; do
FILELIST="$FILELIST`echo ; find . -type f -name \"*$ONESEARCH\" | sed 's/ /@@@@/g'`"
done
for ONEFILE in $FILELIST; do
ONEFILE_=`echo -n $ONEFILE | sed 's/@@@@/ /g'`
iconv --from-code=UTF-8 --to-code=ISO-8859-1 "$ONEFILE_" > "$ONEFILE_.1" 2>/dev/null
RV=$?
if [ $RV -ne 0 ]; then
echo "Error converting $ONEFILE_ ... rolling back."
rm -f "$ONEFILE_.1"
else
mv "$ONEFILE_.1" "$ONEFILE_"
fi
done
Si vous disposez d'une dropbox FTP semi-publique, il peut être intéressant de modifier automatiquement et périodiquement son mot de passe et d'en informer les personnes compétentes.
Ce petit script se charge de l'opération pour vous. Il vous suffira de le mettre en crontab pour bénéficier d'une ré-initialisation automatique du mot de passe.
#!/bin/bash
#<config>
USERNAME=partagedefichiers
PWLEN=10
EMAILTO="root@localhost"
SUBJ="Changement automatique du mot de passe FTP"
MSG="Bonjour,\n\nLe mot de passe pour le compte FTP $USERNAME a ete change automatiquement.\n\nLe nouveau mot de passe est :"
#</config>
function createrandpw {
LEN=$1
echo "`date +%N`$RANDOM`uptime`" | md5sum | sed -r "s/(.{$LEN}).*/\1/g"
}
function setuserpw {
PW=$1
USERNAME=$2
usermod -p `openssl passwd -1 $PW` $USERNAME
}
function emailnewpw {
NEWPW=$1
echo -e "$MSG $NEWPW" | mail -s "$SUBJ" "$EMAILTO"
}
NEWPW=`createrandpw $PWLEN`
setuserpw $NEWPW $USERNAME
emailnewpw $NEWPW
exit 0
Cette fois-ci ce n'est pas un script 'système' mais plutôt un script rigolo qui permet de gérer facilement une base de données des films qu'on a vus, ou qu'on souhaite voir.
Il dispose des fonctionnalités suivantes :
- ajouter/supprimer un film
- rechercher
- changer de vu à pas vu et inversément
- lister les films vus, à voir, ou l'ensemble, en triant par nom ou date
Pour l'utiliser, il suffit de copier le code dans un fichier "movie", par exemple, qu'on rend exécutable avec
chmod 755 movie.
Enjoy !
#!/bin/bash
#
# Movie script 1.0
# Keep track of your movie watching.
#
# Send bug reports to dev <at> slashorg <dot> net
#
# Last update: 20090525
#<config>
DBFILE="$HOME/.movie.db"
COLOR1="\033[32m"
#</config>
[ ! -f "$DBFILE" ] && touch "$DBFILE"
ACTION=$1
PARAM=$2
function cleanname {
echo "$*" | sed -E -e 's/[ ]{2,}/ /g' -e 's/^[ ]+//' -e 's/[ ]+$//' -e 's/\./ /g' -e 's/[^a-zA-Z0-9 ]//g' | tr A-Z a-z
}
function missing {
[ ! "$1" ] && echo " -> $2." && exit
}
function results {
[ $1 -eq 0 ] && echo " -> No results found." && exit
[ $1 -eq 1 ] && echo " - One result found -"
[ $1 -ne 1 ] && echo " - $1 results found -"
}
case "$ACTION" in
"add" )
missing "$PARAM" "File name missing"
NAME=`cleanname "$PARAM"`
missing "$NAME" "File name may contain illegal characters"
# Check for duplicate
[ `cat "$DBFILE" | grep -i ":$NAME" | wc -l` -ne 0 ] && echo " -> $NAME already exists in database." && exit
echo "`date +"%d-%m-%Y"`:$NAME" >> "$DBFILE"
echo " -> Record added."
;;
"remove" )
missing "$PARAM" "File name missing"
cat "$DBFILE" | grep -vi ":$PARAM" > "$DBFILE.new"
if [ `diff "$DBFILE" "$DBFILE.new" | wc -l` -eq 0 ]; then
echo " -> Name not found."
rm -f "$DBFILE.new"
exit
else
echo " -> One record deleted."
mv "$DBFILE.new" "$DBFILE"
fi
;;
"search" )
missing "$PARAM" "Search query missing"
SORTBY=2
NAME=`cleanname "$PARAM"`
RES="`cat $DBFILE | grep "$NAME" | sort -t ":" -k $SORTBY | awk 'BEGIN { FS = ":" } { print " \033[32m"$2"\033[31m"$3"\033[0m added "$1; }'`"
COUNT=`echo "$RES" | sed '/^$/d' | wc -l | sed 's/[^0-9]//g'`
results $COUNT
echo "$RES"
echo "# = unseen"
;;
"flip" )
missing "$PARAM" "File name missing"
NAME=`cleanname "$PARAM"`
[ `cat "$DBFILE" | grep -iE ":$NAME[:#]*$" | wc -l` -eq 0 ] && echo " -> $NAME cannot be found." && exit
if [ "`cat "$DBFILE" | grep -i ":$NAME" | awk 'BEGIN { FS = ":" } { print $3; }'`" == "" ]; then
echo -e " -> Changing status to$COLOR1 unseen\033[0m."
cat "$DBFILE" | sed "s/:$NAME/:$NAME:#/" > "$DBFILE.new"
else
echo -e " -> Changing status to$COLOR1 seen\033[0m."
cat "$DBFILE" | sed "s/:$NAME:#/:$NAME/" > "$DBFILE.new"
fi
mv "$DBFILE.new" "$DBFILE"
;;
"list" | "seen" | "unseen" )
SORTBY=1
[ "$PARAM" == "date" ] && SORTBY=1
[ "$PARAM" == "name" ] && SORTBY=2
[ "$ACTION" == "list" ] && SEARCH="grep :"
[ "$ACTION" == "seen" ] && SEARCH="grep -v :#$"
[ "$ACTION" == "unseen" ] && SEARCH="grep :#$"
RES="`cat $DBFILE | $SEARCH | sort -t ":" -k $SORTBY | awk 'BEGIN { FS = ":" } { print " \033[32m"$2"\033[0m added "$1; }'`"
COUNT=`echo "$RES" | sed '/^$/d' | wc -l | sed 's/[^0-9]//g'`
results $COUNT
echo "$RES"
;;
* )
echo " - Usage -"
echo -e "$COLOR1 $0 add <name>\033[0m - add <name> to database."
echo -e "$COLOR1 $0 remove <name>\033[0m - remove <name> from database."
echo -e "$COLOR1 $0 search <key>\033[0m - search database for <key>."
echo -e "$COLOR1 $0 flip <name>\033[0m - change status from seen to unseen."
echo -e "$COLOR1 $0 list [date|name]\033[0m - list complete database sorting by date or name."
echo -e "$COLOR1 $0 seen [date|name]\033[0m - list seen database sorting by date or name."
echo -e "$COLOR1 $0 unseen [date|name]\033[0m - list unseen database sorting by date or name."
;;
esac
Ce tout petit script permet de voir l'activité d'un serveur MySQL local assez simplement. Il génère les stats en forme CSV ce qui permet de tracer les résultats :
crontab
*/1 * * * * /usr/local/bin/mysqlstat.sh >> mysqlstat.csv
mysqlstat.sh
#!/bin/bash
SAMPLE=10
USER=root
PW=myrootpassword
NOWDATE=`date +"%D %H:%M"`
MYSQLADMIN=/usr/local/mysql/bin/mysqladmin
T1=`$MYSQLADMIN -u $USER -p$PW status | sed 's/.*Questions: //' | sed 's/ Slow queries:.*//'`
sleep $SAMPLE
T2=`$MYSQLADMIN -u $USER -p$PW status | sed 's/.*Questions: //' | sed 's/ Slow queries:.*//'`
T=`expr $T2 - $T1`
TT=`expr $T / $SAMPLE`
echo "$NOWDATE ; Requests: $T ($TT per sec.)"
On a reçu une nouvelle baie de stockage au travail, et comme je voulais être sûr de la fiabilité de la solution avant la mise en production, j'ai conçu une battérie de tests, dont le script suivant. Son but est de générer un très grand nombre (un million) de fichiers vides afin de mesurer l'efficacité du contrôleur RAID à travailler sur beaucoup de fichiers et de détecter des bugs de verouillage dans l'implémentation NFS de l'éditeur de la solution, sans oublier les performances de l'ensemble.
Il peut s'utiliser directement sur un disque local pour vérifier un contrôleur RAID, sur un partage SMB ou NFS ou bien sur un disque SAN ou iSCSI.
Quand la génération est terminée, je conseille un petit rm -rf /mnt/nfs/temp pour finir le test...
manyfiles.sh
#!/bin/bash
##################################################
# Date : 20090417 #
# License : BSD #
# Author : dev -at- slashorg -dot- net #
# #
# About : FS and disk benching tool. #
##################################################
FILECOUNT=1000000
FILEPERDIR=5000
COPYTO=/mnt/nfs/test
OSTYPE=`uname`
[ "$OSTYPE" == "Linux" ] && DIRSEQ=`seq -s " " -w 1000`
[[ "$OSTYPE" == "Darwin" || "$OSTYPE" == "FreeBSD" ]] && DIRSEQ=`jot -w %03d -s " " 1000`
ANS="N"
[ -d "$COPYTO" ] && echo -n "*** $COPYTO exists. Delete? (Y/N) " && read ANS
[ "$ANS" == "Y" ] && echo " -> $COPYTO deleted." && rm -rf "$COPYTO"
[ ! -d "$COPYTO" ] && mkdir -p "$COPYTO"
echo -n "Progress: "
I=0
for ONESEQ in $DIRSEQ; do
mkdir "$COPYTO/$ONESEQ" && cd "$COPYTO/$ONESEQ"
[ "$OSTYPE" == "Linux" ] && touch `seq -s " " -w $FILEPERDIR`
[[ "$OSTYPE" == "Darwin" || "$OSTYPE" == "FreeBSD" ]] && touch `jot -w %04d -s " " $FILEPERDIR`
echo -n "."
I=$(( $I + $FILEPERDIR ))
[ $I -ge $FILECOUNT ] && echo " done." && exit
done