function get_au_roles($audn)
{
    global $ds, $userDN, $ldapError;
    $au_roles = array();
    if (!($result = uniLdapSearch($ds, "cn=roles," . $audn, "(&(member={$userDN})(cn=*))", array("dn", "cn"), "cn", "list", 0, 0))) {
        redirect(5, "index.php", $ldapError, FALSE);
        die;
    } else {
        $result = ldapArraySauber($result);
        #print_r($result);
        foreach ($result as $item) {
            $au_roles[] = $item['cn'];
        }
        return $au_roles;
    }
}
function get_dhcp_range2($dhcpobjectDN)
{
    global $ds, $suffix, $ldapError;
    if (!($result = uniLdapSearch($ds, $dhcpobjectDN, "(objectclass=*)", array("dhcpRange"), "", "one", 0, 0))) {
        # redirect(5, "", $ldapError, FALSE);
        echo "no search";
        die;
        return 0;
    } else {
        $result = ldapArraySauber($result);
        $dhcp_array = array();
        foreach ($result as $item) {
            if (count($item['dhcprange']) == 1) {
                $dhcp_array[] = $item['dhcprange'];
            }
            if (count($item['dhcprange']) > 1) {
                foreach ($item['dhcprange'] as $range) {
                    $dhcp_array[] = $range;
                }
            }
        }
        return $dhcp_array;
    }
}
function add_dhcppool($dhcpsubnetdn, $range, $pcl, $dhcpservicedn, $poolopt_domain, $rbssrvdn)
{
    global $ds, $suffix, $auDN, $ldapError;
    if (!($result = uniLdapSearch($ds, "cn=dhcp," . $auDN, "(objectclass=*)", array("cn"), "dn", "list", 0, 0))) {
        # redirect(5, "", $ldapError, FALSE);
        echo "no search";
        die;
    }
    $result = ldapArraySauber($result);
    $dhcpcn_array = array();
    foreach ($result as $item) {
        $dhcpcn_array[] = $item['cn'];
    }
    #print_r($dhcpcn_array);echo "<br><br>";
    for ($i = 0; $i < 100; $i++) {
        if (array_search("Pool" . $i, $dhcpcn_array) === false) {
            $cn = "Pool" . $i;
            break;
        }
    }
    $dhcppoolDN = "cn=" . $cn . ",cn=dhcp," . $auDN;
    $entrydhcp['objectclass'][0] = "dhcpPool";
    $entrydhcp['objectclass'][1] = "dhcpOptions";
    $entrydhcp['objectclass'][2] = "top";
    $entrydhcp['cn'] = $cn;
    $entrydhcp['dhcphlpcont'] = $dhcpsubnetdn;
    $entrydhcp['dhcprange'] = $range;
    if ($pcl) {
        $entrydhcp['dhcppermittedclients'] = $pcl;
    }
    if ($poolopt_domain) {
        $entrydhcp['dhcpoptdomain-name'] = $poolopt_domain;
    }
    if ($rbssrvdn) {
        $entrydhcp['hlprbservice'] = $rbssrvdn;
    }
    #print_r($dhcppoolDN);echo "<br><br>";
    #print_r($entrydhcp);echo "<br><br>";
    if ($result = ldap_add($ds, $dhcppoolDN, $entrydhcp)) {
        #add_to_file_structure($dhcppoolDN);
        return 1;
    } else {
        return 0;
    }
}
function get_node_data($nodeDN, $attributes)
{
    global $ds, $suffix, $ldapError;
    $node_data = array();
    if (!($result = uniLdapSearch($ds, $nodeDN, "(objectclass=*)", $attributes, "", "one", 0, 0))) {
        # redirect(5, "", $ldapError, FALSE);
        # redirect(0, $START_PATH."/au/au.php", "", TRUE);
        echo "no search";
        die;
    } else {
        $result = ldapArraySauber($result);
        foreach ($result as $item) {
            foreach ($attributes as $att) {
                $node_data[$att] = $item[$att];
            }
        }
        if ($attributes != false) {
            return $node_data;
        } else {
            return $result;
        }
    }
}
function get_pool_subnet_data($dhcprange, $attributes)
{
    global $ds, $suffix, $ldapError;
    $iprange = explode('_', $dhcprange);
    $fs = explode('.', $iprange[0]);
    $fe = explode('.', $iprange[1]);
    if ($fs[0] == $fe[0] && $fs[1] == $fe[1] && $fs[2] == $fe[2] && $fs[3] <= $fe[3]) {
        # DHCP Subnet DN finden
        $subnet = implode(".", array($fs[0], $fs[1], $fs[2], "0"));
        if (!($result = uniLdapSearch($ds, "ou=RIPM," . $suffix, "(&(objectclass=dhcpSubnet)(cn={$subnet}))", $attributes, "", "sub", 0, 0))) {
            # redirect(5, "", $ldapError, FALSE);
            echo "no search";
            die;
        }
        $result = ldapArraySauber($result);
        #print_r($result);echo "<br><br>";
        if (count($result[0]) != 0) {
            return $result[0];
        } else {
            print "kein DHCP Subnet gefunden!<br><br>";
            return 0;
        }
    } else {
        print "DHCP Range {$dhcprange} nicht korrekt!<br><br>";
        return 0;
    }
}
function get_role_members($roleDN)
{
    global $ds, $suffix, $ldapError;
    if (!($result = uniLdapSearch($ds, $roleDN, "objectclass=*", array("member"), "", "one", 0, 0))) {
        # redirect(5, "", $ldapError, FALSE);
        echo "search problem";
        die;
    } else {
        $members_array = array();
        $result = ldapArraySauber($result);
        foreach ($result as $item) {
            if (count($item['member']) > 1) {
                $members_array = $item['member'];
            } else {
                $members_array[] = $item['member'];
            }
        }
    }
    return $members_array;
}
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 getRoles2($ds, $userDN)
{
    global $ldapError, $suffix, $uid;
    if (!($result = uniLdapSearch($ds, "ou=RIPM," . $suffix, "(&(member={$userDN})(cn=*))", array("dn", "cn"), "dn", "sub", 0, 0))) {
        redirect(5, "index.php", $ldapError, FALSE);
        die;
    } else {
        $result = ldapArraySauber($result);
        $au_roles = array();
        foreach ($result as $item) {
            $dn = ldap_explode_dn($item['dn'], 0);
            $dnsub = array_slice($dn, 3);
            $auDN = implode(',', $dnsub);
            if (array_key_exists($auDN, $au_roles)) {
                if (!in_array($item['cn'], $au_roles[$auDN])) {
                    $au_roles[$auDN][] = $item['cn'];
                }
            } else {
                $au_roles[$auDN][] = $item['cn'];
            }
        }
    }
    return $au_roles;
}
function get_entry_number($entryDN, $entryobjectclass)
{
    global $ds, $suffix, $ldapError;
    if (!($result = uniLdapSearch($ds, $entryDN, "(objectclass=machineconfig)", array("count"), "", "one", 0, 0))) {
        # redirect(5, "", $ldapError, FALSE);
        echo "no search";
        die;
    }
    $result = ldapArraySauber($result);
    print_r($result);
}
/**
* datenabgleich($uid, $userPassword, $ds_rz, $ds) - überschreibt bei jedem Login die Daten des
* LSM-LDAP mit denen des RZ-LDAP mithilfe des Dummyusers.
*
* @param string UID
* @param string Password
* @param resource ds_rz RZ-LDAP Directory Handle
* @param resource ds LSM-LDAP Directory Handle nach Bind mit Dummyuser
*/
function datenabgleich($uid, $ds_rz)
{
    global $userDN, $suffix, $suffix_ext, $ldapError, $dummyUid, $dummyPassword;
    if (!($ds_dummy = uniLdapConnect($dummyUid, $dummyPassword))) {
        redirect(5, "index.php", "Dummy-Login fehlgeschlagen!<br>" . $ldapError, FALSE);
        die;
    }
    $ruffelder = array("sn", "givenname");
    # RZ Personendaten
    if (!($rz_person_daten = uniLdapSearch($ds_rz, "ou=people," . $suffix_ext, "uid={$uid}", $ruffelder, "", "list", 0, 0))) {
        redirect(5, "index.php", $ldapError, FALSE);
        die;
    }
    $rz_person_daten = ldapArraySauber($rz_person_daten);
    $rz_person_daten = $rz_person_daten[0];
    #print_r($rz_person_daten); echo "<br>";
    # LSM Personendaten
    if (!($lsm_person_daten = uniLdapSearch($ds_dummy, "ou=people," . $suffix_ext, "uid={$uid}", $ruffelder, "", "list", 0, 0))) {
        redirect(5, "index.php", $ldapError, FALSE);
        die;
    }
    $lsm_person_daten = ldapArraySauber($lsm_person_daten);
    $lsm_person_daten = $lsm_person_daten[0];
    #print_r($lsm_person_daten); echo "<br>";
    foreach ($ruffelder as $ruffeld) {
        $ruffeld = str_replace("ruf", "", $ruffeld);
        $lsmfelder[] = $ruffeld;
    }
    $i = 0;
    $modEintrag = array();
    foreach ($lsmfelder as $lsmfeld) {
        if ($rz_person_daten[$ruffelder[$i]] != $lsm_person_daten[$ruffelder[$i]]) {
            $eintrag = $rz_person_daten[$ruffelder[$i]];
            $change = 1;
        } else {
            $eintrag = '';
        }
        $modEintrag[$lsmfeld] = $eintrag;
        //$person_daten[$ruffelder[$i]];
        $i++;
    }
    # CN erstellen
    $modEintrag['cn'] = $rz_person_daten['givenname'] . " " . $rz_person_daten['sn'];
    $modEintrag = inputArraySauber($modEintrag);
    #echo "<br>"; print_r($modEintrag); echo "<br>";
    if (ldap_mod_replace($ds_dummy, $userDN, $modEintrag)) {
        $meldung = "Daten abgeglichen";
    } else {
        $meldung = "Fehler beim Datenabgleich!";
    }
}
            echo "Folgende Men&uuml; Eintr&auml;ge sind davon betroffen: <br><br>";
            foreach ($result as $item) {
                $exp = ldap_explode_dn($item['dn'], 1);
                echo "Men&uuml; Eintrag <b>" . $exp[0] . "</b> in PXE Bootmen&uuml; <b>" . $exp[1] . "</b> &nbsp;&nbsp;[ Abteilung: " . $exp[4] . " ]<br>";
            }
        } else {
            echo "Keine Men&uuml; Eintr&auml;ge davon betroffen!<br>";
        }
    }
}
if ($type == "rbs") {
    $rbsDN = $dn;
    $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;
    } else {
        $result = ldapArraySauber($result);
        if (count($result) > 0) {
            echo "Folgende PXE Boot Men&uuml;s sind davon betroffen: <br><br>";
            foreach ($result as $item) {
                $exp = ldap_explode_dn($item['dn'], 1);
                echo "PXE Boot Men&uuml; <b>" . $exp[0] . "</b> an Objekt <b>" . $exp[1] . "</b> &nbsp;&nbsp;[ Abteilung: " . $exp[3] . " ]<br>";
            }
        } else {
            echo "Keine PXE Boot Men&uuml;s davon betroffen!<br>";
        }
    }
}
echo "<br><br>\n\t\tWollen Sie das Objekt <b>" . $name . "</b> wirklich l&ouml;schen?<br><br>\n\t\t\t<form action='" . $delurl . "' method='post'>\n\t\t\t\tFalls ja:<br><br>\n\t\t\t\t<input type='hidden' name='dn' value='" . $dn . "'>\n\t\t\t\t<input type='hidden' name='name' value='" . $name . "'>\n\t\t\t\t<input type='hidden' name='successurl' value='" . $successurl . "'>\n\t\t\t\t<input type='hidden' name='pxedn' value='" . $pxedn . "'>\n\t\t\t\t<input type='Submit' name='apply' value='l&ouml;schen' class='small_loginform_button'><br><br>\n\t\t\t</form>\n\t\t\t<form action='" . $backurl . "' method='post'>\n\t\t\t\tFalls, nein:<br><br>\n\t\t\t\t<input type='Submit' name='apply' value='zur&uuml;ck' class='small_loginform_button'>\n\t\t\t</form>\n\t\t</td>\n\t</tr>\n</table>\n</body>\n</html>";