Exile on Keyboard St. - Blog sur Linux et Debian

Aller au contenu | Aller au menu | Aller à la recherche

jeudi 31 août 2017

Ajouter un Hook de Pre Commit dans IntelliJ IDEA

La boite de dialogue de commit d'IntelliJ IDEA propose entre autres de faire les actions suivantes avant le commit:

  • Reformatter le code
  • Optimiser les imports
  • Chercher les TODO

....

En revanche rien n'est prévu par défaut dans IntelliJ pour ajouter un script utlisateur de pre commit, qui par exemple va vérifier que vos traces ajoutées à des fins de debug ont bien été enlevées avant le commit.

Pour ajouter un Hook de pre commit, il faut installer un plugin, nommé Pre Commit Hook Plugin, qui va se charger d'éxécuter avant commit un script que vous aurez créé à la racine de votre projet et nommé pre-commit-hook.sh.

Le script sera appelé avec en paramètres les fichiers participant au commit. Il vous suffit donc dans le script de renvoyer le code retour 1 si vous avez oublié des traces de debug.

Ainsi vous éviterez les commits supplémentaires avec le message signficatif: "Oopppps: forgot to remove debug traces" !

Un exemple de script de pre commit:

#!/bin/bash

for file in "$@"; do
    grep -H -n DBG_TRACE "$file" && exit 1
done

exit 0

Le Pre Commit Hook Plugin est hébergé sur GitHub.

samedi 4 mars 2017

Trouver facilement votre adresse ip sans parser la sortie de la commande ifconfig

Combien de fois avez-vous eu besoin de connaître l'adresse IP de telle ou telle interface réseau sur une machine physique ou virtuelle ?

Quand on pose cette question la réponse ne se fait pas attendre:

Baahhh, tu n'as qu'à parser la sortie d'ifconfig !

En effet, la sortie de la commande ifconfig ressemblant à ceci:

debian@debian-jessie:~$ /sbin/ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 08:00:27:ae:00:9f  
          inet adr:10.0.2.15  Bcast:10.0.2.255  Masque:255.255.255.0
          adr inet6: fe80::a00:27ff:feae:9f/64 Scope:Lien
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:155 errors:0 dropped:0 overruns:0 frame:0
          TX packets:136 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:1000 
          RX bytes:43715 (42.6 KiB)  TX bytes:22029 (21.5 KiB)

Il est possible de parser cette sortie par exemple de la façon suivante:

    /sbin/ifconfig eth0 2> /dev/null | grep 'inet adr:' | cut -d : -f2 | awk '{ print $1}'

Déjà, c'est un peu lourdingue. Ensuite, on ne teste aucune erreur possible, par exemple si la sortie affiche "inet addr" avec deux "d" au lieu d'un, ce qui est le cas sur certaines distributions Linux, on voit ben qu'il faudra modifier la commande grep.

En fait, vous n'êtes pas obligés de parser la sortie d'ifconfig, et on peut obtenir cette adresse ip beaucoup plus simplement avec la commande ifdata.

Pour l'installer:

sudo apt-get install moreutils

Et pour afficher l'adresse:

debian@debian-jessie:/home/debian# ifdata -pa eth0
10.0.2.15

Comme vous le voyez la commande ifdata est très simple à utiliser et elle nous permet également de connaitre toutes les caractéristiques de ce réseau comme l'adresse de broadcast, le masque de sous-réseau, ...

Par exemple pour l'adresse de broadcast:

debian@debian-jessie:/home/debian# ifdata -pb eth0
10.0.2.255

Et pour voir l'ensemble des flags possibles de la commande:

debian@debian-jessie:/home/debian# ifdata 
Usage: ifdata [options] iface
     -e   Reports interface existence via return code
     -p   Print out the whole config of iface
    -pe   Print out yes or no according to existence
    -pa   Print out the address
    -pn   Print netmask
    -pN   Print network address
    -pb   Print broadcast
    -pm   Print mtu
    -ph   Print out the hardware address
    -pf   Print flags
    -si   Print all statistics on input
   -sip   Print # of in packets
   -sib   Print # of in bytes
   -sie   Print # of in errors
   -sid   Print # of in drops
   -sif   Print # of in fifo overruns
   -sic   Print # of in compress
   -sim   Print # of in multicast
    -so   Print all statistics on output
   -sop   Print # of out packets
   -sob   Print # of out bytes
   -soe   Print # of out errors
   -sod   Print # of out drops
   -sof   Print # of out fifo overruns
   -sox   Print # of out collisions
   -soc   Print # of out carrier loss
   -som   Print # of out multicast
  -bips   Print # of incoming bytes per second
  -bops   Print # of outgoing bytes per second

samedi 11 février 2017

Lister les ports occupés sous Linux et se mettre à l'écoute avec netcat

On a souvent besoin en cours de développement de simuler la présence d'un démon en lui substituant un "faux" processus en écoute sur le même port que lui.

Sous Linux, cette opération se fait avec la commande netcat que l'on installe comme suit:

sudo apt-get install netcat-openbsd

Pour que netcat se mette à l'écoute sur le port 7272:

netcat -l -k 7272

Le flag -l précise que l'on souhaite se mettre à l'écoute et -k est positionné pour que l'on reste à l'écoute après la première connexion cliente.

Maintenant, si on souhaite changer l'adresse d'écoute:

netcat -l -k localhost 7272

On peut utiliser soit nc soit netcat, sachant que ce dernier est un lien vers le premier.

Maintenant, si dans un autre terminal je teste la connexion:

netcat -z localhost 7272
echo $?

La commande netcat renvoie le code retour 0 car la connexion a réussi. Elle aurait renvoyé 1 dans le cas contraire.

Si vous voulez avoir plus d'informations sur la sortie standard, le flag -v vous sera très utile.

Quand on regarde attentivement dans le repository Debian, on remarque que la commande netcat est fournie par deux packages différents:

  • netcat-openbsd
  • netcat-traditional

Lequel installer ?

On préférera sans hésiter la première version car netcat-traditional ne supporte pas du tout les mêmes paramètres sur la ligne de commande que netcat-openbsd et en plus a la fâcheuse tendance à permettre de lancer plusieurs commandes d'écoute sur le même port sans broncher ...

En clair, on pense avoir un processus à l'écoute et ce n'est pas le cas !

samedi 24 décembre 2016

Vérifier la syntaxe des fichiers Markdown avec markdownlint

Les fichiers README des projets open source (ou non) sont maintenant (presque) toujours écrits avec le langage de balisage Markdown qu'on ne présente plus.

Après avoir trouvé un éditeur pour les fichiers Markdown et cherché comment convertir un document Markdown en HTML je me suis demandé comment vérifier les erreurs de syntaxe dans les fichiers README.

Il y a énormément d'éditeurs de Markdown en ligne, par contre les outils de vérification de syntaxe ne sont pas très nombreux. J'en ai quand même trouvé un sur GitHub.

Il s'agit de markdownlint disponible à l'adresse suivante: markdownlint.

markdownlint étant écrit en Ruby, il faut procéder comme suit pour l'installer:

sudo apt-get install rubygems
sudo gem install mdl

La vérification d'un fichier README se fait alors avec la commande mdl:

mdl README.md

Et on obtient les erreurs suivantes, par exemple:

README.md:291: MD013 Line length
README.md:19: MD012 Multiple consecutive blank lines
README.md:187: MD009 Trailing spaces
README.md:223: MD014 Dollar signs used before commands without showing output
README.md:15: MD034 Bare URL used

La première erreur MD013 vérifiant que les lignes n'excèdent pas 80 caractères est à mon avis discutable pour un fichier README.

Pour exclure cette règle, on peut procéder comme suit:

mdl -r ~MD013 README.md 

Ceci étant dit, il est facile d'inclure un appel à la commande mdl dans un processus de build logiciel ou d'intégration continue afin de vérifier la non transgression d'un certain nombre de règles.

Afin d'approfondir le sujet, ci-joint l'aide de la commande mdl:

mdl --help
Usage: mdl [options] [FILE.md|DIR ...]
    -c, --config FILE                The configuration file to use
    -g, --git-recurse                Only process files known to git when given a directory
    -i, --[no-]ignore-front-matter   Ignore YAML front matter
    -l, --list-rules                 Don't process any files, just list enabled rules
    -r, --rules RULE1,RULE2          Only process these rules
    -u, --rulesets RULESET1,RULESET2 Specify additional ruleset files to load
    -a, --[no-]show-aliases          Show rule alias instead of rule ID when viewing rules
    -w, --[no-]warnings              Show kramdown warnings
    -d, --skip-default-ruleset       Don't load the default markdownlint ruleset
    -s, --style STYLE                Load the given style
    -t, --tags TAG1,TAG2             Only process rules with these tags
    -v, --[no-]verbose               Increase verbosity
    -h, --help                       Show this message
    -V, --version                    Show version

- page 1 de 2