Olen viime aikoina pörrännyt jonkin verran Sendmail MTA:n C-koodin parissa. Tarkoitus on lisätä Sendmailiin tuki PostgreSQL-tietokannalle.
Nyt olen jo sen verran pitkällä, että ensimmäinen proof of concept julkaisu toimii. Otin kehityksen kohteeksi Sendmailin testiversion 8.16.0.29. Kuten huomaat, Compiled with: sisältää oman lisäykseni PGMAP muiden tietokantatyyppien lisäksi:
Sendmailin /etc/mail/sendmail.mc konfiguraatiotiedostossa käytetään PostgreSQL:n URL-syntaksia -H valitsimen kanssa ja -k valitsimella valitaan mikä tietokantataulu PostgreSQL:n kannassa on hakujen kohteena:
Olen kovakoodannut hakuavaimen kentän nimeksi SQL-kantaan key ja arvoksi value. Kannoissa ei ole juuri yhtään dataa, vaan ainoastaan sen verran, että pystyy testaamaan. Tässä näytteeksi psql-komennon tulostetta:
Sendmail ei käytä GNU Autoconf-työkaluja käännösaikaa ennen, vaan siinä on oma m4-makroihin perustuva käännössysteeminsä. Käänsin Sendmailin laittamalla lähdekoodipuun tiedostoon devtools/Site/site.config.m4 seuraavat asetukset:
Pistin upouuden -DPGMAP määrittelyni omalle APPENDDEF riville loppuun, mutta se voisi toki yhtä hyvin olla confMAPDEF rivillä. Sendmailin käänsin lähdekoodipuun päätasolla antamalla komennon:
Olin laittanut domainin leary.org tiedostoon /etc/mail/virtuserdomains, jotta Sendmail käyttäisi virtusertablea sen domainin osoitteiden kohdalla. Virtusertable on siis nyt määritelty olemaan uutta tyyppiä pg eli PostgreSQL-tietokanta.
Lopuksi testasin miten uusi Sendmailin testiversio resolvoi osoitteen david.bowie@leary.org.
Täytyy myöntää, että olen erittäin tyytyväinen siihen miten tämä PG-tietokantahomma nyt jo toimii! Koodia pitää tietysti vielä hioa, mutta yllättävän hienosti kaikki tuntuu sujuvan. Otin tietysti mallia olemassaolevasta LDAP-koodista ja myös muista osista kantakoodia.
Tämän projektin monimutkaisuutta lisää se, että Sendmailin kanta-abstraktiossa pyritään siihen, että kantayhteys jaetaan useampien tietokantamappien kesken. Näin ollen tarkoitus on, että jos vaikkapa virtusertable ja mailertable ovat kumpikin samassa tietokannassa, niin Sendmailin pitää avata vain yksi kantayhteys PostgreSQL:ään ja kummankin mapin kyselyt pitää tehdä saman TCP-putken kautta.
Jos tutkit ylläolevaa david.bowie@leary.org osoiteresoluutiota, niin näet, että virtuserin kohdalla Sendmail avaa yhteyden PostgreSQL-kantaan, mutta mailertablen kohdalla se käyttääkin cachessä olevaa yhteyttä, joka siis on juuri se, jonka haku virtuserista on jo aiemmin aukaissut.
Itseasiassa olen luultavasti kuluttanut noin 40 tuntia lukien Sendmailin koodia ennenkuin ryhdyin tekemään omaa koodiani. Rimakauhuakin oli, mutta tällä hetkellä Sendmail tuntuisi tekevän tietokantahaut järkevästi PostgreSQL-kannasta.
Huonojakin uutisia on: En nimittäin ole vielä implementoinut mitään timeoutteja tietokantayhteyksien muodostukseen tai hakujen kestoon. Kantayhteyden timeoutin saanee lisättyä URL-parametrien joukkoon, mutta kun haku on tehty, niin en täysin varmaksi tiedä miten timeouttaus pitäisi toteuttaa.