private bool UploadConfigStateMachineAsync(NetworkDevice nDevice) { //NetworkDevice _netDevice = nDevice; int State = 0; while (State < 6) { switch (State) { case 0: // Пингуем в цикле коммутатор по дефолтному адресу пока коммутатор не ответит на пинг if (SendPing(DefaultIP)) { State = 1; } break; case 1: // Пытаемся в цикле подключиться по Telenet (сервер Telnet загружается через некоторое время после успешного пинга) if (_telnetSender.CreateConnection(DefaultIP, _telnetPort, DefaultLogin, DefaultPassword)) { State = 2; } break; case 2: // Заливаем первую часть конфига в коммутатор по Telnet _telnetSender.Send(nDevice, GetSettingsDict()); // Закрываем Telnet соединение _telnetSender.CloseConnection(); State = 3; break; case 3: // Пытаемся в цикле подключиться к SSH-серверу if (_sshSender.CreateConnection(nDevice.AddressIP, _sshPort, NewLogin, NewPassword)) { State = 4; } break; case 4: // Заливаем вторую часть конфига по SSH-протоколу _sshSender.Send(nDevice, GetSettingsDict()); // Закрываем SSH-соединение _sshSender.CloseConnection(); State = 5; break; case 5: // Пингуем в цикле коммутатор по новому IP-адресу (как только пинг пропал - коммутатор отключили) if (!SendPing(nDevice.AddressIP)) { State = 6; } break; case 6: break; default: break; } // Go to пункт 1 } return(true); }
public bool UploadConfigStateMachine(EthernetSwitch switchDevice, Dictionary <string, string> settings, CancellationToken token) { MessageToConsole("Waiting device..."); Dictionary <string, string> _sDict = settings; int State = 0; bool IsSendComplete = false; while (State < 6 && !token.IsCancellationRequested) { switch (State) { case 0: // Пингуем в цикле коммутатор по дефолтному адресу пока коммутатор не ответит на пинг MessageForUser("Ожидание" + "\r\n" + "коммутатора"); if (SendMultiplePing(_sDict["DefaultIPAddress"], repitNumer)) { State = 1; } break; case 1: // Пытаемся в цикле подключиться по Telnet (сервер Telnet загружается через некоторое время после успешного пинга) if (_telnetSender.CreateConnection(_sDict["DefaultIPAddress"], _telnetPort, _sDict["DefaultAdminLogin"], _sDict["DefaultAdminPassword"], null)) { State = 2; } break; case 2: // Заливаем первую часть конфига в коммутатор по Telnet MessageToConsole("Заливаем первую часть конфига в коммутатор по Telnet."); _telnetSender.Send(switchDevice, _sDict); // Закрываем Telnet соединение _telnetSender.CloseConnection(); State = 3; break; case 3: // Пытаемся в цикле подключиться к SSH-серверу if (_sshSender.CreateConnection(switchDevice.AddressIP, _sshPort, _sDict["NewAdminLogin"], _sDict["NewAdminPassword"], RSAfile)) { State = 4; } break; case 4: // Заливаем вторую часть конфига по SSH-протоколу MessageToConsole("Заливаем вторую часть конфига по SSH-протоколу."); _sshSender.Send(switchDevice, _sDict); // Закрываем SSH-соединение _sshSender.CloseConnection(); MessageToConsole("Заливка конфига в коммутатор завершена."); State = 5; break; case 5: // Пингуем в цикле коммутатор по новому IP-адресу (как только пинг пропал - коммутатор отключили) MessageForUser("Замени" + "\r\n" + "коммутатор!"); if (!SendMultiplePing(switchDevice.AddressIP, repitNumer)) { State = 6; } break; case 6: IsSendComplete = true; break; default: break; } Thread.Sleep(100); // Слишком часто коммутатор лучше не долбить (может воспринять как атаку) // Go to state 0 } return(IsSendComplete); }