diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/RemoteDesktopServicesProxy.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/RemoteDesktopServicesProxy.cs index bf847f10..de6146ef 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/RemoteDesktopServicesProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/RemoteDesktopServicesProxy.cs @@ -106,6 +106,14 @@ namespace WebsitePanel.EnterpriseServer { private System.Threading.SendOrPostCallback GetRdsCollectionSessionHostsOperationCompleted; + private System.Threading.SendOrPostCallback GetRdsServerInfoOperationCompleted; + + private System.Threading.SendOrPostCallback GetRdsServerStatusOperationCompleted; + + private System.Threading.SendOrPostCallback ShutDownRdsServerOperationCompleted; + + private System.Threading.SendOrPostCallback RestartRdsServerOperationCompleted; + /// public esRemoteDesktopServices() { this.Url = "http://localhost:9002/esRemoteDesktopServices.asmx"; @@ -225,6 +233,18 @@ namespace WebsitePanel.EnterpriseServer { /// public event GetRdsCollectionSessionHostsCompletedEventHandler GetRdsCollectionSessionHostsCompleted; + /// + public event GetRdsServerInfoCompletedEventHandler GetRdsServerInfoCompleted; + + /// + public event GetRdsServerStatusCompletedEventHandler GetRdsServerStatusCompleted; + + /// + public event ShutDownRdsServerCompletedEventHandler ShutDownRdsServerCompleted; + + /// + public event RestartRdsServerCompletedEventHandler RestartRdsServerCompleted; + /// [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetRdsCollection", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] public RdsCollection GetRdsCollection(int collectionId) { @@ -1944,6 +1964,182 @@ namespace WebsitePanel.EnterpriseServer { } } + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetRdsServerInfo", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public RdsServerInfo GetRdsServerInfo(int itemId, string fqdnName) { + object[] results = this.Invoke("GetRdsServerInfo", new object[] { + itemId, + fqdnName}); + return ((RdsServerInfo)(results[0])); + } + + /// + public System.IAsyncResult BeginGetRdsServerInfo(int itemId, string fqdnName, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetRdsServerInfo", new object[] { + itemId, + fqdnName}, callback, asyncState); + } + + /// + public RdsServerInfo EndGetRdsServerInfo(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((RdsServerInfo)(results[0])); + } + + /// + public void GetRdsServerInfoAsync(int itemId, string fqdnName) { + this.GetRdsServerInfoAsync(itemId, fqdnName, null); + } + + /// + public void GetRdsServerInfoAsync(int itemId, string fqdnName, object userState) { + if ((this.GetRdsServerInfoOperationCompleted == null)) { + this.GetRdsServerInfoOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetRdsServerInfoOperationCompleted); + } + this.InvokeAsync("GetRdsServerInfo", new object[] { + itemId, + fqdnName}, this.GetRdsServerInfoOperationCompleted, userState); + } + + private void OnGetRdsServerInfoOperationCompleted(object arg) { + if ((this.GetRdsServerInfoCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetRdsServerInfoCompleted(this, new GetRdsServerInfoCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetRdsServerStatus", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public string GetRdsServerStatus(int itemId, string fqdnName) { + object[] results = this.Invoke("GetRdsServerStatus", new object[] { + itemId, + fqdnName}); + return ((string)(results[0])); + } + + /// + public System.IAsyncResult BeginGetRdsServerStatus(int itemId, string fqdnName, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetRdsServerStatus", new object[] { + itemId, + fqdnName}, callback, asyncState); + } + + /// + public string EndGetRdsServerStatus(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((string)(results[0])); + } + + /// + public void GetRdsServerStatusAsync(int itemId, string fqdnName) { + this.GetRdsServerStatusAsync(itemId, fqdnName, null); + } + + /// + public void GetRdsServerStatusAsync(int itemId, string fqdnName, object userState) { + if ((this.GetRdsServerStatusOperationCompleted == null)) { + this.GetRdsServerStatusOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetRdsServerStatusOperationCompleted); + } + this.InvokeAsync("GetRdsServerStatus", new object[] { + itemId, + fqdnName}, this.GetRdsServerStatusOperationCompleted, userState); + } + + private void OnGetRdsServerStatusOperationCompleted(object arg) { + if ((this.GetRdsServerStatusCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetRdsServerStatusCompleted(this, new GetRdsServerStatusCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/ShutDownRdsServer", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject ShutDownRdsServer(int itemId, string fqdnName) { + object[] results = this.Invoke("ShutDownRdsServer", new object[] { + itemId, + fqdnName}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginShutDownRdsServer(int itemId, string fqdnName, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("ShutDownRdsServer", new object[] { + itemId, + fqdnName}, callback, asyncState); + } + + /// + public ResultObject EndShutDownRdsServer(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void ShutDownRdsServerAsync(int itemId, string fqdnName) { + this.ShutDownRdsServerAsync(itemId, fqdnName, null); + } + + /// + public void ShutDownRdsServerAsync(int itemId, string fqdnName, object userState) { + if ((this.ShutDownRdsServerOperationCompleted == null)) { + this.ShutDownRdsServerOperationCompleted = new System.Threading.SendOrPostCallback(this.OnShutDownRdsServerOperationCompleted); + } + this.InvokeAsync("ShutDownRdsServer", new object[] { + itemId, + fqdnName}, this.ShutDownRdsServerOperationCompleted, userState); + } + + private void OnShutDownRdsServerOperationCompleted(object arg) { + if ((this.ShutDownRdsServerCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.ShutDownRdsServerCompleted(this, new ShutDownRdsServerCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/RestartRdsServer", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject RestartRdsServer(int itemId, string fqdnName) { + object[] results = this.Invoke("RestartRdsServer", new object[] { + itemId, + fqdnName}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginRestartRdsServer(int itemId, string fqdnName, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("RestartRdsServer", new object[] { + itemId, + fqdnName}, callback, asyncState); + } + + /// + public ResultObject EndRestartRdsServer(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void RestartRdsServerAsync(int itemId, string fqdnName) { + this.RestartRdsServerAsync(itemId, fqdnName, null); + } + + /// + public void RestartRdsServerAsync(int itemId, string fqdnName, object userState) { + if ((this.RestartRdsServerOperationCompleted == null)) { + this.RestartRdsServerOperationCompleted = new System.Threading.SendOrPostCallback(this.OnRestartRdsServerOperationCompleted); + } + this.InvokeAsync("RestartRdsServer", new object[] { + itemId, + fqdnName}, this.RestartRdsServerOperationCompleted, userState); + } + + private void OnRestartRdsServerOperationCompleted(object arg) { + if ((this.RestartRdsServerCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.RestartRdsServerCompleted(this, new RestartRdsServerCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + /// public new void CancelAsync(object userState) { base.CancelAsync(userState); @@ -2937,4 +3133,108 @@ namespace WebsitePanel.EnterpriseServer { } } } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void GetRdsServerInfoCompletedEventHandler(object sender, GetRdsServerInfoCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetRdsServerInfoCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetRdsServerInfoCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public RdsServerInfo Result { + get { + this.RaiseExceptionIfNecessary(); + return ((RdsServerInfo)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void GetRdsServerStatusCompletedEventHandler(object sender, GetRdsServerStatusCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetRdsServerStatusCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetRdsServerStatusCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public string Result { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void ShutDownRdsServerCompletedEventHandler(object sender, ShutDownRdsServerCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class ShutDownRdsServerCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal ShutDownRdsServerCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void RestartRdsServerCompletedEventHandler(object sender, RestartRdsServerCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class RestartRdsServerCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal RestartRdsServerCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/RemoteDesktopServices/RemoteDesktopServicesController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/RemoteDesktopServices/RemoteDesktopServicesController.cs index 09b99f2c..84b73099 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/RemoteDesktopServices/RemoteDesktopServicesController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/RemoteDesktopServices/RemoteDesktopServicesController.cs @@ -248,6 +248,26 @@ namespace WebsitePanel.EnterpriseServer return GetRdsCollectionSessionHostsInternal(collectionId); } + public static RdsServerInfo GetRdsServerInfo(int itemId, string fqdnName) + { + return GetRdsServerInfoInternal(itemId, fqdnName); + } + + public static string GetRdsServerStatus(int itemId, string fqdnName) + { + return GetRdsServerStatusInternal(itemId, fqdnName); + } + + public static ResultObject ShutDownRdsServer(int itemId, string fqdnName) + { + return ShutDownRdsServerInternal(itemId, fqdnName); + } + + public static ResultObject RestartRdsServer(int itemId, string fqdnName) + { + return RestartRdsServerInternal(itemId, fqdnName); + } + private static RdsCollection GetRdsCollectionInternal(int collectionId) { var collection = ObjectUtils.FillObjectFromDataReader(DataProvider.GetRDSCollectionById(collectionId)); @@ -586,7 +606,7 @@ namespace WebsitePanel.EnterpriseServer foreach (var tmpServer in tmpServers) { - FillRdsServerData(tmpServer); + FillRdsServerData(tmpServer); } result.Servers = tmpServers.ToArray(); @@ -1235,6 +1255,118 @@ namespace WebsitePanel.EnterpriseServer return result; } + private static RdsServerInfo GetRdsServerInfoInternal(int itemId, string fqdnName) + { + Organization org = OrganizationController.GetOrganization(itemId); + + if (org == null) + { + return new RdsServerInfo(); + } + + var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + var result = rds.GetRdsServerInfo(fqdnName); + + return result; + } + + private static string GetRdsServerStatusInternal(int itemId, string fqdnName) + { + Organization org = OrganizationController.GetOrganization(itemId); + var result = "Unavailable"; + + if (org == null) + { + return result; + } + + var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + + try + { + result = rds.GetRdsServerStatus(fqdnName); + } + catch + { + } + + return result; + } + + private static ResultObject ShutDownRdsServerInternal(int itemId, string fqdnName) + { + var result = TaskManager.StartResultTask("REMOTE_DESKTOP_SERVICES", "SHUTDOWN_RDS_SERVER"); + + try + { + Organization org = OrganizationController.GetOrganization(itemId); + + if (org == null) + { + result.IsSuccess = false; + result.AddError("", new NullReferenceException("Organization not found")); + return result; + } + + var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + rds.ShutDownRdsServer(fqdnName); + } + catch (Exception ex) + { + result.AddError("REMOTE_DESKTOP_SERVICES_SHUTDOWN_RDS_SERVER", ex); + } + finally + { + if (!result.IsSuccess) + { + TaskManager.CompleteResultTask(result); + } + else + { + TaskManager.CompleteResultTask(); + } + } + + return result; + } + + private static ResultObject RestartRdsServerInternal(int itemId, string fqdnName) + { + var result = TaskManager.StartResultTask("REMOTE_DESKTOP_SERVICES", "RESTART_RDS_SERVER"); + + try + { + Organization org = OrganizationController.GetOrganization(itemId); + + if (org == null) + { + result.IsSuccess = false; + result.AddError("", new NullReferenceException("Organization not found")); + return result; + } + + var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + rds.RestartRdsServer(fqdnName); + } + catch (Exception ex) + { + result.AddError("REMOTE_DESKTOP_SERVICES_RESTART_RDS_SERVER", ex); + } + finally + { + if (!result.IsSuccess) + { + TaskManager.CompleteResultTask(result); + } + else + { + TaskManager.CompleteResultTask(); + } + } + + return result; + } + private static List GetCollectionRemoteApplicationsInternal(int itemId, string collectionName) { var result = new List(); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esRemoteDesktopServices.asmx.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esRemoteDesktopServices.asmx.cs index 82127d09..e60b9cf0 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esRemoteDesktopServices.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esRemoteDesktopServices.asmx.cs @@ -289,5 +289,29 @@ namespace WebsitePanel.EnterpriseServer { return RemoteDesktopServicesController.GetRdsCollectionSessionHosts(collectionId); } + + [WebMethod] + public RdsServerInfo GetRdsServerInfo(int itemId, string fqdnName) + { + return RemoteDesktopServicesController.GetRdsServerInfo(itemId, fqdnName); + } + + [WebMethod] + public string GetRdsServerStatus(int itemId, string fqdnName) + { + return RemoteDesktopServicesController.GetRdsServerStatus(itemId, fqdnName); + } + + [WebMethod] + public ResultObject ShutDownRdsServer(int itemId, string fqdnName) + { + return RemoteDesktopServicesController.ShutDownRdsServer(itemId, fqdnName); + } + + [WebMethod] + public ResultObject RestartRdsServer(int itemId, string fqdnName) + { + return RemoteDesktopServicesController.RestartRdsServer(itemId, fqdnName); + } } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/IRemoteDesktopServices.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/IRemoteDesktopServices.cs index e434048d..807dabd6 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/IRemoteDesktopServices.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/IRemoteDesktopServices.cs @@ -69,5 +69,9 @@ namespace WebsitePanel.Providers.RemoteDesktopServices List GetRdsUserSessions(string collectionName); void LogOffRdsUser(string unifiedSessionId, string hostServer); List GetRdsCollectionSessionHosts(string collectionName); + RdsServerInfo GetRdsServerInfo(string serverName); + string GetRdsServerStatus(string serverName); + void ShutDownRdsServer(string serverName); + void RestartRdsServer(string serverName); } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/RdsServer.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/RdsServer.cs index 1f89e9b8..aa181ba7 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/RdsServer.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/RdsServer.cs @@ -47,5 +47,6 @@ namespace WebsitePanel.Providers.RemoteDesktopServices public string ItemName { get; set; } public int? RdsCollectionId { get; set; } public bool ConnectionEnabled { get; set; } + public string Status { get; set; } } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/RdsServerDriveInfo.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/RdsServerDriveInfo.cs new file mode 100644 index 00000000..1b29f46f --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/RdsServerDriveInfo.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace WebsitePanel.Providers.RemoteDesktopServices +{ + public class RdsServerDriveInfo + { + public string DeviceId { get; set; } + public string VolumeName { get; set; } + public double SizeMb { get; set; } + public double FreeSpaceMb { get; set; } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/RdsServerInfo.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/RdsServerInfo.cs new file mode 100644 index 00000000..55056203 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/RdsServerInfo.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace WebsitePanel.Providers.RemoteDesktopServices +{ + public class RdsServerInfo + { + public string Status { get; set; } + public int NumberOfCores { get; set; } + public int MaxClockSpeed { get; set; } + public int LoadPercentage { get; set; } + public double MemoryAllocatedMb { get; set; } + public double FreeMemoryMb { get; set; } + public RdsServerDriveInfo[] Drives { get; set; } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj b/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj index 6e8b7bd8..752209d3 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj @@ -135,6 +135,8 @@ + + diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/Windows2012.cs b/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/Windows2012.cs index e6e8dba2..07cd3f64 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/Windows2012.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/Windows2012.cs @@ -63,7 +63,8 @@ namespace WebsitePanel.Providers.RemoteDesktopServices private const string Users = "users"; private const string RdsGroupFormat = "rds-{0}-{1}"; private const string RdsModuleName = "RemoteDesktopServices"; - private const string AddNpsString = "netsh nps add np name=\"\"{0}\"\" policysource=\"1\" processingorder=\"{1}\" conditionid=\"0x3d\" conditiondata=\"^5$\" conditionid=\"0x1fb5\" conditiondata=\"{2}\" conditionid=\"0x1e\" conditiondata=\"UserAuthType:(PW|CA)\" profileid=\"0x1005\" profiledata=\"TRUE\" profileid=\"0x100f\" profiledata=\"TRUE\" profileid=\"0x1009\" profiledata=\"0x7\" profileid=\"0x1fe6\" profiledata=\"0x40000000\""; + private const string AddNpsString = "netsh nps add np name=\"\"{0}\"\" policysource=\"1\" processingorder=\"{1}\" conditionid=\"0x3d\" conditiondata=\"^5$\" conditionid=\"0x1fb5\" conditiondata=\"{2}\" conditionid=\"0x1e\" conditiondata=\"UserAuthType:(PW|CA)\" profileid=\"0x1005\" profiledata=\"TRUE\" profileid=\"0x100f\" profiledata=\"TRUE\" profileid=\"0x1009\" profiledata=\"0x7\" profileid=\"0x1fe6\" profiledata=\"0x40000000\""; + #endregion #region Properties @@ -956,9 +957,7 @@ namespace WebsitePanel.Providers.RemoteDesktopServices cmd.Parameters.Add("ConnectionBroker", ConnectionBroker); ExecuteShellCommand(runSpace, cmd, false); - } - - + } private bool ExistRdsServerInDeployment(Runspace runSpace, RdsServer server) { @@ -1835,6 +1834,238 @@ namespace WebsitePanel.Providers.RemoteDesktopServices } #endregion + + #region Server Info + + public RdsServerInfo GetRdsServerInfo(string serverName) + { + var result = new RdsServerInfo(); + Runspace runspace = null; + + try + { + runspace = OpenRunspace(); + result = GetServerInfo(runspace, serverName); + result.Status = GetRdsServerStatus(runspace, serverName); + + } + finally + { + CloseRunspace(runspace); + } + + return result; + } + + public string GetRdsServerStatus(string serverName) + { + string result = ""; + Runspace runspace = null; + + try + { + runspace = OpenRunspace(); + result = GetRdsServerStatus(runspace, serverName); + + } + finally + { + CloseRunspace(runspace); + } + + return result; + } + + public void ShutDownRdsServer(string serverName) + { + Runspace runspace = null; + + try + { + runspace = OpenRunspace(); + var command = new Command("Stop-Computer"); + command.Parameters.Add("ComputerName", serverName); + command.Parameters.Add("Force", true); + object[] errors = null; + + ExecuteShellCommand(runspace, command, false, out errors); + + if (errors.Any()) + { + Log.WriteWarning(string.Join("\r\n", errors.Select(e => e.ToString()).ToArray())); + throw new Exception(string.Join("\r\n", errors.Select(e => e.ToString()).ToArray())); + } + } + finally + { + CloseRunspace(runspace); + } + } + + public void RestartRdsServer(string serverName) + { + Runspace runspace = null; + + try + { + runspace = OpenRunspace(); + var command = new Command("Restart-Computer"); + command.Parameters.Add("ComputerName", serverName); + command.Parameters.Add("Force", true); + object[] errors = null; + + ExecuteShellCommand(runspace, command, false, out errors); + + if (errors.Any()) + { + Log.WriteWarning(string.Join("\r\n", errors.Select(e => e.ToString()).ToArray())); + throw new Exception(string.Join("\r\n", errors.Select(e => e.ToString()).ToArray())); + } + } + finally + { + CloseRunspace(runspace); + } + } + + private RdsServerInfo GetServerInfo(Runspace runspace, string serverName) + { + var result = new RdsServerInfo(); + Command cmd = new Command("Get-WmiObject"); + cmd.Parameters.Add("Class", "Win32_Processor"); + cmd.Parameters.Add("ComputerName", serverName); + + object[] errors = null; + var psProcInfo = ExecuteShellCommand(runspace, cmd, false, out errors).First(); + + if (errors.Any()) + { + Log.WriteWarning(string.Join("\r\n", errors.Select(e => e.ToString()).ToArray())); + return result; + } + + cmd = new Command("Get-WmiObject"); + cmd.Parameters.Add("Class", "Win32_OperatingSystem"); + cmd.Parameters.Add("ComputerName", serverName); + + var psMemoryInfo = ExecuteShellCommand(runspace, cmd, false, out errors).First(); + + if (errors.Any()) + { + Log.WriteWarning(string.Join("\r\n", errors.Select(e => e.ToString()).ToArray())); + return result; + } + + result.NumberOfCores = Convert.ToInt32(GetPSObjectProperty(psProcInfo, "NumberOfCores")); + result.MaxClockSpeed = Convert.ToInt32(GetPSObjectProperty(psProcInfo, "MaxClockSpeed")); + result.LoadPercentage = Convert.ToInt32(GetPSObjectProperty(psProcInfo, "LoadPercentage")); + result.MemoryAllocatedMb = Math.Round(Convert.ToDouble(GetPSObjectProperty(psMemoryInfo, "TotalVisibleMemorySize")) / 1024, 1); + result.FreeMemoryMb = Math.Round(Convert.ToDouble(GetPSObjectProperty(psMemoryInfo, "FreePhysicalMemory")) / 1024, 1); + result.Drives = GetRdsServerDriveInfo(runspace, serverName).ToArray(); + + return result; + } + + private string GetRdsServerStatus (Runspace runspace, string serverName) + { + if (CheckServerAvailability(serverName)) + { + if (CheckPendingReboot(runspace, serverName)) + { + return "Online - Pending Reboot"; + } + + return "Online"; + } + else + { + return "Unavailable"; + } + } + + private List GetRdsServerDriveInfo(Runspace runspace, string serverName) + { + var result = new List(); + Command cmd = new Command("Get-WmiObject"); + cmd.Parameters.Add("Class", "Win32_LogicalDisk"); + cmd.Parameters.Add("Filter", "DriveType=3"); + cmd.Parameters.Add("ComputerName", serverName); + object[] errors = null; + var psDrives = ExecuteShellCommand(runspace, cmd, false, out errors); + + if (errors.Any()) + { + Log.WriteWarning(string.Join("\r\n", errors.Select(e => e.ToString()).ToArray())); + return result; + } + + foreach (var psDrive in psDrives) + { + var driveInfo = new RdsServerDriveInfo() + { + VolumeName = GetPSObjectProperty(psDrive, "VolumeName").ToString(), + DeviceId = GetPSObjectProperty(psDrive, "DeviceId").ToString(), + SizeMb = Math.Round(Convert.ToDouble(GetPSObjectProperty(psDrive, "Size"))/1024/1024, 1), + FreeSpaceMb = Math.Round(Convert.ToDouble(GetPSObjectProperty(psDrive, "FreeSpace"))/1024/1024, 1) + }; + + result.Add(driveInfo); + } + + return result; + } + + private bool CheckRDSServerAvaliability(string serverName) + { + var ping = new Ping(); + var reply = ping.Send(serverName, 1000); + + if (reply.Status == IPStatus.Success) + { + return true; + } + + return false; + } + + private bool CheckPendingReboot(Runspace runspace, string serverName) + { + if (CheckPendingReboot(runspace, serverName, @"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing", "RebootPending")) + { + return true; + } + + if (CheckPendingReboot(runspace, serverName, @"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update", "RebootRequired")) + { + return true; + } + + if (CheckPendingReboot(runspace, serverName, @"HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager", "PendingFileRenameOperations")) + { + return true; + } + + return false; + } + + private bool CheckPendingReboot(Runspace runspace, string serverName, string registryPath, string registryKey) + { + Command cmd = new Command("Get-ItemProperty"); + cmd.Parameters.Add("Path", registryPath); + cmd.Parameters.Add("Name", registryKey); + cmd.Parameters.Add("ErrorAction", "SilentlyContinue"); + + var feature = ExecuteRemoteShellCommand(runspace, serverName, cmd).FirstOrDefault(); + + if (feature != null) + { + return true; + } + + return false; + } + + #endregion } } diff --git a/WebsitePanel/Sources/WebsitePanel.Server.Client/RemoteDesktopServicesProxy.cs b/WebsitePanel/Sources/WebsitePanel.Server.Client/RemoteDesktopServicesProxy.cs index d32659ee..33b741df 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server.Client/RemoteDesktopServicesProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.Server.Client/RemoteDesktopServicesProxy.cs @@ -81,6 +81,14 @@ namespace WebsitePanel.Providers.RemoteDesktopServices { private System.Threading.SendOrPostCallback GetRdsCollectionSessionHostsOperationCompleted; + private System.Threading.SendOrPostCallback GetRdsServerInfoOperationCompleted; + + private System.Threading.SendOrPostCallback GetRdsServerStatusOperationCompleted; + + private System.Threading.SendOrPostCallback ShutDownRdsServerOperationCompleted; + + private System.Threading.SendOrPostCallback RestartRdsServerOperationCompleted; + /// public RemoteDesktopServices() { this.Url = "http://localhost:9003/RemoteDesktopServices.asmx"; @@ -164,6 +172,18 @@ namespace WebsitePanel.Providers.RemoteDesktopServices { /// public event GetRdsCollectionSessionHostsCompletedEventHandler GetRdsCollectionSessionHostsCompleted; + /// + public event GetRdsServerInfoCompletedEventHandler GetRdsServerInfoCompleted; + + /// + public event GetRdsServerStatusCompletedEventHandler GetRdsServerStatusCompleted; + + /// + public event ShutDownRdsServerCompletedEventHandler ShutDownRdsServerCompleted; + + /// + public event RestartRdsServerCompletedEventHandler RestartRdsServerCompleted; + /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/CreateCollection", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] @@ -1299,6 +1319,170 @@ namespace WebsitePanel.Providers.RemoteDesktopServices { } } + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/GetRdsServerInfo", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public RdsServerInfo GetRdsServerInfo(string serverName) { + object[] results = this.Invoke("GetRdsServerInfo", new object[] { + serverName}); + return ((RdsServerInfo)(results[0])); + } + + /// + public System.IAsyncResult BeginGetRdsServerInfo(string serverName, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetRdsServerInfo", new object[] { + serverName}, callback, asyncState); + } + + /// + public RdsServerInfo EndGetRdsServerInfo(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((RdsServerInfo)(results[0])); + } + + /// + public void GetRdsServerInfoAsync(string serverName) { + this.GetRdsServerInfoAsync(serverName, null); + } + + /// + public void GetRdsServerInfoAsync(string serverName, object userState) { + if ((this.GetRdsServerInfoOperationCompleted == null)) { + this.GetRdsServerInfoOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetRdsServerInfoOperationCompleted); + } + this.InvokeAsync("GetRdsServerInfo", new object[] { + serverName}, this.GetRdsServerInfoOperationCompleted, userState); + } + + private void OnGetRdsServerInfoOperationCompleted(object arg) { + if ((this.GetRdsServerInfoCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetRdsServerInfoCompleted(this, new GetRdsServerInfoCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/GetRdsServerStatus", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public string GetRdsServerStatus(string serverName) { + object[] results = this.Invoke("GetRdsServerStatus", new object[] { + serverName}); + return ((string)(results[0])); + } + + /// + public System.IAsyncResult BeginGetRdsServerStatus(string serverName, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetRdsServerStatus", new object[] { + serverName}, callback, asyncState); + } + + /// + public string EndGetRdsServerStatus(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((string)(results[0])); + } + + /// + public void GetRdsServerStatusAsync(string serverName) { + this.GetRdsServerStatusAsync(serverName, null); + } + + /// + public void GetRdsServerStatusAsync(string serverName, object userState) { + if ((this.GetRdsServerStatusOperationCompleted == null)) { + this.GetRdsServerStatusOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetRdsServerStatusOperationCompleted); + } + this.InvokeAsync("GetRdsServerStatus", new object[] { + serverName}, this.GetRdsServerStatusOperationCompleted, userState); + } + + private void OnGetRdsServerStatusOperationCompleted(object arg) { + if ((this.GetRdsServerStatusCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetRdsServerStatusCompleted(this, new GetRdsServerStatusCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/ShutDownRdsServer", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public void ShutDownRdsServer(string serverName) { + this.Invoke("ShutDownRdsServer", new object[] { + serverName}); + } + + /// + public System.IAsyncResult BeginShutDownRdsServer(string serverName, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("ShutDownRdsServer", new object[] { + serverName}, callback, asyncState); + } + + /// + public void EndShutDownRdsServer(System.IAsyncResult asyncResult) { + this.EndInvoke(asyncResult); + } + + /// + public void ShutDownRdsServerAsync(string serverName) { + this.ShutDownRdsServerAsync(serverName, null); + } + + /// + public void ShutDownRdsServerAsync(string serverName, object userState) { + if ((this.ShutDownRdsServerOperationCompleted == null)) { + this.ShutDownRdsServerOperationCompleted = new System.Threading.SendOrPostCallback(this.OnShutDownRdsServerOperationCompleted); + } + this.InvokeAsync("ShutDownRdsServer", new object[] { + serverName}, this.ShutDownRdsServerOperationCompleted, userState); + } + + private void OnShutDownRdsServerOperationCompleted(object arg) { + if ((this.ShutDownRdsServerCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.ShutDownRdsServerCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/RestartRdsServer", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public void RestartRdsServer(string serverName) { + this.Invoke("RestartRdsServer", new object[] { + serverName}); + } + + /// + public System.IAsyncResult BeginRestartRdsServer(string serverName, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("RestartRdsServer", new object[] { + serverName}, callback, asyncState); + } + + /// + public void EndRestartRdsServer(System.IAsyncResult asyncResult) { + this.EndInvoke(asyncResult); + } + + /// + public void RestartRdsServerAsync(string serverName) { + this.RestartRdsServerAsync(serverName, null); + } + + /// + public void RestartRdsServerAsync(string serverName, object userState) { + if ((this.RestartRdsServerOperationCompleted == null)) { + this.RestartRdsServerOperationCompleted = new System.Threading.SendOrPostCallback(this.OnRestartRdsServerOperationCompleted); + } + this.InvokeAsync("RestartRdsServer", new object[] { + serverName}, this.RestartRdsServerOperationCompleted, userState); + } + + private void OnRestartRdsServerOperationCompleted(object arg) { + if ((this.RestartRdsServerCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.RestartRdsServerCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + /// public new void CancelAsync(object userState) { base.CancelAsync(userState); @@ -1826,4 +2010,64 @@ namespace WebsitePanel.Providers.RemoteDesktopServices { } } } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void GetRdsServerInfoCompletedEventHandler(object sender, GetRdsServerInfoCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetRdsServerInfoCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetRdsServerInfoCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public RdsServerInfo Result { + get { + this.RaiseExceptionIfNecessary(); + return ((RdsServerInfo)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void GetRdsServerStatusCompletedEventHandler(object sender, GetRdsServerStatusCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetRdsServerStatusCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetRdsServerStatusCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public string Result { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void ShutDownRdsServerCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void RestartRdsServerCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); } diff --git a/WebsitePanel/Sources/WebsitePanel.Server/RemoteDesktopServices.asmx.cs b/WebsitePanel/Sources/WebsitePanel.Server/RemoteDesktopServices.asmx.cs index cb3e79dd..33a76548 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server/RemoteDesktopServices.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.Server/RemoteDesktopServices.asmx.cs @@ -495,5 +495,73 @@ namespace WebsitePanel.Server throw; } } + + [WebMethod, SoapHeader("settings")] + public RdsServerInfo GetRdsServerInfo(string serverName) + { + try + { + Log.WriteStart("'{0}' GetRdsServerInfo", ProviderSettings.ProviderName); + var result = RDSProvider.GetRdsServerInfo(serverName); + Log.WriteEnd("'{0}' GetRdsServerInfo", ProviderSettings.ProviderName); + + return result; + } + catch (Exception ex) + { + Log.WriteError(String.Format("'{0}' GetRdsServerInfo", ProviderSettings.ProviderName), ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public string GetRdsServerStatus(string serverName) + { + try + { + Log.WriteStart("'{0}' GetRdsServerStatus", ProviderSettings.ProviderName); + var result = RDSProvider.GetRdsServerStatus(serverName); + Log.WriteEnd("'{0}' GetRdsServerStatus", ProviderSettings.ProviderName); + + return result; + } + catch (Exception ex) + { + Log.WriteError(String.Format("'{0}' GetRdsServerStatus", ProviderSettings.ProviderName), ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public void ShutDownRdsServer(string serverName) + { + try + { + Log.WriteStart("'{0}' ShutDownRdsServer", ProviderSettings.ProviderName); + RDSProvider.ShutDownRdsServer(serverName); + Log.WriteEnd("'{0}' ShutDownRdsServer", ProviderSettings.ProviderName); + } + catch (Exception ex) + { + Log.WriteError(String.Format("'{0}' ShutDownRdsServer", ProviderSettings.ProviderName), ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public void RestartRdsServer(string serverName) + { + try + { + Log.WriteStart("'{0}' RestartRdsServer", ProviderSettings.ProviderName); + RDSProvider.RestartRdsServer(serverName); + Log.WriteEnd("'{0}' RestartRdsServer", ProviderSettings.ProviderName); + } + catch (Exception ex) + { + Log.WriteError(String.Format("'{0}' RestartRdsServer", ProviderSettings.ProviderName), ex); + throw; + } + } } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSCreateCollection.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSCreateCollection.ascx.cs index 71db4b8c..5d16a9ba 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSCreateCollection.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSCreateCollection.ascx.cs @@ -43,7 +43,7 @@ namespace WebsitePanel.Portal.RDS { if (!IsPostBack) { - + servers.HideRefreshButton(); } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSEditCollection.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSEditCollection.ascx.cs index 12cbba33..9d0beca3 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSEditCollection.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSEditCollection.ascx.cs @@ -26,6 +26,7 @@ // (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 AjaxControlToolkit; using System; using System.Collections.Generic; using System.Linq; @@ -40,14 +41,31 @@ namespace WebsitePanel.Portal.RDS { protected void Page_Load(object sender, EventArgs e) { + servers.Module = Module; + servers.OnRefreshClicked -= OnRefreshClicked; + servers.OnRefreshClicked += OnRefreshClicked; + if (!Page.IsPostBack) { var collection = ES.Services.RDS.GetRdsCollection(PanelRequest.CollectionID); - litCollectionName.Text = collection.DisplayName; + litCollectionName.Text = collection.DisplayName; } } - private bool SaveRdsServers() + private void OnRefreshClicked(object sender, EventArgs e) + { + var rdsServers = (List)sender; + + foreach (var rdsServer in rdsServers) + { + rdsServer.Status = ES.Services.RDS.GetRdsServerStatus(PanelRequest.ItemID, rdsServer.FqdName); + } + + servers.BindServers(rdsServers.ToArray()); + ((ModalPopupExtender)asyncTasks.FindControl("ModalPopupProperties")).Hide(); + } + + private bool SaveRdsServers(bool exit = false) { try { @@ -62,6 +80,15 @@ namespace WebsitePanel.Portal.RDS ES.Services.RDS.EditRdsCollection(PanelRequest.ItemID, collection); + if (!exit) + { + foreach(var rdsServer in collection.Servers) + { + rdsServer.Status = ES.Services.RDS.GetRdsServerStatus(PanelRequest.ItemID, rdsServer.FqdName); + } + + servers.BindServers(collection.Servers.ToArray()); + } } catch(Exception ex) { diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/UserControls/App_LocalResources/RDSCollectionServers.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/UserControls/App_LocalResources/RDSCollectionServers.ascx.resx index 58c6ab6f..fc6a2efe 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/UserControls/App_LocalResources/RDSCollectionServers.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/UserControls/App_LocalResources/RDSCollectionServers.ascx.resx @@ -138,12 +138,21 @@ Delete + + CloseProgressDialog(); + + + Cancel + Server Name No servers found. + + Status + Server Name @@ -153,4 +162,28 @@ Enabled Servers + + Server Info + + + Restart + + + Shut Down + + + ShowProgressDialog('Getting Server Info ...'); + + + View Info + + + Free Space: + + + Size: + + + Volume Name: + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/UserControls/RDSCollectionServers.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/UserControls/RDSCollectionServers.ascx index 7a32c13f..146dbb51 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/UserControls/RDSCollectionServers.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/UserControls/RDSCollectionServers.ascx @@ -1,15 +1,17 @@ <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="RDSCollectionServers.ascx.cs" Inherits="WebsitePanel.Portal.RDS.UserControls.RDSCollectionServers" %> <%@ Register Src="../../UserControls/PopupHeader.ascx" TagName="PopupHeader" TagPrefix="wsp" %> +<%@ Register TagPrefix="wsp" TagName="CollapsiblePanel" Src="../../UserControls/CollapsiblePanel.ascx" %>
+
+ DataKeyNames="Id" OnRowCommand="gvServers_RowCommand"> @@ -21,18 +23,139 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + +
- -