1074 lines
46 KiB
C#
1074 lines
46 KiB
C#
// Copyright (c) .NET Foundation. All rights reserved.
|
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
|
|
|
using AspNetCoreModule.Test.HttpClientHelper;
|
|
using Microsoft.Web.Administration;
|
|
using System;
|
|
using System.IO;
|
|
using System.Management;
|
|
using System.ServiceProcess;
|
|
using System.Threading;
|
|
|
|
namespace AspNetCoreModule.Test.Framework
|
|
{
|
|
public class IISConfigUtility : IDisposable
|
|
{
|
|
public class Strings
|
|
{
|
|
public static string AppHostConfigPath = Path.Combine(Environment.ExpandEnvironmentVariables("%windir%"), "system32", "inetsrv", "config", "applicationHost.config");
|
|
public static string IIS64BitPath = Path.Combine(Environment.ExpandEnvironmentVariables("%windir%"), "system32", "inetsrv");
|
|
public static string IIS32BitPath = Path.Combine(Environment.ExpandEnvironmentVariables("%windir%"), "syswow64", "inetsrv");
|
|
public static string IISExpress64BitPath = Path.Combine(Environment.ExpandEnvironmentVariables("%ProgramFiles%"), "IIS Express");
|
|
public static string IISExpress32BitPath = Path.Combine(Environment.ExpandEnvironmentVariables("%ProgramFiles(x86)%"), "IIS Express");
|
|
public static string DefaultAppPool = "DefaultAppPool";
|
|
}
|
|
|
|
private ServerType _serverType = ServerType.IIS;
|
|
private string _iisExpressConfigPath = null;
|
|
|
|
public enum AppPoolBitness
|
|
{
|
|
enable32Bit,
|
|
noChange
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
}
|
|
|
|
public ServerManager GetServerManager()
|
|
{
|
|
if (_serverType == ServerType.IISExpress)
|
|
{
|
|
return new ServerManager(
|
|
false, // readOnly
|
|
_iisExpressConfigPath // applicationhost.config path for IISExpress
|
|
);
|
|
}
|
|
else
|
|
{
|
|
return new ServerManager(
|
|
false, // readOnly
|
|
Strings.AppHostConfigPath // applicationhost.config path for IIS
|
|
);
|
|
}
|
|
}
|
|
|
|
public IISConfigUtility(ServerType type, string iisExpressConfigPath = null)
|
|
{
|
|
_serverType = type;
|
|
_iisExpressConfigPath = iisExpressConfigPath;
|
|
}
|
|
|
|
public static void BackupAppHostConfig()
|
|
{
|
|
string fromfile = Strings.AppHostConfigPath;
|
|
string tofile = Strings.AppHostConfigPath + ".ancmtest.bak";
|
|
if (File.Exists(fromfile))
|
|
{
|
|
TestUtility.FileCopy(fromfile, tofile, overWrite: false);
|
|
}
|
|
}
|
|
|
|
public static void RestoreAppHostConfig()
|
|
{
|
|
string fromfile = Strings.AppHostConfigPath + ".ancmtest.bak";
|
|
string tofile = Strings.AppHostConfigPath;
|
|
|
|
if (!File.Exists(fromfile) && !File.Exists(tofile))
|
|
{
|
|
// IIS is not installed, don't do anything here
|
|
return;
|
|
}
|
|
|
|
// backup first if the backup file is not available
|
|
if (!File.Exists(fromfile))
|
|
{
|
|
BackupAppHostConfig();
|
|
}
|
|
|
|
// try again after the ininial clean up
|
|
if (File.Exists(fromfile))
|
|
{
|
|
try
|
|
{
|
|
TestUtility.FileCopy(fromfile, tofile, true, true);
|
|
}
|
|
catch
|
|
{
|
|
// ignore
|
|
}
|
|
|
|
// try again
|
|
if (!File.Exists(tofile) || File.ReadAllBytes(fromfile).Length != File.ReadAllBytes(tofile).Length)
|
|
{
|
|
// try again
|
|
TestUtility.ResetHelper(ResetHelperMode.KillWorkerProcess);
|
|
TestUtility.FileCopy(fromfile, tofile, true, true);
|
|
}
|
|
|
|
if (File.ReadAllBytes(fromfile).Length != File.ReadAllBytes(tofile).Length)
|
|
{
|
|
throw new System.ApplicationException("Failed to restore applicationhost.config");
|
|
}
|
|
}
|
|
}
|
|
|
|
public void SetAppPoolSetting(string appPoolName, string attribute, object value)
|
|
{
|
|
TestUtility.LogInformation("Setting Apppool : " + appPoolName + "::" + attribute.ToString() + " <== " + value.ToString());
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
Configuration config = serverManager.GetApplicationHostConfiguration();
|
|
ConfigurationSection applicationPoolsSection = config.GetSection("system.applicationHost/applicationPools");
|
|
ConfigurationElementCollection applicationPoolsCollection = applicationPoolsSection.GetCollection();
|
|
ConfigurationElement addElement = FindElement(applicationPoolsCollection, "add", "name", appPoolName);
|
|
if (addElement == null) throw new InvalidOperationException("Element not found!");
|
|
|
|
switch (attribute)
|
|
{
|
|
case "privateMemory":
|
|
case "memory":
|
|
ConfigurationElement recyclingElement = addElement.GetChildElement("recycling");
|
|
ConfigurationElement periodicRestartElement = recyclingElement.GetChildElement("periodicRestart");
|
|
periodicRestartElement[attribute] = value;
|
|
break;
|
|
case "rapidFailProtectionMaxCrashes":
|
|
ConfigurationElement failureElement = addElement.GetChildElement("failure");
|
|
failureElement["rapidFailProtectionMaxCrashes"] = value;
|
|
break;
|
|
default:
|
|
addElement[attribute] = value;
|
|
break;
|
|
}
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
|
|
public void RecycleAppPool(string appPoolName)
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
serverManager.ApplicationPools[appPoolName].Recycle();
|
|
}
|
|
}
|
|
|
|
public void StopAppPool(string appPoolName)
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
serverManager.ApplicationPools[appPoolName].Stop();
|
|
}
|
|
}
|
|
|
|
public void StartAppPool(string appPoolName)
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
serverManager.ApplicationPools[appPoolName].Start();
|
|
}
|
|
}
|
|
|
|
public void CreateSite(string siteName, string physicalPath, int siteId, int tcpPort, string appPoolName = "DefaultAppPool")
|
|
{
|
|
TestUtility.LogInformation("Creating web site : " + siteName);
|
|
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
Configuration config = serverManager.GetApplicationHostConfiguration();
|
|
ConfigurationSection sitesSection = config.GetSection("system.applicationHost/sites");
|
|
ConfigurationElementCollection sitesCollection = sitesSection.GetCollection();
|
|
ConfigurationElement siteElement = FindElement(sitesCollection, "site", "name", siteName);
|
|
if (siteElement != null)
|
|
{
|
|
sitesCollection.Remove(siteElement);
|
|
}
|
|
siteElement = sitesCollection.CreateElement("site");
|
|
siteElement["id"] = siteId;
|
|
siteElement["name"] = siteName;
|
|
ConfigurationElementCollection bindingsCollection = siteElement.GetCollection("bindings");
|
|
|
|
ConfigurationElement bindingElement = bindingsCollection.CreateElement("binding");
|
|
bindingElement["protocol"] = @"http";
|
|
bindingElement["bindingInformation"] = "*:" + tcpPort + ":";
|
|
bindingsCollection.Add(bindingElement);
|
|
|
|
ConfigurationElementCollection siteCollection = siteElement.GetCollection();
|
|
ConfigurationElement applicationElement = siteCollection.CreateElement("application");
|
|
applicationElement["path"] = @"/";
|
|
applicationElement["applicationPool"] = appPoolName;
|
|
|
|
ConfigurationElementCollection applicationCollection = applicationElement.GetCollection();
|
|
ConfigurationElement virtualDirectoryElement = applicationCollection.CreateElement("virtualDirectory");
|
|
virtualDirectoryElement["path"] = @"/";
|
|
virtualDirectoryElement["physicalPath"] = physicalPath;
|
|
applicationCollection.Add(virtualDirectoryElement);
|
|
siteCollection.Add(applicationElement);
|
|
sitesCollection.Add(siteElement);
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
|
|
public void CreateApp(string siteName, string appName, string physicalPath, string appPoolName = "DefaultAppPool")
|
|
{
|
|
TestUtility.LogInformation("Creating web app : " + siteName + "/" + appName);
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
Configuration config = serverManager.GetApplicationHostConfiguration();
|
|
|
|
ConfigurationSection sitesSection = config.GetSection("system.applicationHost/sites");
|
|
|
|
ConfigurationElementCollection sitesCollection = sitesSection.GetCollection();
|
|
|
|
ConfigurationElement siteElement = FindElement(sitesCollection, "site", "name", siteName);
|
|
if (siteElement == null) throw new InvalidOperationException("Element not found!");
|
|
|
|
ConfigurationElementCollection siteCollection = siteElement.GetCollection();
|
|
|
|
ConfigurationElement applicationElement = siteCollection.CreateElement("application");
|
|
string appPath = @"/" + appName;
|
|
appPath = appPath.Replace("//", "/");
|
|
applicationElement["path"] = appPath;
|
|
applicationElement["applicationPool"] = appPoolName;
|
|
|
|
ConfigurationElementCollection applicationCollection = applicationElement.GetCollection();
|
|
|
|
ConfigurationElement virtualDirectoryElement = applicationCollection.CreateElement("virtualDirectory");
|
|
virtualDirectoryElement["path"] = @"/";
|
|
virtualDirectoryElement["physicalPath"] = physicalPath;
|
|
applicationCollection.Add(virtualDirectoryElement);
|
|
siteCollection.Add(applicationElement);
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
|
|
public void EnableWindowsAuthentication(string siteName)
|
|
{
|
|
TestUtility.LogInformation("Enable Windows authentication : " + siteName);
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
Configuration config = serverManager.GetApplicationHostConfiguration();
|
|
|
|
ConfigurationSection anonymousAuthenticationSection = config.GetSection("system.webServer/security/authentication/anonymousAuthentication", siteName);
|
|
anonymousAuthenticationSection["enabled"] = false;
|
|
ConfigurationSection windowsAuthenticationSection = config.GetSection("system.webServer/security/authentication/windowsAuthentication", siteName);
|
|
windowsAuthenticationSection["enabled"] = true;
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
|
|
public void SetCompression(string siteName, bool enabled)
|
|
{
|
|
TestUtility.LogInformation("Enable Compression : " + siteName);
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
Configuration config = serverManager.GetApplicationHostConfiguration();
|
|
|
|
ConfigurationSection urlCompressionSection = config.GetSection("system.webServer/urlCompression", siteName);
|
|
urlCompressionSection["doStaticCompression"] = enabled;
|
|
urlCompressionSection["doDynamicCompression"] = enabled;
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
|
|
public void DisableWindowsAuthentication(string siteName)
|
|
{
|
|
TestUtility.LogInformation("Enable Windows authentication : " + siteName);
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
Configuration config = serverManager.GetApplicationHostConfiguration();
|
|
|
|
ConfigurationSection anonymousAuthenticationSection = config.GetSection("system.webServer/security/authentication/anonymousAuthentication", siteName);
|
|
anonymousAuthenticationSection["enabled"] = true;
|
|
ConfigurationSection windowsAuthenticationSection = config.GetSection("system.webServer/security/authentication/windowsAuthentication", siteName);
|
|
windowsAuthenticationSection["enabled"] = false;
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
|
|
public void SetANCMConfig(string siteName, string appName, string attributeName, object attributeValue)
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
Configuration config = serverManager.GetWebConfiguration(siteName, appName);
|
|
ConfigurationSection aspNetCoreSection = config.GetSection("system.webServer/aspNetCore");
|
|
if (attributeName == "environmentVariable")
|
|
{
|
|
string name = ((string[])attributeValue)[0];
|
|
string value = ((string[])attributeValue)[1];
|
|
ConfigurationElementCollection environmentVariablesCollection = aspNetCoreSection.GetCollection("environmentVariables");
|
|
ConfigurationElement environmentVariableElement = environmentVariablesCollection.CreateElement("environmentVariable");
|
|
environmentVariableElement["name"] = name;
|
|
environmentVariableElement["value"] = value;
|
|
var element = FindElement(environmentVariablesCollection, "add", "name", value);
|
|
if (element != null)
|
|
{
|
|
throw new System.ApplicationException("duplicated collection item");
|
|
}
|
|
environmentVariablesCollection.Add(environmentVariableElement);
|
|
}
|
|
else
|
|
{
|
|
aspNetCoreSection[attributeName] = attributeValue;
|
|
}
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
|
|
public void ConfigureCustomLogging(string siteName, string appName, int statusCode, int subStatusCode, string path)
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
Configuration config = serverManager.GetWebConfiguration(siteName, appName);
|
|
ConfigurationSection httpErrorsSection = config.GetSection("system.webServer/httpErrors");
|
|
httpErrorsSection["errorMode"] = @"Custom";
|
|
|
|
ConfigurationElementCollection httpErrorsCollection = httpErrorsSection.GetCollection();
|
|
ConfigurationElement errorElement = FindElement(httpErrorsCollection, "error", "statusCode", statusCode.ToString(), "subStatusCode", subStatusCode.ToString());
|
|
if (errorElement != null)
|
|
{
|
|
httpErrorsCollection.Remove(errorElement);
|
|
}
|
|
|
|
ConfigurationElement errorElement2 = httpErrorsCollection.CreateElement("error");
|
|
errorElement2["statusCode"] = statusCode;
|
|
errorElement2["subStatusCode"] = subStatusCode;
|
|
errorElement2["path"] = path;
|
|
httpErrorsCollection.Add(errorElement2);
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
Thread.Sleep(500);
|
|
}
|
|
|
|
private static bool? _isIISInstalled = null;
|
|
public static bool? IsIISInstalled
|
|
{
|
|
get
|
|
{
|
|
if (_isIISInstalled == null)
|
|
{
|
|
bool result = true;
|
|
if (!File.Exists(Path.Combine(Strings.IIS64BitPath, "iiscore.dll")))
|
|
{
|
|
result = false;
|
|
}
|
|
if (!File.Exists(Path.Combine(Strings.IIS64BitPath, "config", "applicationhost.config")))
|
|
{
|
|
result = false;
|
|
}
|
|
_isIISInstalled = result;
|
|
}
|
|
return _isIISInstalled;
|
|
}
|
|
}
|
|
|
|
public bool IsAncmInstalled(ServerType servertype)
|
|
{
|
|
bool result = true;
|
|
if (servertype == ServerType.IIS)
|
|
{
|
|
if (!File.Exists(InitializeTestMachine.IISAspnetcoreSchema_path))
|
|
{
|
|
result = false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!File.Exists(InitializeTestMachine.IISExpressAspnetcoreSchema_path))
|
|
{
|
|
result = false;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public string GetServiceStatus(string serviceName)
|
|
{
|
|
ServiceController sc = new ServiceController(serviceName);
|
|
|
|
switch (sc.Status)
|
|
{
|
|
case ServiceControllerStatus.Running:
|
|
return "Running";
|
|
case ServiceControllerStatus.Stopped:
|
|
return "Stopped";
|
|
case ServiceControllerStatus.Paused:
|
|
return "Paused";
|
|
case ServiceControllerStatus.StopPending:
|
|
return "Stopping";
|
|
case ServiceControllerStatus.StartPending:
|
|
return "Starting";
|
|
default:
|
|
return "Status Changing";
|
|
}
|
|
}
|
|
|
|
public bool IsUrlRewriteInstalledForIIS()
|
|
{
|
|
bool result = true;
|
|
var toRewrite64 = Path.Combine(Strings.IIS64BitPath, "rewrite.dll");
|
|
var toRewrite32 = Path.Combine(Strings.IIS32BitPath, "rewrite.dll");
|
|
|
|
if (TestUtility.IsOSAmd64)
|
|
{
|
|
if (!File.Exists(toRewrite64))
|
|
{
|
|
result = false;
|
|
}
|
|
}
|
|
|
|
if (!File.Exists(toRewrite32))
|
|
{
|
|
result = false;
|
|
}
|
|
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
Configuration config = serverManager.GetApplicationHostConfiguration();
|
|
ConfigurationSection globalModulesSection = config.GetSection("system.webServer/globalModules");
|
|
ConfigurationElementCollection globalModulesCollection = globalModulesSection.GetCollection();
|
|
if (FindElement(globalModulesCollection, "add", "name", "RewriteModule") == null)
|
|
{
|
|
result = false;
|
|
}
|
|
|
|
ConfigurationSection modulesSection = config.GetSection("system.webServer/modules");
|
|
ConfigurationElementCollection modulesCollection = modulesSection.GetCollection();
|
|
if (FindElement(modulesCollection, "add", "name", "RewriteModule") == null)
|
|
{
|
|
result = false;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public bool RemoveModule(string moduleName)
|
|
{
|
|
bool result = true;
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
Configuration config = serverManager.GetApplicationHostConfiguration();
|
|
ConfigurationSection globalModulesSection = config.GetSection("system.webServer/globalModules");
|
|
ConfigurationElementCollection globalModulesCollection = globalModulesSection.GetCollection();
|
|
var globalModule = FindElement(globalModulesCollection, "add", "name", moduleName);
|
|
if (globalModule != null)
|
|
{
|
|
globalModulesCollection.Remove(globalModule);
|
|
|
|
}
|
|
ConfigurationSection modulesSection = config.GetSection("system.webServer/modules");
|
|
ConfigurationElementCollection modulesCollection = modulesSection.GetCollection();
|
|
var module = FindElement(modulesCollection, "add", "name", moduleName);
|
|
if (module != null)
|
|
{
|
|
modulesCollection.Remove(module);
|
|
}
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public bool AddModule(string moduleName, string image, string preCondition)
|
|
{
|
|
RemoveModule(moduleName);
|
|
|
|
bool result = true;
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
Configuration config = serverManager.GetApplicationHostConfiguration();
|
|
ConfigurationSection globalModulesSection = config.GetSection("system.webServer/globalModules");
|
|
ConfigurationElementCollection globalModulesCollection = globalModulesSection.GetCollection();
|
|
|
|
ConfigurationElement globalModule = globalModulesCollection.CreateElement("add");
|
|
globalModule["name"] = moduleName;
|
|
globalModule["image"] = image;
|
|
if (preCondition != null)
|
|
{
|
|
globalModule["preCondition"] = preCondition;
|
|
}
|
|
globalModulesCollection.Add(globalModule);
|
|
|
|
ConfigurationSection modulesSection = config.GetSection("system.webServer/modules");
|
|
ConfigurationElementCollection modulesCollection = modulesSection.GetCollection();
|
|
ConfigurationElement module = modulesCollection.CreateElement("add");
|
|
module["name"] = moduleName;
|
|
modulesCollection.Add(module);
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static ConfigurationElement FindElement(ConfigurationElementCollection collection, string elementTagName, params string[] keyValues)
|
|
{
|
|
foreach (ConfigurationElement element in collection)
|
|
{
|
|
if (String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
bool matches = true;
|
|
|
|
for (int i = 0; i < keyValues.Length; i += 2)
|
|
{
|
|
object o = element.GetAttributeValue(keyValues[i]);
|
|
string value = null;
|
|
if (o != null)
|
|
{
|
|
value = o.ToString();
|
|
}
|
|
|
|
if (!String.Equals(value, keyValues[i + 1], StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
matches = false;
|
|
break;
|
|
}
|
|
}
|
|
if (matches)
|
|
{
|
|
return element;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public void CreateAppPool(string poolName, bool alwaysRunning = false)
|
|
{
|
|
try
|
|
{
|
|
TestUtility.LogTrace(String.Format("#################### Adding App Pool {0} with startMode = {1} ####################", poolName, alwaysRunning ? "AlwaysRunning" : "OnDemand"));
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
serverManager.ApplicationPools.Add(poolName);
|
|
ApplicationPool apppool = serverManager.ApplicationPools[poolName];
|
|
apppool.ManagedPipelineMode = ManagedPipelineMode.Integrated;
|
|
if (alwaysRunning)
|
|
{
|
|
apppool.SetAttributeValue("startMode", "AlwaysRunning");
|
|
}
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
TestUtility.LogInformation(String.Format("#################### Create app pool {0} failed. Reason: {1} ####################", poolName, ex.Message));
|
|
}
|
|
}
|
|
|
|
public void SetIdleTimeoutForAppPool(string appPoolName, int idleTimeoutMinutes)
|
|
{
|
|
TestUtility.LogTrace(String.Format("#################### Setting idleTimeout to {0} minutes for AppPool {1} ####################", idleTimeoutMinutes, appPoolName));
|
|
try
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
ApplicationPoolCollection appPools = serverManager.ApplicationPools;
|
|
appPools[appPoolName].ProcessModel.IdleTimeout = TimeSpan.FromMinutes(idleTimeoutMinutes);
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
TestUtility.LogInformation(String.Format("#################### Setting idleTimeout to {0} minutes for AppPool {1} failed. Reason: {2} ####################", idleTimeoutMinutes, appPoolName, ex.Message));
|
|
}
|
|
}
|
|
|
|
public void SetMaxProcessesForAppPool(string appPoolName, int maxProcesses)
|
|
{
|
|
TestUtility.LogTrace(String.Format("#################### Setting maxProcesses to {0} for AppPool {1} ####################", maxProcesses, appPoolName));
|
|
try
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
ApplicationPoolCollection appPools = serverManager.ApplicationPools;
|
|
appPools[appPoolName].ProcessModel.MaxProcesses = maxProcesses;
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
TestUtility.LogInformation(String.Format("#################### Setting maxProcesses to {0} for AppPool {1} failed. Reason: {2} ####################", maxProcesses, appPoolName, ex.Message));
|
|
}
|
|
}
|
|
|
|
public void SetIdentityForAppPool(string appPoolName, string userName, string password)
|
|
{
|
|
TestUtility.LogTrace(String.Format("#################### Setting userName {0} and password {1} for AppPool {2} ####################", userName, password, appPoolName));
|
|
try
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
ApplicationPoolCollection appPools = serverManager.ApplicationPools;
|
|
appPools[appPoolName].ProcessModel.IdentityType = ProcessModelIdentityType.SpecificUser;
|
|
appPools[appPoolName].ProcessModel.UserName = userName;
|
|
appPools[appPoolName].ProcessModel.Password = password;
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
TestUtility.LogInformation(String.Format("#################### Setting userName {0} and password {1} for AppPool {2} failed. Reason: {2} ####################", userName, password, appPoolName, ex.Message));
|
|
}
|
|
}
|
|
|
|
public void SetStartModeAlwaysRunningForAppPool(string appPoolName, bool alwaysRunning)
|
|
{
|
|
string startMode = alwaysRunning ? "AlwaysRunning" : "OnDemand";
|
|
|
|
TestUtility.LogTrace(String.Format("#################### Setting startMode to {0} for AppPool {1} ####################", startMode, appPoolName));
|
|
|
|
try
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
ApplicationPoolCollection appPools = serverManager.ApplicationPools;
|
|
appPools[appPoolName]["startMode"] = startMode;
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
TestUtility.LogInformation(String.Format("#################### Setting startMode to {0} for AppPool {1} failed. Reason: {2} ####################", startMode, appPoolName, ex.Message));
|
|
}
|
|
}
|
|
|
|
public void StartAppPoolEx(string appPoolName)
|
|
{
|
|
StartOrStopAppPool(appPoolName, true);
|
|
}
|
|
|
|
public void StopAppPoolEx(string appPoolName)
|
|
{
|
|
StartOrStopAppPool(appPoolName, false);
|
|
}
|
|
|
|
private void StartOrStopAppPool(string appPoolName, bool start)
|
|
{
|
|
string action = start ? "Starting" : "Stopping";
|
|
TestUtility.LogTrace(String.Format("#################### {0} app pool {1} ####################", action, appPoolName));
|
|
|
|
try
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
ApplicationPoolCollection appPools = serverManager.ApplicationPools;
|
|
if (start)
|
|
appPools[appPoolName].Start();
|
|
else
|
|
appPools[appPoolName].Stop();
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
string message = ex.Message;
|
|
TestUtility.LogInformation(String.Format("#################### {0} app pool {1} failed. Reason: {2} ####################", action, appPoolName, ex.Message));
|
|
}
|
|
}
|
|
|
|
public void VerifyAppPoolState(string appPoolName, Microsoft.Web.Administration.ObjectState state)
|
|
{
|
|
try
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
ApplicationPoolCollection appPools = serverManager.ApplicationPools;
|
|
if (appPools[appPoolName].State == state)
|
|
TestUtility.LogInformation(String.Format("Verified state for app pool {0} is {1}.", appPoolName, state.ToString()));
|
|
else
|
|
TestUtility.LogInformation(String.Format("Unexpected state {0} for app pool {1}.", state, appPoolName.ToString()));
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
TestUtility.LogInformation(String.Format("#################### Failed to verify state for app pool {0}. Reason: {1} ####################", appPoolName, ex.Message));
|
|
}
|
|
}
|
|
|
|
public void DeleteAppPool(string poolName)
|
|
{
|
|
try
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
TestUtility.LogTrace(String.Format("#################### Deleting App Pool {0} ####################", poolName));
|
|
|
|
ApplicationPoolCollection appPools = serverManager.ApplicationPools;
|
|
appPools.Remove(appPools[poolName]);
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
TestUtility.LogInformation(String.Format("#################### Delete app pool {0} failed. Reason: {1} ####################", poolName, ex.Message));
|
|
}
|
|
}
|
|
|
|
public void DeleteAllAppPools(bool commitDelay = false)
|
|
{
|
|
TestUtility.LogTrace(String.Format("#################### Deleting all app pools ####################"));
|
|
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
ApplicationPoolCollection appPools = serverManager.ApplicationPools;
|
|
while (appPools.Count > 0)
|
|
appPools.RemoveAt(0);
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
|
|
public void CreateSiteEx(int siteId, string siteName, string poolName, string dirRoot, string Ip, int Port, string host)
|
|
{
|
|
try
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
string bindingInfo = "";
|
|
if (Ip == null)
|
|
Ip = "*";
|
|
bindingInfo += Ip;
|
|
bindingInfo += ":";
|
|
bindingInfo += Port;
|
|
bindingInfo += ":";
|
|
if (host != null)
|
|
bindingInfo += host;
|
|
|
|
TestUtility.LogTrace(String.Format("#################### Adding Site {0} with App Pool {1} with BindingInfo {2} ####################", siteName, poolName, bindingInfo));
|
|
|
|
SiteCollection sites = serverManager.Sites;
|
|
Site site = sites.CreateElement();
|
|
site.Id = siteId;
|
|
site.SetAttributeValue("name", siteName);
|
|
sites.Add(site);
|
|
|
|
Application app = site.Applications.CreateElement();
|
|
app.SetAttributeValue("path", "/");
|
|
app.SetAttributeValue("applicationPool", poolName);
|
|
site.Applications.Add(app);
|
|
|
|
VirtualDirectory vdir = app.VirtualDirectories.CreateElement();
|
|
vdir.SetAttributeValue("path", "/");
|
|
vdir.SetAttributeValue("physicalPath", dirRoot);
|
|
|
|
app.VirtualDirectories.Add(vdir);
|
|
|
|
Binding b = site.Bindings.CreateElement();
|
|
b.SetAttributeValue("protocol", "http");
|
|
b.SetAttributeValue("bindingInformation", bindingInfo);
|
|
|
|
site.Bindings.Add(b);
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
TestUtility.LogInformation(String.Format("#################### Create site {0} failed. Reason: {1} ####################", siteName, ex.Message));
|
|
}
|
|
}
|
|
|
|
public void StartSite(string siteName)
|
|
{
|
|
StartOrStopSite(siteName, true);
|
|
}
|
|
|
|
public void StopSite(string siteName)
|
|
{
|
|
StartOrStopSite(siteName, false);
|
|
}
|
|
|
|
private void StartOrStopSite(string siteName, bool start)
|
|
{
|
|
string action = start ? "Starting" : "Stopping";
|
|
TestUtility.LogTrace(String.Format("#################### {0} site {1} ####################", action, siteName));
|
|
|
|
try
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
SiteCollection sites = serverManager.Sites;
|
|
if (start)
|
|
{
|
|
sites[siteName].Start();
|
|
sites[siteName].SetAttributeValue("serverAutoStart", true);
|
|
}
|
|
else
|
|
{
|
|
sites[siteName].Stop();
|
|
sites[siteName].SetAttributeValue("serverAutoStart", false);
|
|
}
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
TestUtility.LogInformation(String.Format("#################### {0} site {1} failed. Reason: {2} ####################", action, siteName, ex.Message));
|
|
}
|
|
}
|
|
|
|
public ObjectState GetSiteState(string siteName)
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
SiteCollection sites = serverManager.Sites;
|
|
if (sites[siteName] != null)
|
|
{
|
|
return sites[siteName].State;
|
|
}
|
|
else
|
|
{
|
|
return ObjectState.Unknown;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void AddApplicationToSite(string siteName, string appPath, string physicalPath, string poolName)
|
|
{
|
|
try
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
TestUtility.LogTrace(String.Format("#################### Adding Application {0} with App Pool {1} to Site {2} ####################", appPath, poolName, siteName));
|
|
|
|
SiteCollection sites = serverManager.Sites;
|
|
Application app = sites[siteName].Applications.CreateElement();
|
|
app.SetAttributeValue("path", appPath);
|
|
app.SetAttributeValue("applicationPool", poolName);
|
|
sites[siteName].Applications.Add(app);
|
|
|
|
VirtualDirectory vdir = app.VirtualDirectories.CreateElement();
|
|
vdir.SetAttributeValue("path", "/");
|
|
vdir.SetAttributeValue("physicalPath", physicalPath);
|
|
|
|
app.VirtualDirectories.Add(vdir);
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
TestUtility.LogInformation(String.Format("#################### Add Application {0} with App Pool {1} to Site {2} failed. Reason: {3} ####################", appPath, poolName, siteName, ex.Message));
|
|
}
|
|
}
|
|
|
|
public void ChangeApplicationPool(string siteName, int appIndex, string poolName)
|
|
{
|
|
try
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
TestUtility.LogTrace(String.Format("#################### Changing Application Pool for App {0} of Site {1} to {2} ####################", appIndex, siteName, poolName));
|
|
|
|
serverManager.Sites[siteName].Applications[appIndex].SetAttributeValue("applicationPool", poolName);
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
TestUtility.LogInformation(String.Format("#################### Changing Application Pool for App {0} of Site {1} to {2} failed. Reason: {3} ####################", appIndex, siteName, poolName, ex.Message));
|
|
}
|
|
}
|
|
|
|
public void ChangeApplicationPath(string siteName, int appIndex, string path)
|
|
{
|
|
try
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
TestUtility.LogTrace(String.Format("#################### Changing Path for App {0} of Site {1} to {2} ####################", appIndex, siteName, path));
|
|
|
|
serverManager.Sites[siteName].Applications[appIndex].SetAttributeValue("path", path);
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
TestUtility.LogInformation(String.Format("#################### Changing Path for App {0} of Site {1} to {2} failed. Reason: {3} ####################", appIndex, siteName, path, ex.Message));
|
|
}
|
|
}
|
|
|
|
public void RemoveApplication(string siteName, int appIndex)
|
|
{
|
|
try
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
TestUtility.LogTrace(String.Format("#################### Deleting App {0} from Site {1} ####################", appIndex, siteName));
|
|
|
|
serverManager.Sites[siteName].Applications.RemoveAt(appIndex);
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
TestUtility.LogInformation(String.Format("#################### Deleting App {0} from Site {1} failed. Reason: {2} ####################", appIndex, siteName, ex.Message));
|
|
}
|
|
}
|
|
|
|
public void AddBindingToSite(string siteName, string Ip, int Port, string host)
|
|
{
|
|
string bindingInfo = "";
|
|
if (Ip == null)
|
|
Ip = "*";
|
|
bindingInfo += Ip;
|
|
bindingInfo += ":";
|
|
bindingInfo += Port;
|
|
bindingInfo += ":";
|
|
if (host != null)
|
|
bindingInfo += host;
|
|
|
|
TestUtility.LogInformation(String.Format("#################### Adding Binding {0} to Site {1} ####################", bindingInfo, siteName));
|
|
|
|
try
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
SiteCollection sites = serverManager.Sites;
|
|
Binding b = sites[siteName].Bindings.CreateElement();
|
|
b.SetAttributeValue("protocol", "http");
|
|
b.SetAttributeValue("bindingInformation", bindingInfo);
|
|
|
|
sites[siteName].Bindings.Add(b);
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
TestUtility.LogInformation(String.Format("#################### Adding Binding {0} to Site {1} failed. Reason: {2} ####################", bindingInfo, siteName, ex.Message));
|
|
}
|
|
}
|
|
|
|
public void RemoveBindingFromSite(string siteName, BindingInfo bindingInfo)
|
|
{
|
|
try
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
TestUtility.LogTrace(String.Format("#################### Removing Binding {0} from Site {1} ####################", bindingInfo.ToBindingString(), siteName));
|
|
|
|
for (int i = 0; i < serverManager.Sites[siteName].Bindings.Count; i++)
|
|
{
|
|
if (serverManager.Sites[siteName].Bindings[i].BindingInformation.ToString() == bindingInfo.ToBindingString())
|
|
{
|
|
serverManager.Sites[siteName].Bindings.RemoveAt(i);
|
|
|
|
serverManager.CommitChanges();
|
|
return;
|
|
}
|
|
}
|
|
|
|
TestUtility.LogInformation(String.Format("#################### Remove binding failed because binding was not found ####################"));
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
TestUtility.LogInformation(String.Format("#################### Remove binding failed. Reason: {0} ####################", ex.Message));
|
|
}
|
|
}
|
|
|
|
public void ModifyBindingForSite(string siteName, BindingInfo bindingInfoOld, BindingInfo bindingInfoNew)
|
|
{
|
|
try
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
TestUtility.LogTrace(String.Format("#################### Changing Binding {0} for Site {1} to {2} ####################", bindingInfoOld.ToBindingString(), siteName, bindingInfoNew.ToBindingString()));
|
|
|
|
for (int i = 0; i < serverManager.Sites[siteName].Bindings.Count; i++)
|
|
{
|
|
if (serverManager.Sites[siteName].Bindings[i].BindingInformation.ToString() == bindingInfoOld.ToBindingString())
|
|
{
|
|
serverManager.Sites[siteName].Bindings[i].SetAttributeValue("bindingInformation", bindingInfoNew.ToBindingString());
|
|
|
|
serverManager.CommitChanges();
|
|
return;
|
|
}
|
|
}
|
|
|
|
TestUtility.LogInformation(String.Format("#################### Modify binding failed because binding was not found ####################"));
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
TestUtility.LogInformation(String.Format("#################### Changing binding failed. Reason: {0} ####################", ex.Message));
|
|
}
|
|
}
|
|
|
|
public void DeleteSite(string siteName)
|
|
{
|
|
try
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
TestUtility.LogTrace(String.Format("#################### Deleting Site {0} ####################", siteName));
|
|
|
|
SiteCollection sites = serverManager.Sites;
|
|
sites.Remove(sites[siteName]);
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
TestUtility.LogInformation(String.Format("#################### Delete site {0} failed. Reason: {1} ####################", siteName, ex.Message));
|
|
}
|
|
}
|
|
|
|
public void DeleteAllSites(bool commitDelay = false)
|
|
{
|
|
using (ServerManager serverManager = GetServerManager())
|
|
{
|
|
TestUtility.LogTrace(String.Format("#################### Deleting all sites ####################"));
|
|
|
|
SiteCollection sites = serverManager.Sites;
|
|
while (sites.Count > 0)
|
|
sites.RemoveAt(0);
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
|
|
public void SetDynamicSiteRegistrationThreshold(int threshold)
|
|
{
|
|
try
|
|
{
|
|
TestUtility.LogTrace(String.Format("#################### Changing dynamicRegistrationThreshold to {0} ####################", threshold));
|
|
|
|
using (ServerManager serverManager = new ServerManager())
|
|
{
|
|
Configuration config = serverManager.GetApplicationHostConfiguration();
|
|
|
|
ConfigurationSection webLimitsSection = config.GetSection("system.applicationHost/webLimits");
|
|
webLimitsSection["dynamicRegistrationThreshold"] = threshold;
|
|
|
|
|
|
serverManager.CommitChanges();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
TestUtility.LogTrace(String.Format("#################### Changing dynamicRegistrationThreshold failed. Reason: {0} ####################", ex.Message));
|
|
}
|
|
}
|
|
}
|
|
} |