Archives pour février, 2012

Glib : utiliser valgrind pour détecter les memory leaks

Une petite note pour détecter les problèmes mémoire d’un programme utilisant la Glib avec Valgrind.

Les options à fournir sont les suivantes :

bhuisgen@debian:~/projects/sample/$ G_DEBUG=gc-friendly G_SLICE=always-malloc valgrind --leak-check=full --leak-resolution=high --num-callers=20 ./program

Malgré la désactivation des optimisations de la Glib, notamment les pools mémoires, Valgrind détecte encore de nombreux problèmes. Dans un tel cas, seul un fichier de suppression permet de désactiver les erreurs n’ayant aucun rapport avec votre code. Le projet GNOME.supp a pour but de regrouper un ensemble de fichiers prêts à l’emploi. L’utilisation est alors aisée :

bhuisgen@debian:~/projects$ git clone https://github.com/dtrebbien/GNOME.supp
bhuisgen@debian:~/projects/GNOME.supp$ cd GNOME.supp
bhuisgen@debian:~/projects/GNOME.supp$ make

On indique ensuite le fichier de suppression à Valgrind :

bhuisgen@debian:~/projects/sample/$ G_DEBUG=gc-friendly G_SLICE=always-malloc valgrind --leak-check=full --leak-resolution=high --num-callers=20 --suppressions=../GNOME.supp/glib.supp ./program

Inotify : monitorer les actions effectuées dans un répertoire

Exemple en langage C pour détecter la création de sous-répertoires grâce à inotify :

#include <sys/inotify.h>
#include <sys/select.h>
#include <sys/stat.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>

int fd;
int wd;

void
sigint_handler(int signum)
{
	(void) signum;

	if (inotify_rm_watch(fd, wd))
	{
		perror("inotify_rm_watch");
		exit(EXIT_FAILURE);
	}

	if (close(fd) < 0)
	{
		perror("close");
		exit(EXIT_FAILURE);
	}

	exit(EXIT_SUCCESS);
}

int
is_directory(char *path)
{
	if (path == NULL)
		return -1;

	struct stat s;

	if (stat(path, &s) < 0)
	{
		perror("stat");

		return -1;
	}

	if (s.st_mode & S_IFDIR)
		return 1;

	return 0;
}

int
main(int argc, char* argv[])
{
	fd_set fds;
	size_t r;
	char buf[8192], buf2[8192];
	struct inotify_event *event;

	if (argc != 2)
	{
		fprintf(stderr, "usage: %s <DIR>\n", argv[0]);

		return EXIT_FAILURE;
	}

	fd = inotify_init();
	if (fd < 0)
	{
		perror("inotify_init");

		return EXIT_FAILURE;
	}

	wd = inotify_add_watch(fd, argv[1], IN_CREATE);
	if (wd < 0)
	{
		perror("inotify_add_watch");

		return EXIT_FAILURE;
	}

	printf("Directory watched: %s\n", argv[1]);

	signal(SIGINT, sigint_handler);

	while (1)
	{
		FD_ZERO(&fds);
		FD_SET(fd, &fds);

		if (select(fd + 1, &fds, NULL, NULL, 0) <= 0)
		{
			continue;
		}

		r = read(fd, buf, sizeof(buf));
		if (r <= 0)
		{
			perror("read");

			return EXIT_FAILURE;
		}

		event = (struct inotify_event *)buf;
		if (!(event->mask & IN_CREATE) || (event->len < 0))
			continue;

		snprintf(buf2, sizeof(buf2), "%s%s", argv[1], event->name);

		if (is_directory(buf2) < 0)
			continue;

		printf("New directory created %s\n", event->name);
	}

	return EXIT_FAILURE;
}

pfwd 0.1 : proxy de redirection TCP IPv4 & IPv6

Je viens de mettre à disposition librement le code source de pfwd, mon proxy de redirection TCP capable de fonctionner en dualstack IPv4 et IPv6. Si je me souviens bien j’ai codé çà en 1 semaine l’année dernière…

Bref, je vous invite à consulter la page suivante pour de plus amples informations.

Nginx : configuration d’hôte avec root virtuel

L’intérêt de cette configuration est de gérer plusieurs sites par un unique hôte virtuel.

server
{
 listen          127.0.0.1:80;
 listen          192.168.0.1:80;
 server_name ~(?.+).bhuisgen.dev.my.domain$;
 root            /mnt/home/bhuisgen/www/html/$site;
 access_log      /mnt/home/bhuisgen/www/logs/access.log main;
 error_log       /mnt/home/bhuisgen/www/logs/error.log;
 index           index.php;

 location ~ \.php$ {
 fastcgi_pass    unix:/var/run/php-bhuisgen.sock;
 fastcgi_index   index.php;
 fastcgi_param   SCRIPT_FILENAME  /mnt/Users/bhuisgen/Sites/html/$site$fastcgi_script_name;
 include         fastcgi_params;
 }
}

Postfix : patch pour la gestion des alias par fichier .forward

Dans le cas d’une configuration mail par comptes utilisateurs locaux (utilisateurs systèmes), il est courant de configurer un alias de redirection par le biais du fichier .forward situé dans le répertoire personnel de chaque utilisateur. Le problème est qu’il est impossible de modifier ce fichier au travers d’une interface web ou encore son webmail vu que des restrictions d’accès s’appliquent à ces fichiers. En particulier , la vérification du propriétaire sous Postfix :

Feb 12 17:04:47 mail postfix/local[15208]: warning: file /home/bhuisgen/.forward has bad owner uid 33

La redirection mail est évidemment bloquée. Le patch proposé vise donc à supprimer ce test et permettre l’envoi du mail vers l’adresse de redirection :

root@mail:~# apt-get build-dep postfix
root@mail:~# apt-get source postfix
root@mail:~# cd postfix-2.7.1/
root@mail:~# cd src/local/

Le patch à appliquer est le suivant :

--- dotforward.c.old    2012-02-12 17:35:34.000000000 +0100
+++ dotforward.c    2012-02-12 17:36:23.000000000 +0100
@@ -231,12 +231,12 @@
state.msg_attr.exp_from = state.msg_attr.local;
if (S_ISREG(st.st_mode) == 0) {
msg_warn("file %s is not a regular file", STR(path));
-        } else if (st.st_uid != 0 && st.st_uid != usr_attr.uid) {
+        } /*else if (st.st_uid != 0 && st.st_uid != usr_attr.uid) {
msg_warn("file %s has bad owner uid %ld",
STR(path), (long) st.st_uid);
} else if (st.st_mode & 002) {
msg_warn("file %s is world writable", STR(path));
-        } else if ((fd = open_as(STR(path), O_RDONLY, 0, usr_attr.uid, usr_attr.gid)) < 0) {
+        } */else if ((fd = open_as(STR(path), O_RDONLY, 0, usr_attr.uid, usr_attr.gid)) < 0) {
msg_warn("cannot open file %s: %m", STR(path));
} else {
root@mail:~# patch -p0 < patch-fix_forward-20120213

Reste à compiler et installer :

root@mail:~# cd ../..
root@mail:~# dpkg-buildpackage -rfakeroot
root@mail:~# cd ..
root@mail:~# dpkg -i postfix_2.7.1-1+squeeze1_amd64.deb

Et j’en profite pour vous signaler que j’ai fait un minuscule plugin pour le webmail RoundCube, disponible ici. afin de gérer les .forward.

Pluxml : le blog avec un moteur diesel ?

# Creation de l'objet principal et lancement du traitement
$plxMotor = plxMotor::getInstance();

# Hook Plugins
eval($plxMotor->plxPlugins->callHook('Index'));

# Chargement du fichier de langue
loadLang(PLX_CORE.'lang/'.$plxMotor->aConf['default_lang'].'/core.php');

$plxMotor->prechauffage();
$plxMotor->demarrage();

Bon, à part çà, c’est un très bon moteur de blog : http://www.pluxml.org/

Debian : se protéger des attaques bruteforce par SSH avec DenyHosts

Si votre serveur n’assure pas de filtrage réseau, denyhosts est la solution pour limiter les attaques par bruteforce SSH. Ce dernier s’appuie sur les tcp wrappers – les fichiers historiques /etc/hosts.allow et /etc/hosts.deny – afin d’autoriser / bloquer l’accès aux services réseaux, dont SSH. Encore une fois iptables n’est pas nécessaire pour que la protection soit effective.

L’installation est aisée :

root@skinner:~# apt-get install denyhosts

Reste à éditer le fichier de configuration /etc/denyhosts.conf pour spécifier la période de purge des hosts bloqués, les paramètres de messagerie pour l’envoi des notifications… Bref rien de très compliqué.

Par exemple, si l’hôte 192.168.0.1 effectue un trop grand nombre de connexions SSH erronées, denyhosts va ajouter la ligne suivante dans le fichier /etc/hosts.deny :

sshd:      192.168.0.1

A la prochaine tentative, le démon SSH refusera directement la connexion.

Debian : désinstaller les services clients NFS

root@vm:~# apt-get --purge remove nfs-kernel-server nfs-common portmap
Haut de page