예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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;
            }
        }