4.3. Lo schema LDAP

Questo che segue è lo schema che definisce le classi e gli attributi utilizzati nel nostro database di esempio, con qualche commento aggiunto per spiegare le varie sezioni:

#
# infra.schema
#

# OIDs di base
objectIdentifier infraOID 1.1
objectIdentifier infraLDAP infraOID:2
objectIdentifier infraAttributeType infraLDAP:1
objectIdentifier infraObjectClass  infraLDAP:2
    

queste sono delle macro che definiscono gli oid per le classi e gli attributi che andiamo a descivere. L'oid 1.1 è utilizzato per test e prove, sarebbe opportuno registare i propri oid per evitare sovrapposizioni con altri elementi.


# abbreviazioni per tipi di dato molto comuni
objectIdentifier String   1.3.6.1.4.1.1466.115.121.1.26
objectIdentifier Boolean  1.3.6.1.4.1.1466.115.121.1.7
objectIdentifier Date     1.3.6.1.4.1.1466.115.121.1.26
objectIdentifier Counter  1.3.6.1.4.1.1466.115.121.1.27



### Attributi

attributetype ( infraAttributeType:7 NAME 'status'
        DESC 'Status of an object'
        EQUALITY caseIgnoreIA5Match
        SYNTAX String SINGLE-VALUE )
    

l'attributo status è stato introdotto per mantenere nel database LDAP oggetti con stati differenti (ad esempio in fasi diverse della creazione, o per indicare l'obbligatorio cambio di password al primo utilizzo, o per disabilitare un account senza cancellarlo). Tutti i filtri di query che vengono usati per i servizi virtuali contengono una parte che verifica se status è active.


attributetype ( infraAttributeType:1 NAME 'documentRoot'
        DESC 'The absolute path to the document root directory'
        EQUALITY caseExactIA5Match
        SYNTAX String SINGLE-VALUE )

attributetype ( infraAttributeType:2 NAME 'serverAlias'
        DESC 'Apache server alias'
        EQUALITY caseExactIA5Match
        SYNTAX String )

attributetype ( infraAttributeType:3 NAME 'options'
        DESC 'Comma separated string of options'
        EQUALITY  caseExactIA5Match
        SYNTAX String SINGLE-VALUE )    

attributetype ( infraAttributeType:5 NAME 'alias'
        DESC 'apache alias'
        EQUALITY caseExactIA5Match
        SYNTAX String SINGLE-VALUE )

attributetype ( infraAttributeType:6 NAME 'parentSite'
        DESC 'sito a cui si riferisce un alias apache'
        EQUALITY caseExactIA5Match
        SYNTAX String SINGLE-VALUE )
    

questi sopra sono attributi creati appositamente per memorizzare valori relativi ai virtual host e sottositi di Apache.


attributetype ( infraAttributeType:8 NAME 'ftpEnabled'
        DESC 'Machine enabled to use the network '
        EQUALITY caseIgnoreIA5Match
        SYNTAX String  SINGLE-VALUE )

attributetype ( infraAttributeType:12 NAME 'creationDate'
        DESC 'Accont creation date'
        EQUALITY caseIgnoreIA5Match
        SYNTAX Date SINGLE-VALUE )

attributetype ( infraAttributeType:20 NAME 'dbuser'
        DESC 'username of datbase'
        EQUALITY caseIgnoreIA5Match
        SYNTAX String SINGLE-VALUE )

attributetype ( infraAttributeType:21 NAME 'dbname'
        DESC 'database name'
        EQUALITY caseIgnoreIA5Match
        SYNTAX String SINGLE-VALUE )

attributetype ( infraAttributeType:22 NAME 'clearPassword'
        DESC 'cleartext password'
        EQUALITY caseExactIA5Match
        SYNTAX String SINGLE-VALUE )
    

questi ultimi tre sono attributi relativi agli oggetti database MySQL. Ovviamente MySQL non è in grado di autenticare gli utenti con LDAP, ma è comunque utile dal punto di vista amministrativo mantenere questi dati nel database (perlomeno possiamo sapere facilmente a quale utente fanno riferimento).


### Classi

objectclass ( infraObjectClass:1 NAME 'infraObject'
        SUP top ABSTRACT
        DESC 'Basic administrable object'
        MAY ( creationDate $ host $ status )
        )
    

questa è la classe base da cui poi derivano tutti gli oggetti che corrispondono ai servizi virtuali; in questo modo è possibile avere un set di attributi comuni a tutti questi oggetti (come ad esempio degli attributi relativi alla gestione, oppure - vedi host - si può specificare su quale macchina è basato il servizio).


objectclass ( infraObjectClass:2 NAME 'virtualHost'  
        SUP infraObject STRUCTURAL
        DESC 'Apache virtual host'
        MUST ( documentRoot $ cn $ status )
        MAY ( serverAlias $ emailAddress $ options )
        )

objectclass ( infraObjectClass:3 NAME 'virtualMailUser'
        SUP infraObject STRUCTURAL
        DESC 'Virtual mail user' 
        MUST ( mail )
        MAY ( mailMessageStore $ userPassword $
              mailAlternateAddress $ mailForwardingAddress $ 
              gidNumber $ uidNumber )
        )

objectclass ( infraObjectClass:4 NAME 'subSite'
        SUP infraObject STRUCTURAL
        DESC 'Apache sub-directory of our main sites'
        MUST ( alias $ parentSite $ documentRoot )
        )

objectclass ( infraObjectClass:8 NAME 'dataBase'
        SUP infraObject STRUCTURAL
        DESC 'MySQL database info'
        MUST ( dbname )
        MAY  ( dbuser $ clearPassword )
        )

objectclass ( infraObjectClass:10 NAME 'ftpAccount'
        SUP infraObject AUXILIARY
        DESC 'an FTP account'
        MUST ( ftpEnabled )
        )

    

queste sono le classi corrispondenti ai vari servizi virtuali. L'unica eccezione è l'oggetto ftpAccount, definito come una classe "aggiuntiva" a shadowAccount, di modo che il server FTP si possa autenticare tramite PAM; in definitiva queste però non sono differenze importanti dato che comunque vengono nascoste dal software di gestione.