Lars Åges tanker

Politikk og teknologi

Hvordan vi har satt opp Zimbra

| 2 kommentar

Nok en uke har gått, og i løpet av uka har jeg primært jobbet med å sette Zimbra i produksjon som nytt gruppevaresystem for skolene i Tønsberg og Nøtterøy kommuner. Vi kjører fra før av Novell eDirectory som katalogtjeneste og Novell NetMail som mailserver via IMAP, og vi måtte derfor ha på plass to ting.

  • Synkronisering av brukerdatabase fra eDirectory til Zimbra, siden Zimbra har sin egen OpenLDAP-database
  • Migrering av epost fra NetMail til Zimbra

Den første biten gjorde jeg ganske enkel, med et PHP-script som går igjennom hele LDAP-katalogen og lager kommandoer som kan brukes til zmprov:

<?php

$defaultpassword = 'defaultpassword_for_user';

$ldap1_con = ldap_connect("ldap://10.5.48.10");

if($ldap1_con) $ldap1_bind = ldap_bind($ldap1_con, 'cn=admin,o=VESTFOLD', 'very_secret_password');

if(!$ldap1_bind) die("LDAP1-bind failed...(".ldap_error($ldap1_con).")");

$findattrs = array("cn", 'description',  'fullName', 'sn', 'mail', 'givenName', 'title', 'company');

$search = ldap_search($ldap1_con, 'o=VESTFOLD', '(&(objectClass=Person)(|(title=Elev)(title=Laerer)(company=IKT)))', $findattrs);

if(!$search) {
 // Search failed.
 echo "LDAP-errno: ". ldap_errno($ldap1_con)."\n";
 echo "LDAP-Error: " . ldap_error($ldap1_con)."\n";
}
$ldap = ldap_get_entries($ldap1_con, $search);
$output = NULL;
for($i=0;$i<$ldap['count'];$i++) {
 $mail = $ldap[$i]['mail'][0];
 $splitmail = split("@", $mail);
 if(strpos($mail, "nottkom.no")) $kommune = 'Notteroy';
 elseif(strpos($mail, "notteroy.kommune.no")) $kommune = 'Notteroy';
 elseif(strpos($mail, "tbgskole.no")) $kommune = 'Tonsberg';
 elseif(strpos($mail, "tonsberg.kommune.no")) $kommune = 'Tonsberg';

 if($kommune == 'Tonsberg') $maildomain = 'tbgskole.no';
 elseif($kommune == 'Notteroy') $maildomain = 'nottkom.no';

 if($ldap[$i]['company'][0] == 'IKT') $policy = 'iktpolicy'; // IKTpolicy
 elseif($ldap[$i]['title'][0] == 'Laerer') $policy = 'laererpolicy'; // Laererpolicy
 elseif($ldap[$i]['title'][0] == 'Elev') $policy = 'elevpolicy'; // Elevpolicy
 else $policy = 'default';

 $username = $ldap[$i]['cn'][0]."@".$maildomain;
if(strpos($mail, $ldap[$i]['cn'][0])) $createalias = 0; // Mail contains username, do not create alias
 else $createalias = 1;

 $output .= "ca ".$username." $defaultpassword\n"; // Create account
 $output .= "ma ".$username." displayName '".$ldap[$i]['givenname'][0]." ".$ldap[$i]['sn'][0]."'\n";
 $output .= "ma ".$username." zimbraNotes 'Migrated ".date("Ymd H:i")."'\n";
 $output .= "ma ".$username." sn '".$ldap[$i]['sn'][0]."'\n";
 $output .= "ma ".$username." givenName '".$ldap[$i]['givenname'][0]."'\n";
 $output .= "ma ".$username." ou '".$ldap[$i]['company'][0]."'\n";
 $output .= "sac ".$username." '".$policy."'\n";
 if($createalias) {
 $output .= "aaa ".$username." ".$splitmail[0]."@".$maildomain."\n";
 $output .= "ma ".$username." zimbraPrefFromAddress '".$splitmail[0]."@".$maildomain."\n";
 }
 $output .= "ma ".$username." zimbraPrefLocale no\n"; // Set default language to norwegian

#       $output .= "aal -s SADM-MAIL02.ped.local ".$username." zimbra.soap debug\n";
#       echo $ldap[$i]['cn'][0]."\n";
}

echo $output;

Lagre dette scriptet som eDir2Zimbra.php, og kjør det med php på kommandolinje (eller kjør det via en webserver og lagre teksten som kommer et sted på Zimbra-serveren

php eDir2Zimbra > /tmp/add_zimbraaccounts

Deretter kan den fila brukes som input til zmprov

su - zimbra -c 'zmprov < /tmp/add_zimbraaccounts'

Har ikke lagt inn muligheten for å deaktivere kontoer automatisk i Zimbra ennå, men scriptet kan trygt kjøres mange ganger. Må vel oppdatere scriptet rett over sommeren, når en god del av lærere og elever har sluttet «offisielt» i kildesystemene mine, slik at kontoene blir disablet i eDirectory.

Migrering av e-post

Denne biten trodde jeg at jeg hadde rimelig klar. NetMail kjører all mailen i mbox-format, og jeg tenkte derfor orginalt å kjøre denne metoden:

  • Konvertere mbox til maildir via et av mange script for å gjøre det
  • Deaktivere autentisering mot eDirectory for domenet, og dermed ha standardpassordet definert i scriptet over på alle brukerne
  • Kjøre et av mange script for å flytte fra maildir til remote IMAP-server

Fikk dette til å fungere rimelig greit, men oppdaget når jeg testet med et par elever, som i hovedsak hadde fått masseutsendte eposter, at NetMail for å spare plass flytter ut mailer som er over 4k og sendt til flere enn 5 mottagere til et eget felleslager. Alle referansene i mbox-fila til dette felleslageret skapte problemer, og mailene kunne ikke (i hvertfall ikke lett) flyttes over.

Fordi NetMail lagret mailen i så sært format, så fant jeg ut at jeg for enkelthets skyld skulle bruke IMAP2IMAP-synkronisering. Testet litt med IMAPsync, og den fungerte rimelig greit, men jeg måtte ha passordet til alle brukerne for å foreta migreringen. Jeg vurderte det til at jeg kunne nullstille passordet til alle 8000 brukere, men vi har akkurat hatt en sak med elever som har fått tilgang til læreres passord, og byttet sine egne karakterer/fravær, og en slik prosess må nødvendigvis gjøres ekstremt kontrollert. Bestemte meg derfor at jeg ville forsøke å sniffe passordet til alle brukerne i stedenfor… (Yeah, I know: ugly som bare det, men jeg har i hvertfall fått det til å fungere).

Jeg kunne gjøre det på flere måter

  • Sniffe brukernavn og passord på IMAP med ethercap mot den gamle NetWare-servere
  • Sniffe brukernavn og passord på IMAP med ethercap mot den nye Zimbra-serveren
  • Prøve å få Zimbra/webmailen til å gjøre passordet til brukeren tilgjengelig på en eller annen måte

Å prøve å sniffe passordet via NetWare-serveren slo jeg ganske fort fra meg. Hovedønske er å få alle brukerne over på nytt system, og det ville være vanskelig å få bytta over brukerne til nytt system, hvis de må logge seg inn på det gamle, og noen skal flyttes over til det nye «etterhvert».

Å sniffe passordet mot IMAP på Zimbra-serveren kunne vært en mulighet, men jeg prioriterte det ned som løsning, da jeg ikke ønsker at brukerne skal bruke den gamle webmailen (integrert del av LMS-systemet vårt), men det nye å flotte webgrensesnittet til Zimbra. Det ville da være unaturlig å be brukerne om å «bruk den gamle et par ganger, og så benytt den nye etterpå».

Jeg begynte først å leke litt med muligheten for å lage en Zimlet som foretar import av mail fra den gamle serveren, men fant ikke noen gode howtoer på området, og jeg ikke orket å bruke lang tid på prosjektet, for å lære meg å kode Zimlet’er. Lekte også litt med å legge inn en javascript-prosess tok i mot passordet man logget på med, og sendte det videre til et separat system. Greide her ikke å bli fortrolig med kodestilen til Zimbras JSP-kode, så slo det også fra meg.

Gikk til slutt videre med å titte på debug-loggene man kunne aktivere på en bruker, for å se om de hadde mulighet til å logge passordet til brukeren. Hverken IMAP eller POP-så ut til å logge passordene, men SOAP-interfacet logget disse ved pålogging på webmailen. Brukte derfor scriptet over til å lage en kommando fo å aktivere logging på alle brukere:

 $output .= "aal -s SADM-MAIL02.ped.local ".$username." zimbra.soap debug\n";

Dette skal også kjøres via zmprov som over-

Etter dette, skrev jeg et kjapt script for å lete igjennom loggene etter brukernavn og passord, logge dette til en database, og så kjøre sletting av loggingen på den aktuelle brukeren. Fra databasen lagde jeg et nytt separat script som startet opp imapsync med riktig brukernavn og passord, og da var det bare for brukerne å logge inn, og vente til den gamle mailen dems var flyttet over til det nye flotte gruppevaresystemet vårt.

2 kommentarer

  1. Pingback: Friprogsenteret – Godbiter fra GoOpen-programmet 2010

  2. Hvordan setter vi opp eposten mot vår andriod telefon? IMAP

Legg igjen en kommentar

Påkrevde felter er merket *.