Kevin Decherf's blog

Technologies de l'information … et plus si affinité

Jdep-grapher: make a dependency tree of your Java projects

| Comments

Oh, my first english post … so amazing (isn’t it ?). Well, I present a little (and awful) bash dependency graph generator for Java projects.

One goal of my job is to maintain the Quercus project. It is currently highly dependent of Resin, another Caucho’s project, and a removal is needed. To know what I need to remove first, I wanted a graphical representation of all links between projects. We can consider that dependencies could be computed with ‘import’ Java keyword. Yes I know, it’s not a perfect dependencies representation but it’s currently the best way I found (and faster). Finally, we need a graph generation tool … I found GraphViz which can be directly used in CLI and we use DOT format file to make the graph specifications. One day after … Jdep-grapher is released.

How does it work ?

It will first get the list of files to parse (with find) and extract all lines beginning with ‘import’ and ‘package’ (we use temp files with mktemp) :

1
2
find $DIR -type f -name "*.java" > $FILES
grep -E "^package|^import" $(< $FILES) | awk -F':' '{print $2}' > $GREP

Next it creates links between packages and uses DOT format :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
while read type name
do
  name=`echo $name | tr -d ";"`
  pkg=`echo $name | tr -d "."`
  if [[ "$type" == "package" ]]; then
      echo "$pkg [label=\"$name\", style = filled, shape = box];"
      CPKG=$pkg
  else
      ALL=`echo $pkg | grep "\*" | wc -l`
      SUP=""
      LNK=""
      if [[ $ALL -eq 1 ]]; then
          pkg=`echo $pkg | sed s/"*"/"allpkg"/`
          SUP=", color=red, style = filled"
                        LNK=" [color=red]"
      fi
      echo "$pkg [label=\"$name\"$SUP];"
      echo "$CPKG -> $pkg $LNK;"
  fi
done < $GREP | sort -u > $COMPUTE

sort -u at the end of loop will automatically remove duplicates and send the result to a new temp file. All-inclusion packages (with *) are filled in red.

We can exclude useless links (eg. internal dependencies) with :

1
grep -vE "$EXCLUDE" $COMPUTE > $TMPDOT

To reduce the weight of graph, it removes single nodes :

1
2
3
4
CT=`grep -E "$rpkg( |;)" $TMPDOT | wc -l`
  if [[ $CT -gt 1 ]]; then
      echo $rpkg $rop $rchild >> $TMPDOT2
  fi

Finally, the script closes the DOT file and launches graphviz …

1
2
3
4
5
echo "digraph G {" > $DOT
cat $TMPDOT2 >> $DOT
echo "}" >> $DOT

fdp -Tpng < $DOT > $GRAPH

Enjoy

Example : Resin Dependency Graph of Quercus

Note : the script currently uses ‘fdp’ from graphviz which is not fully optimized for this kind of graph. Tell me if you have any other solution ;-)

More information on GitHub.

Clôner un répertoire et déplacer les éléments obsolètes avec rsync

| Comments

Depuis le temps que je devais le faire, hier j’ai mis en place ma petite stratégie de sauvegarde avec un script perso et rsync. Je voulais avoir un clône parfait de mes dossiers : ne pas garder les éléments qui ne sont plus dans la source. Et si jamais on supprime un élément par erreur et qu’il est définitivement perdu lors de la sauvegarde ?

La solution la plus simple est de simuler une première sauvegarde avec l’option --dry-run (-n) afin d’obtenir la liste des fichiers qui vont être supprimés du dossier de destination puis de les déplacer avant de lancer la sauvegarde. Ainsi, on arrive à un script ressemblant à ça :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash

echo "Generating list of files to be rejected..."
# Préfixe de dossier à retirer lors du nettoyage (utile pour les chemins absolus)
# La chaîne doit être échappée pour passer avec 'sed'
RMPREFIX="\/prefixe\/"
# Le slash de fin est important pour la source, ainsi rsync va copier le contenu du dossier (au lieu du dossier lui-même)
SOURCE="/dir1/"
DEST="/dir2"
REJECTFOLDER="/dirr"
# On va chercher la liste des fichiers et dossiers allant être supprimés
rsync -avn --delete-after $SOURCE $DEST | grep ^deleting | sed s/"^deleting "/""/ | while read line; do
 if [[ -d "$DEST/$line" ]]; then
  echo "Deleting $line..."
  rmdir "$DEST/$line"
 else
  echo "Rejecting $line..."
  FDIR=`dirname "$DEST/$line"`
  if [[ ! -z $RMPREFIX ]]; then
   FDIR=`echo $FDIR | sed s/"$RMPREFIX"/""/`
  fi
  mkdir -p "$REJECTFOLDER/$FDIR"
  mv "$DEST/$line" "$REJECTFOLDER/$FDIR/"
 fi
done
# Ici on peut lancer le vrai rsync

Exemple de résultat :

Screenshot

Enjoy it !

Iptables : Utiliser un VPN avec une IP failover

| Comments

Allez, une petite astuce (très facile mais je la donne quand même) pour bien commencer le week-end. Considérons un serveur avec une interface réseau et plusieurs IP failover (un serveur chez OVH par exemple), comment pouvons-nous utiliser l’une de ces IP failover pour la sortie d’un VPN ? Avec Iptables, la table nat, la chaîne POSTROUTING et la cible SNAT :

1
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to-source ipfailover

Pensez à remplacer ipfailover par l’adresse IP publique à utiliser et 10.8.0.0/24 par le réseau de votre VPN. Et bon week-end !

Linux & EMP NS Connection

| Comments

En ce début d’année, j’ai été amené à donner une formation de quelques jours à une promotion d’une centaine de personnes. J’avais à ma disposition des vidéoprojecteurs en réseau (de marque Epson), l’utilisation se faisant via un outil disponible uniquement sous Mac et Windows : EMP NS Connection.

Screenshot

Le hic dans mon cas c’est que je donnais une formation Linux et … je tourne sous Linux. Une première solution s’offre à moi : un projet libre datant de 2008 … mais sans succès.

Qu’à cela ne tienne : ayant mis au défi Wine de faire tourner Office 2010 (mission presque accomplie par ailleurs), j’ai décidé de tester la bête avec l’outil d’Epson et … bah ça tourne parfaitement ! Le logiciel s’installe correctement et s’execute tout aussi bien : multi-projecteurs, protection par mot de passe … Impec’ ! :)

Screenshot

Il n’y a qu’une fonctionnalité que je n’ai pas testé : la capacité à contrôler Powerpoint avec la télécommande (oui, je fais tourner Office 2007 aussi).

Détails : EMP NS Connection 2.50, Wine 1.3.10

Enjoy it !

Un peu de ménage et du changement pour la nouvelle année

| Comments

Et voilà une nouvelle année qui commence … et un billet inutile de plus dans le panier :) Tout d’abord je tiens à vous souhaiter une bonne et heureuse année 2011 (voilà, ça c’est fait).

J’ai profité de ma journée pour faire un peu de ménage sur le blog. Quand j’ai commencé cette aventure (en février 2009), je publiais beaucoup de petites actus … ce qui n’est pas spécialement le but premier d’un blog. Comme ça me perturbait, j’ai décidé de supprimer les catégories et de cacher les billets concernés : ils sont encore accessibles mais ne sont plus affichés dans la recherche ou la liste des billets. Pour publier des actus je vais continuer d’envahir votre timeline Twitter et de les publier sur VIC. Le nettoyage de 98 billets fait, j’en viens à une petite annonce : je vais commencer à bloguer en anglais (ouais, on est mal barré). Et pour bien massacrer la langue de Shakespeare j’ai quelques billets assez fun dans ma corbeille : Queue FIFO en PHP avec Memcache (c’était mon occupation de cette nuit), traitement distribué en PHP (oui, j’ai décidé de maltraiter PHP) et d’autres surprises …

Have fun et récupérez bien du réveillon … parce que lundi c’est la reprise :)