Left Up Right Nisserver mit mehreren Typen von Maps

Grammatik für Nismap-Beschreibungsdatei

Hier ein Beispiel:
# Kommentar : Beispiel für nismaps.conf
# globale Zugriffsliste
allow 192.168.10.1
allow 127.0.0.1
deny 192.168.10.0/255.255.255.0
allow 192.168.1.0/24
allow 192.168.2.0/24
allow 192.168.3.0/24
deny 0.0.0.0/0.0.0.0

directory = "/var/yp/maps/";
maxopen   = 5; # Zahl der Maps, die gleichzeitig geöffnet werden dürfen
#Adabas - Parameter
Serverdb = "MMIMS"; 
Dbuser   = "NISSERVER";
Dbpass   = "geheim";

#Nun folgen die Domains
Domain intern
{
# Globale Konfigurationsparameter
  Adabas passwd.byname,passwd
  {
    fetch = "SELECT * FROM passwd WHERE login='%s'";
    first = "SELECT login FROM passwd";
    next  = "SELECT login FROM passwd WHERE login>'%s'"; 
    manglefield = 2 ; # default, zur zum test

    mangle 192.168.3.0/24
  }

  Adabas passwd.byuid
  {
    fetch = "SELECT * FROM passwd WHERE uid =%s";
    first = "SELECT uid FROM passwd";
    next  = "SELECT uid FROM passwd WHERE uid >%s"; 

    mangle 192.168.3.0/24
  }

  # Group-Datei mit DB-Prozedur
  Adabas group.byname,group
  {
    fetch = "PROC MDBA.MG.GETGROUP('%s',:erg)";
    first = "SELECT gname FROM ugroup";
    next  = "SELECT gname FROM ugroup WHERE gname>'%s'"; 
  }

  Adabas group.bygid
  {
    fetch = "PROC MDBA.MG.GETGROUPUID(%s,:erg)";
    first = "SELECT gid FROM ugroup ORDER BY gid";
    next  = "SELECT gid FROM ugroup WHERE gid > %s ORDER BY gid "; 
  }
  BerkleyDb hosts.byname,hosts
  {
  }  

  Gdbm hosts.byaddr
  {
    deny 192.168.3.0/24
  }
  deny 192.168.2.0/24
}
Der passwd-Map ist im der Datenbank etwa wie folgt definiert:
CREATE TABLE passwd
(
  login VARCHAR(15) KEY,
  pwd   CHAR(15),
  uid   FIXED(6,0) UNIQUE NOT NULL,
  gid   FIXED(6,0),
  gcos  VARCHAR(64),
  home  VARCHAR(32),
  shell VARCHAR(16)
)

Syntax

Die Nismapbeschreibungsdatei besteht aus einer Folge von globalen Deklarationen, danach eine Liste von Domaindeklarationen:
 Start         : globaldecls Domaindecllist      
 
Die globalen Deklarationen bestehen aus einer Zugriffsliste gefolgt von einer Zuweisungsliste:
 globaldecls   : acllist Zuweisungsliste
 
Rekursive Definition der Domaindeklarationsliste (diese kann auch leer sein, was allerdings keinen Sinn macht:
 Domaindecllist:                                 
	       | Domaindecllist Domaindecl       
 
Eine Domaindeklaration beginnt mit dem Schlüsselwort "Domain", gefolgt von einem Namen. In geschweiften Klammen folgt erst eine Liste von Map-Deklarationen, dann eine Zugriffsliste. Die Zugriffsliste schränkt den Zugriff auf die Domain noch zusätzlich zu der Globalen Zugriffsliste ein:
 Domaindecl   : DOMAIN NAME '{' Mapdeclliste acllist '}'
 
Rekursive Definition der Map-Deklarationssliste:
 Mapdeclliste : Mapdecl                          
	      | Mapdeclliste Mapdecl             
 
Eine Map-Deklaration wird eingeleitet durch einen Maptyp. Danach kommt eine Liste der Namen für diese Map, wobei der erste Name der eigentliche ist, die anderen sind aliasnamen:
 Mapdecl : MAPTYPE Namelist '{' Zuweisungsliste acllist '}' 
 
Die Namesliste besteht aus einer mit Komma getrennten Liste von Namen. Eine Namensliste darf nicht leer sein:
 Namelist : NAME                    
	  | Namelist ',' NAME  
 
Eine Zuweisungsliste besteht aus einer mit Semicolon getrennten Folge von Zuweisungen. Sie darf auch leer sein:
 Zuweisungsliste :                               
		 | Zuweisungsliste  Zuweisung ';'
								 ;
 
Einem Namen kann man Zeichenketten oder Integerwerte zuweisen:
 Zuweisung       : NAME '=' STRING 
		 | NAME '=' INT   
 
Eine Zugriffsliste ist leer oder besteht aus einer Folge von Zugriffseinträgen:
 acllist  : acllist aclentry   
	  |                    
 
Ein Zuweisungseintrag besteht aus dem Schlüsselwort allow,deny,oder mangle gefolgt von der Maske. Die Maske kann aus einer IPv4 gefolgt von / gefolgt von einer netzmaske sein, oder die Netzmaske kann wie bei Ascend mit der Zahl der gesetzten bits angegeben werden. Folgt kein /, so gilt das als einzelner Rechner (oder Netzmaske 255.255.255.255)
 aclentry : AORD IPADDR '/' IPADDR
	  | AORD IPADDR
	  | AORD IPADDR '/' INT 
 
;

Lexicographisches

Kommentare beginnen mit '#', und der rest der Zeile wird ignoriert.

Reservierte Schlässelworte sind:

IPv4-Adressen werden in der üblichen Notation [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+ geschrieben.

Integer (INT) ist eine nicht leere Folge von Ziffern: [0-9]+

Namen ist eine Zeichenfolge von Buchstben und Ziffern einschliesslich '.' und '_', beginnend mit einem Buchstaben: [A-Za-z][A-Za-z0-9\._]*

Der MAPTYPE ist auch ein Name, er wird aber in einer internen Liste gesucht. Im Moment gibt es folgende:

Diese sind in der Datei openmaptype deklariert.

Ein STRING wird einfach in doppelten Hochkomatas eingeschlossen: \".*\"

Semantik

Die Konfigrationssprache ist erweiterbar gehalten, so daß ein Einbau eines neuen Maptypes nicht eine Spracherweiterung bedeutet.
Variablen
Die Interpretation der Namen hängt vom Maptyp ab.

Namen haben den Typ String oder Integer. Die Interpretation der Namen hängt vom Maptyp ab. Der Typ wird unterschieden, d.h. der Maptyp sucht einen Namen und einen Typ.

Ein Maptyp ignoriert Variablen, mit denen er nichts anfangen kann.

Zur Zeit gibt es eine Integervariable namens manglefield, die die Feldnummer angibt, die eventuell ausgeblendet wird. Diese wird auf 2 voreingestellt.

Ebenso sind weitere Variablen denkbar, die weitere Sachen über eine Map steuern.

Zugriffseinträge
Diese sind selbsterklärend. Mit mangle versehende Einträge werden in der Globalen Liste und in dem Domainbereich als allow interpretiert. Nur bei maps kennzeichnen sie die Absenderbereiche, in denen ein Feld ausgeblendet werden soll.

SQL anweisungen

Die SQL-Einbettung erfolgt dadurch, daß es Variablen gibt, die die Anweisung für einen bestimmten Zweck enthalten. Oft muß der Schlüssel eingetragen werden. Die Stelle muß ähnlich wie bei der C-Standardbibliothek mit "%s" gekennzeichnet werden.

Für die ADABAS-D-Anbindung gibt es beispeislweise folgede Namen:

fetch
Anweisung um einen Satz für ypproc_fetch_2 aus der Datenbank zu holen. Dabei wird der aktuelle Schüssel bei %s einsubstituiert.
first
Anweisung um den ersten Satz aus der Datenbank zu holen. (Braucht keinen Parameter)
next
Anweisung um den auf %s folgenden Schlüssel zu holen.
Serverdb,Dbuser,Dbpass
sind Variablen, die die Zugangsdaten zur Datenbank enthalten.

Rudolf Weber Informatik und Netzwerkverein Ravensburg e.V