public async Task <Result> Update(FdAppliance appliance, bool isUpdateCredential) { try { var validateResult = Validate(appliance, true, isUpdateCredential); if (!validateResult.Success) { return(validateResult); } if (isUpdateCredential)//修改了密码 { using (var client = new FdClient(appliance)) { var result = await client.TestCredential(); if (!result.Success) { return(result); } } } else { var oldFdObj = await FdApplianceConnector.Instance.FindByHost(appliance.HostIP); if (oldFdObj.Data == null) { return(Result.Failed(104, $"FusionDirector {appliance.HostIP} can not find.")); } var oldFd = GetModelFromMpObject(oldFdObj.Data); if (oldFd.Port != appliance.Port) //修改了端口 { appliance.LoginPd = oldFd.LoginPd; using (var client = new FdClient(appliance)) { var result = await client.TestCredential(); if (!result.Success) { return(result); } } } } var updateResult = await FdApplianceConnector.Instance.Update(appliance, isUpdateCredential); if (updateResult.Success) { await this.LoadAll(); } return(updateResult); } catch (Exception ex) { LogHelper.Error(ex, "Update"); return(Result.Failed(100, "Update", ex)); } }
/// <summary> /// Deletes the specified appliance. /// </summary> /// <param name="appliance">The appliance.</param> /// <returns>Task<Result>.</returns> public async Task <Result> Delete(FdAppliance appliance) { return(await Task.Run(async() => { try { var obj = await this.FindByHost(appliance.HostIP); var exsitObj = obj.Data; if (exsitObj == null) { return Result.Failed(104, $"{appliance.HostIP} does not exists, delete failed."); } var client = new FdClient(appliance); var res = await client.DeleteGivenSubscriptions(appliance.SubscribeId); LogHelper.Info($"Delete Fd:DeleteGivenSubscriptions:{res.Code} {res.Message}"); var incrementalDiscoveryData = new IncrementalDiscoveryData(); incrementalDiscoveryData.Remove(exsitObj); incrementalDiscoveryData.Commit(MGroup.Instance); return Result.Done(); } catch (Exception e) { return Result.Failed(100, $"Internal error caused by {e.Message}", e); } })); }
private async void OnSaveBtnClicked(object sender, RoutedEventArgs e) { this.btnSave.IsEnabled = false; this.btnSave.Content = "Saving"; this.ActionResult = Result.Done(); FdAppliance appliance = new FdAppliance { HostIP = txtHost.Text, Port = txtPort.Text, AliasName = txtAlias.Text, LoginAccount = txtAccount.Text, LoginPd = txtPassword.Password, EventUserName = txtEventAccount.Text, LastModifyTime = DateTime.Now, EventPd = txtEventPassword.Password }; LogHelper.Info($"Update FusionDirector:{appliance.Summary()})"); this.ActionResult = await FdApplianceRepo.Update(appliance, UpdateCredentialChecked); this.btnSave.IsEnabled = true; this.btnSave.Content = "Save"; if (this.ActionResult.Success) { LogHelper.Info($"Update FusionDirector ({appliance.HostIP}) Success."); this.Close(); } else { LogHelper.Error(this.ActionResult.Cause, $"Update FusionDirector ({appliance.HostIP}) Faild:" + this.ActionResult.Message); } }
internal async Task <Result> Add(FdAppliance appliance) { try { var validateResult = Validate(appliance, false, false); if (!validateResult.Success) { return(validateResult); } using (var client = new FdClient(appliance)) { var result = await client.TestCredential(); if (!result.Success) { return(result); } var addResult = await FdApplianceConnector.Instance.Add(appliance); if (addResult.Success) { await this.LoadAll(); } return(addResult); } } catch (Exception ex) { LogHelper.Error(ex, "Add"); return(Result.Failed(100, "Add", ex)); } }
private async void OnDeleteFd(object sender, RoutedEventArgs e) { int selectedIndex = Grid.SelectedIndex; if (Grid.SelectedIndex > -1 && selectedIndex < this.FdApplianceRepo.FilteredItems.Count) { MessageBoxResult confirmResult = MessageBox.Show("Are you sure you want to delete the fusionDirector?", "Confirm", MessageBoxButton.YesNo, MessageBoxImage.Question); if (confirmResult == MessageBoxResult.Yes) { FdAppliance appliance = this.FdApplianceRepo.FilteredItems[Grid.SelectedIndex]; this.ActionResult = await this.FdApplianceRepo.Delete(appliance); if (!this.ActionResult.Success) { LogHelper.Error(this.ActionResult.Cause, $"Delete FusionDirector ({appliance.HostIP}) Faild:" + this.ActionResult.Message); MessageBox.Show(this.ActionResult.Message); } else { LogHelper.Info($"Delete FusionDirector ({appliance.HostIP}) Success."); } } } }
private async void OnTestBtnClicked(object sender, RoutedEventArgs e) { this.btnTest.IsEnabled = false; this.btnTest.Content = "Testing"; this.ActionResult = Result.Done(); FdAppliance appliance = new FdAppliance { HostIP = txtHost.Text, Port = txtPort.Text, AliasName = txtAlias.Text, LoginAccount = txtAccount.Text, LoginPd = txtPassword.Password, EventUserName = txtEventAccount.Text, EventPd = txtEventPassword.Password, }; this.ActionResult = await FdApplianceRepo.Test(appliance, true, UpdateCredentialChecked); this.btnTest.IsEnabled = true; this.btnTest.Content = "Test"; if (this.ActionResult.Success) { LogHelper.Info($"Test FusionDirector ({appliance.HostIP}) Success."); } else { LogHelper.Error(this.ActionResult.Cause, $"Test FusionDirector ({appliance.HostIP}) Faild:" + this.ActionResult.Message); } }
/// <summary> /// Updates the specified appliance. /// </summary> /// <param name="appliance">The appliance.</param> /// <param name="isUpdateCredential">是否修改了密码</param> /// <returns>Result.</returns> public async Task <Result> Update(FdAppliance appliance, bool isUpdateCredential) { return(await Task.Run(async() => { try { var obj = await this.FindByHost(appliance.HostIP); var exsitObj = obj.Data; if (exsitObj == null) { return Result.Failed(104, $"Fd {appliance.HostIP} can not find."); } var incrementalDiscoveryData = new IncrementalDiscoveryData(); var props = this.FdApplianceClass.PropertyCollection; exsitObj[props["AliasName"]].Value = appliance.AliasName; exsitObj[props["Port"]].Value = appliance.Port; exsitObj[props["LastModifyTime"]].Value = appliance.LastModifyTime; if (isUpdateCredential) { try { var eventAccount = exsitObj[props["EventUserName"]].Value as string; var eventPd = exsitObj[props["EventPd"]].Value as string; if (eventAccount != appliance.EventUserName || eventPd != appliance.EventPd) { using (var client = new FdClient(appliance)) { var res = await client.DeleteGivenSubscriptions(appliance.SubscribeId); LogHelper.Info($"Update Fd:DeleteGivenSubscriptions:{res.Code} {res.Message}"); // 取消订阅后重置订阅状态 exsitObj[props["SubscribeId"]].Value = string.Empty; exsitObj[props["SubscribeStatus"]].Value = string.Empty; exsitObj[props["LatestSubscribeInfo"]].Value = string.Empty; } } } catch (Exception ex) { LogHelper.Error("DeleteSubscriptions Faild", ex); } exsitObj[props["LoginAccount"]].Value = appliance.LoginAccount; exsitObj[props["LoginPd"]].Value = RijndaelManagedCrypto.Instance.EncryptForCs(appliance.LoginPd); exsitObj[props["EventUserName"]].Value = appliance.EventUserName; exsitObj[props["EventPd"]].Value = RijndaelManagedCrypto.Instance.EncryptForCs(appliance.EventPd); } incrementalDiscoveryData.Add(exsitObj); incrementalDiscoveryData.Overwrite(MGroup.Instance); return Result.Done(); } catch (Exception e) { return Result.Failed(100, $"Internal error caused by {e.Message}", e); } })); }
public void SetItem(FdAppliance item) { this.Item = item; // using binding instead? txtHost.Text = item.HostIP; txtAlias.Text = item.AliasName; txtPort.Text = item.Port; txtAccount.Text = item.LoginAccount; txtEventAccount.Text = item.EventUserName; // txtPassword.Password = item.LoginPd; }
/// <summary> /// Initializes a new instance of the <see cref="FdClient"/> class. /// </summary> /// <param name="fusionDirector">The e sight.</param> public FdClient(FdAppliance fusionDirector) { this.Appliance = fusionDirector; this.httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(5) }; this.httpClient.DefaultRequestHeaders.Add("Authorization", this.BaseAuthStr); ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return(sslPolicyErrors == SslPolicyErrors.None || sslPolicyErrors == SslPolicyErrors.RemoteCertificateNameMismatch); }; ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; }
public async Task <Result> Delete(FdAppliance appliance) { try { var deleteResult = await FdApplianceConnector.Instance.Delete(appliance); if (deleteResult.Success) { await this.LoadAll(); } return(deleteResult); } catch (Exception ex) { LogHelper.Error(ex, "Test"); return(Result.Failed(100, "Test", ex)); } }
internal async Task <Result> Test(FdAppliance appliance, bool isUpdate, bool isUpdateCredential) { try { var validateResult = Validate(appliance, isUpdate, isUpdateCredential); if (!validateResult.Success) { return(validateResult); } var client = new FdClient(appliance); return(await client.TestCredential()); } catch (Exception ex) { LogHelper.Error(ex, "Test"); return(Result.Failed(100, "Test", ex)); } }
/// <summary> /// Adds the specified appliance. /// </summary> /// <param name="appliance">The appliance.</param> /// <returns>Result.</returns> public async Task <Result> Add(FdAppliance appliance) { return(await Task.Run(() => { try { if (MGroup.Instance.Exsits(this.FdApplianceClass, $"HostIP='{appliance.HostIP}'")) { return Result.Failed(101, $"FusionDirector {appliance.HostIP} already exsits."); } var incrementalDiscoveryData = new IncrementalDiscoveryData(); // add appliance record var emoAppliance = new CreatableEnterpriseManagementObject(MGroup.Instance, this.FdApplianceClass); var props = this.FdApplianceClass.PropertyCollection; emoAppliance[props["UniqueId"]].Value = FusionDirectUniqueIdPrefix + Guid.NewGuid().ToString("D"); emoAppliance[props["HostIP"]].Value = appliance.HostIP; emoAppliance[props["AliasName"]].Value = appliance.AliasName; emoAppliance[props["LoginAccount"]].Value = appliance.LoginAccount; emoAppliance[props["LoginPd"]].Value = RijndaelManagedCrypto.Instance.EncryptForCs(appliance.LoginPd); emoAppliance[props["Port"]].Value = appliance.Port; emoAppliance[props["EventUserName"]].Value = appliance.EventUserName; emoAppliance[props["EventPd"]].Value = RijndaelManagedCrypto.Instance.EncryptForCs(appliance.EventPd); emoAppliance[props["SubscribeId"]].Value = appliance.SubscribeId; emoAppliance[props["SubscribeStatus"]].Value = appliance.SubscribeStatus; emoAppliance[props["LatestSubscribeInfo"]].Value = appliance.LatestSubscribeInfo; emoAppliance[props["LastModifyTime"]].Value = appliance.LastModifyTime; emoAppliance[props["CreateTime"]].Value = appliance.CreateTime; emoAppliance[this.DisplayNameField].Value = appliance.HostIP; incrementalDiscoveryData.Add(emoAppliance); incrementalDiscoveryData.Commit(MGroup.Instance); return Result.Done(); } catch (Exception e) { return Result.Failed(100, $"Internal error caused by {e.Message}", e); } })); }
/// <summary> /// Gets the model from mp object. /// </summary> /// <param name="managementObject">The management object.</param> /// <returns>FdAppliance.</returns> private FdAppliance GetModelFromMpObject(EnterpriseManagementObject managementObject) { var props = FdApplianceConnector.Instance.FdApplianceClass.PropertyCollection; var model = new FdAppliance(); model.HostIP = managementObject[props["HostIP"]].Value.ToString(); model.AliasName = managementObject[props["AliasName"]].Value.ToString(); model.LoginAccount = managementObject[props["LoginAccount"]].Value.ToString(); model.LoginPd = RijndaelManagedCrypto.Instance.DecryptFromCs(managementObject[props["LoginPd"]].Value.ToString()); model.Port = managementObject[props["Port"]].Value.ToString(); model.EventUserName = managementObject[props["EventUserName"]].Value.ToString(); model.EventPd = RijndaelManagedCrypto.Instance.DecryptFromCs(managementObject[props["EventPd"]].Value.ToString()); model.SubscribeId = managementObject[props["SubscribeId"]].Value.ToString(); model.SubscribeStatus = managementObject[props["SubscribeStatus"]].Value.ToString(); model.LatestSubscribeInfo = managementObject[props["LatestSubscribeInfo"]].Value.ToString(); model.LastModifyTime = Convert.ToDateTime(managementObject[props["LastModifyTime"]].Value.ToString()); model.CreateTime = Convert.ToDateTime(managementObject[props["CreateTime"]].Value.ToString()); return(model); }
private async void OnSaveBtnClicked(object sender, RoutedEventArgs e) { this.btnSave.IsEnabled = false; this.btnSave.Content = "Saving"; this.ActionResult = Result.Done(); FdAppliance appliance = new FdAppliance { HostIP = txtHost.Text, Port = txtPort.Text, AliasName = txtAlias.Text, LoginAccount = txtLoginAccount.Text, LoginPd = txtPassword.Password, EventUserName = txtEventAccount.Text,//使用后台生成的eventUserName EventPd = txtEventPassword.Password, SubscribeStatus = FdSubscriptionStatus.NotSubscribed, LatestSubscribeInfo = String.Empty, CreateTime = DateTime.Now, LastModifyTime = DateTime.Now }; LogHelper.Info($"Add FusionDirector:{appliance.Summary()})"); this.ActionResult = await FdApplianceRepo.Add(appliance); this.btnSave.IsEnabled = true; this.btnSave.Content = "Save"; if (this.ActionResult.Success) { LogHelper.Info($"Add FusionDirector ({appliance.HostIP}) Success."); this.Close(); } else { LogHelper.Error(this.ActionResult.Cause, $"Add FusionDirector ({appliance.HostIP}) Faild:" + this.ActionResult.Message); } }
/// <summary> /// 验证 /// </summary> /// <param name="appliance">appliance</param> /// <param name="isUpdate">是否是更新操作</param> /// <param name="isUpdateCredential">是否修改了密码</param> /// <returns></returns> public Result Validate(FdAppliance appliance, bool isUpdate, bool isUpdateCredential) { #region HostIP var hostIp = appliance.HostIP; if (string.IsNullOrEmpty(hostIp)) { return(Result.Failed(1000, "The FQDN or IP Address is required")); } IPAddress Address = null; var isValidIPAddr = IPAddress.TryParse(hostIp, out Address); if (!isValidIPAddr) //如果不是IP { if (Regex.IsMatch(hostIp.Replace(".", ""), @"^[0-9]*$")) //如果是纯数字,说明不是域名 { return(Result.Failed(1000, "Invalid FQDN or IP Address.")); } else { if (Uri.CheckHostName(hostIp) != UriHostNameType.Dns || !hostIp.Contains(".") || hostIp.EndsWith(".") || hostIp.StartsWith(".")) { return(Result.Failed(1000, "Invalid FQDN or IP Address.")); } } } #endregion #region Port if (string.IsNullOrEmpty(appliance.Port)) { return(Result.Failed(1001, "The port is required")); } int PortAsInt; var isNumeric = int.TryParse(appliance.Port, out PortAsInt); if (isNumeric) { if (PortAsInt < 1 || PortAsInt > 65535) { return(Result.Failed(1001, "The port must between 0 and 65535")); } } else { return(Result.Failed(1001, "The port must between 0 and 65535")); } #endregion if (isUpdateCredential || !isUpdate) { // Login Account if (string.IsNullOrEmpty(appliance.LoginAccount)) { return(Result.Failed(1001, "The LoginAccount is required")); } if (!Regex.IsMatch(appliance.LoginAccount, @"^[a-zA-Z0-9_\-\.]{1,100}$")) { return(Result.Failed(1001, "The loginAccount contains 1 to 100 characters, which can include letters, digits, hyphens (-), underscores (_), and periods (.).")); } // Login Password if (string.IsNullOrEmpty(appliance.LoginPd)) { return(Result.Failed(1001, "The password is required")); } // Event Password var regexEventPwd = new Regex(@" (?=.*[0-9]) #必须包含数字 (?=.*[a-z]) #必须包含小写字母 (?=.*[A-Z]) #必须包含大写字母 (?=([\x21-\x7e]+)[^a-zA-Z0-9]) #必须包含特殊符号 .{8,32} #至少8个字符,最多32个字符 ", RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace); if (string.IsNullOrEmpty(appliance.EventPd)) { return(Result.Failed(1001, "The event password is required")); } if (appliance.EventPd.Length > 32) { return(Result.Failed(1001, @"The event password must contain 8 to 32 characters.")); } if (!regexEventPwd.IsMatch(appliance.EventPd) || appliance.EventPd.Contains("#")) { return(Result.Failed(1001, @"The event password must contain 8 to 32 characters, and include: uppercase letters, lowercase letters, digits, and special characters including `~!@$%\^&*()_+-={}[]|;:"";'<,>.?")); } } return(Result.Done()); }