Initial project's source code check-in.
This commit is contained in:
commit
b03b0b373f
4573 changed files with 981205 additions and 0 deletions
|
@ -0,0 +1,628 @@
|
|||
// Copyright (c) 2011, Outercurve Foundation.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// - Redistributions of source code must retain the above copyright notice, this
|
||||
// list of conditions and the following disclaimer.
|
||||
//
|
||||
// - Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// - Neither the name of the Outercurve Foundation nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from this
|
||||
// software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Xml;
|
||||
|
||||
namespace WebsitePanel.Setup
|
||||
{
|
||||
/// <summary>
|
||||
/// Provides methods for rolling back after an error.
|
||||
/// </summary>
|
||||
public sealed class RollBack
|
||||
{
|
||||
private static XmlDocument script;
|
||||
|
||||
static RollBack()
|
||||
{
|
||||
script = new XmlDocument();
|
||||
XmlElement root = script.CreateElement("currentScenario");
|
||||
script.AppendChild(root);
|
||||
}
|
||||
|
||||
private static XmlNode RootElement
|
||||
{
|
||||
get
|
||||
{
|
||||
return script.ChildNodes[0];
|
||||
}
|
||||
}
|
||||
|
||||
internal static XmlNodeList Actions
|
||||
{
|
||||
get
|
||||
{
|
||||
return RootElement.ChildNodes;
|
||||
}
|
||||
}
|
||||
|
||||
internal static void RegisterRegistryAction(string key)
|
||||
{
|
||||
XmlElement action = script.CreateElement("registry");
|
||||
RootElement.AppendChild(action);
|
||||
action.SetAttribute("key", key);
|
||||
}
|
||||
|
||||
internal static void RegisterDirectoryAction(string path)
|
||||
{
|
||||
XmlElement action = script.CreateElement("directory");
|
||||
RootElement.AppendChild(action);
|
||||
action.SetAttribute("path", path);
|
||||
}
|
||||
|
||||
internal static void RegisterDirectoryBackupAction(string source, string destination)
|
||||
{
|
||||
XmlElement action = script.CreateElement("directoryBackup");
|
||||
RootElement.AppendChild(action);
|
||||
action.SetAttribute("source", source);
|
||||
action.SetAttribute("destination", destination);
|
||||
}
|
||||
|
||||
internal static void RegisterDatabaseAction(string connectionString, string name)
|
||||
{
|
||||
XmlElement action = script.CreateElement("database");
|
||||
RootElement.AppendChild(action);
|
||||
action.SetAttribute("connectionString", connectionString);
|
||||
action.SetAttribute("name", name);
|
||||
}
|
||||
|
||||
internal static void RegisterDatabaseBackupAction(string connectionString, string name, string bakFile, string position)
|
||||
{
|
||||
XmlElement action = script.CreateElement("databaseBackup");
|
||||
RootElement.AppendChild(action);
|
||||
action.SetAttribute("connectionString", connectionString);
|
||||
action.SetAttribute("name", name);
|
||||
action.SetAttribute("bakFile", bakFile);
|
||||
action.SetAttribute("position", position);
|
||||
}
|
||||
|
||||
|
||||
internal static void RegisterDatabaseUserAction(string connectionString, string username)
|
||||
{
|
||||
XmlElement action = script.CreateElement("databaseUser");
|
||||
RootElement.AppendChild(action);
|
||||
action.SetAttribute("connectionString", connectionString);
|
||||
action.SetAttribute("username", username);
|
||||
}
|
||||
|
||||
internal static void RegisterWebSiteAction(string siteId)
|
||||
{
|
||||
XmlElement action = script.CreateElement("webSite");
|
||||
RootElement.AppendChild(action);
|
||||
action.SetAttribute("siteId", siteId);
|
||||
}
|
||||
|
||||
internal static void RegisterIIS7WebSiteAction(string siteId)
|
||||
{
|
||||
XmlElement action = script.CreateElement("IIS7WebSite");
|
||||
RootElement.AppendChild(action);
|
||||
action.SetAttribute("siteId", siteId);
|
||||
}
|
||||
|
||||
internal static void RegisterVirtualDirectoryAction(string siteId, string name)
|
||||
{
|
||||
XmlElement action = script.CreateElement("virtualDirectory");
|
||||
RootElement.AppendChild(action);
|
||||
action.SetAttribute("siteId", siteId);
|
||||
action.SetAttribute("name", name);
|
||||
}
|
||||
|
||||
internal static void RegisterUserAccountAction(string domain, string userName)
|
||||
{
|
||||
XmlElement action = script.CreateElement("userAccount");
|
||||
RootElement.AppendChild(action);
|
||||
action.SetAttribute("name", userName);
|
||||
action.SetAttribute("domain", domain);
|
||||
}
|
||||
|
||||
internal static void RegisterApplicationPool(string name)
|
||||
{
|
||||
XmlElement action = script.CreateElement("applicationPool");
|
||||
RootElement.AppendChild(action);
|
||||
action.SetAttribute("name", name);
|
||||
}
|
||||
|
||||
internal static void RegisterIIS7ApplicationPool(string name)
|
||||
{
|
||||
XmlElement action = script.CreateElement("IIS7ApplicationPool");
|
||||
RootElement.AppendChild(action);
|
||||
action.SetAttribute("name", name);
|
||||
}
|
||||
|
||||
internal static void RegisterStopApplicationPool(string name)
|
||||
{
|
||||
XmlElement action = script.CreateElement("stopApplicationPool");
|
||||
RootElement.AppendChild(action);
|
||||
action.SetAttribute("name", name);
|
||||
}
|
||||
|
||||
internal static void RegisterStopIIS7ApplicationPool(string name)
|
||||
{
|
||||
XmlElement action = script.CreateElement("stopIIS7ApplicationPool");
|
||||
RootElement.AppendChild(action);
|
||||
action.SetAttribute("name", name);
|
||||
}
|
||||
|
||||
internal static void RegisterConfigAction(string componentId, string name)
|
||||
{
|
||||
XmlElement action = script.CreateElement("config");
|
||||
RootElement.AppendChild(action);
|
||||
action.SetAttribute("key", componentId);
|
||||
action.SetAttribute("name", name);
|
||||
}
|
||||
|
||||
internal static void RegisterWindowsService(string path, string name)
|
||||
{
|
||||
XmlElement action = script.CreateElement("WindowsService");
|
||||
RootElement.AppendChild(action);
|
||||
action.SetAttribute("path", path);
|
||||
action.SetAttribute("name", name);
|
||||
}
|
||||
|
||||
internal static void ProcessAction(XmlNode action)
|
||||
{
|
||||
switch(action.Name)
|
||||
{
|
||||
case "registry":
|
||||
DeleteRegistryKey(XmlUtils.GetXmlAttribute(action, "key"));
|
||||
break;
|
||||
case "directory":
|
||||
DeleteDirectory(XmlUtils.GetXmlAttribute(action, "path"));
|
||||
break;
|
||||
case "directoryBackup":
|
||||
RestoreDirectory(
|
||||
XmlUtils.GetXmlAttribute(action, "source"),
|
||||
XmlUtils.GetXmlAttribute(action, "destination"));
|
||||
break;
|
||||
case "database":
|
||||
DeleteDatabase(
|
||||
XmlUtils.GetXmlAttribute(action, "connectionString"),
|
||||
XmlUtils.GetXmlAttribute(action, "name"));
|
||||
break;
|
||||
case "databaseBackup":
|
||||
RestoreDatabase(
|
||||
XmlUtils.GetXmlAttribute(action, "connectionString"),
|
||||
XmlUtils.GetXmlAttribute(action, "name"),
|
||||
XmlUtils.GetXmlAttribute(action, "bakFile"),
|
||||
XmlUtils.GetXmlAttribute(action, "position"));
|
||||
break;
|
||||
case "databaseUser":
|
||||
DeleteDatabaseUser(
|
||||
XmlUtils.GetXmlAttribute(action, "connectionString"),
|
||||
XmlUtils.GetXmlAttribute(action, "username"));
|
||||
break;
|
||||
case "webSite":
|
||||
DeleteWebSite(
|
||||
XmlUtils.GetXmlAttribute(action, "siteId"));
|
||||
break;
|
||||
case "IIS7WebSite":
|
||||
DeleteIIS7WebSite(
|
||||
XmlUtils.GetXmlAttribute(action, "siteId"));
|
||||
break;
|
||||
case "virtualDirectory":
|
||||
DeleteVirtualDirectory(
|
||||
XmlUtils.GetXmlAttribute(action, "siteId"),
|
||||
XmlUtils.GetXmlAttribute(action, "name"));
|
||||
break;
|
||||
case "userAccount":
|
||||
DeleteUserAccount(
|
||||
XmlUtils.GetXmlAttribute(action, "domain"),
|
||||
XmlUtils.GetXmlAttribute(action, "name"));
|
||||
break;
|
||||
case "applicationPool":
|
||||
DeleteApplicationPool(
|
||||
XmlUtils.GetXmlAttribute(action, "name"));
|
||||
break;
|
||||
case "IIS7ApplicationPool":
|
||||
DeleteIIS7ApplicationPool(
|
||||
XmlUtils.GetXmlAttribute(action, "name"));
|
||||
break;
|
||||
case "config":
|
||||
DeleteComponentSettings(
|
||||
XmlUtils.GetXmlAttribute(action, "key"),
|
||||
XmlUtils.GetXmlAttribute(action, "name"));
|
||||
break;
|
||||
case "stopApplicationPool":
|
||||
StartApplicationPool(
|
||||
XmlUtils.GetXmlAttribute(action, "name"));
|
||||
break;
|
||||
case "stopIIS7ApplicationPool":
|
||||
StartIIS7ApplicationPool(
|
||||
XmlUtils.GetXmlAttribute(action, "name"));
|
||||
break;
|
||||
case "WindowsService":
|
||||
UnregisterWindowsService(
|
||||
XmlUtils.GetXmlAttribute(action, "path"),
|
||||
XmlUtils.GetXmlAttribute(action, "name"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private static void DeleteComponentSettings(string id, string name)
|
||||
{
|
||||
try
|
||||
{
|
||||
Log.WriteStart("Deleting component settings");
|
||||
Log.WriteInfo(string.Format("Deleting \"{0}\" settings", name));
|
||||
XmlNode node = AppConfig.GetComponentConfig(id);
|
||||
if (node != null)
|
||||
{
|
||||
XmlUtils.RemoveXmlNode(node);
|
||||
AppConfig.SaveConfiguration();
|
||||
}
|
||||
Log.WriteEnd("Deleted component settings");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (Utils.IsThreadAbortException(ex))
|
||||
return;
|
||||
Log.WriteError("Component settings delete error", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
private static void DeleteRegistryKey(string subkey)
|
||||
{
|
||||
try
|
||||
{
|
||||
Log.WriteStart("Deleting registry key");
|
||||
Log.WriteInfo(string.Format("Deleting registry key \"{0}\"", subkey));
|
||||
RegistryUtils.DeleteRegistryKey(subkey);
|
||||
Log.WriteEnd("Deleted registry key");
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
if (Utils.IsThreadAbortException(ex))
|
||||
return;
|
||||
Log.WriteError("Registry key delete error", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
private static void DeleteDirectory(string path)
|
||||
{
|
||||
try
|
||||
{
|
||||
Log.WriteStart("Deleting directory");
|
||||
Log.WriteInfo(string.Format("Deleting directory \"{0}\"", path));
|
||||
|
||||
if(FileUtils.DirectoryExists(path))
|
||||
{
|
||||
FileUtils.DeleteDirectory(path);
|
||||
Log.WriteEnd("Deleted directory");
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
if (Utils.IsThreadAbortException(ex))
|
||||
return;
|
||||
Log.WriteError("Directory delete error", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
private static void RestoreDirectory(string targetDir, string zipFile)
|
||||
{
|
||||
try
|
||||
{
|
||||
Log.WriteStart("Restoring directory");
|
||||
Log.WriteInfo(string.Format("Restoring directory \"{0}\"", targetDir));
|
||||
FileUtils.UnzipFile(targetDir, zipFile);
|
||||
Log.WriteStart("Restored directory");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (Utils.IsThreadAbortException(ex))
|
||||
return;
|
||||
Log.WriteError("Directory restore error", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static void DeleteDatabase(string connectionString, string name)
|
||||
{
|
||||
try
|
||||
{
|
||||
Log.WriteStart("Deleting database");
|
||||
Log.WriteInfo(string.Format("Deleting database \"{0}\"", name));
|
||||
if ( SqlUtils.DatabaseExists(connectionString, name) )
|
||||
{
|
||||
SqlUtils.DeleteDatabase(connectionString, name);
|
||||
Log.WriteEnd("Deleted database");
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
if (Utils.IsThreadAbortException(ex))
|
||||
return;
|
||||
|
||||
Log.WriteError("Database delete error", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
private static void RestoreDatabase(string connectionString, string name, string bakFile, string position)
|
||||
{
|
||||
try
|
||||
{
|
||||
Log.WriteStart("Restoring database");
|
||||
Log.WriteInfo(string.Format("Restoring database \"{0}\"", name));
|
||||
if (SqlUtils.DatabaseExists(connectionString, name))
|
||||
{
|
||||
SqlUtils.RestoreDatabase(connectionString, name, bakFile, position);
|
||||
Log.WriteEnd("Restored database");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (Utils.IsThreadAbortException(ex))
|
||||
return;
|
||||
|
||||
Log.WriteError("Database restore error", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static void DeleteDatabaseUser(string connectionString, string username)
|
||||
{
|
||||
try
|
||||
{
|
||||
Log.WriteStart("Deleting database user");
|
||||
Log.WriteInfo(string.Format("Deleting database user \"{0}\"", username));
|
||||
if (SqlUtils.UserExists(connectionString, username))
|
||||
{
|
||||
SqlUtils.DeleteUser(connectionString, username);
|
||||
Log.WriteEnd("Deleted database user");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (Utils.IsThreadAbortException(ex))
|
||||
return;
|
||||
|
||||
Log.WriteError("Database user delete error", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
private static void DeleteWebSite(string siteId)
|
||||
{
|
||||
try
|
||||
{
|
||||
Log.WriteStart("Deleting web site");
|
||||
Log.WriteInfo(string.Format("Deleting web site \"{0}\"", siteId));
|
||||
if ( WebUtils.SiteIdExists(siteId) )
|
||||
{
|
||||
WebUtils.DeleteSite(siteId);
|
||||
Log.WriteEnd("Deleted web site");
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
if (Utils.IsThreadAbortException(ex))
|
||||
return;
|
||||
|
||||
Log.WriteError("Web site delete error", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
private static void DeleteIIS7WebSite(string siteId)
|
||||
{
|
||||
try
|
||||
{
|
||||
Log.WriteStart("Deleting web site");
|
||||
Log.WriteInfo(string.Format("Deleting web site \"{0}\"", siteId));
|
||||
if (WebUtils.IIS7SiteExists(siteId))
|
||||
{
|
||||
WebUtils.DeleteIIS7Site(siteId);
|
||||
Log.WriteEnd("Deleted web site");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (Utils.IsThreadAbortException(ex))
|
||||
return;
|
||||
|
||||
Log.WriteError("Web site delete error", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
private static void DeleteVirtualDirectory(string siteId, string name)
|
||||
{
|
||||
try
|
||||
{
|
||||
Log.WriteStart("Deleting virtual directory");
|
||||
Log.WriteInfo(string.Format("Deleting virtual directory \"{0}\" for the site \"{1}\"", name, siteId));
|
||||
if ( WebUtils.VirtualDirectoryExists(siteId, name) )
|
||||
{
|
||||
WebUtils.DeleteVirtualDirectory(siteId, name);
|
||||
Log.WriteEnd("Deleted virtual directory");
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
if (Utils.IsThreadAbortException(ex))
|
||||
return;
|
||||
|
||||
Log.WriteError("Virtual directory delete error", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
private static void DeleteUserAccount(string domain, string user)
|
||||
{
|
||||
try
|
||||
{
|
||||
Log.WriteStart("Deleting user account");
|
||||
Log.WriteInfo(string.Format("Deleting user account \"{0}\"", user));
|
||||
if ( SecurityUtils.UserExists(domain, user) )
|
||||
{
|
||||
SecurityUtils.DeleteUser(domain, user);
|
||||
Log.WriteEnd("Deleted user account");
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
if (Utils.IsThreadAbortException(ex))
|
||||
return;
|
||||
|
||||
Log.WriteError("User account delete error", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
private static void DeleteApplicationPool(string name)
|
||||
{
|
||||
try
|
||||
{
|
||||
Log.WriteStart("Deleting application pool");
|
||||
Log.WriteInfo(string.Format("Deleting application pool \"{0}\"", name));
|
||||
if (WebUtils.ApplicationPoolExists(name))
|
||||
{
|
||||
int count = WebUtils.GetApplicationPoolSitesCount(name);
|
||||
if (count > 0)
|
||||
{
|
||||
Log.WriteEnd("Application pool is not empty");
|
||||
}
|
||||
else
|
||||
{
|
||||
WebUtils.DeleteApplicationPool(name);
|
||||
Log.WriteEnd("Deleted application pool");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
if (Utils.IsThreadAbortException(ex))
|
||||
return;
|
||||
|
||||
Log.WriteError("Application pool delete error", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
private static void DeleteIIS7ApplicationPool(string name)
|
||||
{
|
||||
try
|
||||
{
|
||||
Log.WriteStart("Deleting application pool");
|
||||
Log.WriteInfo(string.Format("Deleting application pool \"{0}\"", name));
|
||||
if (WebUtils.IIS7ApplicationPoolExists(name))
|
||||
{
|
||||
int count = WebUtils.GetIIS7ApplicationPoolSitesCount(name);
|
||||
if (count > 0)
|
||||
{
|
||||
Log.WriteEnd("Application pool is not empty");
|
||||
}
|
||||
else
|
||||
{
|
||||
WebUtils.DeleteIIS7ApplicationPool(name);
|
||||
Log.WriteEnd("Deleted application pool");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (Utils.IsThreadAbortException(ex))
|
||||
return;
|
||||
|
||||
Log.WriteError("Application pool delete error", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
private static void StartApplicationPool(string name)
|
||||
{
|
||||
try
|
||||
{
|
||||
Log.WriteStart("Starting IIS application pool");
|
||||
Log.WriteInfo(string.Format("Starting \"{0}\"", name));
|
||||
WebUtils.StartApplicationPool(name);
|
||||
Log.WriteEnd("Started application pool");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (Utils.IsThreadAbortException(ex))
|
||||
return;
|
||||
|
||||
Log.WriteError("Application pool start error", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
private static void StartIIS7ApplicationPool(string name)
|
||||
{
|
||||
try
|
||||
{
|
||||
Log.WriteStart("Starting IIS application pool");
|
||||
Log.WriteInfo(string.Format("Starting \"{0}\"", name));
|
||||
WebUtils.StartIIS7ApplicationPool(name);
|
||||
Log.WriteEnd("Started application pool");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (Utils.IsThreadAbortException(ex))
|
||||
return;
|
||||
|
||||
Log.WriteError("Application pool start error", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
private static void UnregisterWindowsService(string path, string serviceName)
|
||||
{
|
||||
try
|
||||
{
|
||||
Log.WriteStart(string.Format("Unregistering \"{0}\" Windows service", serviceName));
|
||||
try
|
||||
{
|
||||
Utils.StopService(serviceName);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (!Utils.IsThreadAbortException(ex))
|
||||
Log.WriteError("Windows service stop error", ex);
|
||||
}
|
||||
Utils.RunProcess(path, "/u");
|
||||
Log.WriteEnd("Unregistered Windows service");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (Utils.IsThreadAbortException(ex))
|
||||
return;
|
||||
|
||||
Log.WriteError("Windows service error", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue