bool TSrvIfaceMgr::addFQDN(int iface, SPtr<TIPv6Addr> dnsAddr, SPtr<TIPv6Addr> addr, const std::string& name) { bool success = true; #ifndef MOD_SRV_DISABLE_DNSUPDATE SPtr<TSrvCfgIface> cfgIface = SrvCfgMgr().getIfaceByID(iface); if (!cfgIface) { Log(Error) << "Unable find cfgIface with ifindex=" << iface << ", DDNS failed." << LogEnd; return false; } DnsUpdateModeCfg FQDNMode = static_cast<DnsUpdateModeCfg>(cfgIface->getFQDNMode()); TCfgMgr::DNSUpdateProtocol proto = SrvCfgMgr().getDDNSProtocol(); DNSUpdate::DnsUpdateProtocol proto2 = DNSUpdate::DNSUPDATE_TCP; if (proto == TCfgMgr::DNSUPDATE_UDP) proto2 = DNSUpdate::DNSUPDATE_UDP; if (proto == TCfgMgr::DNSUPDATE_ANY) proto2 = DNSUpdate::DNSUPDATE_ANY; unsigned int timeout = SrvCfgMgr().getDDNSTimeout(); // FQDNMode: 0 = NONE, 1 = PTR only, 2 = BOTH PTR and AAAA if ((FQDNMode == DNSUPDATE_MODE_PTR) || (FQDNMode == DNSUPDATE_MODE_BOTH)) { //Test for DNS update char zoneroot[128]; doRevDnsZoneRoot(addr->getAddr(), zoneroot, cfgIface->getRevDNSZoneRootLength()); /* add PTR only */ DnsUpdateResult result = DNSUPDATE_SKIP; DNSUpdate *act = new DNSUpdate(dnsAddr->getPlain(), zoneroot, name, addr->getPlain(), DNSUPDATE_PTR, proto2); result = act->run(timeout); act->showResult(result); delete act; success = (result == DNSUPDATE_SUCCESS); } if (FQDNMode == 2) { DnsUpdateResult result = DNSUPDATE_SKIP; DNSUpdate *act = new DNSUpdate(dnsAddr->getPlain(), "", name, addr->getPlain(), DNSUPDATE_AAAA, proto2); result = act->run(timeout); act->showResult(result); delete act; success = (result == DNSUPDATE_SUCCESS) && success; } #else Log(Info) << "DNSUpdate not compiled in. Pretending success." << LogEnd; #endif return success; }
bool TClntIfaceMgr::fqdnAdd(SPtr<TClntIfaceIface> iface, const std::string& fqdn) { SPtr<TIPv6Addr> DNSAddr; SPtr<TIPv6Addr> addr; SPtr<TClntCfgIface> cfgIface; cfgIface = ClntCfgMgr().getIface(iface->getID()); if (!cfgIface) { Log(Error) << "Unable to find interface with ifindex=" << iface->getID() << "." << LogEnd; return false; } // For the moment, we just take the first DNS entry. List(TIPv6Addr) DNSSrvLst = iface->getDNSServerLst(); if (!DNSSrvLst.count()) { Log(Error) << "Unable to find DNS Server. FQDN add failed." << LogEnd; return false; } DNSSrvLst.first(); DNSAddr = DNSSrvLst.get(); // And the first IP address SPtr<TAddrIA> ptrAddrIA; ClntAddrMgr().firstIA(); ptrAddrIA = ClntAddrMgr().getIA(); if (ptrAddrIA->countAddr() > 0) { ptrAddrIA->firstAddr(); addr = ptrAddrIA->getAddr()->get(); Log(Notice) << "FQDN: About to perform DNS Update: DNS server=" << *DNSAddr << ", IP=" << *addr << " and FQDN=" << fqdn << LogEnd; // remember DNS Address (used during address release) ptrAddrIA->setFQDNDnsServer(DNSAddr); #ifndef MOD_CLNT_DISABLE_DNSUPDATE TCfgMgr::DNSUpdateProtocol proto = ClntCfgMgr().getDDNSProtocol(); DNSUpdate::DnsUpdateProtocol proto2 = DNSUpdate::DNSUPDATE_TCP; if (proto == TCfgMgr::DNSUPDATE_UDP) proto2 = DNSUpdate::DNSUPDATE_UDP; if (proto == TCfgMgr::DNSUPDATE_ANY) proto2 = DNSUpdate::DNSUPDATE_ANY; unsigned int timeout = ClntCfgMgr().getDDNSTimeout(); /* add AAAA record */ DNSUpdate *act = new DNSUpdate(DNSAddr->getPlain(), "", fqdn, addr->getPlain(), DNSUPDATE_AAAA, proto2); int result = act->run(timeout); act->showResult(result); delete act; #else Log(Error) << "This version is compiled without DNS Update support." << LogEnd; return false; #endif } return true; }
bool TClntIfaceMgr::fqdnDel(SPtr<TClntIfaceIface> iface, SPtr<TAddrIA> ia, const std::string& fqdn) { SPtr<TIPv6Addr> dns = ia->getFQDNDnsServer(); // let's do deleting update SPtr<TIPv6Addr> clntAddr; ia->firstAddr(); SPtr<TAddrAddr> tmpAddr = ia->getAddr(); if (!tmpAddr) { Log(Error) << "FQDN: Unable to delete FQDN: IA (IAID=" << ia->getIAID() << ") does not have any addresses." << LogEnd; return false; } SPtr<TIPv6Addr> myAddr = tmpAddr->get(); SPtr<TClntCfgIface> ptrIface = ClntCfgMgr().getIface(iface->getID()); #ifndef MOD_CLNT_DISABLE_DNSUPDATE TCfgMgr::DNSUpdateProtocol proto = ClntCfgMgr().getDDNSProtocol(); DNSUpdate::DnsUpdateProtocol proto2 = DNSUpdate::DNSUPDATE_TCP; if (proto == TCfgMgr::DNSUPDATE_UDP) proto2 = DNSUpdate::DNSUPDATE_UDP; if (proto == TCfgMgr::DNSUPDATE_ANY) proto2 = DNSUpdate::DNSUPDATE_ANY; unsigned int timeout = ClntCfgMgr().getDDNSTimeout(); Log(Debug) << "FQDN: Cleaning up DNS AAAA record in server " << *dns << ", for IP=" << *myAddr << " and FQDN=" << fqdn << LogEnd; DNSUpdate *act = new DNSUpdate(dns->getPlain(), "", fqdn, myAddr->getPlain(), DNSUPDATE_AAAA_CLEANUP, proto2); int result = act->run(timeout); act->showResult(result); delete act; #else Log(Error) << "This Dibbler version is compiled without DNS Update support." << LogEnd; #endif return false; }
bool TSrvIfaceMgr::delFQDN(int iface, SPtr<TIPv6Addr> dnsAddr, SPtr<TIPv6Addr> addr, const std::string& name) { bool success = true; #ifndef MOD_SRV_DISABLE_DNSUPDATE SPtr<TSrvCfgIface> cfgIface = SrvCfgMgr().getIfaceByID(iface); if (!cfgIface) { Log(Error) << "Unable find cfgIface with ifindex=" << iface << ", DDNS failed." << LogEnd; return false; } DnsUpdateModeCfg FQDNMode = static_cast<DnsUpdateModeCfg>(cfgIface->getFQDNMode()); char zoneroot[128]; doRevDnsZoneRoot(addr->getAddr(), zoneroot, cfgIface->getRevDNSZoneRootLength()); // that's ugly but required. Otherwise we would have to include CfgMgr.h in DNSUpdate.h // and that would include both poslib and Dibbler headers in one place. Universe would // implode then. TCfgMgr::DNSUpdateProtocol proto = SrvCfgMgr().getDDNSProtocol(); DNSUpdate::DnsUpdateProtocol proto2 = DNSUpdate::DNSUPDATE_TCP; if (proto == TCfgMgr::DNSUPDATE_UDP) proto2 = DNSUpdate::DNSUPDATE_UDP; if (proto == TCfgMgr::DNSUPDATE_ANY) proto2 = DNSUpdate::DNSUPDATE_ANY; unsigned int timeout = SrvCfgMgr().getDDNSTimeout(); // FQDNMode: 0 = NONE, 1 = PTR only, 2 = BOTH PTR and AAAA if ((FQDNMode == DNSUPDATE_MODE_PTR) || (FQDNMode == DNSUPDATE_MODE_BOTH)) { /* PTR cleanup */ Log(Notice) << "FQDN: Attempting to clean up PTR record in DNS Server " << dnsAddr->getPlain() << ", IP = " << addr->getPlain() << " and FQDN=" << name << LogEnd; DNSUpdate *act = new DNSUpdate(dnsAddr->getPlain(), zoneroot, name, addr->getPlain(), DNSUPDATE_PTR_CLEANUP, proto2); int result = act->run(timeout); act->showResult(result); delete act; success = (result == DNSUPDATE_SUCCESS); } if (FQDNMode == DNSUPDATE_MODE_BOTH) { /* AAAA Cleanup */ Log(Notice) << "FQDN: Attempting to clean up AAAA and PTR record in DNS Server " << dnsAddr->getPlain() << ", IP = " << addr->getPlain() << " and FQDN=" << name << LogEnd; DNSUpdate *act = new DNSUpdate(dnsAddr->getPlain(), "", name, addr->getPlain(), DNSUPDATE_AAAA_CLEANUP, proto2); int result = act->run(timeout); act->showResult(result); delete act; success = (result == DNSUPDATE_SUCCESS) && success; } #else Log(Info) << "DNSUpdate not compiled in. Pretending success." << LogEnd; #endif return success; }