Éliminer les doublons dans les contacts SOGo

Éliminer les doublons d'un ou plusieurs carnets d'adresses peut être une tâche assez complexe (l'air de rien). sogo-tool (outil en ligne de commande pour effectuer certaines opérations de maintenance sur sogo) permet de détecter et supprimer les doublons dans un même carnet. Il s'utilise comme ça:

su -s /bin/bash sogo
sogo-tool remove-doubles dani 1910-4FC4C580-B-1D65D600

(dans cet exemple, c'est le carnet 1910-4FC4C580-B-1D65D600 de l'utilisateur dani qui est dédoublonné).

Jusque là, rien d'extraordinaire. Seulement, voilà aussi la demande que vous pouvez avoir: supprimer tous les contacts du carnet 1 s'ils sont également présent dans le carnet 2.

Dans ce cas, la solution la plus simple que j'ai trouvé, c'est d'exporter ces deux carnets en LDIF (peut se faire directement depuis l'interface web) et d'utiliser le petit script suivant:

dedup.pl
#!/usr/bin/perl -w
 
use Net::LDAP::LDIF;
 
my $perso = $ARGV[0];
my $dup = $ARGV[1];
 
$perso = Net::LDAP::LDIF->new( "$perso", "r", onerror => 'undef' );
my $out = Net::LDAP::LDIF->new( "-", "w", onerror => 'undef' );
 
while( not $perso->eof ) {
    my $remove = 0;
    $entry1 = $perso->read_entry;
    if ( $perso->error ) {
        print "Error msg ($ARGV[0]): ", $perso->error, "\n";
        print "Error lines ($ARGV[0]):\n", $perso->error_lines, "\n";
    }
    else {
        my $dn1 = $entry1->dn;
        $dup = Net::LDAP::LDIF->new( $ARGV[1], "r", onerror => 'undef' );
        while( not $dup->eof ) {
            $entry2 = $dup->read_entry;
            if ( $dup->error ) {
                print "Error msg ($ARGV[1]): ", $dup->error, "\n";
                print "Error lines ($ARGV[1]):\n", $dup->error_lines, "\n";
            }
            else {
                my $dn2 = $entry2->dn;
                if ($dn1 eq $dn2){
                    print "Dup DN: $dn1\n";
                    $remove = 1;
                }
            }
        }
        $dup->done;
        if (not $remove){
            $out->write_entry($entry1);
        }
    }
}
$perso->done;
$out->done;

Il ne reste plus qu'à filtrer vos exports LDIF:

perl dedup.pl 1.ldif 2.ldif > 3.ldif

Et voilà, votre fichier 3.ldif ne devrait contenir que les contacts non présents dans le carnet 2. Il ne vous reste plus qu'à nettoyer votre carnet SOGo, puis ré-importer le fichier 3.ldif

SOGo va refuser d'importer votre LDIF s'il contient une ligne blanche en premier. Éditez le fichier LDIF pour supprimer cette ligne avant l'import

sogo doublons contacts