internal static int AddWebSitePointer(int siteItemId, int domainId, bool updateWebSite) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // load domain item DomainInfo domain = ServerController.GetDomain(domainId); if (domain == null) return BusinessErrorCodes.ERROR_DOMAIN_PACKAGE_ITEM_NOT_FOUND; // get zone records for the service List<GlobalDnsRecord> dnsRecords = ServerController.GetDnsRecordsByService(siteItem.ServiceId); // load web site IP address IPAddressInfo ip = ServerController.GetIPAddress(siteItem.SiteIPAddressId); // place log record TaskManager.StartTask("WEB_SITE", "ADD_POINTER", siteItem.Name); TaskManager.ItemId = siteItemId; TaskManager.WriteParameter("Domain pointer", domain.DomainName); try { // load appropriate zone DnsZone zone = (DnsZone)PackageController.GetPackageItem(domain.ZoneItemId); if (zone != null) { // change DNS zone string serviceIp = (ip != null) ? ip.ExternalIP : null; List<DnsRecord> resourceRecords = DnsServerController.BuildDnsResourceRecords( dnsRecords, domain.DomainName, serviceIp); try { DNSServer dns = new DNSServer(); ServiceProviderProxy.Init(dns, zone.ServiceId); // add new resource records dns.AddZoneRecords(zone.Name, resourceRecords.ToArray()); } catch (Exception ex1) { TaskManager.WriteError(ex1, "Error updating DNS records"); } } // update host headers if (updateWebSite) { // get existing web site bindings WebServer web = new WebServer(); ServiceProviderProxy.Init(web, siteItem.ServiceId); List<ServerBinding> bindings = new List<ServerBinding>(); bindings.AddRange(web.GetSiteBindings(siteItem.SiteId)); // check if web site has dedicated IP assigned bool dedicatedIp = bindings.Exists(binding => { return String.IsNullOrEmpty(binding.Host) && binding.IP != "*"; }); // update binding only for "shared" ip addresses if (!dedicatedIp) { // add new host headers string ipAddr = "*"; if (ip != null) ipAddr = !String.IsNullOrEmpty(ip.InternalIP) ? ip.InternalIP : ip.ExternalIP; // fill bindings FillWebServerBindings(bindings, dnsRecords, ipAddr, domain.DomainName); // update bindings web.UpdateSiteBindings(siteItem.SiteId, bindings.ToArray()); } } // update domain domain.WebSiteId = siteItemId; ServerController.UpdateDomain(domain); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } }
internal static int AddWebSitePointer(int siteItemId, string hostName, int domainId, bool updateWebSite, bool ignoreGlobalDNSRecords, bool rebuild) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // load domain item DomainInfo domain = ServerController.GetDomain(domainId); if (domain == null) return BusinessErrorCodes.ERROR_DOMAIN_PACKAGE_ITEM_NOT_FOUND; // check if the web site already exists if (!rebuild) { if (DataProvider.CheckDomain(domain.PackageId, string.IsNullOrEmpty(hostName) ? domain.DomainName : hostName + "." + domain.DomainName, true) != 0) return BusinessErrorCodes.ERROR_WEB_SITE_ALREADY_EXISTS; } // get zone records for the service List<GlobalDnsRecord> dnsRecords = ServerController.GetDnsRecordsByService(siteItem.ServiceId); // load web site IP address IPAddressInfo ip = ServerController.GetIPAddress(siteItem.SiteIPAddressId); // place log record TaskManager.StartTask("WEB_SITE", "ADD_POINTER", siteItem.Name, siteItemId); TaskManager.WriteParameter("Domain pointer", domain.DomainName); TaskManager.WriteParameter("Host name", hostName); TaskManager.WriteParameter("updateWebSite", updateWebSite.ToString()); try { // load appropriate zone DnsZone zone = (DnsZone)PackageController.GetPackageItem(domain.ZoneItemId); if (zone != null) { // change DNS zone List<GlobalDnsRecord> tmpDnsRecords = new List<GlobalDnsRecord>(); string serviceIp = (ip != null) ? ip.ExternalIP : null; if (string.IsNullOrEmpty(serviceIp)) { StringDictionary settings = ServerController.GetServiceSettings(siteItem.ServiceId); if (settings["PublicSharedIP"] != null) serviceIp = settings["PublicSharedIP"].ToString(); } //filter initiat GlobaDNSRecords list if (ignoreGlobalDNSRecords) { //ignore all other except the host_name record foreach (GlobalDnsRecord r in dnsRecords) { if (r.RecordName == "[host_name]") { tmpDnsRecords.Add(r); break; } } } else tmpDnsRecords = dnsRecords; List<DnsRecord> resourceRecords = DnsServerController.BuildDnsResourceRecords(tmpDnsRecords, hostName, domain.DomainName, serviceIp); if (!rebuild) { foreach (DnsRecord r in resourceRecords) { if (r.RecordName != "*") { // check if the web site already exists if (DataProvider.CheckDomain(domain.PackageId, string.IsNullOrEmpty(r.RecordName) ? domain.DomainName : r.RecordName + "." + domain.DomainName, true) != 0) return BusinessErrorCodes.ERROR_WEB_SITE_ALREADY_EXISTS; } } } try { DNSServer dns = new DNSServer(); ServiceProviderProxy.Init(dns, zone.ServiceId); DnsRecord[] domainRecords = dns.GetZoneRecords(zone.Name); var duplicateRecords = (from zoneRecord in domainRecords from resRecord in resourceRecords where zoneRecord.RecordName == resRecord.RecordName where zoneRecord.RecordType == resRecord.RecordType select zoneRecord).ToArray(); if (duplicateRecords != null && duplicateRecords.Count() > 0) { dns.DeleteZoneRecords(zone.Name, duplicateRecords); } // add new resource records dns.AddZoneRecords(zone.Name, resourceRecords.ToArray()); } catch (Exception ex1) { TaskManager.WriteError(ex1, "Error updating DNS records"); } } // update host headers List<ServerBinding> bindings = new List<ServerBinding>(); // get existing web site bindings WebServer web = new WebServer(); ServiceProviderProxy.Init(web, siteItem.ServiceId); bindings.AddRange(web.GetSiteBindings(siteItem.SiteId)); // check if web site has dedicated IP assigned bool dedicatedIp = bindings.Exists(binding => { return String.IsNullOrEmpty(binding.Host) && binding.IP != "*"; }); // update binding only for "shared" ip addresses // add new host headers string ipAddr = "*"; if (ip != null) ipAddr = !String.IsNullOrEmpty(ip.InternalIP) ? ip.InternalIP : ip.ExternalIP; // fill bindings FillWebServerBindings(bindings, dnsRecords, ipAddr, hostName, domain.DomainName, ignoreGlobalDNSRecords); //for logging purposes foreach (ServerBinding b in bindings) { string header = string.Format("{0} {1} {2}", b.Host, b.IP, b.Port); TaskManager.WriteParameter("Add Binding", header); } // update bindings if (updateWebSite) web.UpdateSiteBindings(siteItem.SiteId, bindings.ToArray(), false); // update domain if (!rebuild) { domain.WebSiteId = siteItemId; domain.IsDomainPointer = true; foreach (ServerBinding b in bindings) { //add new domain record if (!string.IsNullOrEmpty(b.Host)) { domain.DomainName = b.Host; DomainInfo domainTmp = ServerController.GetDomain(domain.DomainName); if (!((domainTmp != null) && (domainTmp.WebSiteId == siteItemId))) { int domainID = ServerController.AddDomain(domain, domain.IsInstantAlias, false); domainTmp = ServerController.GetDomain(domainID); if (domainTmp != null) { domainTmp.WebSiteId = siteItemId; domainTmp.ZoneItemId = domain.ZoneItemId; domainTmp.DomainItemId = domainId; ServerController.UpdateDomain(domainTmp); } } } } } else { if (domain.ZoneItemId > 0) { DomainInfo domainTmp = ServerController.GetDomain(string.IsNullOrEmpty(hostName) ? domain.DomainName : hostName + "." + domain.DomainName, true, true); if (domainTmp != null) { domainTmp.ZoneItemId = domain.ZoneItemId; ServerController.UpdateDomain(domainTmp); } } } return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } }
/// <summary> /// Adds SharePoint site collection. /// </summary> /// <param name="item">Site collection description.</param> /// <returns>Created site collection id within metabase.</returns> public static int AddSiteCollection(SharePointSiteCollection item) { // Check account. int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) { return accountCheck; } // Check package. int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); if (packageCheck < 0) { return packageCheck; } // Check quota. OrganizationStatistics orgStats = OrganizationController.GetOrganizationStatistics(item.OrganizationId); //QuotaValueInfo quota = PackageController.GetPackageQuota(item.PackageId, Quotas.HOSTED_SHAREPOINT_SITES); if (orgStats.AllocatedSharePointSiteCollections > -1 && orgStats.CreatedSharePointSiteCollections >= orgStats.AllocatedSharePointSiteCollections) { return BusinessErrorCodes.ERROR_SHAREPOINT_RESOURCE_QUOTA_LIMIT; } // Check if stats resource is available int serviceId = PackageController.GetPackageServiceId(item.PackageId, ResourceGroups.SharepointFoundationServer); if (serviceId == 0) { return BusinessErrorCodes.ERROR_SHAREPOINT_RESOURCE_UNAVAILABLE; } StringDictionary hostedSharePointSettings = ServerController.GetServiceSettings(serviceId); QuotaValueInfo quota = PackageController.GetPackageQuota(item.PackageId, Quotas.HOSTED_SHAREPOINT_USESHAREDSSL); Uri rootWebApplicationUri = new Uri(hostedSharePointSettings["RootWebApplicationUri"]); Organization org = OrganizationController.GetOrganization(item.OrganizationId); string siteName = item.Name; if (quota.QuotaAllocatedValue == 1) { string sslRoot = hostedSharePointSettings["SharedSSLRoot"]; string defaultDomain = org.DefaultDomain; string hostNameBase = string.Empty; string[] tmp = defaultDomain.Split('.'); if (tmp.Length == 2) { hostNameBase = tmp[0]; } else { if (tmp.Length > 2) { hostNameBase = tmp[0] + tmp[1]; } } int counter = 0; item.Name = String.Format("{0}://{1}", rootWebApplicationUri.Scheme, hostNameBase + "-" + counter.ToString() + "." + sslRoot); siteName = String.Format("{0}", hostNameBase + "-" + counter.ToString() + "." + sslRoot); while ( DataProvider. CheckServiceItemExists( serviceId, item. Name, "WebsitePanel.Providers.SharePoint.SharePointSiteCollection, WebsitePanel.Providers.Base")) { counter++; item.Name = String.Format("{0}://{1}", rootWebApplicationUri.Scheme, hostNameBase + "-" + counter.ToString() + "." + sslRoot); siteName = String.Format("{0}", hostNameBase + "-" + counter.ToString() + "." + sslRoot); } } else item.Name = String.Format("{0}://{1}", rootWebApplicationUri.Scheme, item.Name); if (rootWebApplicationUri.Port > 0 && rootWebApplicationUri.Port != 80 && rootWebApplicationUri.Port != 443) { item.PhysicalAddress = String.Format("{0}:{1}", item.Name, rootWebApplicationUri.Port); } else { item.PhysicalAddress = item.Name; } if (Utils.ParseBool(hostedSharePointSettings["LocalHostFile"], false)) { item.RootWebApplicationInteralIpAddress = hostedSharePointSettings["RootWebApplicationInteralIpAddress"]; item.RootWebApplicationFQDN = item.Name.Replace(rootWebApplicationUri.Scheme + "://", ""); } item.MaxSiteStorage = RecalculateMaxSize(org.MaxSharePointStorage, (int)item.MaxSiteStorage); item.WarningStorage = item.MaxSiteStorage == -1 ? -1 : Math.Min((int)item.WarningStorage, item.MaxSiteStorage); // Check package item with given name already exists. if (PackageController.GetPackageItemByName(item.PackageId, item.Name, typeof(SharePointSiteCollection)) != null) { return BusinessErrorCodes.ERROR_SHAREPOINT_PACKAGE_ITEM_EXISTS; } // Log operation. TaskManager.StartTask("HOSTEDSHAREPOINT", "ADD_SITE_COLLECTION", item.Name); try { // Create site collection on server. HostedSharePointServer hostedSharePointServer = GetHostedSharePointServer(serviceId); hostedSharePointServer.CreateSiteCollection(item); // Make record in metabase. item.ServiceId = serviceId; int itemId = PackageController.AddPackageItem(item); hostedSharePointServer.SetPeoplePickerOu(item.Name, org.DistinguishedName); int dnsServiceId = PackageController.GetPackageServiceId(item.PackageId, ResourceGroups.Dns); if (dnsServiceId > 0) { string[] tmpStr = siteName.Split('.'); string hostName = tmpStr[0]; string domainName = siteName.Substring(hostName.Length + 1, siteName.Length - (hostName.Length + 1)); List<GlobalDnsRecord> dnsRecords = ServerController.GetDnsRecordsByService(serviceId); List<DnsRecord> resourceRecords = DnsServerController.BuildDnsResourceRecords(dnsRecords, hostName, domainName, ""); DNSServer dns = new DNSServer(); ServiceProviderProxy.Init(dns, dnsServiceId); // add new resource records dns.AddZoneRecords(domainName, resourceRecords.ToArray()); } TaskManager.ItemId = itemId; return itemId; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } }
internal static int AddWebSitePointer(int siteItemId, int domainId, bool updateWebSite) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // load domain item DomainInfo domain = ServerController.GetDomain(domainId); if (domain == null) return BusinessErrorCodes.ERROR_DOMAIN_PACKAGE_ITEM_NOT_FOUND; // load appropriate zone DnsZone zone = (DnsZone)PackageController.GetPackageItem(domain.ZoneItemId); //if (zone == null) // return BusinessErrorCodes.ERROR_DNS_PACKAGE_ITEM_NOT_FOUND; // get zone records for the service List<GlobalDnsRecord> dnsRecords = ServerController.GetDnsRecordsByService(siteItem.ServiceId); // change DNS zone IPAddressInfo ip = ServerController.GetIPAddress(siteItem.SiteIPAddressId); if (ip == null) return BusinessErrorCodes.ERROR_WEB_SITE_IP_ADDRESS_NOT_SPECIFIED; List<DnsRecord> resourceRecords = DnsServerController.BuildDnsResourceRecords( dnsRecords, domain.DomainName, ip.ExternalIP); // place log record TaskManager.StartTask("WEB_SITE", "ADD_POINTER", siteItem.Name); TaskManager.ItemId = siteItemId; TaskManager.WriteParameter("Domain pointer", domain.DomainName); try { if (zone != null) { try { DNSServer dns = new DNSServer(); ServiceProviderProxy.Init(dns, zone.ServiceId); // add new resource records dns.AddZoneRecords(zone.Name, resourceRecords.ToArray()); } catch(Exception ex1) { TaskManager.WriteError(ex1, "Error updating DNS records"); } } // update host headers if (updateWebSite) { // load web settings StringDictionary webSettings = ServerController.GetServiceSettings(siteItem.ServiceId); int sharedIpId = Utils.ParseInt(webSettings["SharedIP"], 0); bool dedicatedIp = (siteItem.SiteIPAddressId != sharedIpId); if (!dedicatedIp) { WebServer web = new WebServer(); ServiceProviderProxy.Init(web, siteItem.ServiceId); List<ServerBinding> bindings = new List<ServerBinding>(); ServerBinding[] siteBindings = web.GetSiteBindings(siteItem.SiteId); if(siteBindings != null) bindings.AddRange(siteBindings); // add new host headers string ipAddr = ip.InternalIP; if (ipAddr == null || ipAddr == "") ipAddr = ip.ExternalIP; // fill bindings FillWebServerBindings(bindings, dnsRecords, ipAddr, domain.DomainName); // update bindings web.UpdateSiteBindings(siteItem.SiteId, bindings.ToArray()); } } // update domain domain.WebSiteId = siteItemId; ServerController.UpdateDomain(domain); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } }