//проблема с многопоточностью //создаем новый контекст для каждого потока private void ConnectionThread(FavoriteTask favConnect) { try { using (RconfigContext ctx = new RconfigContext()) { var task = (from c in ctx.RemoteTasks where c.Id == favConnect.TaskId select c).Single(); List<string> commands = favConnect.Commands; Favorite fav = (from c in ctx.Favorites where c.Id == favConnect.FavoriteId select c).Single(); //данные для подключения к сетевому устройству ConnectionData data = new ConnectionData(); data.address = fav.Address; data.port = fav.Port; data.username = fav.Credential.Username; data.password = fav.Credential.Password; data.enableMode = fav.Category.EnableModeRequired; data.enablePassword = fav.Credential.EnablePassword; data.anonymousLogin = fav.Category.AnonymousLogin; data.timeOut = fav.TimeOut; //по типу протоколу выбираем требуемое подключение string protocol = fav.Protocol.Name; Expect.Expect expect; switch (protocol) { case "Telnet": expect = new TelnetMintExpect(data); break; case "SSH": expect = new SshExpect(data); break; //по умолчанию для сетевых устройств протокол Telnet default: expect = new TelnetMintExpect(data); break; } //если объект expect успешно создан if (expect != null) { //выполняем список команд expect.ExecuteCommands(commands); string result = expect.GetResult(); bool success = expect.isSuccess; string error = expect.GetError(); //если успешно сохраняем конфигурацию устройства if (success) { Config config = new Config(); config.Current = result ?? "Empty"; config.Date = DateTime.Now; fav.Configs.Add(config); Logging(string.Format("TASK {0} : success connection for {0} {1}", _taskId, fav.Hostname, fav.Address)); } else { Logging(string.Format("TASK {0} : failed connection for {0}: {1}", _taskId, fav.Hostname, fav.Address)); } //создаем отчет о проделанном задании Report report = new Report(); report.Date = DateTime.Now; report.Status = success; report.Info = error; report.Task = task; report.Favorite = fav; ctx.Reports.Add(report); ctx.SaveChanges(); } } } catch (Exception ex) { //логгирование Logging(string.Format("TASK {0} failed!!! Exception: {1}", _taskId, ex.StackTrace)); } }
//исполнение команды для устройства private void Connection(FavoriteConnect favConnect) { RemoteTask task = favConnect.task; List<string> commands = favConnect.commands; Favorite fav = favConnect.favorite; //данные для подключения к сетевому устройству ConnectionData data = new ConnectionData(); data.address = fav.Address; data.port = fav.Port; data.username = fav.Credential.Username; data.password = fav.Credential.Password; data.enableMode = fav.Category.EnableModeRequired; data.enablePassword = fav.Credential.EnablePassword; data.anonymousLogin = fav.Category.AnonymousLogin; //по типу протоколу выбираем требуемое подключение string protocol = fav.Protocol.Name; Expect.Expect expect; switch (protocol) { case "Telnet": expect = new TelnetMintExpect(data); break; case "SSH": expect = new SshExpect(data); break; //по умолчанию для сетевых устройств протокол Telnet default: expect = new TelnetMintExpect(data); break; } //если объект expect успешно создан if (expect != null) { //выполняем список команд expect.ExecuteCommands(commands); //если возвращает пустую строку, то выдает исключение string result = expect.GetResult(); bool success = expect.isSuccess; string error =expect.GetError(); //если успешно сохраняем конфигурацию устройства if (success) { Config config = new Config(); config.Current = result ?? "Empty";//если строка пустая, вернуть Empty config.Date = DateTime.Now; fav.Configs.Add(config); Logging(string.Format("TASK {0} : success connection for {0} {1}", _taskId, fav.Hostname, fav.Address)); } else { Logging(string.Format("TASK {0} : failed connection for {0} {1}!!!", _taskId, fav.Hostname, fav.Address)); } //создаем отчет о проделанном задании Report report = new Report(); report.Date = DateTime.Now; report.Status = success; report.Info = error; report.Task = task; report.Favorite = fav; _context.Reports.Add(report); _context.SaveChanges(); } }
//подключение к сетевому устройству private string Connection(List<string> commands) { string resultStr = string.Empty; try { using (RconfigContext context = new RconfigContext()) { var fav = (from c in context.Favorites where c.Hostname == _favName select c).Single(); if (fav != null) { //данные для подключения к сетевому устройству ConnectionData data = new ConnectionData(); data.address = fav.Address; data.port = fav.Port; data.username = fav.Credential.Username; data.password = fav.Credential.Password; data.enableMode = fav.Category.EnableModeRequired; data.enablePassword = fav.Credential.EnablePassword; data.anonymousLogin = fav.Category.AnonymousLogin; data.timeOut = fav.TimeOut; //по типу протоколу выбираем требуемое подключение string protocol = fav.Protocol.Name; Expect.Expect expect; switch (protocol) { case "Telnet": expect = new TelnetMintExpect(data); break; case "SSH": expect = new SshExpect(data); break; //по умолчанию для сетевых устройств протокол Telnet default: expect = new TelnetMintExpect(data); break; } // richTextBoxConfig.Text += "Device configuration checked..."+Environment.NewLine; //если объект expect успешно создан if (expect != null) { //выполняем список команд expect.ExecuteCommands(commands); string result = expect.GetResult(); bool success = expect.isSuccess; string error = expect.GetError(); //если успешно сохраняем конфигурацию устройства if (success && !string.IsNullOrWhiteSpace(result)) { //richTextBoxConfig.Text= "SUCCESS: " + result; //DialogResult dialogResult = MessageBox.Show("Do you want to save this configuration to database?!","Confirmation", MessageBoxButtons.OKCancel, MessageBoxIcon.Question); ////предупредить пользователя, что единовременный сбор конфигурации не будет храниться в базе данных ////затем сделать сбор конфигурации //if (dialogResult == DialogResult.OK) //{ // Config config = new Config(); // config.Current = result ?? "Empty"; // config.Date = DateTime.Now; // fav.Configs.Add(config); // context.SaveChanges(); //} return result; } else if (success && string.IsNullOrWhiteSpace(result)) { //richTextBoxConfig.Text= "Output is empty! Something wrong with device configuration. Please check!"; return "Output is empty! Something wrong with device configuration. Please check!"; } else { //richTextBoxConfig.Text= "FAILED: " + error; return "FAILED: " + error; } } } } } catch (Exception e) { return e.StackTrace; } return resultStr; }