Noen dager har gått siden Michael Jackson døde, og det var mye rart som skjedde i løpet av veldig kort tid. Alle nettavisene begynte i full fart å publisere “noen andre sier at Michael Jackson er død”, og det var vanskelig å få noe bekreftet før det hadde gått flere timer. På Wikipedia ble artikkelen om Michael Jackson låst på alle de store språkene rimelig med en gang, fordi det ikke var kommet en offisiell uttalelse ennå. Minutter etter at de første rapporterene om popstjernens død kom, begynte alarmene også å gå på #wikimedia-tech; serverne for Wikipedia begynte å få belastningsproblemer.
Det tok litt tid å finne ut hva problemet var, men til slutt viste det seg at artikkelen om Michael Jackson ble besøkt så mange ganger på kort tid, at serverene slet med å bygge opp cachen på nytt. Fiksen der ble da å kjøre et quick hack:
Index: ParserCache.php
===================================================================
--- ParserCache.php (revision 52088)
+++ ParserCache.php (working copy)
@@ -63,6 +63,7 @@
if ( is_object( $value ) ) {
wfDebug( "Found.\n" );
# Delete if article has changed since the cache was made
// temp hack!
+ if( $article->mTitle->getPrefixedText() != 'Michael Jackson' ) {
$canCache = $article->checkTouched();
$cacheTime = $value->getCacheTime();
$touched = $article->mTouched;
Heldigvis var det ikke bare Wikipedia som ikke taklet nyhetene, men med en million sidevisninger på en time på engelsk Wikipedia alene, så har man vel egentlig ikke testet MediaWiki for belastningen som kom…
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.
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.
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:
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
Å 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.
På skolenettet i kommunen har vi Novell eDirectory, og har gratis-mailsystemet Novell hadde i 2004 kalt NetMail for alle elever og lærere, med IMAP-tilkobling og lesing i LMSen. Denne mailserveren har vi bare hatt mer og mer problemer med etterhvert som årene har gått, og det faktum at den kjører på NetWare, noe ingen av oss på avdelingen egentlig har peiling på, gjør ikke problemene noe mindre.
Satte meg i forrige uke ned og testet mange forskjellige open source-gruppevaresystemer. I utgangspunktet hadde jeg et par små krav:
Hadde på forhånd blitt anbefalt om Zimbra fra en bekjent, som er utviklet av Yahoo!. Vi hadde sett litt på det på avdelingen, og var enige om at det AJAX-baserte grensesnittet var veldig bra, og at Zimbra løste mange (om ikke de fleste) problemene vi hadde hatt med LMSen og nåværende mailserverløsning.
Satte i gang installasjonen av Zimbra, men slet lenge med å få til autentisering mot eDirectory. Ingen av dokumentasjonene jeg greide å finne viste noe relevant for problemene mine. Jeg ga til slutt opp, og begynte å labbe på noen andre løsninger. I forbindelse med testing av en av disse løsningene, fant jeg dokumentasjon som viste seg å være relevant. I NetMail har vi opprettet mange brukerkontoer, og for lærere har vi opprettet alias-objekter som fornavn.etternavn for å få disse som e-post-adresser. Disse alias-objektene ser ut som ordinære brukere når de listes opp i LDAP, og dermed ble problemet at uansett hvordan man søkte etter brukere, så fikk man to svar, og Zimbra og de andre gruppevareløsningene greide ikke å bestemme hvilken av disse brukerobjektene den skulle bruke, og ga feilmelding på det. Flyttet alle aliasene ut fra OUene for brukerne, og problemet var løst.
Har nå satt opp Zimbra for test for endel skoler, og det ser ut til å fungere rimelig bra. Zimbra er en skalerbar løsning, og forhåpentligvis vil vi etterhvert få en veldig god e-post-løsning, med mye funksjonalitet. Gleder meg allerede til vi kan sette dette i produksjon.
Da har det gått en ukes tid siden LarvikLAN ble ferdig. Ser dessverre ut som at vi gikk med underskudd, men det var en spennende helg, og jeg har aldri fått så gode tilbakemeldinger fra utleier som vi har fått nå. Morsomt.
Nå er det sommerferie og LAN-sesongen ligger litt nede, men begynner arbeidet med neste arrangement i august tenker jeg.
God sommer folkens
Nå har jeg registrert meg på Bloggurat.