+#!/bin/sh
+# pipsecd2ipsectools - outil d'aide à la migration de pipsecd vers ipsec-tools
+# Copyright ©2011 Agence universitaire de la Francophonie
+# http://www.auf.org/
+# Licence : GNU General Public License, version 3
+# Auteur : Progfou <jean-christophe.andre@auf.org>
+# Création : 2011-02-15
+# Mise à jour : 2011-02-16
+LOCALGW="210.245.61.206"
+LOCALIP="10.230.0.254"
+LOCALNET="10.230.0.0/20"
+
+cat << __EOF__
+
+# REMARQUES :
+# - l'ordre des règles spdadd est important et doit correspondre à l'ordre
+# des routes les plus précises vers les routes les plus générales
+
+# ne pas utiliser IPsec en réseau local
+
+spdadd $LOCALNET $LOCALNET any -P out none ;
+spdadd $LOCALNET $LOCALNET any -P in none ;
+
+__EOF__
+
+(
+# pré-traitement de la liste des réseaux dans /etc/pipsecd/startup
+awk '
+/^ifconfig / {
+ IF=substr($2,6)
+ REMOTENET=$5; split(REMOTENET,N,"\.")
+ REMOTEMASK=$7; split(REMOTEMASK,M,"\.")
+ REMOTENET=N[1]"."N[2]"."N[3]".0" # incorrect mais plus simple pour le moment
+ REMOTECIDR=32-log(256^4-(M[1]*256^3+M[2]*256^2+M[3]*256+M[4]))/log(2)
+ printf("remotenet %s %s\n", IF, REMOTENET"/"REMOTECIDR)
+}
+' /etc/pipsecd/startup
+# envoi du contenu de /etc/pipsecd/pipsecd.conf
+sed -e '/^[^#]/s/ *= */=/g' /etc/pipsecd/pipsecd.conf
+) | awk -v LOCALGW="$LOCALGW" -v LOCALIP="$LOCALIP" -v LOCALNET="$LOCALNET" '
+/^remotenet / {
+ IF=$2; REMOTENET[IF]=$3
+ #printf("# IF=%s REMOTENET=%s\n", IF, REMOTENET[IF])
+}
+/^#/ {
+ LASTCOMMENT=$0
+}
+/^sa / {
+ SPI=substr($3,5)
+ ENC=substr($4,5); EKEY=substr($5,6); gsub("_","-",ENC)
+ AUTH=substr($6,6); AKEY=substr($7,6); gsub("_","-",AUTH)
+ if (AUTH=="hmac-md5-96") { AUTH="hmac-md5" }
+ if ($8 != "") {
+ OSPI=SPI; OENC=ENC; OEKEY=EKEY; OAUTH=AUTH; OAKEY=AKEY
+ REMOTEGW=substr($8,6)
+ } else {
+ ISPI=SPI; IENC=ENC; IEKEY=EKEY; IAUTH=AUTH; IAKEY=AKEY
+ }
+}
+/^if / {
+ IF=$2; LSPI=substr($3,10); RSPI=substr($4,11)
+ IPROUTE="ip route add "REMOTENET[IF]" via "LOCALGW" src "LOCALIP
+ printf("%s\n#%s\n\n", LASTCOMMENT, IPROUTE)
+ printf("spdadd %s %s any -P out ipsec\n", LOCALNET, REMOTENET[IF])
+ printf(" esp/tunnel/%s-%s/require ;\n", LOCALGW, REMOTEGW)
+ printf("spdadd %s %s any -P in ipsec\n", REMOTENET[IF], LOCALNET)
+ printf(" esp/tunnel/%s-%s/require ;\n\n", REMOTEGW, LOCALGW)
+ printf("add %s %s esp-old %s -m tunnel\n", LOCALGW, REMOTEGW, OSPI)
+ printf(" -E %s 0x%s\n -A %s 0x%s ;\n", OENC, OEKEY, OAUTH, OAKEY)
+ printf("add %s %s esp-old %s -m tunnel\n", REMOTEGW, LOCALGW, ISPI)
+ printf(" -E %s 0x%s\n -A %s 0x%s ;\n\n", IENC, IEKEY, IAUTH, IAKEY)
+ EMPTYLINE=0
+}
+/^[ ]*$/ {
+ if (EMPTYLINE!=1) { print ""; EMPTYLINE=1 }
+}
+'