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.