finish develop

This commit is contained in:
lnk
2025-03-05 17:47:47 +08:00
parent 1df5385fc9
commit 28811fbae7
6 changed files with 422 additions and 349 deletions

View File

@@ -120,6 +120,22 @@ void doMonitorTaskmain(void);
}
#endif
// ====================== Telnet <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ======================
// Telnet <20><><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>:
#define IAC 255 // Interpret As Command
#define DONT 254
#define TELDO 253
#define WONT 252
#define WILL 251
// Telnet ѡ<><EFBFBD><EEB3A3>:
#define TELOPT_ECHO 1 // <20><><EFBFBD><EFBFBD>
#define TELOPT_SUPPRESS_GO_AHEAD 3 // SGA
#define TELOPT_LINEMODE 34 // <20><>ģʽ
/**
* @brief Worker<65><EFBFBD><E0A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Telnet<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD>
*/
class Worker : public QObject
{
Q_OBJECT
@@ -142,16 +158,18 @@ public:
}
void handleViewLogCommand(const QString& command, QTcpSocket* clientSocket);
public slots:
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void startServer() {
if (server) {
qDebug() << "Server is already running!";
return; // <20><>ֹ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
// <20><><EFBFBD><EFBFBD> QTcpServer <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD>
server = new QTcpServer(this);
connect(server, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
@@ -172,15 +190,19 @@ public slots:
connect(timer, SIGNAL(timeout()), this, SLOT(doPeriodicTask()));
timer->start(60000); // ÿ60<36><EFBFBD><EBB4A5>һ<EFBFBD><D2BB>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD><DABA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BBBB><EFBFBD>̵߳ļ<CCB5><C4BC><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵߳ļ<EFBFBD><EFBFBD><EFBFBD>
QTimer *monitorTimer = new QTimer(this);
connect(monitorTimer, SIGNAL(timeout()), this, SLOT(doMonitorTask()));
monitorTimer->start(1000); // ÿ1<C3BF><EFBFBD><EBB4A5>һ<EFBFBD><D2BB>
std::cout << "Timer started, event loop running in thread: " << QThread::currentThreadId() << std::endl;
std::cout << "Timer started, event loop running in thread: "
<< QThread::currentThreadId() << std::endl;
qDebug() << "Timer started, event loop running in thread:" << QThread::currentThreadId();
}
/**
* @brief ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void stopServer() {
// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
if (server) {
@@ -199,12 +221,18 @@ public slots:
}
}
/**
* @brief <20><><EFBFBD><EFBFBD>TEST_NUM
*/
void setTestNum(int num) {
QMutexLocker locker(&mutex);
TEST_NUM = num;
}
private slots:
/**
* @brief <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
*/
void doPeriodicTask() {
QMutexLocker locker(&mutex);
std::cout << "Executing TEST_NUM is " << TEST_NUM << std::endl;
@@ -217,10 +245,16 @@ private slots:
}
}
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void doMonitorTask() {
doMonitorTaskmain();
}
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD>¿ͻ<C2BF><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
*/
void onNewConnection() {
if (!server) return;
@@ -228,22 +262,24 @@ private slots:
qDebug() << "New connection established!";
std::cout << "New connection established!\n";
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿɶ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> onReadyRead()
// <20><><EFBFBD><EFBFBD> readyRead / disconnected
connect(clientSocket, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
// <20><><EFBFBD>ͻ<EFBFBD><CDBB>˶Ͽ<CBB6>ʱ<EFBFBD><CAB1><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD> socket
connect(clientSocket, SIGNAL(disconnected()), clientSocket, SLOT(deleteLater()));
// <20><><EFBFBD>ͻ<EFBFBD><EFBFBD>˷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> Telnet Э<EFBFBD><EFBFBD>
sendTelnetNegotiation(clientSocket);
// <20><><EFBFBD>ͻ<EFBFBD>ӭ<EFBFBD><D3AD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>
if (clientSocket) {
std::cout << "clientSocket OK\n";
clientSocket->write("Welcome to the test shell. Type 'help' for available commands.\n> ");
clientSocket->flush(); // ȷ<><C8B7><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
clientSocket->write("\r\x1B[K");
clientSocket->write("Welcome to the test shell. Type 'help' for available commands.\r\n");
printPrompt(clientSocket); // ͳһ<CDB3><D2BB>ӡ<EFBFBD><D3A1>ʾ<EFBFBD><CABE>
}
}
/**
* @brief <20><><EFBFBD>ֽڴ<EFBFBD><EFBFBD><EFBFBD>Telnet<EFBFBD><EFBFBD><EFBFBD>룬ʶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>)<29><><EFBFBD>˸񡢻س<F1A1A2BB><D8B3><EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD>»س<C2BB>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊһ<CEAA><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEBDBB> processCommand <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @brief <20><><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><EFBFBD>˷<EFBFBD><EFBFBD>͵<EFBFBD>Telnet<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void onReadyRead() {
QTcpSocket *clientSocket = qobject_cast<QTcpSocket *>(sender());
@@ -253,72 +289,87 @@ private slots:
}
QByteArray data = clientSocket->readAll();
// <20><><EFBFBD>ֽڴ<D6BD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < data.size(); ++i) {
char c = data[i];
unsigned char c = static_cast<unsigned char>(data[i]);
if (c == 'q') { // ? <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD> `q` <20>˳<EFBFBD> `viewlog`
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽ IAC(255)<29><>˵<EFBFBD><CBB5><EFBFBD><EFBFBD> Telnet Э<><D0AD>ָ<EFBFBD><D6B8>
if (c == IAC) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TELDO/DONT/WILL/WONT + option
if (i + 1 < data.size()) {
unsigned char cmd = static_cast<unsigned char>(data[i+1]);
if (cmd == TELDO || cmd == DONT || cmd == WILL || cmd == WONT) {
i += 2; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>ֽ<EFBFBD>
} else {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>IAC SB)<29><><EFBFBD>˴<EFBFBD><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>
i += 1;
}
}
continue;
}
// 1) <20><><EFBFBD><EFBFBD> 'q' <20>˳<EFBFBD> viewlog
if (c == 'q') {
std::cout << "Received 'q' from shell socket! Exiting viewlog...\n";
if (activeClient == clientSocket) {
stopViewLog = true; // ? <20><> `viewlog` <20>˳<EFBFBD>
clientSocket->write("\nLog view stopped. Returning to shell.\n> ");
stopViewLog = true;
clientSocket->write("\r\x1B[K");
clientSocket->write("\r\nLog view stopped. Returning to shell.\r\n");
printPrompt(clientSocket);
}
return;
}
// 2) <20>س<EFBFBD><D8B3><EFBFBD><EFBFBD>У<EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (c == '\r' || c == '\n') {
if (!currentCommand.isEmpty()) {
// <20>ӵ<EFBFBD><D3B5><EFBFBD>ʷ
if (commandHistory.isEmpty() || commandHistory.last() != currentCommand) {
commandHistory.append(currentCommand);
}
historyIndex = commandHistory.size();
// ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>հ<EFBFBD>
//QString trimmedCmd = currentCommand.trimmed();
currentCommand.remove(0, 1);
processCommand(currentCommand, clientSocket);
currentCommand.clear();
} else {
// <20><><EFBFBD><EFBFBD> => <20><><EFBFBD><EFBFBD>ӡ<EFBFBD>µ<EFBFBD><C2B5><EFBFBD>ʾ<EFBFBD><CABE>
printPrompt(clientSocket);
}
continue;
}
// 3) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (c == '\x1b') {
if (i + 2 < data.size() && data[i+1] == '[') {
char arrow = data[i+2];
if (arrow == 'A') {
handleUpArrow(clientSocket);
} else if (arrow == 'B') {
handleDownArrow(clientSocket);
}
i += 2;
}
continue;
}
// 4) <20>˸<EFBFBD><CBB8><EFBFBD>
if (c == '\x7f' || c == '\b') {
if (!currentCommand.isEmpty()) {
currentCommand.chop(1);
// <20><><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>
clientSocket->write("\b \b");
clientSocket->flush();
}
return; // ? <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
}
switch (c) {
case '\r':
case '\n':
// ? <20><><EFBFBD><EFBFBD><EFBFBD>س<EFBFBD><D8B3><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (!currentCommand.isEmpty()) {
if (commandHistory.isEmpty() || commandHistory.last() != currentCommand) {
commandHistory.append(currentCommand);
}
historyIndex = commandHistory.size(); // ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>֮<EFBFBD><D6AE>
processCommand(currentCommand, clientSocket);
currentCommand.clear();
} else {
clientSocket->write("\n> ");
clientSocket->flush();
}
break;
case '\x1b':
// ? <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28>ϼ<EFBFBD>ͷ `\x1b[A`<60><><EFBFBD>¼<EFBFBD>ͷ `\x1b[B`)
if (i + 2 < data.size() && data[i+1] == '[') {
char arrow = data[i+2];
if (arrow == 'A') {
handleUpArrow(clientSocket); // **<2A><><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>**
} else if (arrow == 'B') {
handleDownArrow(clientSocket); // **<2A><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>**
}
i += 2; // ? **<2A><><EFBFBD><EFBFBD> ESC <20><><EFBFBD><EFBFBD> `\x1b[A` <20><> `\x1b[B`**
continue;
}
break;
case '\x7f':
case '\x08':
// ? <20><><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD><CBB8><EFBFBD>
if (!currentCommand.isEmpty()) {
currentCommand.chop(1);
clientSocket->write("\b \b");
clientSocket->flush();
}
break;
default:
// ? <20><>ͨ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>׷<EFBFBD>ӵ<EFBFBD> `currentCommand`
currentCommand.append(c);
clientSocket->write(&c, 1);
clientSocket->flush();
break;
continue;
}
// 5) <20><>ͨ<EFBFBD>ַ<EFBFBD>
currentCommand.append(static_cast<char>(c));
clientSocket->write((const char*)&c, 1);
clientSocket->flush();
}
}
@@ -326,195 +377,176 @@ signals:
void serverError();
private:
// ====================== <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD> =========================
bool stopViewLog; // ? <20><><EFBFBD><EFBFBD><EFB2BB>Ҫ static<69><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF> client
QTcpSocket* activeClient; // <20><>¼<EFBFBD><C2BC>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD> `viewlog` <20>Ŀͻ<C4BF><CDBB><EFBFBD>
// ========== Telnet Э<>̺<EFBFBD><CCBA><EFBFBD> ==========
void sendTelnetNegotiation(QTcpSocket *socket)
{
// <20><><EFBFBD><EFBFBD> WILL ECHO / WILL SUPPRESS-GO-AHEAD / DONT LINEMODE
static const unsigned char will_echo[3] = { IAC, WILL, TELOPT_ECHO };
static const unsigned char will_sga[3] = { IAC, WILL, TELOPT_SUPPRESS_GO_AHEAD };
static const unsigned char dont_linemode[3] = { IAC, DONT, TELOPT_LINEMODE };
// --------------------
// <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// --------------------
socket->write(reinterpret_cast<const char*>(will_echo), 3);
socket->write(reinterpret_cast<const char*>(will_sga), 3);
socket->write(reinterpret_cast<const char*>(dont_linemode), 3);
socket->flush();
}
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>)<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> onReadyRead() <20><><EFBFBD><EFBFBD> if-else <20><><EFBFBD>߼<EFBFBD>
* @brief <20><>ӡ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳһʹ<EFBFBD><EFBFBD>\r\n<EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҵ<EFBFBD>ӡ"> "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void processCommand(const QString &command, QTcpSocket *clientSocket) {
// <20><>ӡ<EFBFBD><D3A1>־
qDebug() << "Received command:" << command;
std::cout << "Received command: " << command.toStdString() << "\n";
// <20><><EFBFBD><EFBFBD>Ϊԭ<CEAA><D4AD> onReadyRead() <20>е<EFBFBD> if / else if <20><><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD>
// ------------------------------------------------------
if (command == "help") {
QString helpText = "Available commands:\n";
helpText += "TEST_NUM=<num> - Set the TEST_NUM\n";
helpText += "rc - Execute rocketmq_test_rc\n";
helpText += "rt - Execute rocketmq_test_rt\n";
helpText += "ud - Execute rocketmq_test_ud\n";
helpText += "set - Execute rocketmq_test_set\n";
helpText += "only - Execute rocketmq_test_only\n";
helpText += "log - Execute rocketmq_test_log\n";
helpText += "ledger <id> - Execute ledger with optional terminal_id\n";
helpText += "viewlog <level> - View logs (ERROR, WARN, NORMAL, DEBUG)\n";
helpText += "value <valuename> - Execute value print with valuename : iedcount frontfun frontindex remtable log init\n";
helpText += "exit - Exit the shell\n";
helpText += "help - Show this help message\n";
clientSocket->write(helpText.toUtf8());
}
else if (command.startsWith("viewlog")) {
showinshellflag = true;
handleViewLogCommand(command, clientSocket);
}
// <20><><EFBFBD>ö<EFBFBD><C3B6><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD>
else if (command.startsWith("TEST_NUM=")) {
bool ok;
int num = command.mid(9).toInt(&ok); // <20><>ȡ<EFBFBD>Ⱥź<C8BA><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD>
if (ok) {
setTestNum(num); // <20><><EFBFBD><EFBFBD> TEST_NUM
clientSocket->write("TEST_NUM updated\n");
std::cout << "TEST_NUM updated\n";
} else {
clientSocket->write("Invalid number\n");
std::cout << "Invalid number\n";
}
}
// <20><><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD>ı<EFBFBD>
else if (command.startsWith("rc")) {
qDebug() << "Executing rocketmq_test_rc()";
std::cout << "Executing rocketmq_test_rc()\n";
rocketmq_test_rc(); // <20><><EFBFBD><EFBFBD> rc <20><><EFBFBD><EFBFBD>
clientSocket->write("Executed rocketmq_test_rc\n");
}
// <20><><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD>ı<EFBFBD>
else if (command.startsWith("rt")) {
qDebug() << "Executing rocketmq_test_rt()";
std::cout << "Executing rocketmq_test_rt()\n";
rocketmq_test_rt(); // <20><><EFBFBD><EFBFBD> rt <20><><EFBFBD><EFBFBD>
clientSocket->write("Executed rocketmq_test_rt\n");
}
// <20><><EFBFBD><EFBFBD>̨<EFBFBD>˸<EFBFBD><CBB8>²<EFBFBD><C2B2><EFBFBD><EFBFBD>ı<EFBFBD>
else if (command.startsWith("ud")) {
qDebug() << "Executing rocketmq_test_ud()";
std::cout << "Executing rocketmq_test_ud()\n";
rocketmq_test_ud(); // <20><><EFBFBD><EFBFBD> ud <20><><EFBFBD><EFBFBD>
clientSocket->write("Executed rocketmq_test_ud\n");
}
// <20><><EFBFBD>ͽ<EFBFBD><CDBD>̿<EFBFBD><CCBF>Ʋ<EFBFBD><C6B2><EFBFBD><EFBFBD>ı<EFBFBD>
else if (command.startsWith("set")) {
qDebug() << "Executing rocketmq_test_set()";
std::cout << "Executing rocketmq_test_set()\n";
rocketmq_test_set(); // <20><><EFBFBD><EFBFBD> set <20><><EFBFBD><EFBFBD>
clientSocket->write("Executed rocketmq_test_set\n");
}
// <20><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̲<EFBFBD><CCB2><EFBFBD><EFBFBD>ı<EFBFBD>
else if (command.startsWith("only")) {
qDebug() << "Executing rocketmq_test_only()";
std::cout << "Executing rocketmq_test_only()\n";
rocketmq_test_only(); // <20><><EFBFBD><EFBFBD> rocketmq_test_only <20><><EFBFBD><EFBFBD>
clientSocket->write("Executed rocketmq_test_only\n");
}
// <20><><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>
else if (command.startsWith("log")) {
qDebug() << "Executing rocketmq_test_log()";
std::cout << "Executing rocketmq_test_log()\n";
rocketmq_test_log(); // <20><><EFBFBD><EFBFBD> log <20><><EFBFBD><EFBFBD>
clientSocket->write("Executed rocketmq_test_log\n");
}
// <20><EFBFBD><E9BFB4>ǰ<EFBFBD><C7B0><EFBFBD>̵<EFBFBD>̨<EFBFBD><CCA8>
else if (command.startsWith("ledger")) {
qDebug() << "Executing ledger()";
std::cout << "Executing ledger()\n";
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
QStringList parts = command.split(" "); // <20><><EFBFBD>ݿո<DDBF><D5B8>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>
if (parts.size() > 1) { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> id<69>ţ<EFBFBD>
QString terminalId = parts[1];
std::cout << "Calling ledger with terminal_id: " << terminalId.toStdString() << std::endl;
ledger(terminalId.toStdString().c_str(), clientSocket); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ledger
clientSocket->write("Executed ledger with terminal_id\n");
} else {
std::cout << "Calling ledger without parameters\n";
ledger(NULL, clientSocket); // <20>޲<EFBFBD><DEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ledger
clientSocket->write("Executed ledger without parameters\n");
}
}
// <20><EFBFBD><E9BFB4>ǰ<EFBFBD><C7B0><EFBFBD>̵<EFBFBD>ָ<EFBFBD><D6B8>ֵ
else if (command.startsWith("value")) {
std::cout << "Executing value()" << std::endl;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>еIJ<D0B5><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
QStringList parts = command.split(" ");
if (parts.size() > 1) {
QString variableName = parts[1];
std::cout << "Calling value() with variable name: " << variableName.toStdString() << std::endl;
// <20><><EFBFBD><EFBFBD> value_print() <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
value_print(variableName.toStdString().c_str(), clientSocket);
clientSocket->write("Executed value with variable name: " + variableName.toUtf8() + "\n");
} else {
std::cout << "Calling value without parameters" << std::endl;
clientSocket->write("Please provide a variable name\n");
}
}
// <20><><EFBFBD><EFBFBD> exit <20><><EFBFBD><EFBFBD>
else if (command == "exit") {
// <20><><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>رտͻ<D5BF><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
clientSocket->write("Goodbye! Exiting shell...\n");
clientSocket->flush();
clientSocket->disconnectFromHost(); // <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
clientSocket->waitForDisconnected(); // ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD>ӶϿ<D3B6>
return;
}
// δ֪<CEB4><D6AA><EFBFBD><EFBFBD>
else {
clientSocket->write("Unknown command\n");
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󣬻<EFBFBD><F3A3ACBB><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD><D0BA><EFBFBD>ʾ<EFBFBD><CABE>
clientSocket->write("> ");
void printPrompt(QTcpSocket *clientSocket)
{
//clientSocket->write("\r\n> ");
clientSocket->write("\r\x1B[K> ");
clientSocket->flush();
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><EFBFBD>¼<EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @brief ִ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѱ<EFBFBD>trimmed<EFBFBD><EFBFBD>
*/
void processCommand(const QString &cmd, QTcpSocket *clientSocket) {
qDebug() << "Received command:" << cmd;
std::cout << "Received command: " << cmd.toStdString() << "\n";
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (cmd == "help") {
QString helpText = "Available commands:\r\n";
helpText += "TEST_NUM=<num> - Set the TEST_NUM\r\n";
helpText += "rc - Execute rocketmq_test_rc\r\n";
helpText += "rt - Execute rocketmq_test_rt\r\n";
helpText += "ud - Execute rocketmq_test_ud\r\n";
helpText += "set - Execute rocketmq_test_set\r\n";
helpText += "only - Execute rocketmq_test_only\r\n";
helpText += "log - Execute rocketmq_test_log\r\n";
helpText += "ledger <id> - Execute ledger with optional terminal_id\r\n";
helpText += "viewlog <level> - View logs (ERROR, WARN, NORMAL, DEBUG)\r\n";
helpText += "value <valuename> - Execute value print with valuename\r\n";
helpText += "exit - Exit the shell\r\n";
helpText += "help - Show this help message\r\n";
clientSocket->write("\r\x1B[K");
clientSocket->write(helpText.toUtf8());
}
else if (cmd.startsWith("viewlog")) {
showinshellflag = true;
handleViewLogCommand(cmd, clientSocket);
}
else if (cmd.startsWith("TEST_NUM=")) {
bool ok;
int num = cmd.mid(9).toInt(&ok);
if (ok) {
setTestNum(num);
clientSocket->write("\r\x1B[K");
clientSocket->write("TEST_NUM updated\r\n");
} else {
clientSocket->write("\r\x1B[K");
clientSocket->write("Invalid number\r\n");
}
}
else if (cmd.startsWith("rc")) {
rocketmq_test_rc();
clientSocket->write("\r\x1B[K");
clientSocket->write("Executed rocketmq_test_rc\r\n");
}
else if (cmd.startsWith("rt")) {
rocketmq_test_rt();
clientSocket->write("\r\x1B[K");
clientSocket->write("Executed rocketmq_test_rt\r\n");
}
else if (cmd.startsWith("ud")) {
rocketmq_test_ud();
clientSocket->write("\r\x1B[K");
clientSocket->write("Executed rocketmq_test_ud\r\n");
}
else if (cmd.startsWith("set")) {
rocketmq_test_set();
clientSocket->write("\r\x1B[K");
clientSocket->write("Executed rocketmq_test_set\r\n");
}
else if (cmd.startsWith("only")) {
rocketmq_test_only();
clientSocket->write("\r\x1B[K");
clientSocket->write("Executed rocketmq_test_only\r\n");
}
else if (cmd.startsWith("log")) {
rocketmq_test_log();
clientSocket->write("\r\x1B[K");
clientSocket->write("Executed rocketmq_test_log\r\n");
}
else if (cmd.startsWith("ledger")) {
QStringList parts = cmd.split(" ");
if (parts.size() > 1) {
QString terminalId = parts[1];
ledger(terminalId.toStdString().c_str(), clientSocket);
clientSocket->write("\r\x1B[K");
clientSocket->write("Executed ledger with terminal_id\r\n");
} else {
ledger(NULL, clientSocket);
clientSocket->write("\r\x1B[K");
clientSocket->write("Executed ledger without parameters\r\n");
}
}
else if (cmd.startsWith("value")) {
QStringList parts = cmd.split(" ");
if (parts.size() > 1) {
QString variableName = parts[1];
value_print(variableName.toStdString().c_str(), clientSocket);
clientSocket->write("\r\x1B[K");
clientSocket->write("Executed value with variable name: " + variableName.toUtf8() + "\r\n");
} else {
clientSocket->write("\r\x1B[K");
clientSocket->write("Please provide a variable name\r\n");
}
}
else if (cmd == "exit") {
clientSocket->write("\r\x1B[K");
clientSocket->write("Goodbye! Exiting shell...\r\n");
clientSocket->flush();
clientSocket->disconnectFromHost();
clientSocket->waitForDisconnected();
return;
}
else {
clientSocket->write("\r\x1B[K> ");
clientSocket->write("Unknown command\r\n");
clientSocket->flush();
}
// <20><><EFBFBD><EFBFBD><EEB4A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󣬴<EFBFBD>ӡ<EFBFBD><D3A1>ʾ<EFBFBD><CABE>
printPrompt(clientSocket);
}
/**
* @brief <20>ϼ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void handleUpArrow(QTcpSocket *clientSocket) {
if (!commandHistory.isEmpty() && historyIndex > 0) {
historyIndex--;
currentCommand = commandHistory[historyIndex];
// **<2A><><EFBFBD>յ<EFBFBD>ǰ<EFBFBD><C7B0>**
clientSocket->write("\r"); // <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EAB5BD><EFBFBD><EFBFBD>
clientSocket->write(" "); // <20>ÿո񸲸<D5B8>
clientSocket->write("\r> "); // <20><><EFBFBD>´<EFBFBD>ӡ<EFBFBD><D3A1>ʾ<EFBFBD><CABE>
clientSocket->write(currentCommand.toUtf8()); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>\r<>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD> + \x1B[K<><4B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
clientSocket->write("\r\x1B[K> ");
clientSocket->write(currentCommand.toUtf8());
clientSocket->flush();
}
}
/**
* @brief <20><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><EFBFBD>¼<EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @brief <20>¼<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>
*/
void handleDownArrow(QTcpSocket *clientSocket) {
if (!commandHistory.isEmpty() && historyIndex < commandHistory.size() - 1) {
historyIndex++;
currentCommand = commandHistory[historyIndex];
// **<2A><><EFBFBD>յ<EFBFBD>ǰ<EFBFBD><C7B0>**
clientSocket->write("\r");
clientSocket->write(" ");
clientSocket->write("\r> ");
clientSocket->write(currentCommand.toUtf8()); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>
clientSocket->write("\r\x1B[K> ");
clientSocket->write(currentCommand.toUtf8());
clientSocket->flush();
}
else if (historyIndex == commandHistory.size() - 1) {
// **<2A><><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ٰ<EFBFBD><D9B0>¼<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>**
historyIndex = commandHistory.size();
currentCommand.clear();
clientSocket->write("\r");
clientSocket->write(" ");
clientSocket->write("\r> ");
clientSocket->write("\r\x1B[K> ");
clientSocket->flush();
}
}
@@ -529,6 +561,10 @@ private:
QList<QString> commandHistory; // <20><EFBFBD><E6B4A2>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>
int historyIndex; // <20><>ǰ<EFBFBD><C7B0>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
QString currentCommand; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// viewlog <20><><EFBFBD><EFBFBD>
bool stopViewLog;
QTcpSocket* activeClient;
};