File: clRemoteTerminal.cpp

package info (click to toggle)
codelite 17.0.0%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 136,244 kB
  • sloc: cpp: 491,547; ansic: 280,393; php: 10,259; sh: 8,930; lisp: 7,664; vhdl: 6,518; python: 6,020; lex: 4,920; yacc: 3,123; perl: 2,385; javascript: 1,715; cs: 1,193; xml: 1,110; makefile: 804; cobol: 741; sql: 709; ruby: 620; f90: 566; ada: 534; asm: 464; fortran: 350; objc: 289; tcl: 258; java: 157; erlang: 61; pascal: 51; ml: 49; awk: 44; haskell: 36
file content (84 lines) | stat: -rw-r--r-- 2,330 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include "clRemoteTerminal.hpp"

#include "asyncprocess.h"
#include "environmentconfig.h"
#include "file_logger.h"
#include "globals.h"

#include <wx/tokenzr.h>

clRemoteTerminal::clRemoteTerminal(const SSHAccountInfo& account)
    : m_account(account)
{
    m_tty_file << "/tmp/remoty-" << ::clGetUserName() << "-tty";
}

clRemoteTerminal::~clRemoteTerminal() { wxDELETE(m_proc); }

bool clRemoteTerminal::Start()
{
    if(m_proc) {
        return true;
    }

    // wrap the command in ssh
    wxFileName ssh_exe;
    EnvSetter setter;
    if(!FileUtils::FindExe("ssh", ssh_exe)) {
        clERROR() << "Could not locate ssh executable in your PATH!" << endl;
        return false;
    }

    std::vector<wxString> command = { "ssh", "-o", "ServerAliveInterval=10", "-o", "StrictHostKeyChecking=no" };
    command.push_back(m_account.GetUsername() + "@" + m_account.GetHost());
    command.push_back("-t");
    command.push_back("-p");
    command.push_back(wxString() << m_account.GetPort());
    wxString ssh_cmd;
    ssh_cmd << "tty > " << m_tty_file << " 2>/dev/null && sleep 10000";
    command.push_back(ssh_cmd);

    m_proc = ::CreateAsyncProcess(nullptr, command, IProcessCreateConsole | IProcessNoRedirect | IProcessWrapInShell);
    return m_proc != nullptr;
}

void clRemoteTerminal::Stop()
{
    wxDELETE(m_proc);
    m_tty.clear();
    m_tty_file.clear();
}

const wxString& clRemoteTerminal::ReadTty()
{
    static wxString empty_string;
    // wrap the command in ssh
    wxFileName ssh_exe;
    EnvSetter setter;
    if(!FileUtils::FindExe("ssh", ssh_exe)) {
        clERROR() << "Could not locate ssh executable in your PATH!" << endl;
        return empty_string;
    }

    std::vector<wxString> command = { "cat", m_tty_file };
    IProcess::Ptr_t proc(::CreateAsyncProcess(this, command, IProcessCreateSSH | IProcessCreateSync, wxEmptyString,
                                              nullptr, m_account.GetAccountName()));

    wxString output;
    if(!proc) {
        m_tty.Clear();
        return m_tty;
    }
    proc->WaitForTerminate(output);

    m_tty.clear();
    auto arr = ::wxStringTokenize(output, "\n", wxTOKEN_STRTOK);
    for(auto s : arr) {
        s.Trim().Trim(false);
        if(s.StartsWith("/dev")) {
            m_tty = s;
            break;
        }
    }
    return m_tty;
}