[TIP] Générateur SPF

SPF est une des solutions techniques qui permet d'identifier un serveur comme légitime pour envoyer un email avec un nom de domaine précis. On s'appuie sur les DNS pour effectuer cette configuration. Pour plus d'informations, je vous invite à consulter l'article SPF sur Wikipedia.

La syntaxe n'est pas très compliquée mais il a quelques subtilités qui nécessitent de regarder de la doc avant de valider les modifications. Par conséquent, j'ai écrit un script shell qui permet de générer facilement une entrée SPF.

Voici quelques exemples d'utilisation :

Afficher/masquer le code
$ spfgenerator -d '*' -mx -ip 109.190.159.83 -ip 5.135.190.125 -p fail
*	IN	TXT	"v=spf1 mx ip4:109.190.159.83 ip4:5.135.190.125 -all"
$ spfgenerator -a "" -mx -ip 1.2.3.4 -ip fe80::7e7a:91ff:fe27:d29c/64 -i example.com -s
v=spf1 mx a ip4:1.2.3.4 ip6:fe80::7e7a:91ff:fe27:d29c/64 include:example.com ?all

Et le code source (https://wall.deblan.org/x1bfa/bash/1/) :

Afficher/masquer le code
#!/bin/sh

showHelp() {
    cat <<EOF
NAME
    spfgenerator generates SPF DNS entry

SYNOPSIS
    spfgenerator [-h] [-s] [-mx] [-a [domain]] [-i domain] [-p fail|soft|neutral] [-d domain]

DESCRIPTION
    spfgenerator generates SPF DNS entry

    -h, --help
        show this help.

    -mx
        Allow servers listed as MX to send email for the domain.

    -ip <ip>
        Allow IP to send email for the domain.
        Can be used several times.

    -i, --include <domain>
        Any domains that may deliver or relay mail for the domain.
        Can be used several times.

    -a <domain>
        Add any other server hostname that may deliver or relay mail for the domain.
        If domain is empty, it allows current IP address of the domain to send email for the domain.
        Can be used several times.

    -p, --policy <fail|soft|neutral
        How strict should be the servers treating the emails

        neutral:
            Mails will be probably accepted
            Default value.

        fail:
            Not compliant will be rejected

        soft:
            Not compliant will be accepted but marked

    -d,  --domain <domain>
        Default value: @

    -s, --short
        Only show the value
EOF
}

MX=0
IPv4s=
IPv6s=
INCLUDEs=
POLICY='?all'
DOMAIN=@
SHORT=0
As=

testData() {
    if [ -z "$1" ]; then
        (
            echo "Invalid parameter ($2)\n"
            showHelp
        ) >&2
        exit 1
    fi
}

addIp() {
    if [ -n "$1" ]; then
        if [ $(echo "$1" | egrep "^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") ]; then
            IPv4s="$IPv4s ip4:$1"
        else
            IPv6s="$IPv6s ip6:$1"
        fi
    fi
}

addA() {
    if [ -z "$1" ]; then
        As="$As a"
    else
        As="$As a:$1"
    fi
}

addInclude() {
    if [ -n "$1" ]; then
        INCLUDEs="$INCLUDEs include:$1"
    fi
}

for i in $@; do
    case $1 in
        -h|--help)
            showHelp
            exit 0
            ;;
        -mx)
            MX=1
            shift
            ;;
        -s|--short)
            SHORT=1
            shift
            ;;
        -a)
            shift
            addA $1
            shift
            ;;
        -ip)
            shift
            addIp $1
            shift
            ;;
        -i|--include)
            shift
            addInclude $1
            shift
            ;;
        -p|--policy)
            shift
                case $1 in
                    neutral) POLICY='?all';;
                    soft) POLICY='~all';;
                    fail) POLICY='-all';;
                esac
            shift
            ;;
        -d|--domain)
            shift
            DOMAIN=$1
            shift
            ;;
    esac
done

testData "$DOMAIN" domain
testData "$IPv4s$IPv6s" ip

(
    if [ $MX -eq 1 ]; then
        MX=mx
    fi

    if [ $SHORT -eq 0 ]; then
        echo "$DOMAIN	IN	TXT	\"v=spf1 $MX $As $IPv4s $IPv6s $INCLUDEs $POLICY\""
    else
        echo "v=spf1 $MX $As $IPv4s $IPv6s $INCLUDEs $POLICY"
    fi
) | sed 's/  */ /g'

Enjoy :)

Projet symfony2, convention PSR2 et validation pré-commit SVN

Les gens qui travaillent avec moi savent que je suis un "Syntax nazi". Je ne supporte pas quand le code ne suit pas les conventions. Ainsi, pour éviter de rager quand j'update mes sources, j'ai décidé de créer un hook SVN pour valider les commits des fichiers PHP.

Vous l'aurez donc compris, il s'agit ici de valider les uniquement les fichiers PHP suivant la norme PSR2. Par ailleurs, je ne m'attarde que sur le code de l'équipe de développement. Il s'agit donc de tout ce qui se trouve dans le répertoire "src" des applications symfony2 que nous développons.

Un hook SVN est un script qui sera exécuté à un instant donné et qui, suivant le code d'erreur, va valider ou non l'action en cours. Dans le cas de commit SVN, le hook est "pre-commit". Il se place dans le répertoire "hooks" du dépôt SVN et se nomme "pre-commit". Vous y trouvez d'ailleurs des fichiers .tmpl donnant quelques exemples.

Mon script s'appuie sur PHP_CodeSniffer (phpcs) que j'ai installé via composer. En effet, il existe un paquet Debian pour phpcs mais le standard PSR2 n'est pas pris en charge dans celui de la Wheezy (version de Debian du serveur SVN).

Voici le contenu du script :

Afficher/masquer le code
#!/bin/sh

SVNLOOK=/usr/bin/svnlook
PHPCS=/usr/local/src/phpcs/vendor/bin/phpcs
STANDARD=PSR2
SEVERITY=1
FINAL_REPORT=

for FILE in `$SVNLOOK changed -t "$2" "$1" | egrep -v '^D' | cut -b 5- | egrep '^src.*\.php$'`; do
    REPORT=`$SVNLOOK cat -t "$2" "$1" "$FILE" | $PHPCS --standard=$STANDARD -n --report=full --error-severity=$SEVERITY | sed 's,STDIN,'$FILE','`

    if [ -n "$REPORT" ]; then
        FINAL_REPORT="$FINAL_REPORT$REPORT\n\n"
    fi
done

if [ -n "$FINAL_REPORT" ]; then
    echo "$FINAL_REPORT" >&2
    exit 1
fi

exit 0

Voici un exemple de sortie lorsque la validation échoue :

Afficher/masquer le code
Envoi          src/FooBar/Bundle/PacteBundle/Controller/CollaboratorController.php
Envoi          src/FooBar/Bundle/PacteBundle/Controller/PacteController.php
Envoi          src/FooBar/Bundle/PacteBundle/Controller/TeamController.php
Transmission des données ..svn: E165001: Échec de la propagation (commit), détails : 
svn: E165001: Commit blocked by pre-commit hook (exit code 1) with output:

FILE: src/FooBar/Bundle/PacteBundle/Controller/CollaboratorController.php
--------------------------------------------------------------------------------
FOUND 5 ERROR(S) AFFECTING 3 LINE(S)
--------------------------------------------------------------------------------
 18 | ERROR | Spaces must be used to indent lines; tabs are not allowed
 18 | ERROR | Line indented incorrectly; expected at least 4 spaces, found 1
 18 | ERROR | Line indented incorrectly; expected 4 spaces, found 1
 19 | ERROR | Opening brace indented incorrectly; expected 1 spaces, found 4
 32 | ERROR | Closing brace indented incorrectly; expected 1 spaces, found 4
--------------------------------------------------------------------------------


FILE: src/FooBar/Bundle/PacteBundle/Controller/PacteController.php
--------------------------------------------------------------------------------
FOUND 5 ERROR(S) AFFECTING 3 LINE(S)
--------------------------------------------------------------------------------
 15 | ERROR | Spaces must be used to indent lines; tabs are not allowed
 15 | ERROR | Line indented incorrectly; expected at least 4 spaces, found 1
 15 | ERROR | Line indented incorrectly; expected 4 spaces, found 1
 16 | ERROR | Opening brace indented incorrectly; expected 1 spaces, found 4
 18 | ERROR | Closing brace indented incorrectly; expected 1 spaces, found 4
--------------------------------------------------------------------------------

Édit : mise à jour du code qui plantait lors de la suppression d'un fichier.

Alsa, Debian et le Dell XPS 15

Un bref article pour poser la configuration d'Alsa qui permet de gérer des sorties sons simultanées avec plusieurs logiciels. En effet, dans l'article traitant du Dell XPS récemment acquis, j'expliquais comment configurer Alsa mais j'avais toujours des problèmes quand 2 logiciels tentaient de produire un son en même temps.

Dans ~/.asoundrc :

pcm.!default { 
    type plug
    slave.pcm "dmixer"
} 

ctl.!default {  
    type hw
    card 1
} 

pcm.dmixer {
    type dmix
    ipc_key 1024
    slave {
        pcm "hw:1,0"
        period_time 0
        period_size 1024
        buffer_size 4096
        rate 44100
    }
    bindings {
        0 0
        1 1
    }
}

ctl.dmixer {
    type hw
    card 1
}

Il me reste à résoudre la gestion du micro et je devrais arriver au bout des problèmes.

Edit : le micro fonctionne très bien, seul skype ne sait pas jouer avec…

Logiciels UML et Merise sous Linux

Le développement d'un projet se déroule en plusieurs étapes majeurs dont la conception technique. Il existe un tas de méthodes dont Merise et l'UML. Quels sont les outils existants pour la réalisation des différents diagrammes inhérents à ces méthodologies ?

Le MCD permet de décrire les entités d'une application et de mette en évidence les relations qui existent entre elles. Pour la réalisation de ce diagramme, NextObjects est vraiment idéal. Il permet d'ailleurs de générer le MPD, du SQL, des modèles de classes et bien d'autres choses. Le site d'éditeur est down mais vous pouvez télécharger le logiciel depuis SourceForge.

NextObjects

Bien que NextObjects puisse générer des MPD, j'utilise Mysql Workbench pour leur génération. Je travail avec MySQL et il contient tous les outils dont j'ai besoin. Par ailleurs, il est possible d'écrire des plugins en LUA pour, à titre d'exemple, générer des schéma XML au format Propel. Il est maintenant packagé dans Debian (Jessie, dépôt non-free).

Mysql-Workbench

Pour la génération des diagrammes de cas d'utilisation, de séquence, de classe, d'état et d'activité, j'utilise 2 outils. Le premier est ArgoUML, écrit en JAVA aqui fonctionne très bien. Il est intuitif et permet de cadrer ce qu'on fait. Il est édité par Tigris et est dispo sur leur site.

ArgoUML

Enfin, il m'arrive d'utiliser l'incontournable DIA qui est un véritable couteau suisse des diagrammes. Il a cependant 2 défauts majeurs : la mise en page est parfois hasardeuse et il manque certains pictigrammes. Il est packagé dans toutes les bonnes distributions depuis des lustres.

Dia

Debian + XPS 15 (9530)

Mon agence m'a acheté le dernier XPS 15 de Dell (9530). C'est une belle machine, autant à l'extérieur qu'à l'intérieur...Cependant, aussi jolie soit-elle, installer Debian dessus n'a pas été de tout repos. Livrée avec Windows 8 et des Gigas d'espace disque monopolisés par les partitions EFI, Windows 8 et les partitions de restauration, j'ai commencé par faire le grand ménage en virant tout.

J'ai installé Debian dessus, je me suis confronté à l'éternel problème des matériels plus ou moins reconnus. J'ai quand même eu de la chance car une grande partie d'entre eux l'était.

Il faut savoir que ce laptop n'a pas de port ethernet, ainsi, il m'a été nécessaire d'utiliser un adapteur USB/Ethernet. Sachez que Debian Wheezy pète une pile avec l'USB3 et les dongles USB2. Faute au kernel ? Sans doute, mais je n'ai pas voulu perdre de temps avec ces conneries donc j'ai migré sur la SID. Le kernel est donc plus récent et j'ai écarté des problèmes de connectivité.

Après l'installation, j'ai rencontré 3 problèmes majeurs :

  • pas d'interface wifi
  • pas de son
  • mplayer lisait les vidéos de manière saccadée
  • mon touchpad ne me permettait pas de faire un middle click : pas pratique du tout pour faire des copiés/collés

Le Wifi

Il a suffit d'installer le paquet iwlwifi et tout est rentré dans dans l'ordre. Ça implique d'avoir paramétré les dépots non-free (@see).

Le son

Ce souci de son m'a littéralement fait rager. Le problème est simple en fait : la sortie HDMI est considérée comme une carte son et Alsa la positionne comme carte par défaut. Pour résoudre le problème, j'ai installé pulseaudio (et ça m'a fait mal aux fesses) et j'ai placé la conf suivante dans mon ~/.asoundrc :

Edit : Pulseaudio ne sert à rien en fait....sauf poser des problèmes donc il a été supprimé.

pcm.!default { 
    type hw 
    card 1 
} 

ctl.!default { 
    type hw 
    card 1 
} 

Au démarrage de mon WM (i3), j'exécute pulseaudio comme suit :

exec pulseaudio --start

Et j'ai également cet init d'Alsa :

exec alsactl init -c 1

Mplayer

Pour pouvoir lire des vidéos avec mplayer2, voici la conf que j'ai écrite dans ~/.mplayer2/config

[default]
vo=x11
vc=ffh264vdpau,ffmpeg12vdpau,
zoom=1

Le Touchpad

Pour "activer" le middle click sur le touchpad, j'ai transpiré quelques heures. Encore une fois, le problème est simple (et la solution également) :

  • le touchpad n'a qu'un seul boutton
  • c'est la position du clique qui détermine si on fait un clique gauche, un clique droit ou bien le clique du mileu (middle click)

Synclient (en ligne de commande) permet de connaître les valeurs attribuées par Synaptics pour les paramètres du touchpad. Il s'avère que par défaut, le middle click a tout à 0, c'est à dire qu'aucune position de clique ne permet de détecter ce fameux clique.

Il suffit donc de modifier ces valeurs et tout devrait rentrer dans l'ordre. Voici ce que j'exécute au lancement du WM :

exec synclient MiddleButtonAreaLeft=2700
exec synclient MiddleButtonAreaRight=3500

Un bout de scotch pour repérer au touché cette position (entre les clique gauche et le clique droit) et l'affaire est bouclée.

J'espère que ça pourra aider :)