Simple != easy
Tavaliselt ei viitsi ma oma tööst kirjutada, aga kuna ma pole siia midagi 20 päeva kirjutanud ja seda just põhiselt töö pärast, siis võiks kirjutan ühe IT alase posti.
Vaja oli siis C++ kirjutatud applikatsiooniserverile kirjutada moodul, mis võimaldaks serveris startida/stopida protsesse (snmpset) ja küsida nende kohta statistikat (snmptable). Ainuke vabalt saada olev C/C++ lib on net-snmp.
SNMP’st (SIMPLE Network Management Protocol) ma midagi enne ei teadnud ja SNMP FAQs arvatakse, et SNMP selgeks saamine võtab umbes pool aastat. Ma arvasin, et kui APIga implemeteerima hakata ja samal ajal Internetist juttu lugeda, siis saab hakkama. Sai, aga närvirakke hävis selle käigus kõvasti.
Põhiprobleemiks oli net-snmp C API ja selle väga puudulik dokumentatsioon. Nüüd tahaks ma kasutada roppu sõimu, aga võtan end kokku ja püüan emotsioonivabalt kirja panna, miks net-snmp imeb.
Net-snmp’s on tabelite täitmiseks on umbes seitse erinevat APIt, mis kasutavad C selliseid võimalusi nagu void*, funktsiooni pointerid ja variable arguments makrod. Enamus funktsioone ei ole dokumenteeritud (st. funktsiooni kirjeldus ütleb sama, mis funktsiooni nimetus).
Kas ei oleks mõistlikum teha üks API ja see ka korralikult dokumenteerida?
Net-snmp tabelite API kasutamise “lihtsusest” saab aru ka kui vaadata examples kataloogis oleva tabeli näite suurust - see on üle 50kb C koodi.
Net-snmps õnnestus samuti mitme bugi otsa komistada.
Nt oli vaja täita kaks erinvat tabelit ja hiljem kirjutatud tabeli täitmise handlerit ei kutstutud mingil põhjusel välja - asi lahenes kui kui tabelite handlerite initsialiseerimisfunktsioonid kutsusin välja vastupidises järjekorras.
free_loop_context_at_end funktsiooni pointer, mida API peaks välja kutsuma, kui on vaja tabelitäitmiseks kasutatud datat mälust kustutada, siis see lihtsalt ei toimi!
Et see artikel puhtaks vingumiseks ei jääks ja kellegil sellest võibolla ka kasu oleks, siis näitekood on siin.
Kui platvormi valida saab, siis http://www.snmp4j.org tundub märksa mõistlikum.