Tuer des processus MySQL de façon sélective

http://www.maraumax.fr/medias/Billets/mysql-shell.jpgJ'ai récemment eu besoin de killer tous les processus MySQL d'un utilisateur pour permettre une modification de table tranquillement. MySQL ne propose pas de commande pratique pour le faire et il est impossible d'ajouter des conditions à la commande kill.

Connectez vous à votre serveur MySQL et exécutez les commandes suivantes en utilisant vos conditions évidemment.

# Création d'un fichier temporaire sous la forme "kill id;"
select concat('KILL ',id,';') from information_schema.processlist where user='root' and time > 200 into outfile '/tmp/kill.tmp';
# On importe le fichier contenant nos commandes
source /tmp/kill.tmp;

Dans cet exemple, je récupère les IDs de tous les processus de l'utilisateur root lancés depuis plus de 200 secondes. N'hésitez pas à regarder la structure de la table processlist avec la commande suivante :

# Afficha la structure de la table des processus
describe information_schema.processlist;

Bon killing à vous !

Forcer le HTTPS avec un Load Balancer chez Amazon

http://www.maraumax.fr/medias/Billets/amazon-web-services.pngAmazon permet de configurer son service Load Balancing pour gérer le chiffrement de votre site et renvoyer du HTTP sur vos instances. Cette solution permet de décharger votre serveur WEB mais impossible d'utiliser la variable "SERVER_PORT" dans vos conditions car le serveur répond uniquement sur le port 80. Logique !

La solution est plus ou moins indiquée dans la documentation d'amazon et c'est en place depuis le 27 octobre 2010.

Il faut donc utiliser le header X-Forwarded-Proto qui contient le protocole du client renvoyé par le load balancer. Et voici deux petites lignes permettant de forcer le https à votre client :

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule !/status https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

La première ligne active le mod rewrite, la seconde vérifie si le protocole est donc différent de https et dans ce cas la troisième ligne effectue une redirection 301 vers le même domaine en excluant le cas ou vous consultez le server status !

Problème avec Pure Ftp Mysql et Inetd

Inetd est un démon très avantageux qui active automatiquement un service lorsqu'un client tente de s'y connecter. Il permet donc d'allouer des ressources uniquement quand c'est nécessaire. Suite à une mise à jour des paquets un serveur Debian, je me suis retrouvé avec une erreur lors de la connexion au ftp.

Can't exec "/usr/sbin/pure-ftpd": No such file or directory at /usr/sbin/pure-ftpd-wrapper line 174.

Cette erreur apparaît car inetd a mal été configuré avec pure ftp mysql. Pour la corriger il suffit d'éditer les quelques premières lignes du fichier /usr/sbin/pure-ftpd-wrapper.

Remplacez les trois lignes suivantes :

my $daemon = '/usr/sbin/pure-ftpd';
my @capabilities = @ARGV;
 
if ($ARGV[0]) {
$daemon = "$daemon-$ARGV[0]";
}

Par ceci :

my $daemon = '/usr/sbin/pure-ftpd-mysql';
my @capabilities = @ARGV;
 
#if ($ARGV[0]) {
#$daemon = "$daemon-$ARGV[0]";
#}

On a donc remplacer le chemin du démon et commenté les quelques lignes qui normalement auraient du ajouter "-mysql" au nom du démon.

Vous pouvez ensuite redémarrer inetd, et tout devrait à nouveau fonctionner !
/etc/init.d/openbsd-inetd restart

En espérant vous avoir rendu service !

Créer des miniatures de vidéos à la volée

Pour un projet qui devrait voir le jour dans les prochaines semaines / mois j'ai eu besoin de réaliser un script permettant de générer des vidéos à la volée.

J'ai donc travaillé sur un script qui est assez simple au final. Pour l'utiliser vous devez disposer de ffmpeg sur votre serveur.

Pour l'installer lancez simplement la commande suivante :

apt-get update
apt-get install ffmpeg

Et voici le script, nommez la captures.sh par exemple :

#! /bin/bash
 
#--- Paramètres
 
videowaitdir=/home/www/videos/
capturedir=/home/www/videos/screens/
 
numberscreens=10
 
#--- Traitement des vidéos
 
for video in `ls $videowaitdir`; do
	if [ -f $videowaitdir$video ]; then
		duration=`ffmpeg -i $videowaitdir$video 2>&1 | grep "Duration:" | awk '{print $2}' | tr -d , | cut -d . -f 1`
 
		if [ -z "$duration" ] || [ "$duration" = "00:00:00" ]
		then
			continue
		fi
 
		h=`echo $duration | cut -d : -f 1`
		m=`echo $duration | cut -d : -f 2`
		s=`echo $duration | cut -d : -f 3`
 
		totaltime=$(($h+$m+$s))
 
		time=$(($totaltime/$numberscreens))
 
		for((i=0;i<=$numberscreens;i++))
		do
			t=$(($time*$i+$time))
 
			ffmpeg -y -i $videowaitdir$video -f mjpeg -ss $t -vframes 1 -s 640x480 -an $capturedir$video.$i.jpg
		done
	fi
done

Modifiez simplement les deux premières variables qui sont :
videowaitdir : répertoire des vidéos
capturedir : répertoire des miniatures

Vous avez aussi une variable numberscreens qui détermine le nombre de screens à faire de la vidéo.

N'oubliez pas de modifier les permissions pour exécuter le bash :
chmod +x captures.sh
Le script est assez simple à comprendre, on liste les vidéos du dossier, on utilise ffmpeg pour récupérer le temps de la vidéo et on détermine à quels moments on doit faire les screens.

N'hésitez pas si vous avez des suggestions.

Consulter les message du boot sur Debian

J'ai récement eu besoin de consulter les messages retournés par les services lors du boot sur Debian mais impossible de trouver quoi que ce soit dans les fichiers de logs.

Après quelques recherche il s'est avéré qu'il faut activer une option pour loger les sorties dans un fichier.

Pour les activer, ouvrez le fichier :
/etc/default/bootlogd

Puis remplacez la valeur de BOOTLOGD_ENABLE par Yes.

# Run bootlogd at startup ?
BOOTLOGD_ENABLE=Yes

Vous pouvez désormais consulter les logs du boot dans le fichier
/var/log/boot

Et voici un exemple de contenu :

Thu Jul  5 15:05:08 2012: Configuring network interfaces...done.
Thu Jul  5 15:05:09 2012: Cleaning up temporary files....
Thu Jul  5 15:05:09 2012: Setting sensors limits.
Thu Jul  5 15:05:09 2012: Setting kernel variables ...done.
Thu Jul  5 15:05:09 2012: INIT: Entering runlevel: 2
Thu Jul  5 15:05:09 2012: Using makefile-style concurrent boot in runlevel 2.
Thu Jul  5 15:05:09 2012: Starting enhanced syslogd: rsyslogd.

En espérant que ça vous permettre de résoudre vos soucis !

Installer Red5 sur Debian Squeeze

http://www.maraumax.fr/medias/Billets/tutoriels/red5-logo.pngAujourd'hui c'est un tutoriel pour installer Red5, un équivalent de Flash Media Server de Adobe. J'utilise red5 dans le cadre d'un projet de publication de vidéo et audio en streaming.

J'utilisais jusqu'à aujourd'hui la version 0.9.1 disponible sur les dépôts Debian, mais je rencontrait quelques soucis donc j'ai préféré passer la dernière version 1.0 RC.

J'en ai profité pour écrire un petit tutoriel vous permettant d'effectuer cette installation. Je partagerais probablement quelques codes flash pour publier des flux vidéo (webcam) en utilisant red5 un jour !

Installer Red5 sur Debian Squeeze

Créer des onglets personnalisés sur Android

http://www.maraumax.fr/medias/Billets/tutoriels/preview-onglets.pngVous souhaitez créer des onglets personnalisés dans votre application Android ? Je viens de créer un tutoriel permettant de modifier l'aspect par défaut des onglets afin de créer des onglets plus esthétiques et moins importants en taille.

Le tutoriel est assez simple et consiste à créer une vue à partir d'un fichier xml pour chaque onglet. Dans mon exemple j'ai simplement ajouté du texte dans cette vue, mais vous pouvez évidemment ajouter "ce que vous souhaitez" mais si c'est pour mettre un texte et une image autant ne pas vous embêter et utiliser le layout de base d'Android.

Vous pouvez télécharger les sources du tutoriel à la fin, n'hésitez pas à montrer le résultat de vos modifications et pourquoi les différents fichiers XML afin de donner des exemples pour les autres visiteurs.

Créer des onglets personnalisés sur Android

Trouver une adresse à partir de coodonnées GPS en PHP

Pour ma prochaine application Android, j'ai souhaité retrouver l'adresse correspondant aux coordonnées du téléphone en php. La plupart des cas, quand on parle de cartographie il suffit de faire un tour dans les documentations du géant du web : Google.

Voici une petite fonction permettant de récupérer l'adresse correspondant à des coordonnées GPS:

function getAdresseFromCoords($lat, $lng)
{
	$content = file_get_contents('http://maps.googleapis.com/maps/api/geocode/json?latlng='.$lat.','.$lng.'&sensor=false');
 
	if(!$content)
		return false;
 
	$json = json_decode($content, true);
 
	if(!$json || $json['status'] != 'OK')
		return false;
 
	if(!isset($json['results'][0]['formatted_address']) && empty($json['results'][0]['formatted_address']))
		return false;
 
	return $json['results'][0]['formatted_address'];
}

Rien de bien compliqué, on appelle l'api google en lui envoyant nos coordonnées. Ca nous retourne un flux json avec nos informations si elles existent.

Voici un petit exemple d'utilisation :

// République, 35000 Rennes, France
if($adresse = getAdresseFromCoords('48.10968399999999', '-1.679257600000028'))
	echo $adresse;

Et voilà c'est tout simple ! N'hésitez pas à aller consulter la documentation de l'API Geocoding de Google si vous avez des interrogations !

[Android] Alterner les couleurs dans une liste

Les listview sur Android sont par défaut assez tristes. Voici un exemple vous permettant d'alterner les couleurs dans votre vue, en utilisant un adapter. Dans l'exemple j'utilise un SimpleAdapter mais vous pouvez évidement reproduire l'effet sur les BaseAdapter, ArrayAdapter et les autres wink

Voici le résultat
http://www.maraumax.fr/medias/Billets/listview-couleur-alterne.jpg

La mise en place est assez simple, vous pouvez télécharger les sources à la fin du billet si jamais vous voulez plus de détail.

Créer une nouvelle classe ListViewAdapter avec le code suivant :

import java.util.HashMap;
import java.util.List;
 
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.SimpleAdapter;
 
public class ListViewAdapter extends SimpleAdapter {
	private int color1 = 0xaaFF5F5F;
	private int color2 = 0xaa2F67FF;
 
	public ListViewAdapter(Context context, List<HashMap<String, String>> items, int resource, String[] from, int[] to) {
		super(context, items, resource, from, to);
	}
 
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
	  View view = super.getView(position, convertView, parent);
 
	  if(position % 2 == 0)
		  view.setBackgroundColor(color1);
	  else
		  view.setBackgroundColor(color2);
 
	  return view;
	}
}

Pour l'exemple j'ai mis les couleurs dans le code java, l'idéal étant de les mettrent dans un fichier colors.xml du dossier values pour par exemple changer la couleur en fonction d'un thème.

Il vous suffit ensuite de lier cette adapter à votre ListView en ajout la ligne suivante dans votre Activity :

// A ajouter dans l'Activity
list.setAdapter(new ListViewAdapter(this, listContent, R.layout.item, from, to));

Vous pouvez télécharger l'exemple complet à cette adresse et n'hésitez pas en cas de questions !

Ajouter PureFTP dans fail2ban

http://www.maraumax.fr/medias/Billets/fail2ban.pngFail2ban est un excellent framework permettant d'éviter ou du moins limiter les intrusions sur votre serveur. Voici la procédure pour ajouter le serveur ftp PureFTP dans les règles fail2ban. En ajoutant cette règle votre adresse ip peut se retrouver filtré à partir de trois echecs de connexion pendant 10 minutes (par défaut), faites donc attention à vos test !

Ajoutez au fichier /etc/fail2ban/jail.conf dans la section FTP servers de préférence le contenu suivant :

[pure-ftpd]
enabled = true
port = ftp,ftp-data,ftps,ftps-data
filter = pure-ftpd
logpath = /var/log/messages
maxretry = 3

Cette section vas permettre à fail2ban de filtrer (interdire) les ports 21, 20, 990 et 989 en cas de détection d'echec de login dans le fichier /var/log/messages (logs par défaut de PureFtpd)

Le fichier /etc/fail2ban/filter.d/pure-ftpd.conf est normalement crée par défaut sur votre machine, vérifiez son contenu. Il doit ressembler à celà :

# Fail2Ban configuration file
#
# Author: Cyril Jaquier
# Modified: Yaroslav Halchenko for pure-ftpd
#
# $Revision: 3$
#
 
[Definition]
 
# Error message specified in multiple languages
__errmsg = (?:Authentication failed for user|Erreur d'authentification pour l'utilisateur)
 
#
# Option: failregex
# Notes.: regex to match the password failures messages in the logfile. The
#         host must be matched by a group named "host". The tag "<HOST>" can
#         be used for standard IP/hostname matching and is only an alias for
#         (?:::f{4,6}:)?(?P<host>[\w\-.^_]+)
# Values: TEXT
#
failregex = pure-ftpd(?:\[\d+\])?: \(.+?@<HOST>\) \[WARNING\] %(__errmsg)s \[.+\]\s*$
 
# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =

Il s'agit de regex permettant de récupérer l'adresse IP d'un echec de connexion à votre serveur ftp.

Pour tester si votre regex est correcte, vous pouvez exécuter la commande suivante après avoir de préférence effectué une mauvaise connexion à votre serveur ftp.

# Test de la regex
fail2ban-regex /var/log/messages /etc/fail2ban/filter.d/pure-ftpd.conf

Vous devriez retrouver votre adresse IP dans "Addresses found".

Il faut ensuite re-démarrer le service fail2ban :

# On rédémarre
/etc/init.d/fail2ban restart

Pour vérifier si le filtre à bien été pris en compte, vous pouvez utiliser la commande suivante :

# Test
cat /var/log/fail2ban.log |grep pure-ftpd

Et vous devriez avoir le résultat suivant :

2012-03-27 10:23:10,041 fail2ban.jail   : INFO   Creating new jail 'pure-ftpd'
2012-03-27 10:23:10,041 fail2ban.jail   : INFO   Jail 'pure-ftpd' uses poller
2012-03-27 10:23:10,051 fail2ban.jail   : INFO   Jail 'pure-ftpd' started

Et voilà votre serveur ftp est maintenant géré par fail2ban !

Find Me If U Can - Retrouver votre mobile perdu !