int main(){ LDAPConnection *lc=new LDAPConnection("192.168.3.128",389); std::cout << "----------------------doing bind...." << std::endl; try{ lc->bind("uid=admin,dc=home,dc=local" , "secret"); std::cout << lc->getHost() << std::endl; StringList tmp; tmp.add("subschemasubentry"); LDAPSearchResults* entries = lc->search("", LDAPConnection::SEARCH_BASE, "(objectClass=*)", tmp ); LDAPEntry* rootDse = entries->getNext(); std::string schemabase="cn=subschema"; if(rootDse){ const LDAPAttribute* schemaAttr = rootDse->getAttributes()->getAttributeByName("subschemaSubentry"); schemabase = *(schemaAttr->getValues().begin()); } StringList attrs; attrs.add("objectClasses"); attrs.add("attributeTypes"); entries = lc->search(schemabase, LDAPConnection::SEARCH_BASE, "(objectClass=*)", attrs); if (entries != 0){ LDAPEntry* entry = entries->getNext(); if(entry != 0){ const LDAPAttribute* oc = entry->getAttributes()->getAttributeByName("objectClasses"); LDAPSchema schema; schema.setObjectClasses((oc->getValues())); LDAPObjClass test = schema.getObjectClassByName("inetOrgPerson"); std::cout << test.getDesc() << std::endl; // StringList mustAttr = test.getMay(); // for( StringList::const_iterator i = mustAttr.begin(); i != mustAttr.end(); i++ ){ // std::cout << *i << std::endl; // } StringList sup = test.getSup(); for( StringList::const_iterator i = sup.begin(); i != sup.end(); i++ ){ std::cout << *i << std::endl; } } } lc->unbind(); delete lc; }catch (LDAPException e){ std::cout << "---------------- caught Exception ---------"<< std::endl; std::cout << e << std::endl; } }
void LdifWriter::writeRecord(const LDAPEntry& le) { std::ostringstream line; if ( m_addSeparator ) { m_ldifstream << std::endl; } else { m_addSeparator = true; } line << "dn: " << le.getDN(); this->breakline( line.str(), m_ldifstream ); const LDAPAttributeList *al = le.getAttributes(); LDAPAttributeList::const_iterator i = al->begin(); for ( ; i != al->end(); i++ ) { StringList values = i->getValues(); StringList::const_iterator j = values.begin(); for( ; j != values.end(); j++) { // clear output stream line.str(""); line << i->getName() << ": " << *j; this->breakline( line.str(), m_ldifstream ); } } }
string LdapTools::readStoragePoolUri(const string& storagePoolName) { string retval = ""; string base("sstStoragePool="); base.append(storagePoolName).append(",ou=storage pools,ou=virtualization,ou=services,").append( Config::getInstance()->getLdapBaseDn()); SYSLOGLOGGER(logDEBUG) << "readStoragePool " << base; LDAPSearchResults* entries = lc->search(base, LDAPConnection::SEARCH_SUB); if (entries != 0) { LDAPEntry* entry = entries->getNext(); if (entry != 0) { // SYSLOGLOGGER(logINFO) << "dn: " << entry->getDN() << endl; const LDAPAttributeList* attrs = entry->getAttributes(); LDAPAttributeList::const_iterator it = attrs->begin(); for (; it != attrs->end(); it++) { LDAPAttribute attr = *it; // SYSLOGLOGGER(logINFO) << attr.getName() << "("; // SYSLOGLOGGER(logINFO) << attr.getNumValues() << "): "; if (0 == attr.getName().compare("sstStoragePoolURI")) { StringList values = attr.getValues(); StringList::const_iterator it2 = values.begin(); if (it2 != values.end()) { retval = *it2; break; } } } delete entry; } } return retval; }
void LdapTools::readGlobalBackupConfiguration() { VmBackupConfiguration* config = Config::getInstance()->getGlobalBackupConfiguration(); string base("ou=backup,ou=configuration,ou=virtualization,ou=services,"); base.append(Config::getInstance()->getLdapBaseDn()); SYSLOGLOGGER(logDEBUG) << "readGlobalBackupConfiguration " << base; LDAPSearchResults* entries = lc->search(base, LDAPConnection::SEARCH_SUB); if (entries != 0) { LDAPEntry* entry = entries->getNext(); while (entry != 0) { // SYSLOGLOGGER(logINFO) << "dn: " << entry->getDN(); const LDAPAttributeList* attrs = entry->getAttributes(); LDAPAttributeList::const_iterator it = attrs->begin(); for (; it != attrs->end(); it++) { LDAPAttribute attr = *it; // SYSLOGLOGGER(logINFO) << attr.getName() << "("; // SYSLOGLOGGER(logINFO) << attr.getNumValues() << "): "; StringList values = attr.getValues(); StringList::const_iterator it2 = values.begin(); string value = *it2; // for (; it2 != values.end(); it2++) { // // SYSLOGLOGGER(logINFO) << *it2 << "; "; // } // SYSLOGLOGGER(logINFO) << std::endl; //retval->addAttribute(entry->getDN(), attr.getName(), value); if (0 == attr.getName().compare("sstBackupNumberOfIterations")) { config->setIterations(atoi(value.c_str())); } else if (0 == attr.getName().compare("sstBackupExcludeFromBackup")) { config->setExclude(0 == value.compare("TRUE")); } else if (0 == attr.getName().compare("sstCronActive")) { config->setCronActive(0 == value.compare("TRUE")); } else if (0 == attr.getName().compare("sstCronDay")) { config->setCronDay(value); } else if (0 == attr.getName().compare("sstCronDayOfWeek")) { config->setCronDayOfWeek(value); } else if (0 == attr.getName().compare("sstCronHour")) { config->setCronHour(value); } else if (0 == attr.getName().compare("sstCronMinute")) { config->setCronMinute(value); } else if (0 == attr.getName().compare("sstCronMonth")) { config->setCronMonth(value); } } delete entry; entry = entries->getNext(); } } }
void LdapTools::readConfigurationSettings() { string base("ou=settings,ou=configuration,ou=virtualization,ou=services,"); base.append(Config::getInstance()->getLdapBaseDn()); SYSLOGLOGGER(logDEBUG) << "readConfigurationSettings " << base; LDAPSearchResults* entries = lc->search(base, LDAPConnection::SEARCH_SUB); if (entries != 0) { LDAPEntry* entry = entries->getNext(); while (entry != 0) { // SYSLOGLOGGER(logINFO) << "dn: " << entry->getDN(); const LDAPAttributeList* attrs = entry->getAttributes(); LDAPAttributeList::const_iterator it = attrs->begin(); for (; it != attrs->end(); it++) { LDAPAttribute attr = *it; // SYSLOGLOGGER(logINFO) << attr.getName() << "("; // SYSLOGLOGGER(logINFO) << attr.getNumValues() << "): "; StringList values = attr.getValues(); StringList::const_iterator it2 = values.begin(); string value = *it2; // for (; it2 != values.end(); it2++) { // // SYSLOGLOGGER(logINFO) << *it2 << "; "; // } // SYSLOGLOGGER(logINFO) << std::endl; //retval->addAttribute(entry->getDN(), attr.getName(), value); if (string::npos != entry->getDN().find("ou=sound")) { if (0 == attr.getName().compare("sstAllowSound")) { Config::getInstance()->setAllowSound(0 == value.compare("TRUE")); } } else if (string::npos != entry->getDN().find("ou=spice")) { if (0 == attr.getName().compare("sstAllowSpice")) { Config::getInstance()->setAllowSpice(0 == value.compare("TRUE")); } else if (0 == attr.getName().compare("sstSpicePortMin")) { Config::getInstance()->setSpicePortMin(atoi(value.c_str())); } else if (0 == attr.getName().compare("sstSpicePortMax")) { Config::getInstance()->setSpicePortMax(atoi(value.c_str())); } } else if (string::npos != entry->getDN().find("ou=usb")) { if (0 == attr.getName().compare("sstAllowUSB")) { Config::getInstance()->setAllowUsb(0 == value.compare("TRUE")); } } } delete entry; entry = entries->getNext(); } } }
VmPool* LdapTools::readVmPool(const string poolName, bool complete) { VmPool* retval = NULL; string base; if (!complete) { base = string("sstVirtualMachinePool="); base.append(poolName).append(",ou=virtual machine pools,ou=virtualization,ou=services,").append( Config::getInstance()->getLdapBaseDn()); } else { base = string(poolName); } SYSLOGLOGGER(logINFO) << "readVmPool "; LDAPSearchResults* entries = lc->search(base, LDAPConnection::SEARCH_SUB); if (entries != 0) { LDAPEntry* entry = entries->getNext(); if (entry != 0) { retval = new VmPool(entry->getDN(), this); } while (entry != 0) { // SYSLOGLOGGER(logINFO) << "dn: " << entry->getDN(); const LDAPAttributeList* attrs = entry->getAttributes(); LDAPAttributeList::const_iterator it = attrs->begin(); for (; it != attrs->end(); it++) { LDAPAttribute attr = *it; // SYSLOGLOGGER(logINFO) << attr.getName() << "("; // SYSLOGLOGGER(logINFO) << attr.getNumValues() << "): "; StringList values = attr.getValues(); StringList::const_iterator it2 = values.begin(); string value = *it2; // for (; it2 != values.end(); it2++) { // // SYSLOGLOGGER(logINFO) << *it2 << "; "; // } // SYSLOGLOGGER(logINFO) << std::endl; retval->addAttribute(entry->getDN(), attr.getName(), value); } delete entry; entry = entries->getNext(); } } if (!retval->hasOwnBackupConfiguration()) { retval->setBackupConfiguration(Config::getInstance()->getGlobalBackupConfiguration()); SYSLOGLOGGER(logINFO) << " use global backupconf for vmPool " << retval->getName() << "!"; SYSLOGLOGGER(logINFO) << " " << *(Config::getInstance()->getGlobalBackupConfiguration()); } return retval; }
Vm* LdapTools::readVm(const string vmName, bool complete) { Vm* retval = NULL; string base; if (!complete) { base = string("sstVirtualMachine="); base.append(vmName).append(",ou=virtual machines,ou=virtualization,ou=services,").append( Config::getInstance()->getLdapBaseDn()); } else { base = string(vmName); } SYSLOGLOGGER(logINFO) << "readVm " << base; LDAPSearchResults* entries = lc->search(base, LDAPConnection::SEARCH_SUB); if (entries != 0) { LDAPEntry* entry = entries->getNext(); if (entry != 0) { retval = new Vm(entry->getDN(), this); } while (entry != 0) { // SYSLOGLOGGER(logINFO) << "dn: " << entry->getDN(); const LDAPAttributeList* attrs = entry->getAttributes(); LDAPAttributeList::const_iterator it = attrs->begin(); for (; it != attrs->end(); it++) { LDAPAttribute attr = *it; // SYSLOGLOGGER(logINFO) << attr.getName() << "(" << attr.getNumValues() << "): "; StringList values = attr.getValues(); StringList::const_iterator it2 = values.begin(); string value = *it2; // for (; it2 != values.end(); it2++) { // SYSLOGLOGGER(logINFO) << *it2 << "; "; // } if (0 == attr.getName().compare("sstFeature")) { retval->setFeatures(values); } else { retval->addAttribute(entry->getDN(), attr.getName(), value); } } delete entry; entry = entries->getNext(); } } //SYSLOGLOGGER(logINFO) << "readVm finished!"; return retval; }
Node* LdapTools::readNode(const string nodeName) { Node* retval = NULL; string base("sstNode="); base.append(nodeName).append(",ou=nodes,ou=virtualization,ou=services,").append( Config::getInstance()->getLdapBaseDn()); SYSLOGLOGGER(logDEBUG) << "readNode " << base; LDAPSearchResults* entries = lc->search(base, LDAPConnection::SEARCH_SUB); if (entries != 0) { LDAPEntry* entry = entries->getNext(); if (entry != 0) { retval = new Node(entry->getDN(), this); } while (entry != 0) { // SYSLOGLOGGER(logINFO) << "dn: " << entry->getDN(); const LDAPAttributeList* attrs = entry->getAttributes(); LDAPAttributeList::const_iterator it = attrs->begin(); for (; it != attrs->end(); it++) { LDAPAttribute attr = *it; // SYSLOGLOGGER(logINFO) << attr.getName() << "("; // SYSLOGLOGGER(logINFO) << attr.getNumValues() << "): "; StringList values = attr.getValues(); StringList::const_iterator it2 = values.begin(); string value = *it2; // for (; it2 != values.end(); it2++) { // // SYSLOGLOGGER(logINFO) << *it2 << "; "; // } // SYSLOGLOGGER(logINFO) << std::endl; retval->addAttribute(entry->getDN(), attr.getName(), value); } delete entry; entry = entries->getNext(); } if (NULL != retval) { NodeType* type = retval->getType(string("VM-Node")); string nodestate = type->getState(); retval->setMaintenance(0 == nodestate.compare("maintenance")); } } return retval; }
Vm* LdapTools::cloneVm(const Vm* vm, const Node* targetNode, VirtTools* vt, string newUuid) { Vm* retval = NULL; size_t pos; const VmPool* vmPool = vm->getVmPool(); SYSLOGLOGGER(logDEBUG) << "cloneVm DN: " << (vm->getDn()); LDAPSearchResults* entries = lc->search(vm->getDn(), LDAPConnection::SEARCH_SUB); if (entries != 0) { string newVmDn; LDAPEntry* entry = entries->getNext(); const string oldVmDn = entry->getDN(); string uuid; vm->getDnPart(oldVmDn, "sstVirtualMachine", uuid); SYSLOGLOGGER(logDEBUG) << "old DN: " << oldVmDn << "; uuid: " << uuid; string oldVm = "sstVirtualMachine="; oldVm.append(uuid); string newVm = "sstVirtualMachine=" + newUuid; pos = oldVmDn.find(oldVm); newVmDn = newVm; newVmDn.append(oldVmDn.substr(oldVm.length())); SYSLOGLOGGER(logDEBUG) << "new DN: " << newVmDn; string firstMac = ""; bool diskSet = false; while (entry != 0) { string dn = entry->getDN(); pos = dn.find(oldVm); string newDn = dn.substr(0, pos); newDn.append(newVm).append(dn.substr(pos + oldVm.length())); //SYSLOGLOGGER(logDEBUG) << "oldDn: " << dn; //SYSLOGLOGGER(logDEBUG) << "newDn: " << newDn; LDAPEntry* newEntry = new LDAPEntry(newDn, entry->getAttributes()); if (0 == newDn.find("sstVirtualMachine")) { // DN starts with sstVirtualMachine newEntry->delAttribute("sstVirtualMachine"); const LDAPAttribute* attribute = entry->getAttributeByName("sstDisplayName"); StringList values = attribute->getValues(); StringList::const_iterator it = values.begin(); string displayName = *it; displayName.append(" clone"); newEntry->replaceAttribute(LDAPAttribute("sstDisplayName", displayName)); newEntry->replaceAttribute(LDAPAttribute("sstNode", targetNode->getName())); newEntry->replaceAttribute(LDAPAttribute("sstVirtualMachineType", "dynamic")); newEntry->replaceAttribute(LDAPAttribute("sstVirtualMachineSubType", "Desktop")); newEntry->replaceAttribute(LDAPAttribute("sstOsBootDevice", "hd")); newEntry->replaceAttribute(LDAPAttribute("sstSpicePort", nextSpicePort(targetNode))); newEntry->replaceAttribute(LDAPAttribute("sstSpicePassword", newUuid)); } else if (0 == newDn.find("sstDisk") && !diskSet) { // DN starts with sstDisk const LDAPAttribute* attribute = entry->getAttributeByName("sstDevice"); StringList values = attribute->getValues(); StringList::const_iterator it = values.begin(); string value = *it; if (0 == value.compare("disk")) { const string volumeName = vt->generateUUID(); string sourceFile = vmPool->getStoragePoolDir(); sourceFile.append("/").append(volumeName).append(".qcow2"); SYSLOGLOGGER(logINFO) << "volumeName: " << volumeName; SYSLOGLOGGER(logINFO) << "sourceFile: " << sourceFile; try { vt->createBackingStoreVolumeFile(vm, vmPool->getStoragePoolName(), volumeName); } catch (VirtException& e) { SYSLOGLOGGER(logINFO) << "-------------- caught Exception ---------"; SYSLOGLOGGER(logINFO) << e; lc->del(newDn); delete entry; return NULL; } newEntry->replaceAttribute(LDAPAttribute("sstVolumeName", volumeName)); newEntry->replaceAttribute(LDAPAttribute("sstSourceFile", sourceFile)); diskSet = true; } } else if (0 == newDn.find("sstInterface") && 0 == firstMac.size()) { // DN start with sstInterface firstMac = vt->generateMacAddress(); newEntry->replaceAttribute(LDAPAttribute("sstMacAddress", firstMac)); } lc->add(newEntry); delete entry; entry = entries->getNext(); } string peopleDn = "ou=people,"; peopleDn.append(newVmDn); LDAPEntry* peopleEntry = new LDAPEntry(peopleDn); StringList values; values.add("top"); values.add("organizationalUnit"); values.add("sstRelationship"); peopleEntry->addAttribute(LDAPAttribute("objectClass", values)); peopleEntry->addAttribute(LDAPAttribute("ou", "people")); peopleEntry->addAttribute(LDAPAttribute("description", "This is the assigned people subtree.")); peopleEntry->addAttribute(LDAPAttribute("sstBelongsToCustomerUID", vm->getCustomerUID())); peopleEntry->addAttribute(LDAPAttribute("sstBelongsToResellerUID", vm->getResellerUID())); lc->add(peopleEntry); delete peopleEntry; const NetworkRange* range = vmPool->getRange(); string base = "ou=dhcp,ou=networks,ou=virtualization,ou=services,"; base.append(Config::getInstance()->getLdapBaseDn()); string filter = "(&(objectClass=sstVirtualizationNetworkRange)(cn="; filter.append(range->getRange()).append("))"); SYSLOGLOGGER(logDEBUG) << "dhcp base: " << base << "; filter " << filter; StringList attrs = StringList(); attrs.add("cn"); LDAPSearchResults* entries2 = lc->search(base, LDAPConnection::SEARCH_SUB, filter, attrs); if (NULL != entries2) { LDAPEntry* entry2 = entries2->getNext(); if (NULL != entry2) { string dn = "cn="; dn.append(newUuid).append(",ou=virtual machines,"); string entryDn = entry2->getDN(); delete entry2; SYSLOGLOGGER(logDEBUG) << "rangeDN: " << entryDn; pos = entryDn.find("ou=ranges,"); dn.append(entryDn.substr(pos + 10)); SYSLOGLOGGER(logDEBUG) << "dhcp dn:" << dn; LDAPEntry* dhcpEntry = new LDAPEntry(dn); StringList vals; vals.add("top"); vals.add("dhcpHost"); vals.add("sstVirtualizationNetwork"); dhcpEntry->addAttribute(LDAPAttribute("objectClass", vals)); dhcpEntry->addAttribute(LDAPAttribute("cn", newUuid)); dhcpEntry->addAttribute(LDAPAttribute("sstBelongsToCustomerUID", vm->getCustomerUID())); dhcpEntry->addAttribute(LDAPAttribute("sstBelongsToResellerUID", vm->getResellerUID())); dhcpEntry->addAttribute(LDAPAttribute("dhcpHWAddress", "ethernet " + firstMac)); dhcpEntry->addAttribute(LDAPAttribute("dhcpStatements", "fixed-address " + getFreeIp(range))); lc->add(dhcpEntry); delete dhcpEntry; } } retval = readVm(newVmDn, true); } return retval; }