/// <summary> /// Добавление сессии к пользователю и поппытка присоединения /// </summary> /// <param name="connectionInfo">Информация дл подключения к устройству.</param> /// <returns>Успешность выполнения операции</returns> public OperationResult TryAddSessionUserAndConnect(ClientConnectionInfo connectionInfo) { var sshClient = new SshClient(connectionInfo.Host, connectionInfo.Port, connectionInfo.UserName, connectionInfo.Password);; ShellStream?shellStream = null; try { sshClient.ConnectionInfo.Timeout = TimeSpan.FromMinutes(10); sshClient.Connect(); shellStream = sshClient.CreateShellStream("Terminal", 80, 30, 800, 400, 1000); var sessionModel = new Session { Status = "Connected", UniqueKey = connectionInfo.UniqueKey, ShellStream = shellStream, SshClient = sshClient, StartSessionDate = DateTime.Now, LastAccessSessionDate = DateTime.Now, StoredSessionModel = connectionInfo, OnLineReceive = OnLineReceived, OnTerminalError = OnTerminalError }; string?result; while ((result = sessionModel.ShellStream.ReadLine(TimeSpan.FromSeconds(0.3))) != null) { sessionModel.OnLineReceive?.Invoke( new OperationResult( OperationResultStatus.NoError, result + Environment.NewLine, sessionModel.UniqueKey)); } //sessionModel.Lines.TryAdd(sessionModel.ShellStream.Read()); shellStream.DataReceived += (obj, e) => { try { var data = Encoding.UTF8.GetString(e.Data); sessionModel.OnLineReceive?.Invoke( new OperationResult(OperationResultStatus.NoError, data, sessionModel.UniqueKey)); } catch (Exception ex) { //sessionModel.Lines.TryAdd($"An error occurred while receiving data: {ex.Message}"); sessionModel.OnTerminalError?.Invoke( new OperationResult( OperationResultStatus.ReceiveDataError, $"An error occurred while receiving data: {ex.Message}", sessionModel.UniqueKey)); } }; AddActiveSession(sessionModel); sshClient.ErrorOccurred += (obj, e) => { if (obj is SshClient sshClientInner) { if (sshClientInner.IsConnected) { sessionModel.OnTerminalError?.Invoke(new OperationResult( OperationResultStatus.SessionError, $"Session error: {e.Exception.Message}", sessionModel.UniqueKey)); } } RemoveSession(sessionModel.UniqueKey); }; var connectResult = new OperationResult( OperationResultStatus.NoError, string.Empty, sessionModel.UniqueKey); return(connectResult); } catch (Exception ex) { shellStream?.Dispose(); sshClient?.Dispose(); return(new OperationResult( OperationResultStatus.ConnectionError, ex.Message, Guid.Empty)); } }
void AddActiveSession(Session session) { Sessions.TryAdd(session.UniqueKey, session); }