public void TestRemoveActiveSession() { var sessionModel = new ActiveSessionModel(); var model = new ActiveSessionsModel(); model.AddActiveSession(sessionModel); Assert.AreEqual(1, model.Sessions.Count); model.RemoveActiveSession(Guid.NewGuid()); Assert.AreEqual(1, model.Sessions.Count); model.RemoveActiveSession(sessionModel.UniqueKey); Assert.AreEqual(0, model.Sessions.Count); }
public ServerResponse <ActiveSessionModel> Connected(ActiveSessionModel activeSessionModel) { var id = HttpContext.Session.GetString(Constants.ClientSessionIdName); var response = new ServerResponse <ActiveSessionModel> { StausResult = StausResult.Successful }; if (string.IsNullOrEmpty(id)) { id = Guid.NewGuid().ToString(); HttpContext.Session.SetString(Constants.ClientSessionIdName, id); } try { if (activeSessionModel.StoredSessionModel != null) { ShellPool.AddShellToPool(id, activeSessionModel); response.Response = new ActiveSessionModel { StartSessionDate = DateTime.Now, Status = "Connected Successful", StoredSessionModel = activeSessionModel.StoredSessionModel, UniqueKey = activeSessionModel.UniqueKey }; } } catch (Exception ex) { response.StausResult = StausResult.Exception; response.ExtraMessage = ex.Message; } return(response); }
public ServerActiveSessionModel Connected(ActiveSessionModel activeSessionModel, ShellConfiguration shellConfiguration) { SshClient sshClient = null; ShellStream shellStream = null; try { var timeOutMinutes = shellConfiguration.MaxIdleMinutes < 1 ? 1 : shellConfiguration.MaxIdleMinutes > 20 ? 20 : shellConfiguration.MaxIdleMinutes; var clientStoredSessionModel = activeSessionModel.StoredSessionModel; sshClient = new SshClient(clientStoredSessionModel.Host, clientStoredSessionModel.Port, clientStoredSessionModel.UserName, clientStoredSessionModel.PasswordDecryped); sshClient.ConnectionInfo.Timeout = TimeSpan.FromMinutes(timeOutMinutes); sshClient.Connect(); shellStream = sshClient.CreateShellStream("Terminal", 80, 30, 800, 400, 1000); var outputQueue = new ConcurrentQueue <string>(); var sessionModel = new ServerActiveSessionModel { Status = "Connected", UniqueKey = activeSessionModel.UniqueKey, ShellStream = shellStream, Client = sshClient, StartSessionDate = DateTime.Now, LastAccessSessionDate = DateTime.Now, StoredSessionModel = clientStoredSessionModel, OutputQueue = outputQueue }; string result = null; while ((result = sessionModel.ShellStream.ReadLine(TimeSpan.FromSeconds(0.3))) != null) { outputQueue.Enqueue(result + Constants.NewLineForShell); } outputQueue.Enqueue(sessionModel.ShellStream.Read()); shellStream.DataReceived += (obj, e) => { try { outputQueue.Enqueue(Encoding.UTF8.GetString(e.Data)); if (outputQueue.Count > Constants.MaxinumQueueCount) { outputQueue.TryDequeue(out _); } } catch (Exception ex) { outputQueue.Enqueue(ex.Message); } }; AddActiveSession(sessionModel); sshClient.ErrorOccurred += SshClient_ErrorOccurred; return(sessionModel); } catch { shellStream?.Dispose(); sshClient?.Dispose(); throw; } }