"; print_r($rbsDN); echo "
"; # 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 "

"; $rbs_offers = array(); foreach ($result as $rbs){ #print_r(strpos($auDN, $rbs['rbsofferdn']));echo "
"; if ( strpos($auDN, $rbs['rbsofferdn']) !== false ) $rbs_offers [] = $rbs['dn']; } } #print_r($rbs_offers);echo "

"; 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 "

"; $delentry ['rbservicedn'] = $rbsDN; foreach ($result as $item){ #print_r($item['dn']); echo "
"; 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 "

"; $delentry2 ['hlprbservice'] = $rbsDN; foreach ($result as $item){ #print_r($item['dn']); echo "
"; 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; } } } } # Bei Änderung der TFTP Server IP eines RBS-Objekts entsprechend DHCP Option next-server # in den Hostobjekten anpassen und DHCP modify time in den AUs aktualisieren function adjust_dhcpnextserver($tftpIP, $rbsDN){ global $ds, $suffix, $ldapError; if(!($result = uniLdapSearch($ds, "ou=RIPM,".$suffix, "(&(|(objectclass=Host)(objectclass=dhcpPool))(hlprbservice=$rbsDN))", array("dn"), "dn", "sub", 0, 0))) { # redirect(5, "", $ldapError, FALSE); echo "no search"; die; } $result = ldapArraySauber($result); $host_au = array(); if ($tftpIP == ""){ $deltftpentry ['dhcpoptnext-server'] = array(); foreach ($result as $item){ ldap_mod_del($ds, $item['dn'], array()); $expdn = array_slice(ldap_explode_dn($item['dn'], 0), 3); $host_au [] = implode(",", $expdn); } }else{ $modtftpentry ['dhcpoptnext-server'] = $tftpIP; foreach ($result as $item){ ldap_mod_replace($ds, $item['dn'], $modtftpentry); $expdn = array_slice(ldap_explode_dn($item['dn'], 0), 3); $host_au [] = implode(",", $expdn); } } if ( count($host_au) != 0 ){ $host_au = array_unique($host_au); update_dhcpmtime($host_au); } } # Bei Änderung des PXE Init Boot File eines RBS-Objekts entsprechend DHCP Option Filename # in den Hostobjekten anpassen function adjust_dhcpfilename($initbootfile, $rbsDN, $type){ global $ds, $suffix, $ldapError; 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); $host_au = array(); if ($type == "add"){ $modentry ['dhcpoptfilename'] = $initbootfile; foreach ($result as $item){ ldap_mod_add($ds, $item['dn'], $modentry); } } elseif ($type == "delete"){ $modentry ['dhcpoptfilename'] = array(); foreach ($result as $item){ ldap_mod_del($ds, $item['dn'], $modentry); } } elseif ($type == "replace"){ $modentry ['dhcpoptfilename'] = $initbootfile; foreach ($result as $item){ ldap_mod_replace($ds, $item['dn'], $modentry); $expdn = array_slice(ldap_explode_dn($item['dn'], 0), 3); $host_au [] = implode(",", $expdn); } } if ( count($host_au) != 0 ){ $host_au = array_unique($host_au); update_dhcpmtime($host_au); } } # IP Adresse eines Host ändern -> RBS TFTP Server IP anpassen (inkl. dhcpNext-server) function adjust_hostip_tftpserverip($oldip,$newip){ global $ds, $suffix, $ldapError, $auDN; if(!($result = uniLdapSearch($ds, "cn=rbs,".$auDN, "(&(objectclass=RBService)(tftpserverip=$oldip))", array("dn","tftpserverip"), "dn", "sub", 0, 0))) { # redirect(5, "", $ldapError, FALSE); echo "no search"; die; } $result = ldapArraySauber($result); if (count($result) != 0){ foreach ($result as $item){ if ($newip == ""){ $delentry ['tftpserverip'] = array(); ldap_mod_del($ds, $item['dn'], $delentry); adjust_dhcpnextserver("", $item['dn']); }else{ $modentry ['tftpserverip'] = $newip; ldap_mod_replace($ds, $item['dn'], $modentry); adjust_dhcpnextserver($newip, $item['dn']); } } } } # # Sucht den Hostname zu einer IP im Rechnerteilbaum der AU # Verwaltung der am RBS beteiligten Server # function get_hostname_from_ip($ip){ global $ds, $suffix, $ldapError, $auDN; $ipp = array($ip,$ip); $ipaddress = implode('_',$ipp); if(!($result = uniLdapSearch($ds, "cn=computers,".$auDN, "(&(objectclass=Host)(ipaddress=$ipaddress))", array("dn","hostname"), "", "list", 0, 0))) { # redirect(5, "", $ldapError, FALSE); echo "no search"; die; } $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 "

"; 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 "
"; #echo "bpxeday:"; print_r($bpxeday); echo "
"; #echo "pxebeg:"; print_r($pxebeg); echo "
"; #echo "bpxebeg:"; print_r($bpxebeg); echo "
"; #echo "pxeend:"; print_r($pxeend); echo "
"; #echo "bpxeend:"; print_r($bpxeend); echo "
"; 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 "
"; #echo "bpxeday:"; print_r($bpxeday); echo "
"; #echo "pxebeg:"; print_r($pxebeg); echo "
"; #echo "bpxebeg:"; print_r($bpxebeg); echo "
"; #echo "pxeend:"; print_r($pxeend); echo "
"; #echo "bmcend:"; print_r($bpxeend); echo "
"; 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 "
"; if ($intersect == 1){ echo "[".$pxeday."_".$pxebeg."_".$pxeend."] überschneidet sich mit der bereits existierende Time Range [".$intersecttr."] !

"; 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"; print_r($pxeDN); echo "
"; 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 "
"; print_r($meDN); echo "
"; 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 "
"; print_r($gbmDN); echo "
"; 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 "

"; $delentry ['genericmenuentrydn'] = $gbmDN; foreach ($result as $item){ #print_r($item['dn']); echo "
"; 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 "
"; 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; } ?>