AOSI je akronim za Aplikaciju za Održavanje Sadržaja Imenika i jedna je od osnovnih komponenti sustava AAI@EduHr. AOSI je web servis koji dohvaća, ažurira, dodaje i briše podatke u LDAP imeniku matične ustanove.
Od verzije 2.0 AOSI donosi niz poboljšanja i novih mogućnosti - jedna od najvažnijih je i sustav modula, odnosno plug-in-ova. Sustav je zamišljen na način da prije i poslije svake akcije kojom se mijenja stanje podataka u imeniku dozvoli pokretanje i izvršavanje još neke dodatne akcije i na taj način omogući lakšu integraciju s drugim aplikacijama korištenim za pohranu i manipulaciju podataka o korisnicima na matičnoj ustanovi. Sustav omogućuje okidanje 6 akcija:
beforeAddUser
- izvršava se prije pokušaja dodavanja elektroničkog identiteta u LDAP imenik;
afterAddUser
- izvršava se nakon pokušaja dodavanja elektroničkog identiteta u LDAP imenik;
beforeDeleteUser
- izvršava se prije pokušaja brisanja elektroničkog identiteta iz LDAP imenika;
afterDeleteUser
- izvršava se nakon pokušaja brisanja elektroničkog identiteta iz LDAP imenika;
beforeChangeAttribute
- izvršava se prije pokušaja promjene atributa određenog elektroničkog identiteta u LDAP imeniku;
afterChangeAttribute
- izvršava se nakon pokušaja promjene atributa određenog elektroničkog identiteta u LDAP imeniku;
Primjer za funkciju ldapAddUser
bi se mogao ovako prikazati:
Funkcije before*
bi trebale provjeriti smije li se upisati elektronički dentitet u LDAP imenik, odnosno provjeriti postoji li već u drugim repozitorijima zapis koji bi se trebao upisati (npr. postoji li već takav account u Microsoft Active Directory bazi) te spriječiti upisivanje.
Funkcije after*
bi trebale obaviti rukovanje podacima o elektroničkom identitetu, odnosno upisati/obrisati/osvježiti podatke u drugim repozitorijima (npr. dodati korisnika u Microsoft Active Directory).
Sustav modula se sastoji od:
/usr/lib/aosi/Plugins.pm
- datoteka koja sadrži logiku;
/usr/lib/aosi/Plugins
- direktorij koji sadrži same module;
/usr/lib/aosi/Plugins/plugins.conf
- datoteka koja sadrži popis aktivnih modula;
Da bi AOSI prepoznao dodatni modul potrebno je:
- Napraviti Perl paket (npr.
MojModul.pm
) i smjestiti ga u direktorijPlugins;
- Minimalni sadržaj takve datoteke (za
MojModul.pm
) bi trebao biti:
package MojModul; 1;
- Potrebno je "registrirati" modul u datoteci
plugins.conf
, odnosno potrebno je dopisati samo naziv modula (npr.MojModul
);
Nakon restarta AOSI servisa (/etc/init.d/aosi restart
), modul će se učitati. Gore opisani modul ne radi ništa, jer još nisu definirane funkcije za neku od 6 akcija. Nije potrebno definirati svih 6 funkcija, npr. mogu se definirati samo dvije: afterAddUser
i afterDeleteUser
.
before* funkcije:
Funkcije beforeAddUser
i beforeDeleteUser
imaju oblik:
sub before*User{ my($status_hash, $ldap, $base_dn, $entry_in, $user, $pwd) = @_; # obrada return $code, $msg, $out_panic; }
gdje je:
$status_hash
- hash ukojemu su popisani rezultati svih prethodno izvršenih modula. Hash je oblika:
$status_hash->{*NAZIV_MODULA*}->{*VRSTA_AKCIJE*}->{*VARIJABLA*} = *VRIJEDNOST*;
gdje je:
*NAZIV_MODULA* -
naziv modula kako je registriran uplugins.conf
datoteci (npr.MojModul
);
*VRSTA_AKCIJE* -
Jedan od ova dva stringa:before
iliafter;
*VARIJABLA* -
Postavljaju se tri varijble:code
,msg
tepanic
pri čemu je:
code -
brojčana oznaka uspješnosti operacije, ako je 0 (nula) operacija je uspjela;
msg -
tekstualna poruka o uspješnosti operacije;
panic -
brojčana vrijednost, ako nije 0 (nula) označava da modul traži prekid i sve daljnje operacije se trebaju zaustaviti!
$ldap
- referenca na Net::LDAP objekt za povezivanje s LDAP imenikom.
$base_dn
- base DN zapis u LDAP imeniku;
$entry_in
- XML kojim se traži određena akcija. XML je oblika:
<entry dn="uid=user,dc=domena,dc=hr"> <attribute ldapname="sn"> <value>User</value> <value>User2</value> </attribute> <attribute ldapname="mail"> <value>user@domain.hr</value> <value>user2@domain.hr</value> <value>user@gmail.com</value> </attribute> </entry>
$user -
UID administratora imenika;
$pwd - zaporka
administratora imenika;
Funkcija mora vratiti sve tri vrijednosti: code
, msg
te panic
kako bi se mogao napuniti hash $status_hash
.
Funkcija beforeChangeAttribute
se razlikuje samo u jednom argumentu:
my($status_hash, $type, $ldap, $base_dn, $entry_in) = @_;
odnosno dodan je argument $type
koji određuje koja vrsta promjene je zahtjevana:
- 1 - dodavanje atributa (
Add
);
- 2 - promjena atributa (
Modify
);
- 3 - brisanje atributa (
Delete
);
after* funkcije:
Funkcije afterAddUser
i afterDeleteUser
imaju oblik:
sub after*User{ my($status_hash, $entry_in, $out_xml, $user, $pwd) = @_; my($code, $msg, $before_code, $before_msg, $before_panic); ($code, $msg) = Plugins::parse_ldap_xml($out_xml); $before_code = $status_hash->{'MojPlugin'}->{'before'}->{'code'}; $before_msg = $status_hash->{'MojPlugin'}->{'before'}->{'msg'}; $before_panic = $status_hash->{'MojPlugin}->{'before'}->{'panic'}; # obrada return $code, $msg, $out_panic; }
gdje je:
$status_hash
- isto kao kod before*
funkcija;
$entry_in
- isto kao kod before*
funkcija;
$out_xml
- XML kojeg vraća AOSI, oblika:
<entry dn="uid=user,dc=domena,dc=hr"> <status code="0">Success!</status> </entry>
$user
- isto kao kod before*
funkcija;
$pwd -
isto kao kod before*
funkcija;
Datoteka Plugins.pm
sadrži funkciju Plugins::parse_ldap_xml
koja olakšava dohvat brojčane i tekstulane obavijesti o uspješnosti AOSI akcije.
U primjeru je prikazan dohvat vrijednosti iz hasha $status_hash
.
Kao i kod *before
funkcija, funkcija mora vratiti tri vrijednosti: code
, msg
te panic
kako bi se mogao napuniti hash $status_hash
.
Funkcija afterChangeAttribute
razlikuje se samo u jednom argumentu:
my($status_hash, $type, $ldap, $base_dn, $entry_in) = @_;
odnosno dodan je argument $type
koji određuje koja vrsta promjene je zahtjevana:
- 1 - dodavanje atributa (
Add
);
- 2 - promjena atributa (
Modify
);
- 3 - brisanje atributa (
Delete
);
Izlazni XML:
Izlazni XML AOSI web servisa je također dobio dodatak, odnosno ako nema registriranih modula izlazni XML je nepromjenjen:
<entry dn="uid=user,dc=domain,dc=hr"> <status code="-81">User does not exist!</status> </entry>
Međutim ako postoje registrirani moduli (u ovom primjeru su registrirani MSAD, File i WebService) izlazni XML AOSI web servisa bit će oblika:
<entry dn="uid=user,dc=domain,dc=hr"> <before_plugin_status name="MSAD" code="-10031">User user does not exists!</before_plugin_status> <before_plugin_status name="File" code="0">OK</before_plugin_status> <before_plugin_status name="WebService" code="0">OK</before_plugin_status> <status code="-81">User does not exist!</status> <after_plugin_status name="MSAD" code="-10040">Before action returned: panic=0; code=-10031; message=User atest does not exists!</after_plugin_status> <after_plugin_status name="File" code="0">OK</after_plugin_status> <after_plugin_status name="WebService" code="-81">User does not exist!</after_plugin_status> </entry>
Brojčani kodovi:
Svi brojčani kodovi grešaka kod modula moraju imati oblik -10XYY
, gdje je:
X
- jedinstveni broj modula kojeg dodjeljuje AAI@EduHr;
YY -
jedinstveni kod greške na razini modula;