summaryrefslogtreecommitdiffstats
path: root/ldap-site-mngmt/webinterface/lib/rbs_management_functions.php
diff options
context:
space:
mode:
Diffstat (limited to 'ldap-site-mngmt/webinterface/lib/rbs_management_functions.php')
-rw-r--r--ldap-site-mngmt/webinterface/lib/rbs_management_functions.php591
1 files changed, 591 insertions, 0 deletions
diff --git a/ldap-site-mngmt/webinterface/lib/rbs_management_functions.php b/ldap-site-mngmt/webinterface/lib/rbs_management_functions.php
new file mode 100644
index 00000000..6b1f42fd
--- /dev/null
+++ b/ldap-site-mngmt/webinterface/lib/rbs_management_functions.php
@@ -0,0 +1,591 @@
+<?php
+
+/**
+* rbs_management_functions.php - Remote Boot Services Management Funktions-Bibliothek
+* Diese Bibliothek enthält alle Funktionen für die Verwaltung von RBS Diensten,
+* PXE Konfigurationsdateien ihren Menüeinträgen und ihren Genersichen Bootmenüeinträgen
+*
+* @param string ldapError
+* @param resource ds
+*
+* @author Tarik Gasmi
+* @copyright Tarik Gasmi
+*/
+
+
+# Konfiguration laden
+require_once("config.inc.php");
+
+$ldapError = null;
+
+
+#######################################################################
+# Funktionen zur Verwaltung von RBS Diensten
+#
+
+#
+# Neues RBS Dienst-Objekt anlegen
+#
+function add_rbs($rbsDN,$rbscn,$rbsoffer,$server,$atts){
+
+ global $ds, $suffix, $auDN, $ldapError;
+
+ $rbsentry ['objectclass'][0] = "RBService";
+ $rbsentry ['objectclass'][1] = "top";
+ $rbsentry ['cn'] = $rbscn;
+ $rbsentry ['rbsofferdn'] = $rbsoffer;
+ if (count($atts) != 0){
+ foreach (array_keys($atts) as $key){
+ if ($atts[$key] != ""){
+ $rbsentry[$key] = $atts[$key];
+ }
+ }
+ }
+ if (count($server) != 0){
+ if ($server['tftp'] != ""){$rbsentry ['tftpserverip'] = $server['tftp'];}
+ if ($server['nfs'] != ""){$rbsentry ['nfsserverip'] = $server['nfs'];}
+ if ($server['nbd'] != ""){$rbsentry ['nbdserverip'] = $server['nbd'];}
+ }
+ # print_r($rbsentry); echo "<br>";
+ print_r($rbsDN); echo "<br>";
+
+ # Standard Fallback Menü anlegen
+ $pxecn = "PXE_Fallback-No-Config";
+ $pxeDN = "cn=".$pxecn.",".$rbsDN;
+ $filename = array("fallback-nopxe");
+ $ldapuri = LDAP_HOST."/dn=cn=computers,".$auDN; # wirklich nötig??
+ $mecn = "Fallback-Text";
+ $meDN = "cn=".$mecn.",".$pxeDN;
+ $meattribs = array("label" => "Keine PXE Boot-Konfiguration fuer die aktuelle Zeit definiert",
+ "kernel" => "menu.c32",
+ "submenulink" => "fallback-nopxe");
+
+ if (ldap_add($ds,$rbsDN,$rbsentry)){
+ if (add_pxe($pxeDN,$pxecn,$rbsDN,"",array(),$filename,$ldapuri)){
+ if (add_me($meDN,$mecn,"","01",$meattribs,$pxeDN)){
+ return 1;
+ }
+ else{
+ return 0;
+ }
+ }
+ else{
+ return 0;
+ }
+ }
+ else{
+ return 0;
+ }
+}
+
+#
+# "RBS-Angebote" im Verzeichnis suchen, die die AU ($auDN) nutzen darf,
+# Suche nach passenden RBS-Offer-DNs
+#
+function get_rbsoffers($auDN){
+
+ global $ds, $suffix, $auDN, $ldapError;
+
+ $attribs = array("dn","rbsofferdn");
+ if(!($result = uniLdapSearch($ds, "ou=RIPM,".$suffix, "(objectclass=RBService)", $attribs, "dn", "sub", 0, 0))) {
+ # redirect(5, "", $ldapError, FALSE);
+ echo "no search";
+ die;
+ }
+ else{
+ $result = ldapArraySauber($result);
+ #print_r($result);echo "<br><br>";
+
+ $rbs_offers = array();
+ foreach ($result as $rbs){
+ #print_r(strpos($auDN, $rbs['rbsofferdn']));echo "<br>";
+ if ( strpos($auDN, $rbs['rbsofferdn']) !== false )
+ $rbs_offers [] = $rbs['dn'];
+ }
+ }
+ #print_r($rbs_offers);echo "<br><br>";
+ return $rbs_offers;
+}
+
+
+#
+# Beim Löschen von RBS-Objekten muss dafür gesorgt werden dass keine PXEs mehr auf
+# diese zeigen, Ref. Abhängigkeiten
+#
+function clean_up_del_rbs($rbsDN){
+
+ global $ds, $suffix, $auDN, $ldapError;
+
+ $attribs = array("dn");
+ if(!($result = uniLdapSearch($ds, "ou=RIPM,".$suffix, "(&(objectclass=PXEConfig)(rbservicedn=$rbsDN))", $attribs, "dn", "sub", 0, 0))) {
+ # redirect(5, "", $ldapError, FALSE);
+ echo "no search";
+ die;
+ }
+ $result = ldapArraySauber($result);
+ #print_r($result); echo "<br><br>";
+ $delentry ['rbservicedn'] = $rbsDN;
+ foreach ($result as $item){
+ #print_r($item['dn']); echo "<br>";
+ ldap_mod_del($ds, $item['dn'], $delentry);
+ }
+
+ if(!($result = uniLdapSearch($ds, "ou=RIPM,".$suffix, "(&(objectclass=Host)(hlprbservice=$rbsDN))", $attribs, "dn", "sub", 0, 0))) {
+ # redirect(5, "", $ldapError, FALSE);
+ echo "no search";
+ die;
+ }
+ $result = ldapArraySauber($result);
+ #print_r($result); echo "<br><br>";
+ $delentry2 ['hlprbservice'] = $rbsDN;
+ foreach ($result as $item){
+ #print_r($item['dn']); echo "<br>";
+ ldap_mod_del($ds, $item['dn'], $delentry2);
+ }
+
+}
+
+#
+# beim ändern des CN (DN) des RBS muss dieses in allen referenzierenden PXEConfig-Objekten
+# nachvollzogen werden, Ref. Abhängigkeiten
+#
+function adjust_rbs_dn($newrbsDN, $rbsDN){
+
+ global $ds, $suffix, $auDN, $ldapError;
+
+ if(!($result = uniLdapSearch($ds, "ou=RIPM,".$suffix, "(&(objectclass=PXEConfig)(rbservicedn=$rbsDN))", array("dn"), "dn", "sub", 0, 0))) {
+ # redirect(5, "", $ldapError, FALSE);
+ echo "no search";
+ die;
+ }
+ $result = ldapArraySauber($result);
+ $modentry ['rbservicedn'] = $newrbsDN;
+ foreach ($result as $item){
+ ldap_mod_replace($ds, $item['dn'], $modentry);
+ }
+
+ if(!($result = uniLdapSearch($ds, "ou=RIPM,".$suffix, "(&(objectclass=Host)(hlprbservice=$rbsDN))", array("dn"), "dn", "sub", 0, 0))) {
+ # redirect(5, "", $ldapError, FALSE);
+ echo "no search";
+ die;
+ }
+ $result = ldapArraySauber($result);
+ $modentry2 ['hlprbservice'] = $newrbsDN;
+ foreach ($result as $item){
+ ldap_mod_replace($ds, $item['dn'], $modentry2);
+ }
+}
+
+function rbs_adjust_host($hostDN, $rbs){
+
+ global $ds, $suffix, $ldapError;
+
+ $modentry ['rbservicedn'] = $rbs;
+
+ $pxearray = get_pxeconfigs($hostDN,array("dn"));
+ if ( count($pxearray) != 0 ){
+ foreach ( $pxearray as $item ){
+ if ($result = ldap_mod_replace($ds,$item['dn'],$modentry)){
+ return 1;
+ }else{
+ return 0;
+ }
+ }
+ }
+}
+
+
+#
+# Sucht den Hostname zu einer IP im Rechnerteilbaum der AU
+# Verwaltung der am RBS beteiligten Server
+#
+function get_hostname_from_ip($ip,$auDN){
+
+ global $ds, $suffix, $ldapError;
+
+ $ipp = array($ip,$ip);
+ $ipaddress = implode('_',$ipp);
+
+ if(!($result = uniLdapSearch($ds, "cn=computers,".$auDN, "(&(objectclass=Host)(ipaddress=$ipaddress))", array("hostname"), "", "list", 0, 0))) {
+ # redirect(5, "", $ldapError, FALSE);
+ echo "no search";
+ die;
+ }
+ elseif(count($result) == 0){echo "kein Rechner mit dieser IP"; return "";}
+ else{
+ $result = ldapArraySauber($result);
+ #print_r($result);
+ $host ['hostname'] = $result[0]['hostname'];
+ $host ['dn'] = $result[0]['dn'];
+ return $host;
+ }
+}
+
+
+###############################################################################
+# Funktionen zur Verwaltung von PXE Bootmenüs
+
+#
+# Überprüft, ob sich die angegebene Timerange auf einer der 4 Spezifikationsstufen mit anderen
+# Timeranges des Objkets überschneidet
+#
+function check_timerange_pxe($pxeday,$pxebeg,$pxeend,$nodeDN,$excepttimerange){
+
+ global $ds, $suffix, $auDN, $ldapError;
+
+ $brothers = get_pxeconfigs($nodeDN,array("timerange"));
+ # keine Überschneidungen pro Spez.Ebene zulassen
+ # print_r($brothers); echo "<br><br>";
+ if (count($brothers) != 0){
+
+ $intersect = 0;
+ foreach ($brothers as $item){
+
+ # Fall das Brother mehrere TimeRanges hat
+ if (count($item['timerange']) > 1){
+ foreach ($item['timerange'] as $tr){
+
+ if($tr != $excepttimerange){
+ $exptime = explode('_',$tr);
+ $bpxeday = $exptime[0];
+ $bpxebeg = $exptime[1];
+ $bpxeend = $exptime[2];
+ #echo "pxeday:"; print_r($pxeday); echo "<br>";
+ #echo "bpxeday:"; print_r($bpxeday); echo "<br>";
+ #echo "pxebeg:"; print_r($pxebeg); echo "<br>";
+ #echo "bpxebeg:"; print_r($bpxebeg); echo "<br>";
+ #echo "pxeend:"; print_r($pxeend); echo "<br>";
+ #echo "bpxeend:"; print_r($bpxeend); echo "<br>";
+
+ if ($pxeday == $bpxeday){
+ if ( $pxebeg > $bpxeend || $pxeend < $bpxebeg ){
+ # keine Überschneidung in der Uhrzeit
+ }else{
+ # Uhrzeit Überschneidung
+ $intersect = 1;
+ $intersecttr = $bpxeday."_".$bpxebeg."_".$bpxeend;
+ break;
+ }
+ }
+ }
+
+ }
+ }
+ # Fall das Brother nur eine TimeRange hat
+ elseif (count($item['timerange']) == 1){
+
+ if($item['timerange'] != $excepttimerange){
+ $exptime = explode('_',$item['timerange']);
+ $bpxeday = $exptime[0];
+ $bpxebeg = $exptime[1];
+ $bpxeend = $exptime[2];
+ #echo "pxeday:"; print_r($pxeday); echo "<br>";
+ #echo "bpxeday:"; print_r($bpxeday); echo "<br>";
+ #echo "pxebeg:"; print_r($pxebeg); echo "<br>";
+ #echo "bpxebeg:"; print_r($bpxebeg); echo "<br>";
+ #echo "pxeend:"; print_r($pxeend); echo "<br>";
+ #echo "bmcend:"; print_r($bpxeend); echo "<br>";
+
+ if ($pxeday == $bpxeday){
+ if ( $pxebeg > $bpxeend || $pxeend < $bpxebeg ){
+ # keine Überschneidung in der Uhrzeit
+ }else{
+ # Uhrzeit Überschneidung
+ $intersect = 1;
+ $intersecttr = $bpxeday."_".$bpxebeg."_".$bpxeend;
+ break;
+ }
+ }
+ }
+ }
+ }
+ #echo "intersect: "; print_r($intersect); echo "<br>";
+ if ($intersect == 1){
+ echo "<b>[".$pxeday."_".$pxebeg."_".$pxeend."]</b> &uuml;berschneidet sich mit der
+ bereits existierende <b>Time Range [".$intersecttr."]</b> !<br><br>";
+ return 0;
+ }else{
+ return 1;
+ }
+ }else{
+ return 1;
+ }
+}
+
+
+#
+# Neues PXE Bootmenü anlegen
+#
+function add_pxe($pxeDN,$pxecn,$rbsDN,$pxetimerange,$pxeattribs,$filenames,$conffile){
+
+ global $ds, $suffix, $auDN, $ldapError;
+
+ $pxeentry ['objectclass'][0] = "PXEConfig";
+ $pxeentry ['objectclass'][1] = "top";
+ $pxeentry ['cn'] = $pxecn;
+ $pxeentry ['rbservicedn'] = $rbsDN;
+ #$pxeentry ['ldapuri'] = $ldapuri;
+ if ($conffile != ""){$pxeentry ['fileuri'] = $conffile;}
+ if (count($filenames) > 1 ){
+ for ($i=0; $i<count($filenames); $i++){
+ $pxeentry ['filename'][$i] = $filenames[$i];
+ }
+ }
+ if (count($filenames) == 1){
+ $pxeentry ['filename'] = $filenames[0];
+ }
+ if ($pxetimerange != ""){$pxeentry ['timerange'] = $pxetimerange;}
+ if (count($pxeattribs) != 0){
+ foreach (array_keys($pxeattribs) as $key){
+ if ($pxeattribs[$key] != ""){
+ $pxeentry[$key] = $pxeattribs[$key];
+ }
+ }
+ }
+ #print_r($pxeentry); echo "<br>";
+ print_r($pxeDN); echo "<br>";
+ if (ldap_add($ds,$pxeDN,$pxeentry)){
+ return 1;
+ }
+ else{
+ return 0;
+ }
+}
+
+
+#
+# PXE CN (DN) ändern, Teilbaum verschieben
+#
+function modify_pxe_dn($pxeDN, $newpxeDN){
+
+ global $ds, $suffix, $ldapError;
+
+ if (move_subtree($pxeDN,$newpxeDN)){
+ return 1;
+ }else{
+ return 0;
+ }
+}
+
+
+#
+# Timerange eines PXEConfig-Objekts ändern
+#
+function change_pxe_timerange($pxeDN,$newpxeDN,$pxetimerange){
+
+ global $ds, $suffix, $auDN, $ldapError;
+
+ # move tree
+ if (move_subtree($pxeDN,$newpxeDN)){
+ # timerange ändern
+ $entrypxe ['timerange'] = $pxetimerange;
+ if (ldap_mod_replace($ds,$newpxeDN,$entrypxe)){
+ return 1;
+ }
+ else{
+ return 0;
+ }
+ }
+ else{
+ return 0;
+ }
+}
+
+#
+# nach dem Löschen von PXEConfig Menueinträgen müssen Menüpositionen in der PXEConfig
+# angepasst werden (Lücken schließen)
+#
+function cleanup_menupositions($pxeDN){
+
+ global $ds, $suffix, $auDN, $ldapError;
+
+ $me = get_menuentries($pxeDN,array("dn","menuposition"));
+ if (count($me) != 0){
+ foreach ($me as $item){
+ $pos = $item['menuposition'];
+ $pos = preg_replace ( '/0([0-9])/', '$1', $pos);
+ $menpos[$pos] = $item['dn'];
+ ksort($menpos);
+ }
+ $p = 1;
+ foreach ($menpos as $item){
+ if (strlen($p) == 1){
+ $p = "0".$p;
+ }
+ $entry ['menuposition'] = $p;
+ ldap_mod_replace($ds,$item,$entry);
+ $p++;
+ }
+ }
+}
+
+#
+# Hilfsfunktion zur Verarbeitung von Menüpositionen in PXEConfigs
+#
+function increment_menupositions($pxeDN,$menpos){
+
+ global $ds, $suffix, $auDN, $ldapError;
+
+ if (strlen($menpos) == 1){
+ $menpos = "0".$menpos;
+ }
+ $meDN = get_dn_menuposition($pxeDN,$menpos);
+ if ($meDN != ""){
+ # zur Berechnung erst führende Nullen weg
+ $menpos = preg_replace ( '/0([0-9])/', '$1', $menpos);
+ $newpos = $menpos+1;
+ increment_menupositions($pxeDN,$newpos);
+ # zum Eintragen führenden Nullen wieder dazu
+ if (strlen($newpos) == 1){
+ $newpos = "0".$newpos;
+ }
+ $entry ['menuposition'] = $newpos;
+ ldap_mod_replace($ds,$meDN,$entry);
+ }
+}
+
+#
+# Neuen Menüeintrag anlegen
+#
+function add_me($meDN,$mecn,$gbmDN,$menpos,$meattribs,$pxeDN){
+
+ global $ds, $suffix, $auDN, $ldapError;
+
+ $mentry ['objectclass'][0] = "MenuEntry";
+ $mentry ['objectclass'][1] = "top";
+ $mentry ['cn'] = $mecn;
+ if($gbmDN != ""){$mentry ['genericmenuentrydn'] = $gbmDN;}
+ $mentry ['menuposition'] = $menpos;
+ if (count($meattribs) != 0){
+ foreach (array_keys($meattribs) as $key){
+ if ($meattribs[$key] != ""){
+ $mentry[$key] = $meattribs[$key];
+ }
+ }
+ }
+ print_r($mentry); echo "<br>";
+ print_r($meDN); echo "<br>";
+ increment_menupositions($pxeDN,$menpos); # andere jeweils um 1 erhöhen
+ if (ldap_add($ds,$meDN,$mentry)){
+ return 1;
+ }
+ else{
+ return 0;
+ }
+}
+
+
+#
+# Menu Entry CN (DN) ändern
+#
+function modify_me_dn($meDN, $newmeDN){
+
+ global $ds, $suffix, $ldapError;
+
+ if (move_subtree($meDN,$newmeDN)){
+ return 1;
+ }else{
+ return 0;
+ }
+}
+
+
+
+#####################################################################
+# Verwaltung von GBM
+#
+
+function add_gbm($gbmDN,$gbmcn,$attribs){
+
+ global $ds, $suffix, $auDN, $ldapError;
+
+ $entry ['objectclass'][0] = "MenuEntry";
+ $entry ['objectclass'][1] = "top";
+ $entry ['cn'] = $gbmcn;
+ if (count($attribs) != 0){
+ foreach (array_keys($attribs) as $key){
+ if ($attribs[$key] != ""){
+ $entry[$key] = $attribs[$key];
+ }
+ }
+ }
+ print_r($entry); echo "<br>";
+ print_r($gbmDN); echo "<br>";
+ if (ldap_add($ds,$gbmDN,$entry)){
+ return 1;
+ }
+ else{
+ return 0;
+ }
+}
+
+
+#
+# beim löschen von GBMs muss dafür gesorgt werden, dass keine MEs mehr auf diese zeigen,
+# Ref.Abhängigkeiten (sonst gibts Fehler beim PXE-Perlskript und die Nutzer wissen nicht dass ihr PXE Menü nicht
+# mehr funktioniert, so kann man durch Fehlen des gbmDN wissen das es kein GBM mehr zu diesem ME gibt
+#
+function clean_up_del_gbm($gbmDN){
+
+ global $ds, $suffix, $auDN, $ldapError;
+
+ $attribs = array("dn","genericmenuentrydn");
+ if(!($result = uniLdapSearch($ds, "ou=RIPM,".$suffix, "(&(objectclass=MenuEntry)(genericmenuentrydn=$gbmDN))", $attribs, "dn", "sub", 0, 0))) {
+ # redirect(5, "", $ldapError, FALSE);
+ echo "no search";
+ die;
+ }
+ $result = ldapArraySauber($result);
+ #print_r($result); echo "<br><br>";
+ $delentry ['genericmenuentrydn'] = $gbmDN;
+ foreach ($result as $item){
+ #print_r($item['dn']); echo "<br>";
+ ldap_mod_del($ds, $item['dn'], $delentry);
+ }
+
+}
+
+
+#
+# beim ändern des CN (DN) des GBM, Meüeinträge anpassen, Ref. Abhängigkeiten
+#
+function adjust_gbm_dn($newgbmDN, $gbmDN){
+
+ global $ds, $suffix, $auDN, $ldapError;
+
+ if(!($result = uniLdapSearch($ds, "ou=RIPM,".$suffix, "(&(objectclass=MenuEntry)(genericmenuentrydn=$gbmDN))", array("dn"), "dn", "sub", 0, 0))) {
+ # redirect(5, "", $ldapError, FALSE);
+ echo "no search";
+ die;
+ }
+ $result = ldapArraySauber($result);
+ $modentry ['genericmenuentrydn'] = $newgbmDN;
+ foreach ($result as $item){
+ ldap_mod_replace($ds, $item['dn'], $modentry);
+ }
+}
+
+
+
+function alternative_rbservices($rbsDN){
+
+ global $ds, $suffix, $auDN, $ldapError;
+
+ $alt_rbs = array();
+
+ $rbsarray = get_rbsoffers($auDN);
+ # print_r($rbsarray); echo "<br>";
+ if (count($rbsarray) != 0){
+ for ($i=0; $i < count($rbsarray); $i++){
+ if ($rbsarray[$i] != $rbsDN){
+ $exp = ldap_explode_dn ( $rbsarray[$i], 1 );
+ $alt = array ("dn" => $rbsarray[$i], "cn" => $exp[0], "au" => " / ".$exp[2]);
+ $alt_rbs[] = $alt;
+ }
+ }
+ }
+
+ return $alt_rbs;
+}
+
+?> \ No newline at end of file