Пример #1
0
        //многопоточный вариант обхода и сбора конфигураций с устройств по задаче
        #region TASK PARALLEL USAGE
        //возможен конфликт при параллельной вставке данных
        //требуется протестировать
        private void LoadConfigurationThread(int taskId)
        {
            using (RconfigContext context = new RconfigContext())
            {
                var task = (from c in context.RemoteTasks
                            where c.Id == taskId
                            select c).FirstOrDefault();

                if (task != null)
                {
                    List<Task> taskRunnerManager = new List<Task>();
                    //таймер
                    DateTime starTime = DateTime.Now;
                    try
                    {
                        Logging(string.Format("TASK {0} started... THREADING", taskId));
                        //если количество избранных равна нулю коэффициент ожидания равен 1
                        //int waiter = (task.Favorites.Count>0) ? task.Favorites.Count : 1;
                        foreach (Favorite fav in task.Favorites)
                        {                            
                            List<string> commands = new List<string>();
                            //проходим по списку команд, выявляем соответствие используемой команды и категории избранного               
                            foreach (Command command in task.Commands.OrderBy(c => c.Order))
                            {
                                foreach (Category category in command.Categories)
                                {
                                    if (fav.Category.CategoryName == category.CategoryName)
                                    {
                                        commands.Add(command.Name);
                                    }
                                }
                            }
                            //многопоточность
                            //устанавливаем соединение
                            FavoriteTask connect = new FavoriteTask();
                            connect.Commands = commands;
                            connect.FavoriteId = fav.Id;
                            connect.TaskId = task.Id;
                            
                            //создаем задачу и добавляем ее в менеджер
                            Task taskRunner = Task.Factory.StartNew(() =>
                                ConnectionThread(connect));
                            taskRunnerManager.Add(taskRunner);
                        }                        
                        //дожидаемся пока выполняться все задания                       
                        Task.WaitAll(taskRunnerManager.ToArray());
                    }
                    catch (Exception ex)
                    {
                        //логгирование
                        Logging(string.Format("TASK {0} failed!!! Exception: {1}", taskId, ex.StackTrace));
                    }
                    finally
                    {
                        //таймер
                        DateTime endTime = DateTime.Now;
                        TimeSpan diffSpan = endTime-starTime;
                        Logging(string.Format("TASK {0} finished in {1} seconds ", taskId, diffSpan.Seconds));
                        //************************************************************
                        //создаем событие и уведомляем о том, что все задачи выполнены
                        taskCompleted();
                    }
                }
                else
                {
                    //записать в логи провал
                    Logging(string.Format("TASK {0} failed!!! Not correct task ID!!!", taskId));
                }
            }
        }
Пример #2
0
        //многопоточный вариант обхода и сбора конфигураций с устройств по задаче
        #region TASK PARALLEL USAGE
        //возможен конфликт при параллельной вставке данных
        //требуется протестировать
        private void LoadConfigurationThread(int taskId)
        {
            using (RconfigContext context = new RconfigContext())
            {
                var task = (from c in context.RemoteTasks
                            where c.Id == taskId
                            select c).FirstOrDefault();

                if (task != null)
                {
                    List <Task> taskRunnerManager = new List <Task>();
                    try
                    {
                        Logging(string.Format("TASK {0} started... THREADING", taskId));
                        //если количество избранных равна нулю коэффициент ожидания равен 1
                        //int waiter = (task.Favorites.Count>0) ? task.Favorites.Count : 1;
                        foreach (Favorite fav in task.Favorites)
                        {
                            List <string> commands = new List <string>();
                            //проходим по списку команд, выявляем соответствие используемой команды и категории избранного
                            foreach (Command command in task.Commands.OrderBy(c => c.Order))
                            {
                                foreach (Category category in command.Categories)
                                {
                                    if (fav.Category.CategoryName == category.CategoryName)
                                    {
                                        commands.Add(command.Name);
                                    }
                                }
                            }
                            //мультипоточность
                            //устанавливаем соединение
                            FavoriteTask connect = new FavoriteTask();
                            connect.Commands   = commands;
                            connect.FavoriteId = fav.Id;
                            connect.TaskId     = task.Id;

                            //создаем задачу и добавляем ее в менеджер
                            Task taskRunner = Task.Factory.StartNew(() =>
                                                                    ConnectionThread(connect));
                            taskRunnerManager.Add(taskRunner);
                        }
                        //дожидаемся пока выполняться все задания
                        Task.WaitAll(taskRunnerManager.ToArray());
                        //************************************************************
                        //создаем событие и уведомляем о том, что все задачи выполнены
                        taskCompleted();
                    }
                    catch (Exception ex)
                    {
                        //логгирование
                        Logging(string.Format("TASK {0} failed!!! Exception: {1}", taskId, ex.Message));
                    }
                }
                else
                {
                    //записать в логи провал
                    Logging(string.Format("TASK {0} failed!!! Not correct task ID!!!", taskId));
                }
            }
        }
Пример #3
0
        //проблема с многопоточностью
        //создаем новый контекст для каждого потока
        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));
            }

        }
Пример #4
0
        //проблема с многопоточностью
        //создаем новый контекст для каждого потока
        private void ConnectionThread(FavoriteTask favConnect)
        {
            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;
                //по типу протоколу выбираем требуемое подключение
                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();
                }
            }
        }