Tag Archives: Perl

Perl en Ini-files

Soms zie je best leuke constructies om configuratiebestand in te lezen, maar Perl bestaat al zolang dat er voldoende modules zijn. Zo ook een module om het bekende ini-file formaat in te lezen. En met de volgende regels in je code heb je al toegang tot de content van een ini-file.

use Config::IniFiles;
use Env qw(HOME);
$cfg = new Config::IniFiles(-file => "$ENV{HOME}/.inirc");
$config{'identity'}{'dbtype'} = $cfg->val('Identity', 'DBType');
$config{'identity'}{'dbnode'} = $cfg->val('Identity', 'DBNode');
$config{'dict'}{'dbtype'} = $cfg->val('Dict', 'DBType');

En natuurlijk ook een voorbeeld van de ini-file.

[Dict]
DBType=variable1
DBNode=variable2
[Identity]
DBType=variable3
DBNode=variable4

Gezien het gemak waarmee dit gedaan kan worden blijft de vraag over waarom je nog eigen procedures zou schrijven.

Condensed Perl-code

Bij het opschonen cq herschijven van wat code kwam de volgende regel uit mijn vingers. Deze condensed Perl-code blijkt ook nog redelijk leesbaar te zijn.

do $domains{lc($1)}++ if /postfix\/qmgr.+ from=<.+\@(.+)>,/;

Of het verstandig is moet de toekomst uitwijzen, maar het past nu wel netjes op één regel zonder wrapping. Een ding wat wel langzaam duidelijk wordt is dat Perl een taal is die je door de jaren heen je code anders laat uitschrijven. We zullen zien wat de toekomst brengt, maar ik vrees het ergste ;-)

DKIM verifiëren

DKIM aka DomainKeys Identified Mail is een alternatief op SPF aka Sender Policy Framework en hoewel het lastiger is op te zetten aan de verzenderkant is het wel goed te gebruiken als ontvanger. Zeker omdat oa grote partijen zoals Google en Yahoo het ook gebruiken om hun e-mail te versturen. Gelukkig zijn er ook steeds meer kleinere partijen die DKIM gebruiken.

Op Debian kan door het installeren van Mail::DKIM het oa worden gebruikt door SpamAssassin en Amavisd-new.

$ sudo apt-get install libmail-dkim-perl

Voor SpamAssassin om gebruik te maken van DKIM hoeft in het bestand /etc/spamassassin/v312.pre de volgende regel staan zonder #-teken ervoor.

loadplugin Mail::SpamAssassin::Plugin::DKIM

Je kan los een DKIM-proxy installeren om een header te laten toevoegen of de DKIM-signature voldoet, maar als je al al gebruikt maakt van Amavisd-new dan kan het al automatisch worden gedaan door Amavisd-new. Zorg dat in het bestand /etc/amavis/conf.d/50-user de volgende regel staan en herstart de daemon.

$enable_dkim_verification = 1;

Je zal nu zien dat de volgende regels zien verschijnen in /var/log/mail.log:

Dec 29 20:36:45 server amavis[7162]: Module Mail::DKIM 0.32
Dec 29 20:36:45 server amavis[7162]: DKIM code loaded

Als je bijvoorbeeld RoundCube gebruikt dat kan je met DKIM verification plugin de status automatisch laten weergegeven als de gebruiker zijn e-mail leest. Het zal je ook opvallen waar het voorlopig niet verstandig is om e-mail te rejecten op basis van een invalide DKIM signature. Bij sommige mailinglisten worden extra regels aan de body van de e-mail toegevoegd waardoor het signature niet meer valide is.

IMAP migreren naar IMAP, deel 1

Vroeger was Courier redelijk de standaard voor diensten zoals POP3 en IMAP, maar er waren te veel beperkinge en de developers te moeilijk in de omgang. En totdat Dovecot aan de releasecandidates begon van 1.0 serie was er ook niet echt een alternatief. Een zeer goed bruikbaar alternatief welke nog hard in ontwikkeling is met mailboxen in verschillende namespaces zoals public en private, maar ook fatsoenlijk Sieve-ondersteuning.

Met de komst van Roundcube 0.3 als webmailclient zijn er nieuwe mogelijkheden beschikbaar gekomen welke nu langzaam benut kunnen worden. Ondersteuning voor Sieve is daar eentje van en met de belofte van de developers om ook ondersteuning in Evolution te bouwen komt serverside mailfitering voor oa de Linux-wereld en de normale gebruikers redelijk dichtbij. Geen geknutsel meer met .procmailrc of .maildrop files uploaden en hopen dat het werkt.

Helaas kwam er direct een probleem aan het licht bij het testen. Een probleem in de private namespace van de mailbox en eentje die eigenlijk voorkomt uit de migratie van Courier naar Dovecot. Om het gedrag van Courier te imiteren beschikt Dovecot over de mogelijkheid om standaard een prefix voor subfolders te zetten. Een actie om zo gebruikers transparante kunnen migreren, maar welke wel zorgt dat alle subfolders onderdeel zijn van de Inbox.

Om cache fouten in mailclients uit te sluiten is het gebruiken van een simpele client aan te raden. Simpeler dan de Perl-code hieronder bestaat bijna niet, maar doet precies wat het moet doen.

#!/usr/bin/env perl
use Net::IMAP::Client;
my $imap = Net::IMAP::Client->new(
server => 'mailhost',
user => 'username',
pass => 'password',
ssl => 1,
port => 993
) or die "Could not connect to IMAP server";
$imap->login or die('Login failed: '.$imap->last_error);
foreach ($imap->folders) { print $_."\n"; }

Bij de eerste run komt de output zoals die nu wordt aangeboden aan de mailclient.

INBOX.Trash
INBOX.Drafts
INBOX.Test
INBOX.Junk
INBOX.Sent
INBOX

Bij het uitschakelen van alleen de prefix-optie in Dovecot komt gelijk naar voren wat er gaat veranderen.

Trash
Drafts
Test
Junk
Sent
INBOX

Bij het controleren met verschillende mailclients komt direct naar voren dat hier wat slims gedaan moet gaan worden. Want de mailclients zien subfolders die ineens niet meer onderdeel zijn van de Inbox. Technisch gezien zijn ze nu ook geen onderdeel van de Inbox. Voor de standaard folders zoals Trash, Drafts, Junk en Sent zal dit niet echt een probleem gaan vormen, maar wel voor bv de folder Test.

Perl blijft het plakband

Perl Camel“Perl is the ducktape of Internet” is de uitspraak van iemand bij Sun Microsystems en ik kan hem geen ongelijk geven. In amper een uurtje en 100 regels code doorloopt een Perl-script nu elke dag netjes door een tabel en zoekt resource records op in DNS. Als alles correct gaat in de dry-run van de komende tijd zal dit me weer wat tijd besparen wat ik dan aan andere dingen kan besteden. Ik vraag me alleen wel af of ik zo uberhaupt nog wel aan Python of Java leren toekom en of het nog toegevoegde waarde gaat hebben.