fmon file monitoring – est un outil de détection d’évènements liés aux systèmes de fichiers. Plusieurs sondes peuvent être configurées pour inspecter les évènements sur un fichier particulier, un répertoire ou encore une arborescence. Les évènements détectés sont par exemple la création d’un fichier ou encore sa modification. La détection est en temps réel.

Caractéristiques :

  • sonde de détection d’évènements en temps réel sur les systèmes de fichiers.
  • sonde un fichier, un répertoire ou une arborescence par récursion.
  • détection du montage/démontage des systèmes de fichiers.
  • exécution en démon ou en console pour interagir avec d’autres commandes comme grep et xargs.
  • test sur les fichiers pour restreindre le périmètre de détection (type, propriétaire, liste d’inclusion et d’exclusion, etc).
  • support de journalisation par syslog.

Dépendances :

  • glib 2.6.
  • gio/gio-unix 2.6.

Le logiciel est placé sous licence open-source et est fonctionnel sous GNU/Linux, BSD (FreeBSD, OpenBSD, NetBSD) et Mac OS X.

Cas d’utilisation

  • auditer un système de fichiers.
  • assurer l’intégrité des fichiers.
  • synchroniser un répertoire distant.
  • recharger un démon suite à une reconfiguration.

Développement

Le projet est disponible sous github : https://github.com/bhuisgen/fmon.

Pour cloner le dépôt :

$ git clone git://github.com/bhuisgen/fmon.git

Installation

# ./configure --prefix=/usr --sysconfdir=/etc
# make
# make install

Ligne de commandes

$ fmon --help-all
Usage:
fmon [OPTION...] [WATCHER]

Help Options:
-h, --help           Show help options
--help-all           Show all help options
--help-watcher       Show all watcher options

Watcher Options
--path=PATH          Path to watch for events
--recursive          Enable recursive mode
--maxdepth=LEVEL     Maximum depth of recursion
--event=EVENT        Event to watch
--mount Don't descend directories on other filesystems
--readable Matches files which are readable
--writable Matches files which are writable
--executable Matches files which are executable and directories which are searchable
--size=N Matches files using given size
--type=TYPE Check file type
--user=NAME Check owner user
--group=NAME Check owner group
--include=LIST       Include files list
--exclude=LIST       Exclude files list
--exec=COMMAND       Execute command on event
--print              Print filename on event, followed by a newline
--print0             Print filename on event, followed by a null character
Application Options:
-f, --file=FILE      Read configuration from file
-v, --verbose        Set verbose output
--version            Show version information

fmon permet d’exécuter une sonde directement en ligne de commande. Son intérêt est alors d’émuler le comportement de find et d’interagir avec d’autres commandes comme grep et xargs, notamment grâce à l’option –print0. Par exemple :

$ fmon --watcher ~/shared  --recursive  --event created --type f --print0 | xargs -0 stat

Dans le cas où plusieurs sondes sont à exécuter, il est nécessaire d’utiliser un fichier de configuration. Avec ce dernier, il est alors possible d’activer l’exécution en démon.

Configuration

La configuration s’effectue dans le fichier fmon.conf présent soit dans le répertoire personnel de l’utilisateur (~/.fmon/fmon.conf), soit dans le répertoire global /etc (/etc/fmon.conf). Un fichier de configuration spécifique peut également être fourni en ligne de commande par l’option -f.

La syntaxe de ce fichier est de type mot-clef/valeur. Les lignes débutant par le caractère # sont des commentaires. Les mots-clefs peuvent être groupés avec la syntaxe [nom_du_groupe]. La première partie du fichier englobe les options générales sous le groupe [main]. Les groupes suivants constituent chacun une sonde de détection.

[main]

Groupe principal des options.

Le groupe est obligatoire.

Daemonize=0

Active l’exécution en arrière-plan.

L’option est facultative, par défaut 0.

PIDFile=/var/run/fmon/fmon.pid

Fichier utilisé par le démon pour stocker son PID. Ce fichier est généralement utilisé par un script de démarrage init.d.

L’option est facultative, par défaut /var/run/fmon/fmon.pid.

User=nobody

Nom de l’utilisateur vers lequel le démon rétrograde ses droits suite à un lancement par l’utilisateur root.

L’option est facultative.

Group=nogroup

Groupe utilisateur vers lequel le démon rétrograde ses droits suite à un lancement par l’utilisateur root.

L’option est facultative.

LogLevel=3

Niveau de journalisation du fichier journal. Les niveaux possibles sont les suivants :

  • 0 : désactive la journalisation.
  • 1 : enregistre les erreurs.
  • 2 : enregistre les erreurs et les warnings.
  • 3 : enregistre les erreurs, warnings et informations.
  • 4 : enregistre les erreurs, warnings, informations et les évènements de débogage.

Note : pour bénéficier des évènements de débogage, pfwd doit être compilé avec l’option de débogage activée.

L’option est facultative. Par défaut, 3.

LogFile=/var/log/fmon/fmon.log

Nom du fichier journal où le démon enregistre ses évènements. En cas d’exécution console, les évènements sont automatiquement envoyés vers les sorties standards.

L’option est facultative. Par défaut, /var/log/fmon/fmon.log.

UseSyslog=0

Utilisation du serveur syslog local pour enregistrer les évènements.

L’option est facultative. Par défaut, 0.

SyslogFacility=DAEMON

Code de facilité utilisé pour l’enregistrement des évènements. Les valeurs possibles sont les suivantes : DAEMON, USER, AUTH, LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7.

L’option est facultative. Par défaut, DAEMON.

[nom]

Groupe nommé englobant les options d’une sonde sur un répertoire.

L’option est obligatoire.

Path=/home/user/watchdir

Chemin du répertoire ou du fichier à inspecter par la sonde.

L’option est obligatoire.

Recursive=1

Inspecte récursivement le répertoire sondé. Path doit donc être un nom de répertoire.

L’option est facultative. Par défaut, 0.

MaxDepth=0

Niveau de récursion maximum à effectuer par rapport au répertoire racine de la sonde. Une valeur de 0 spécifie une récursion infinie.

L’option est facultative. Par défaut, 0.

Events=created,deleted

Liste des évènements fichiers à inspecter. Le caractère de séparation est la virgule. Les évènements possibles sont les suivants :

  • created : création d’un nouveau fichier.
  • deleted : suppression d’un fichier.
  • changed : modification d’un fichier.
  • attribute_changed : modification d’un attribut de fichier.
  • mounted : un système de fichiers a été monté.
  • unmounted : un système de fichiers a été démonté.

L’option est facultative. Par défaut, tous les évènements sont signalés.

Note : lorsque l’évènement deleted est inspecté, aucun test n’est effectué étant donné que le fichier détecté est déjà supprimé par le système d’exploitation.

Exec=/home/user/import.sh $event $file

Commande à exécuter lors de la détection d’un évènement fichier. L’automate se charge de remplacer les paramètres suivants au moment de l’exécution de la commande :

  • $name : nom de la sonde.
  • $path : répertoire inspecté par la sonde.
  • $event : nom textuel de l’évènement détecté.
  • $file : nom du fichier (chemin absolu) à l’origine de l’évènement.
  • $rfile : nom du fichier (chemin relatif au répertoire de la sonde) à l’origine de l’évènement.

L’option est facultative. Par défaut, aucune action est exécutée lors d’un évènement.

Mount=1

Ignore l’évènement si le fichier est stocké sur un système de fichiers différent du répertoire de la sonde. L’option est donc inutile si la sonde inspecte un fichier précis.

L’option est facultative. Par défaut, 0.

Readable=1

Vérifie que le fichier possède les permissions de lecture.

L’option est facultative. Par défaut, 0.

Writable=1

Vérifie si le fichier possède les permissions d’écriture.

L’option est facultative. Par défaut, 0.

Executable=1

Vérifie que le fichier possède les permissions d’exécution.

L’option est facultative. Par défaut, 0.

Size=+15k

Vérifie que la taille utilisée par le fichier correspond à celle spécifiée.

Un préfixe peut être utilisé pour spécifier le type de comparaison :

  • + : comparaison strictement supérieure.
  • – : comparaison strictement inferieure.

L’absence de préfixe effectue une comparaison d’égalité.

Un suffixe permet de spécifier l’unité de la taille spécifiée :

  • b : l’octet
  • k : le kilooctet
  • M : le mégaoctet
  • G : le gigaoctet
En cas d’absence de suffixe, l’unité est l’octet.

L’option est facultative.

Type=f

Ignore l’évènement si le type du fichier ne correspond pas. Les types supportés sont les suivants :

  • b : fichier de périphérique de type bloc
  • c : fichier de périphérique de type caractère
  • d : répertoire
  • f : fichier régulier
  • l : lien symbolique
  • p : tube nommé / FIFO
  • s : socket UNIX

L’option est facultative. Par défaut, aucun test est effectué.

User=john

Ignore l’évènement si l’utilisateur propriétaire du fichier ne correspond pas. La spécification d’un identifiant utilisateur est possible en lieu et place de son nom.

L’option est facultative. Par défaut, aucun test est effectué.

Group=john

Ignore l’évènement si le groupe propriétaire du fichier ne correspond pas. La spécification d’un identifiant de groupe est possible en lieu et place de son nom.

L’option est facultative. Par défaut, aucun test est effectué.

Include=*

Liste des fichiers à inclure dans la détection. Les wildcards sont supportés. Le caractère de séparation est la virgule.

Les chemins des fichiers sont à spécifier relativement au répertoire de la sonde. Cette liste d’inclusion est prioritaire par rapport à la liste d’exclusion de fichiers.

L’option est facultative. Par défaut, tous les fichiers sont inclus.

Exclude=.*,*~

Liste des fichiers à exclure de la détection. Les wildcards sont supportés. Le caractère de séparation est la virgule.

Les chemins des fichiers sont à spécifier relativement au répertoire de la sonde.

L’option est facultative. Par défaut, aucun fichier n’est exclu.