Archives pour mars, 2012

Java : caster un Object en Map

Alors le casse-tête du jour : comment convertir un Object en une Map ?

Solution avec dans mon cas une Map<Object,Object> – ce qui constitue toute la difficulté – :

Object ret;
Map<Object, Object> map;

ret = getData();
map = safeCastMap(ret, Object.class, Object.class);

Voici les fonctions de vérifications nécessaires  :

	@SuppressWarnings({ "unchecked" })
	public static <K, V> Map<K, V> safeCastMap(Object map, Class<K> keyType,
			Class<V> valueType) {
		checkMap(map);
		checkMapContents(keyType, valueType, (Map<?, ?>) map);
		return (Map<K, V>) map;
	}

	private static void checkMap(Object map) {
		checkType(Map.class, map);
	}

	private static <K, V> void checkMapContents(Class<K> keyType,
			Class<V> valueType, Map<?, ?> map) {
		for (Map.Entry<?, ?> entry : map.entrySet()) {
			checkType(keyType, entry.getKey());
			checkType(valueType, entry.getValue());
		}
	}

	private static <K> void checkType(Class<K> expectedType, Object obj) {
		if (!expectedType.isInstance(obj)) {
			throw new IllegalArgumentException("Expected " + expectedType
					+ " but was " + obj.getClass() + ": " + obj);
		}
	}

Zabbix : monitorer un serveur Postfix

Voici les différents éléments de configuration nécessaires à la supervision d’un serveur Postfix avec Zabbix.

En premier lieu, rajouter un élément dans le fichier de configuration de l’agent Zabbix /etc/zabbix/zabbix_agentd.conf pour reporter le nombre actuel de mails dans la file d’exécution :

UserParameter=postfix.mailq,mailq|grep -v "Mail queue is empty"|grep -c '^[0-9A-Z]'

Ne pas oublier de créer l’élément dans l’interface web de Zabbix et le graphique associé.

Pour monitorer les statistiques sur les messages traités par Postfix, il convient d’installer les programmes pflogsumm ainsi que logcheck. Le premier permet d’analyser le journal du serveur et produire un rapport détaillés sur les messages. logcheck apporte quant à lui la commande logtail qui va permettre d’accélérer le temps de parsing du fichier log en gardant un offset de position à chaque passe par pflogsumm.

L’analyse s’effectue par ce script qu’il conviendra de placer en cron selon l’intervalle de temps désiré. Le script se charge d’envoyer les  différentes valeurs au serveur Zabbix gràce à la commande zabbix_sender :

#!/bin/bash
PFLOGSUMM=/usr/bin/pflogsumm.pl
MAILLOG=/var/log/mail.log
LOGTAIL=/usr/sbin/logtail
DAT1=/tmp/zabbix-postfix-offset.dat
DAT2=$(mktemp)
ZABBIX_SENDER=/usr/bin/zabbix_sender
ZABBIX_CONF=/etc/zabbix/zabbix_agentd.conf
DEBUG=0

function zsend {
   key="postfix.`echo "$1" | tr ' -' '_' | tr '[A-Z]' '[a-z]' | tr -cd [a-z_]`"
   value=`grep -m 1 "$1" $DAT2 | awk '{print $1}'`

   [ ${DEBUG} -ne 0 ] && echo "Send key \"${key}\" with value \"${value}\"" >&2
   $ZABBIX_SENDER -c $ZABBIX_CONF -k "${key}" -o "${value}" 2>&1 >/dev/null
}

$LOGTAIL -f $MAILLOG -o $DAT1 | $PFLOGSUMM -h 0 -u 0 --bounce_detail=0 --deferral_detail=0 --reject_detail=0 --no_no_msg_size --smtpd --warning_detail=0 > $DAT2

zsend received
zsend delivered
zsend forwarded
zsend deferred
zsend bounced
zsend rejected
zsend held
zsend discarded
zsend "reject warnings"
zsend "bytes received"
zsend "bytes delivered"
zsend senders
zsend recipients

rm $DAT2

Template XML : [Téléchargement non trouvé]

Source : http://www.zabbix.com/wiki/howto/monitor/mail/postfix/monitoringpostfix

Java : itérer sur une Map « proprement »

Mauvaise méthode :

Map<Object,Object> map = getData();

for (Object key : map.keySet())
{
   System.out.println(key + "=" + map.get(key));
}

Bonne méthode :

Map<Object,Object> map = getData();

for (Map.Entry<Object,Object> entry : map.entrySet())
{
   System.out.println(entry.getKey() + "=" + entry.getValue());
}

OpenSSH : proxy SOCKS local

Afin de sécuriser vos sessions web (et autres) sur un réseau dont vous n’avez aucune confiance, OpenSSH permet de créer un proxy SOCKS local pour y rediriger et sécuriser l’ensemble de vos connexions réseau :

$ ssh user@server -ND 8080

Il convient ensuite de configurer vos applications pour utiliser le proxy SOCKS localhost:8080. Pour anonymiser les requêtes DNS de Firefox, il convient de modifier la variable de configuration network.proxy.socks_remote_dns.

Mise à jour 13/11/2012 : l’option -N permet de ne pas lancer un shell après l’établissement du tunnel SSH.

fmon : version 0.2

fmon, mon outil de monitoring filesystem, passe en version 0.2. Au programme des nouveautés de cette version  :

  • support du mode récursif.
  • gestion des événements mount/unmount pour les périphériques de stockage amovibles.
  • filtrage des fichiers : type, propriétaire, groupe, etc …
  • exécution possible en ligne de commandes pour simuler la commande find et permettre l’utilisation de commandes externes telles que grep et xargs.

Bref, çà commence tout doucement à prendre forme.

  • Page d’informations : fmon
  • Lien de téléchargement : [Téléchargement non trouvé]

Git : gestion des branches

Article sur l’intérêt et l’emploi des branches avec Git :

http://nvie.com/posts/a-successful-git-branching-model/

pfwd : version 0.2

Au sommaire des nouveautés de la version 0.2 de mon proxy de redirection réseau :

  • redirection depuis/vers des sockets UNIX.
  • redirection IPv4 vers IPv6 (et inversement).
  • règles de filtrage IP (listes du type allow / deny).
  • possibilité d’exécuter une redirection réseau depuis la ligne de commandes.

Concernant le dépôt Git, je vais prendre soin de créer une branche spéciale développement à partir de maintenant :)

  • Page d’informations : pfwd
  • Lien de téléchargement : [Téléchargement non trouvé]

Git : corriger le commentaire d’un ancien commit

En premier lieu, s’il s’agit du dernier commit, seule cette commande suffit :

$ git commit --amend

Mais dans le cas présent, il s’agit d’un commit plus ancien. Il faut alors récupérer l’identifiant du commit parent – celui précédant le commit à éditer – puis lancer cette commande magique :

$ git rebase --interactive d50314941e6f2c181739ddd874678ab7ce442974

Une session dans votre éditeur texte favori se lance en listant chaque commit effectués depuis ce dernier. Par exemple :

pick 0b1104d Update README/TODO files
pick e4711eb Fix uninitialized value.
pick 16b4194 Remove duplicated code.
pick 0ac66c9 Add mount/umounts events support, recursive directories and new file tests.
pick e42b186 Add watcher support in command line execution.

Il convient alors de remplacer pick par reword pour chaque commentaire de commit à corriger. Une fois ces modifications effectuées, git va lancer une session texte pour chaque commentaire.

fmon 0.1 : automate de détection d’évènements filesystem

Il m’est venu le temps de publier le code source de fmon, mon automate de détection temps réel d’évènements filesystem. Très utile pour automatiser le post-traitement de certaines actions, son intérêt demeure incontournable dans le cadre de l’administration système.

Je vous renvoie à la page dédiée à ce logiciel pour de plus amples informations.

Haut de page