diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer.Core/Loader.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer.Core/Loader.cs index b65c1e57..54ef5d79 100644 --- a/WebsitePanel.Installer/Sources/WebsitePanel.Installer.Core/Loader.cs +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer.Core/Loader.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2012, Outercurve Foundation. +// Copyright (c) 2012, Outercurve Foundation. // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, @@ -80,7 +80,7 @@ namespace WebsitePanel.Installer.Core private WebClient fileLoader; - public BitlyLoader(string remoteFile) + internal BitlyLoader(string remoteFile) : base(remoteFile) { InitFileLoader(); @@ -115,7 +115,7 @@ namespace WebsitePanel.Installer.Core Log.WriteStart("Downloading file"); Log.WriteInfo("Downloading file \"{0}\" to \"{1}\"", remoteFile, tmpFile); - + // Attach event handlers to track status of the download process fileLoader.DownloadProgressChanged += (obj, e) => { @@ -145,7 +145,7 @@ namespace WebsitePanel.Installer.Core fileLoader.DownloadFileAsync(new Uri(remoteFile), tmpFile); RaiseOnStatusChangedEvent(DownloadingSetupFilesMessage); - + autoEvent.WaitOne(); } }, ct); @@ -175,7 +175,7 @@ namespace WebsitePanel.Installer.Core public event EventHandler> ProgressChanged; public event EventHandler OperationCompleted; - public Loader(string remoteFile) + internal Loader(string remoteFile) { this.remoteFile = remoteFile; } @@ -276,7 +276,7 @@ namespace WebsitePanel.Installer.Core // Download the file requested Task downloadFileTask = GetDownloadFileTask(remoteFile, tmpFile, token); // Move the file downloaded from temporary location to Data folder - var moveFileTask = downloadFileTask.ContinueWith((t) => + var moveFileTask = downloadFileTask.ContinueWith((t) => { if (File.Exists(tmpFile)) { @@ -312,7 +312,7 @@ namespace WebsitePanel.Installer.Core { RaiseOnOperationCompletedEvent(); }, token); - + downloadFileTask.Start(); downloadFileTask.Wait(); } @@ -527,4 +527,4 @@ namespace WebsitePanel.Installer.Core } } } -} +} \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.SilentInstaller/Program.cs b/WebsitePanel.Installer/Sources/WebsitePanel.SilentInstaller/Program.cs index 76fbefd8..621b0c16 100644 --- a/WebsitePanel.Installer/Sources/WebsitePanel.SilentInstaller/Program.cs +++ b/WebsitePanel.Installer/Sources/WebsitePanel.SilentInstaller/Program.cs @@ -337,10 +337,13 @@ namespace WebsitePanel.SilentInstaller string installerPath = Utils.GetDbString(row["InstallerPath"]); string installerType = Utils.GetDbString(row["InstallerType"]); + // Get appropriate loader to download the app distributive + var loader = LoaderFactory.CreateFileLoader(fileName); + // Mimic synchronous download process for the console app + AutoResetEvent autoEvent = new AutoResetEvent(false); + try { - // download installer - var loader = new Loader(fileName); // loader.OperationCompleted += new EventHandler((object sender, EventArgs e) => { @@ -374,25 +377,26 @@ namespace WebsitePanel.SilentInstaller Log.WriteEnd("Installer finished"); // Remove temporary directory FileUtils.DeleteTempDirectory(); + // We are done + autoEvent.Set(); }); - + // TODO: Add cleanup for events. loader.OperationFailed += new EventHandler>(loader_OperationFailed); loader.ProgressChanged += new EventHandler>(loader_ProgressChanged); loader.StatusChanged += new EventHandler>(loader_StatusChanged); // loader.LoadAppDistributive(); + // Wait until the download is complete + autoEvent.WaitOne(); } catch (Exception ex) { Log.WriteError("Installer error", ex); - //AppContext.AppForm.ShowError(ex); } finally { - //this.componentSettingsXml = null; - //this.componentCode = null; + autoEvent.Set(); } - } static void loader_StatusChanged(object sender, LoaderEventArgs e) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/UsernameAssertion.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/UsernameAssertion.cs index f5efadbd..a2e8519b 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/UsernameAssertion.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/UsernameAssertion.cs @@ -232,7 +232,7 @@ namespace WebsitePanel.EnterpriseServer ); if (user == null) - throw new Exception("Authentication token is invalid or borken"); + throw new Exception("Authentication token is invalid or broken"); SecurityContext.SetThreadPrincipal(user); } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/VirtualizationForPrivateCloud/VirtualizationServerControllerForPrivateCloud.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/VirtualizationForPrivateCloud/VirtualizationServerControllerForPrivateCloud.cs index 8c0d084e..5b71992e 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/VirtualizationForPrivateCloud/VirtualizationServerControllerForPrivateCloud.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/VirtualizationForPrivateCloud/VirtualizationServerControllerForPrivateCloud.cs @@ -2700,7 +2700,7 @@ namespace WebsitePanel.EnterpriseServer public static NetworkAdapterDetails GetExternalNetworkAdapterDetails(int itemId) { // load service item - VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + VMInfo vm = (VMInfo)PackageController.GetPackageItem(itemId); if (vm == null) return null; diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.FTP.FileZilla/FileZilla.cs b/WebsitePanel/Sources/WebsitePanel.Providers.FTP.FileZilla/FileZilla.cs index d598357f..7b6c5f9e 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.FTP.FileZilla/FileZilla.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.FTP.FileZilla/FileZilla.cs @@ -40,361 +40,366 @@ using WebsitePanel.Server.Utils; namespace WebsitePanel.Providers.FTP { - public class FileZilla : HostingServiceProviderBase, IFtpServer - { - #region Constants + public class FileZilla : HostingServiceProviderBase, IFtpServer + { + #region Constants - private const string FILEZILLA_REG = @"SOFTWARE\FileZilla Server"; - private const string FILEZILLA_REG_X64 = @"SOFTWARE\Wow6432Node\FileZilla Server"; - private const string FILEZILLA_SERVER_FILE = "FileZilla Server.xml"; + private const string FILEZILLA_REG = @"SOFTWARE\FileZilla Server"; + private const string FILEZILLA_REG_X64 = @"SOFTWARE\Wow6432Node\FileZilla Server"; + private const string FILEZILLA_SERVER_FILE = "FileZilla Server.xml"; - #endregion + #endregion - #region Properties - protected virtual string FileZillaFolder - { - get - { - RegistryKey fzKey = Registry.LocalMachine.OpenSubKey(FILEZILLA_REG) ?? - Registry.LocalMachine.OpenSubKey(FILEZILLA_REG_X64); + #region Properties + protected virtual string FileZillaFolder + { + get + { + RegistryKey fzKey = Registry.LocalMachine.OpenSubKey(FILEZILLA_REG) ?? + Registry.LocalMachine.OpenSubKey(FILEZILLA_REG_X64); if (fzKey == null) - throw new Exception("FileZilla registry key was not found: " + FILEZILLA_REG); + throw new Exception("FileZilla registry key was not found: " + FILEZILLA_REG); - return (string)fzKey.GetValue("Install_Dir"); - } - } - #endregion + return (string)fzKey.GetValue("Install_Dir"); + } + } + #endregion - #region Sites + #region Sites - public virtual void ChangeSiteState(string siteId, ServerState state) - { - // not implemented - } + public virtual void ChangeSiteState(string siteId, ServerState state) + { + // not implemented + } - public virtual string CreateSite(FtpSite site) - { - // not implemented - return null; - } + public virtual string CreateSite(FtpSite site) + { + // not implemented + return null; + } - public virtual void DeleteSite(string siteId) - { - // not implemented - } + public virtual void DeleteSite(string siteId) + { + // not implemented + } - public virtual FtpSite GetSite(string siteId) - { - // not implemented - return null; - } + public virtual FtpSite GetSite(string siteId) + { + // not implemented + return null; + } - public virtual FtpSite[] GetSites() - { - // not implemented - return null; - } + public virtual FtpSite[] GetSites() + { + // not implemented + return null; + } - public virtual bool SiteExists(string siteId) - { - // not implemented - return false; - } + public virtual bool SiteExists(string siteId) + { + // not implemented + return false; + } - public virtual ServerState GetSiteState(string siteId) - { - // not implemented - return ServerState.Started; - } + public virtual ServerState GetSiteState(string siteId) + { + // not implemented + return ServerState.Started; + } - public virtual void UpdateSite(FtpSite site) - { - // not implemented - } + public virtual void UpdateSite(FtpSite site) + { + // not implemented + } - #endregion + #endregion - #region Accounts + #region Accounts - public virtual bool AccountExists(string accountName) - { - XmlDocument doc = GetFileZillaConfig(); - XmlNode nodeUser = doc.SelectSingleNode("/FileZillaServer/Users/User[@Name='" + accountName + "']"); - return (nodeUser != null); - } + public virtual bool AccountExists(string accountName) + { + XmlDocument doc = GetFileZillaConfig(); + XmlNode nodeUser = doc.SelectSingleNode("/FileZillaServer/Users/User[@Name='" + accountName + "']"); + return (nodeUser != null); + } - public virtual FtpAccount GetAccount(string accountName) - { - XmlDocument doc = GetFileZillaConfig(); - XmlNode nodeUser = doc.SelectSingleNode("/FileZillaServer/Users/User[@Name='" + accountName + "']"); - if (nodeUser == null) - return null; + public virtual FtpAccount GetAccount(string accountName) + { + XmlDocument doc = GetFileZillaConfig(); + XmlNode nodeUser = doc.SelectSingleNode("/FileZillaServer/Users/User[@Name='" + accountName + "']"); + if (nodeUser == null) + return null; - return CreateAccountFromXmlNode(nodeUser, false); - } + return CreateAccountFromXmlNode(nodeUser, false); + } - public virtual FtpAccount[] GetAccounts() - { - XmlDocument doc = GetFileZillaConfig(); - XmlNodeList nodeUsers = doc.SelectNodes("/FileZillaServer/Users/User"); + public virtual FtpAccount[] GetAccounts() + { + XmlDocument doc = GetFileZillaConfig(); + XmlNodeList nodeUsers = doc.SelectNodes("/FileZillaServer/Users/User"); - List accounts = new List(); - foreach (XmlNode nodeUser in nodeUsers) - accounts.Add(CreateAccountFromXmlNode(nodeUser, true)); + List accounts = new List(); + foreach (XmlNode nodeUser in nodeUsers) + accounts.Add(CreateAccountFromXmlNode(nodeUser, true)); - return accounts.ToArray(); - } + return accounts.ToArray(); + } - public virtual void CreateAccount(FtpAccount account) - { + public virtual void CreateAccount(FtpAccount account) + { Log.WriteInfo("GetFileZillaConfig"); - XmlDocument doc = GetFileZillaConfig(); + XmlDocument doc = GetFileZillaConfig(); Log.WriteInfo("Find users nodes"); - // find users node - XmlNode nodeUsers = doc.SelectSingleNode("/FileZillaServer/Users"); - - XmlElement nodeUser = doc.CreateElement("User"); - if (nodeUsers != null) nodeUsers.AppendChild(nodeUser); + // find users node + XmlNode fzServerNode = doc.SelectSingleNode("/FileZillaServer"); + XmlNode fzAccountsNode = fzServerNode.SelectSingleNode("/Users"); + if (fzAccountsNode == null) + { + fzAccountsNode = doc.CreateElement("Users"); + fzServerNode.AppendChild(fzAccountsNode); + } - // set properties - nodeUser.SetAttribute("Name", account.Name); - SetOption(nodeUser, "Pass", MD5(account.Password)); - SetOption(nodeUser, "Group", ""); - SetOption(nodeUser, "Bypass server userlimit", "0"); - SetOption(nodeUser, "User Limit", "0"); - SetOption(nodeUser, "IP Limit", "0"); - SetOption(nodeUser, "Enabled", BoolToString(account.Enabled)); - SetOption(nodeUser, "Comments", ""); - SetOption(nodeUser, "ForceSsl", "0"); + XmlElement fzAccountNode = doc.CreateElement("User"); + fzAccountsNode.AppendChild(fzAccountNode); + // set properties + fzAccountNode.SetAttribute("Name", account.Name); + SetOption(fzAccountNode, "Pass", MD5(account.Password)); + SetOption(fzAccountNode, "Group", ""); + SetOption(fzAccountNode, "Bypass server userlimit", "0"); + SetOption(fzAccountNode, "User Limit", "0"); + SetOption(fzAccountNode, "IP Limit", "0"); + SetOption(fzAccountNode, "Enabled", BoolToString(account.Enabled)); + SetOption(fzAccountNode, "Comments", ""); + SetOption(fzAccountNode, "ForceSsl", "0"); - // IP filter - XmlElement nodeIPFilter = doc.CreateElement("IpFilter"); - nodeUser.AppendChild(nodeIPFilter); + // IP filter + XmlElement nodeIPFilter = doc.CreateElement("IpFilter"); + fzAccountNode.AppendChild(nodeIPFilter); - XmlElement nodeDisallowed = doc.CreateElement("Disallowed"); - nodeIPFilter.AppendChild(nodeDisallowed); + XmlElement nodeDisallowed = doc.CreateElement("Disallowed"); + nodeIPFilter.AppendChild(nodeDisallowed); - XmlElement nodeAllowed = doc.CreateElement("Allowed"); - nodeIPFilter.AppendChild(nodeAllowed); + XmlElement nodeAllowed = doc.CreateElement("Allowed"); + nodeIPFilter.AppendChild(nodeAllowed); - // folder - XmlElement nodePermissions = doc.CreateElement("Permissions"); - nodeUser.AppendChild(nodePermissions); + // folder + XmlElement nodePermissions = doc.CreateElement("Permissions"); + fzAccountNode.AppendChild(nodePermissions); - XmlElement nodePermission = doc.CreateElement("Permission"); - nodePermissions.AppendChild(nodePermission); + XmlElement nodePermission = doc.CreateElement("Permission"); + nodePermissions.AppendChild(nodePermission); - // folder settings - nodePermission.SetAttribute("Dir", account.Folder); - SetOption(nodePermission, "FileRead", BoolToString(account.CanRead)); - SetOption(nodePermission, "FileWrite", BoolToString(account.CanWrite)); - SetOption(nodePermission, "FileDelete", BoolToString(account.CanWrite)); - SetOption(nodePermission, "DirCreate", BoolToString(account.CanWrite)); - SetOption(nodePermission, "DirDelete", BoolToString(account.CanWrite)); - SetOption(nodePermission, "DirList", BoolToString(account.CanRead)); - SetOption(nodePermission, "DirSubdirs", BoolToString(account.CanRead)); - SetOption(nodePermission, "IsHome", "1"); - SetOption(nodePermission, "AutoCreate", "0"); + // folder settings + nodePermission.SetAttribute("Dir", account.Folder); + SetOption(nodePermission, "FileRead", BoolToString(account.CanRead)); + SetOption(nodePermission, "FileWrite", BoolToString(account.CanWrite)); + SetOption(nodePermission, "FileDelete", BoolToString(account.CanWrite)); + SetOption(nodePermission, "DirCreate", BoolToString(account.CanWrite)); + SetOption(nodePermission, "DirDelete", BoolToString(account.CanWrite)); + SetOption(nodePermission, "DirList", BoolToString(account.CanRead)); + SetOption(nodePermission, "DirSubdirs", BoolToString(account.CanRead)); + SetOption(nodePermission, "IsHome", "1"); + SetOption(nodePermission, "AutoCreate", "0"); - // speed limits - XmlElement nodeSpeedLimits = doc.CreateElement("SpeedLimits"); - nodeUser.AppendChild(nodeSpeedLimits); - nodeSpeedLimits.SetAttribute("DlType", "0"); - nodeSpeedLimits.SetAttribute("DlLimit", "10"); - nodeSpeedLimits.SetAttribute("ServerDlLimitBypass", "0"); - nodeSpeedLimits.SetAttribute("UlType", "0"); - nodeSpeedLimits.SetAttribute("UlLimit", "10"); - nodeSpeedLimits.SetAttribute("ServerUlLimitBypass", "0"); + // speed limits + XmlElement nodeSpeedLimits = doc.CreateElement("SpeedLimits"); + fzAccountNode.AppendChild(nodeSpeedLimits); + nodeSpeedLimits.SetAttribute("DlType", "0"); + nodeSpeedLimits.SetAttribute("DlLimit", "10"); + nodeSpeedLimits.SetAttribute("ServerDlLimitBypass", "0"); + nodeSpeedLimits.SetAttribute("UlType", "0"); + nodeSpeedLimits.SetAttribute("UlLimit", "10"); + nodeSpeedLimits.SetAttribute("ServerUlLimitBypass", "0"); - XmlElement nodeDownload = doc.CreateElement("Download"); - nodeSpeedLimits.AppendChild(nodeDownload); + XmlElement nodeDownload = doc.CreateElement("Download"); + nodeSpeedLimits.AppendChild(nodeDownload); - XmlElement nodeUpload = doc.CreateElement("Upload"); - nodeSpeedLimits.AppendChild(nodeUpload); + XmlElement nodeUpload = doc.CreateElement("Upload"); + nodeSpeedLimits.AppendChild(nodeUpload); - // save document - doc.Save(GetFileZillaConfigPath()); + // save document + doc.Save(GetFileZillaConfigPath()); - // reload config - ReloadFileZillaConfig(); - } + // reload config + ReloadFileZillaConfig(); + } - public virtual void UpdateAccount(FtpAccount account) - { - XmlDocument doc = GetFileZillaConfig(); - XmlNode nodeUser = doc.SelectSingleNode("/FileZillaServer/Users/User[@Name='" + account.Name + "']"); - if (nodeUser == null) - return; + public virtual void UpdateAccount(FtpAccount account) + { + XmlDocument doc = GetFileZillaConfig(); + XmlNode nodeUser = doc.SelectSingleNode("/FileZillaServer/Users/User[@Name='" + account.Name + "']"); + if (nodeUser == null) + return; - // update user - if(!String.IsNullOrEmpty(account.Password)) - SetOption(nodeUser, "Pass", MD5(account.Password)); - SetOption(nodeUser, "Enabled", BoolToString(account.Enabled)); + // update user + if(!String.IsNullOrEmpty(account.Password)) + SetOption(nodeUser, "Pass", MD5(account.Password)); + SetOption(nodeUser, "Enabled", BoolToString(account.Enabled)); - // update folder - XmlNode nodePermission = nodeUser.SelectSingleNode("Permissions/Permission"); - if (nodePermission != null) - { - ((XmlElement)nodePermission).SetAttribute("Dir", account.Folder); - SetOption(nodePermission, "FileRead", BoolToString(account.CanRead)); - SetOption(nodePermission, "FileWrite", BoolToString(account.CanWrite)); - SetOption(nodePermission, "FileDelete", BoolToString(account.CanWrite)); - SetOption(nodePermission, "DirCreate", BoolToString(account.CanWrite)); - SetOption(nodePermission, "DirDelete", BoolToString(account.CanWrite)); - SetOption(nodePermission, "DirList", BoolToString(account.CanRead)); - SetOption(nodePermission, "DirSubdirs", BoolToString(account.CanRead)); - } + // update folder + XmlNode nodePermission = nodeUser.SelectSingleNode("Permissions/Permission"); + if (nodePermission != null) + { + ((XmlElement)nodePermission).SetAttribute("Dir", account.Folder); + SetOption(nodePermission, "FileRead", BoolToString(account.CanRead)); + SetOption(nodePermission, "FileWrite", BoolToString(account.CanWrite)); + SetOption(nodePermission, "FileDelete", BoolToString(account.CanWrite)); + SetOption(nodePermission, "DirCreate", BoolToString(account.CanWrite)); + SetOption(nodePermission, "DirDelete", BoolToString(account.CanWrite)); + SetOption(nodePermission, "DirList", BoolToString(account.CanRead)); + SetOption(nodePermission, "DirSubdirs", BoolToString(account.CanRead)); + } - // save document - doc.Save(GetFileZillaConfigPath()); + // save document + doc.Save(GetFileZillaConfigPath()); - // reload config - ReloadFileZillaConfig(); - } + // reload config + ReloadFileZillaConfig(); + } - public virtual void DeleteAccount(string accountName) - { - XmlDocument doc = GetFileZillaConfig(); - XmlNode nodeUser = doc.SelectSingleNode("/FileZillaServer/Users/User[@Name='" + accountName + "']"); - if (nodeUser == null) - return; + public virtual void DeleteAccount(string accountName) + { + XmlDocument doc = GetFileZillaConfig(); + XmlNode nodeUser = doc.SelectSingleNode("/FileZillaServer/Users/User[@Name='" + accountName + "']"); + if (nodeUser == null) + return; - // delete account - nodeUser.ParentNode.RemoveChild(nodeUser); + // delete account + nodeUser.ParentNode.RemoveChild(nodeUser); - // save document - doc.Save(GetFileZillaConfigPath()); + // save document + doc.Save(GetFileZillaConfigPath()); - // reload config - ReloadFileZillaConfig(); - } + // reload config + ReloadFileZillaConfig(); + } - #endregion + #endregion - public override void ChangeServiceItemsState(ServiceProviderItem[] items, bool enabled) - { - foreach (ServiceProviderItem item in items) - { - if (item is FtpAccount) - { - try - { - // change FTP account state - FtpAccount account = GetAccount(item.Name); - account.Enabled = enabled; - UpdateAccount(account); - } - catch (Exception ex) - { - Log.WriteError(String.Format("Error switching '{0}' {1}", item.Name, item.GetType().Name), ex); - } - } - } - } + public override void ChangeServiceItemsState(ServiceProviderItem[] items, bool enabled) + { + foreach (ServiceProviderItem item in items) + { + if (item is FtpAccount) + { + try + { + // change FTP account state + FtpAccount account = GetAccount(item.Name); + account.Enabled = enabled; + UpdateAccount(account); + } + catch (Exception ex) + { + Log.WriteError(String.Format("Error switching '{0}' {1}", item.Name, item.GetType().Name), ex); + } + } + } + } - public override void DeleteServiceItems(ServiceProviderItem[] items) - { - foreach (ServiceProviderItem item in items) - { - if (item is FtpAccount) - { - try - { - // delete FTP account - DeleteAccount(item.Name); - } - catch (Exception ex) - { - Log.WriteError(String.Format("Error deleting '{0}' {1}", item.Name, item.GetType().Name), ex); - } - } - } - } + public override void DeleteServiceItems(ServiceProviderItem[] items) + { + foreach (ServiceProviderItem item in items) + { + if (item is FtpAccount) + { + try + { + // delete FTP account + DeleteAccount(item.Name); + } + catch (Exception ex) + { + Log.WriteError(String.Format("Error deleting '{0}' {1}", item.Name, item.GetType().Name), ex); + } + } + } + } - #region Private Helpers - private string BoolToString(bool val) - { - return val ? "1" : "0"; - } + #region Private Helpers + private string BoolToString(bool val) + { + return val ? "1" : "0"; + } - private void SetOption(XmlNode parentNode, string name, string val) - { - XmlNode option = parentNode.SelectSingleNode("Option[@Name='" + name + "']"); - if (option == null) - { - option = parentNode.OwnerDocument.CreateElement("Option"); - parentNode.AppendChild(option); - ((XmlElement)option).SetAttribute("Name", name); - } - option.InnerText = val; - } + private void SetOption(XmlNode parentNode, string name, string val) + { + XmlNode option = parentNode.SelectSingleNode("Option[@Name='" + name + "']"); + if (option == null) + { + option = parentNode.OwnerDocument.CreateElement("Option"); + parentNode.AppendChild(option); + ((XmlElement)option).SetAttribute("Name", name); + } + option.InnerText = val; + } - private FtpAccount CreateAccountFromXmlNode(XmlNode nodeUser, bool excludeDetails) - { - FtpAccount account = new FtpAccount(); - account.Name = nodeUser.Attributes["Name"].Value; + private FtpAccount CreateAccountFromXmlNode(XmlNode nodeUser, bool excludeDetails) + { + FtpAccount account = new FtpAccount(); + account.Name = nodeUser.Attributes["Name"].Value; - if (!excludeDetails) - { - account.Password = nodeUser.SelectSingleNode("Option[@Name='Pass']").InnerText; - account.Enabled = (nodeUser.SelectSingleNode("Option[@Name='Enabled']").InnerText == "1"); - XmlNode nodeFolder = nodeUser.SelectSingleNode("Permissions/Permission"); - if (nodeFolder != null) - { - account.Folder = nodeFolder.Attributes["Dir"].Value; - account.CanRead = (nodeFolder.SelectSingleNode("Option[@Name='FileRead']").InnerText == "1"); - account.CanWrite = (nodeFolder.SelectSingleNode("Option[@Name='FileWrite']").InnerText == "1"); - } - } + if (!excludeDetails) + { + account.Password = nodeUser.SelectSingleNode("Option[@Name='Pass']").InnerText; + account.Enabled = (nodeUser.SelectSingleNode("Option[@Name='Enabled']").InnerText == "1"); + XmlNode nodeFolder = nodeUser.SelectSingleNode("Permissions/Permission"); + if (nodeFolder != null) + { + account.Folder = nodeFolder.Attributes["Dir"].Value; + account.CanRead = (nodeFolder.SelectSingleNode("Option[@Name='FileRead']").InnerText == "1"); + account.CanWrite = (nodeFolder.SelectSingleNode("Option[@Name='FileWrite']").InnerText == "1"); + } + } - return account; - } + return account; + } - private XmlDocument GetFileZillaConfig() - { - string path = GetFileZillaConfigPath(); - if (!File.Exists(path)) - throw new Exception("FileZilla configuration file was not found: " + path); + private XmlDocument GetFileZillaConfig() + { + string path = GetFileZillaConfigPath(); + if (!File.Exists(path)) + throw new Exception("FileZilla configuration file was not found: " + path); - XmlDocument doc = new XmlDocument(); - doc.Load(path); - return doc; - } + XmlDocument doc = new XmlDocument(); + doc.Load(path); + return doc; + } - private string GetFileZillaConfigPath() - { - return Path.Combine(FileZillaFolder, FILEZILLA_SERVER_FILE); - } + private string GetFileZillaConfigPath() + { + return Path.Combine(FileZillaFolder, FILEZILLA_SERVER_FILE); + } - private string MD5(string str) - { - System.Text.UTF8Encoding ue = new System.Text.UTF8Encoding(); - byte[] bytes = ue.GetBytes(str); + private string MD5(string str) + { + System.Text.UTF8Encoding ue = new System.Text.UTF8Encoding(); + byte[] bytes = ue.GetBytes(str); - // encrypt bytes - System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); - byte[] hashBytes = md5.ComputeHash(bytes); + // encrypt bytes + System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); + byte[] hashBytes = md5.ComputeHash(bytes); - // Convert the encrypted bytes back to a string (base 16) - string hashString = ""; + // Convert the encrypted bytes back to a string (base 16) + string hashString = ""; - for (int i = 0; i < hashBytes.Length; i++) - hashString += Convert.ToString(hashBytes[i], 16).PadLeft(2, '0'); + for (int i = 0; i < hashBytes.Length; i++) + hashString += Convert.ToString(hashBytes[i], 16).PadLeft(2, '0'); - return hashString.PadLeft(32, '0'); - } + return hashString.PadLeft(32, '0'); + } - private void ReloadFileZillaConfig() - { - FileUtils.ExecuteSystemCommand( - Path.Combine(FileZillaFolder, "FileZilla Server.exe"), - "/reload-config"); - } - #endregion + private void ReloadFileZillaConfig() + { + FileUtils.ExecuteSystemCommand( + Path.Combine(FileZillaFolder, "FileZilla Server.exe"), + "/reload-config"); + } + #endregion public override bool IsInstalled() { @@ -423,5 +428,5 @@ namespace WebsitePanel.Providers.FTP } } - } + } } diff --git a/WebsitePanel/Sources/WebsitePanel.Server.Utils/FileUtils.cs b/WebsitePanel/Sources/WebsitePanel.Server.Utils/FileUtils.cs index 6a4263bc..f30354a5 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server.Utils/FileUtils.cs +++ b/WebsitePanel/Sources/WebsitePanel.Server.Utils/FileUtils.cs @@ -38,14 +38,98 @@ using System.Reflection; using Ionic.Zip; using WebsitePanel.Providers.OS; - namespace WebsitePanel.Providers.Utils { + /// + /// Defines a contract that a system command provider needs to implement. + /// + public interface ICommandLineProvider + { + /// + /// Executes the file specifed as if you were executing it via command-line interface. + /// + /// Path to the executable file (eq. .exe, .bat, .cmd and etc). + /// Arguments to pass to the executable file + /// Path to the output file if you want the output to be written somewhere. + /// Output of the command being executed. + string Execute(string filePath, string args, string outputFile); + } + + /// + /// Provides a default implementation of running system commands. + /// + public sealed class DefaultCommandLineProvider : ICommandLineProvider + { + /// + /// Creates a new process and executes the file specifed as if you were executing it via command-line interface. + /// + /// Path to the executable file (eq. .exe, .bat, .cmd and etc). + /// Arguments to pass to the executable file + /// Path to the output file if you want the output to be written somewhere. + /// Output of the command being executed. + public string Execute(string filePath, string args, string outputFile) + { + // launch system process + ProcessStartInfo startInfo = new ProcessStartInfo(filePath, args); + startInfo.WindowStyle = ProcessWindowStyle.Hidden; + startInfo.RedirectStandardOutput = true; + startInfo.UseShellExecute = false; + startInfo.CreateNoWindow = true; + + // get working directory from executable path + startInfo.WorkingDirectory = Path.GetDirectoryName(filePath); + Process proc = Process.Start(startInfo); + + // analyze results + StreamReader reader = proc.StandardOutput; + string results = ""; + if (!String.IsNullOrEmpty(outputFile)) + { + // stream to writer + StreamWriter writer = new StreamWriter(outputFile); + int BUFFER_LENGTH = 2048; + int readBytes = 0; + char[] buffer = new char[BUFFER_LENGTH]; + while ((readBytes = reader.Read(buffer, 0, BUFFER_LENGTH)) > 0) + { + writer.Write(buffer, 0, readBytes); + } + writer.Close(); + } + else + { + // return as string + results = reader.ReadToEnd(); + } + reader.Close(); + + return results; + } + } + /// /// Summary description for FileUtils. /// public class FileUtils { + private static ICommandLineProvider CliProvider; + + static FileUtils() + { + SetDefaultCliProvider(new DefaultCommandLineProvider()); + } + + /// + /// Initializes command-line provider for the utility class. Yet this is not a perfect way to inverse control over CLI processing + /// but it does its job for the testing purposes. + /// + /// An instance of a command-line provider to initialize the utility with. + public static void SetDefaultCliProvider(ICommandLineProvider provider) + { + Debug.Assert(provider != null, "Command line provider is null"); + CliProvider = provider; + } + public static string EvaluateSystemVariables(string str) { if (String.IsNullOrEmpty(str)) @@ -616,45 +700,17 @@ namespace WebsitePanel.Providers.Utils return ExecuteSystemCommand(cmd, args, null); } + /// + /// Executes the file specifed as if you were executing it via command-line interface. + /// + /// Path to the executable file (eq. .exe, .bat, .cmd and etc). + /// Arguments to pass to the executable file + /// Path to the output file if you want the output to be written somewhere. + /// Output of the command being executed. public static string ExecuteSystemCommand(string cmd, string args, string outputFile) { // launch system process - ProcessStartInfo startInfo = new ProcessStartInfo(cmd, args); - startInfo.WindowStyle = ProcessWindowStyle.Hidden; - startInfo.RedirectStandardOutput = true; - startInfo.StandardOutputEncoding = Encoding.UTF8; - startInfo.UseShellExecute = false; - startInfo.CreateNoWindow = true; - - // get working directory from executable path - startInfo.WorkingDirectory = Path.GetDirectoryName(cmd); - Process proc = Process.Start(startInfo); - - - // analyze results - StreamReader reader = proc.StandardOutput; - string results = ""; - if (!String.IsNullOrEmpty(outputFile)) - { - // stream to writer - StreamWriter writer = new StreamWriter(outputFile); - int BUFFER_LENGTH = 2048; - int readBytes = 0; - char[] buffer = new char[BUFFER_LENGTH]; - while ((readBytes = reader.Read(buffer, 0, BUFFER_LENGTH)) > 0) - { - writer.Write(buffer, 0, readBytes); - } - writer.Close(); - } - else - { - // return as string - results = reader.ReadToEnd(); - } - reader.Close(); - - return results; + return CliProvider.Execute(cmd, args, outputFile); } public static void ExecuteCmdCommand(string command) diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Code/Helpers/VirtualMachinesHelper.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Code/Helpers/VirtualMachinesHelper.cs index ab166877..fd36cf23 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Code/Helpers/VirtualMachinesHelper.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Code/Helpers/VirtualMachinesHelper.cs @@ -29,9 +29,54 @@ using WebsitePanel.EnterpriseServer; using WebsitePanel.Providers.Virtualization; using System.Web; +using System; namespace WebsitePanel.Portal { + // TODO: Move this extension to a separate file later. + public static class VirtualMachinesExtensions + { + #region Privates with specific purposes (eq. caching, usability, performance and etc) + /// + /// This method supports the Portal internal infrastructure and is not intended to be used directly from your code. Gets a cached copy of virtual machine object of the specified type or retrieves it for the first time and then caches it. + /// + /// Type of virtual machine to be retrieved (possible types are VirtualMachine|VMInfo) + /// Virtual machine item id + /// Function to retrieve the virtual machine data from Enterprise Server + /// An instance of the specified virtual machine + internal static T GetCachedVirtualMachine(object cacheIdentityKey, Func getVmFunc) + { + // TODO: Make this method private when all dependents will be consolidated in the extension. + string cacheKey = "CachedVirtualMachine_" + cacheIdentityKey; + if (HttpContext.Current.Items[cacheKey] != null) + return (T)HttpContext.Current.Items[cacheKey]; + + // load virtual machine + T virtualMachine = getVmFunc(); + + // place to cache + if (virtualMachine != null) + HttpContext.Current.Items[cacheKey] = virtualMachine; + + return virtualMachine; + } + #endregion + + #region Extension methods + /// + /// Gets a cached copy of virtual machine object of the specified type or retrieves it for the first time and then caches it. + /// + /// + /// Virtual machine id + /// An instance of the virtual machine speficied + public static VMInfo GetCachedVirtualMachine(this esVirtualizationServerForPrivateCloud client, int itemId) + { + return GetCachedVirtualMachine( + itemId, () => ES.Services.VPSPC.GetVirtualMachineItem(itemId)); + } + #endregion + } + public class VirtualMachinesHelper { public static bool IsVirtualMachineManagementAllowed(int packageId) @@ -57,20 +102,11 @@ namespace WebsitePanel.Portal return manageAllowed; } + // TODO: Move this method to the corresponding extension later. public static VirtualMachine GetCachedVirtualMachine(int itemId) { - string key = "CachedVirtualMachine" + itemId; - if (HttpContext.Current.Items[key] != null) - return (VirtualMachine)HttpContext.Current.Items[key]; - - // load virtual machine - VirtualMachine vm = ES.Services.VPS.GetVirtualMachineItem(itemId); - - // place to cache - if (vm != null) - HttpContext.Current.Items[key] = vm; - - return vm; + return VirtualMachinesExtensions.GetCachedVirtualMachine( + itemId, () => ES.Services.VPS.GetVirtualMachineItem(itemId)); } #region Virtual Machines diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPSForPC/RemoteDesktop/Connect.aspx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPSForPC/RemoteDesktop/Connect.aspx.cs index 053b437f..6dfa1150 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPSForPC/RemoteDesktop/Connect.aspx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPSForPC/RemoteDesktop/Connect.aspx.cs @@ -40,13 +40,14 @@ namespace WebsitePanel.Portal.VPSForPC.RemoteDesktop resolution.Text = Request["Resolution"]; // load server info - VirtualMachine vm = VirtualMachinesHelper.GetCachedVirtualMachine(PanelRequest.ItemID); + VMInfo vm = ES.Services.VPSPC.GetCachedVirtualMachine(PanelRequest.ItemID); litServerName.Text = vm.Name + " - "; username.Text = "Administrator"; - password.Text = vm.AdministratorPassword; + // TODO: Review VMInfo class fields and underlying data for correctness + password.Text = vm.AdminPassword; // load external network parameters - NetworkAdapterDetails nic = ES.Services.VPS.GetExternalNetworkAdapterDetails(PanelRequest.ItemID); + NetworkAdapterDetails nic = ES.Services.VPSPC.GetExternalNetworkAdapterDetails(PanelRequest.ItemID); if (nic.IPAddresses.Length > 0) { NetworkAdapterIPAddress ip = nic.IPAddresses[0]; diff --git a/WebsitePanel/build.xml b/WebsitePanel/build.xml index 0db6aae2..f2805da8 100644 --- a/WebsitePanel/build.xml +++ b/WebsitePanel/build.xml @@ -1,10 +1,10 @@  - + 1.2.2.0 1.2.2.1 1.2.2 - 2012-05-13 + 2012-08-01 Release .. $(RootFolder)\WebsitePanel @@ -15,12 +15,13 @@ $(TrunkFolder)\Build\$(BuildConfiguration) $(TrunkFolder)\Deploy\$(BuildConfiguration) - C:\Projects\WebsitePanel-1.2.1\$(BuildConfiguration) + $(RootFolder)\..\prev\$(BuildConfiguration) $(TrunkFolder)\Tools\Diff.exe - "C:\Program Files\Microsoft SQL Server\110\Tools\Binn\sqlcmd.exe" -S (local)\SQLEXPRESS -E + "$(ProgramFiles)\Microsoft SQL Server\100\Tools\Binn\sqlcmd.exe" -S (local)\SQLEXPRESS -E - "C:\Program Files\IIS\Microsoft Web Deploy V2\msdeploy.exe" + "$(ProgramFiles)\IIS\Microsoft Web Deploy\msdeploy.exe" + "$(ProgramFiles)\IIS\Microsoft Web Deploy V2\msdeploy.exe" WebsitePanel_build server=(local)\SQLEXPRESS;database=$(DataBaseName);Integrated Security=true; @@ -31,7 +32,8 @@ $(TrunkFolder)\Sources\Tools\WebsitePanel.Import.CsvBulk\bin\$(BuildConfiguration) $(TrunkFolder)\Sources\Tools\WebsitePanel.Import.Enterprise\bin\$(BuildConfiguration) $(TrunkFolder)\Sources\Tools\WebsitePanel.AWStats.Viewer - $(TrunkFolder)\Sources\Tools\WSPTransportAgent + +$(TrunkFolder)\Sources\Tools\WSPTransportAgent $(BuildFolder)\Server $(BuildFolder)\EnterpriseServer @@ -39,17 +41,14 @@ $(BuildFolder)\Import.CsvBulk $(BuildFolder)\Import.Enterprise $(BuildFolder)\AWStats.Viewer - $(BuildFolder)\WSPTransportAgent - - +$(BuildFolder)\WSPTransportAgent - - - - + + + + + @@ -60,7 +59,7 @@ - + @@ -71,7 +70,7 @@ - + @@ -81,7 +80,7 @@ - + @@ -191,7 +190,7 @@ - + @@ -228,7 +227,7 @@ $(ToolsFolder)\Import.CsvBulk $(ToolsFolder)\Import.Enterprise $(ToolsFolder)\AWStats.Viewer - $(ToolsFolder)\WSPTransportAgent + $(ToolsFolder)\WSPTransportAgent @@ -349,8 +348,8 @@ $(DeployFolder)\Database - - + + @@ -461,7 +460,7 @@ - + diff --git a/WebsitePanel/deploy-debug.bat b/WebsitePanel/deploy-debug.bat index 8d37c4b9..35fd6db8 100644 --- a/WebsitePanel/deploy-debug.bat +++ b/WebsitePanel/deploy-debug.bat @@ -1 +1 @@ -%windir%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe build.xml /target:Deploy /property:BuildConfiguration=Debug /v:n /fileLogger /m +%windir%\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe build.xml /target:Deploy /property:BuildConfiguration=Debug /v:n /fileLogger /m