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));
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Deletes the specified appliance.
        /// </summary>
        /// <param name="appliance">The appliance.</param>
        /// <returns>Task&lt;Result&gt;.</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);
                }
            }));
        }
Exemplo n.º 3
0
        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.");
                    }
                }
            }
        }
Exemplo n.º 6
0
        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);
            }
        }
Exemplo n.º 7
0
        /// <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);
                }
            }));
        }
Exemplo n.º 8
0
 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));
            }
        }
Exemplo n.º 12
0
        /// <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());
        }