Files
amnezia-client/service/server/localserver.cpp
T

222 lines
6.7 KiB
C++
Raw Normal View History

2020-12-26 15:03:51 +03:00
#include <QCoreApplication>
#include <QFileInfo>
#include <QLocalServer>
#include <QLocalSocket>
2021-02-02 01:47:40 +03:00
#include "ipc.h"
2020-12-26 15:03:51 +03:00
#include "localserver.h"
#include "utils.h"
2021-01-26 15:01:15 +03:00
#include "router.h"
#ifdef Q_OS_WIN
#include "tapcontroller_win.h"
#endif
2020-12-26 23:17:20 +03:00
LocalServer::LocalServer(QObject *parent) : QObject(parent),
m_clientConnection(nullptr),
2021-02-02 01:47:40 +03:00
m_clientConnected(false),
m_ipcServer(this)
2020-12-26 15:03:51 +03:00
{
2021-01-26 15:01:15 +03:00
m_server = QSharedPointer<QLocalServer>(new QLocalServer(this));
2020-12-26 15:03:51 +03:00
m_server->setSocketOptions(QLocalServer::WorldAccessOption);
2021-02-02 01:47:40 +03:00
// if (!m_server->listen(Utils::serverName())) {
// qDebug() << QString("Unable to start the server: %1.").arg(m_server->errorString());
// return;
// }
// connect(m_server.data(), &QLocalServer::newConnection, this, &LocalServer::onNewConnection);
2020-12-26 15:03:51 +03:00
2021-02-02 01:47:40 +03:00
// qDebug().noquote() << QString("Local server started on '%1'").arg(m_server->serverName());
2020-12-26 15:03:51 +03:00
2021-02-02 01:47:40 +03:00
m_serverNode.setHostUrl(QUrl(QStringLiteral(IPC_SERVICE_URL))); // create host node without Registry
m_serverNode.enableRemoting(&m_ipcServer); // enable remoting/sharing
2020-12-26 15:03:51 +03:00
}
LocalServer::~LocalServer()
{
m_clientConnected = false;
m_server->disconnect();
2020-12-26 23:17:20 +03:00
QFile::remove(Utils::serverName());
2020-12-26 15:03:51 +03:00
qDebug() << "Local server stopped";
}
bool LocalServer::isRunning() const
{
2021-02-02 01:47:40 +03:00
return true;
//return m_server->isListening();
2020-12-26 15:03:51 +03:00
}
void LocalServer::onNewConnection()
{
if (m_clientConnection) {
m_clientConnection->deleteLater();
}
m_clientConnection = m_server->nextPendingConnection();
connect(m_clientConnection, &QLocalSocket::disconnected, this, &LocalServer::onDisconnected);
m_clientConnected = true;
2020-12-26 23:17:20 +03:00
qDebug() << "New connection";
2020-12-26 15:03:51 +03:00
for(;;) {
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
if (!m_clientConnected || !m_clientConnection) {
break;
}
2020-12-30 17:03:05 +03:00
if (m_clientConnection->waitForReadyRead(1000) && m_clientConnection->canReadLine()) {
2020-12-26 15:03:51 +03:00
char buf[1024];
qint64 lineLength = m_clientConnection->readLine(buf, sizeof(buf));
if (lineLength != -1) {
QString line = buf;
line = line.simplified();
2021-01-09 19:55:16 +03:00
qDebug().noquote() << QString("Read line: '%1'").arg(line);
Message incomingMessage(line);
if (!incomingMessage.isValid()) {
2020-12-26 15:03:51 +03:00
qWarning().noquote() << "Message is not valid!";
continue;
}
2021-01-26 15:01:15 +03:00
else {
qDebug().noquote() << QString("Got message id: '%1'").arg(static_cast<int>(incomingMessage.state()));
//qDebug().noquote() << incomingMessage.rawData();
}
2020-12-26 15:03:51 +03:00
2021-01-09 19:55:16 +03:00
switch (incomingMessage.state()) {
2020-12-26 15:03:51 +03:00
case Message::State::Initialize:
2021-01-26 15:01:15 +03:00
#ifdef Q_OS_WIN
TapController::Instance().checkAndSetup();
#endif
2020-12-26 23:17:20 +03:00
sendMessage(Message(Message::State::Initialize, QStringList({"Server"})));
2020-12-26 15:03:51 +03:00
break;
case Message::State::StartRequest:
2021-01-09 19:55:16 +03:00
startProcess(incomingMessage.args());
2020-12-26 15:03:51 +03:00
break;
case Message::State::FinishRequest:
2021-01-09 19:55:16 +03:00
finishProcess(incomingMessage.args());
2020-12-26 15:03:51 +03:00
break;
2021-01-26 15:01:15 +03:00
case Message::State::RoutesAddRequest:
routesAddRequest(incomingMessage.args());
break;
case Message::State::RouteDeleteRequest:
routeDeleteRequest(incomingMessage.args());
break;
case Message::State::ClearSavedRoutesRequest:
Router::Instance().clearSavedRoutes();
break;
case Message::State::FlushDnsRequest:
Router::Instance().flushDns();
break;
case Message::State::InstallDriverRequest:
checkAndInstallDriver(incomingMessage.args());
break;
2020-12-26 15:03:51 +03:00
default:
;
}
}
}
}
qDebug() << "Released";
}
void LocalServer::finishProcess(const QStringList& args)
{
Q_UNUSED(args)
}
void LocalServer::startProcess(const QStringList& messageArgs)
{
if (messageArgs.size() < 1) {
return;
}
QProcess* process = new QProcess();
connect(process, SIGNAL(started()), this, SLOT(onStarted()));
connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(onFinished(int, QProcess::ExitStatus)));
const QString program = messageArgs.at(0);
QStringList args;
for (int i = 1; i < messageArgs.size(); i++) {
args.append(messageArgs.at(i));
}
QFileInfo fi(program);
const QString baseName = fi.baseName();
if (!fi.exists()) {
qWarning() << "This program does not exist";
sendMessage(Message(Message::State::Started, QStringList({baseName})));
sendMessage(Message(Message::State::Finished, QStringList({baseName, QString::number(-1)})));
return;
}
process->setObjectName(baseName);
qDebug().noquote() << QString("Start process '%1' - '%2' with args '%3'")
.arg(baseName).arg(program).arg(args.join(","));
process->start(program, args);
m_processList.append(process);
}
2021-01-26 15:01:15 +03:00
void LocalServer::routesAddRequest(const QStringList &messageArgs)
{
Router::Instance().routeAddList(messageArgs.first(), messageArgs.mid(1));
}
void LocalServer::routeDeleteRequest(const QStringList &messageArgs)
{
Router::Instance().routeDelete(messageArgs.first());
}
void LocalServer::checkAndInstallDriver(const QStringList &messageArgs)
{
}
2020-12-26 15:03:51 +03:00
void LocalServer::onFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
Q_UNUSED(exitStatus)
QProcess* process = (QProcess*)sender();
sendMessage(Message(Message::State::Finished, QStringList({process->objectName(), QString::number(exitCode)})));
}
void LocalServer::onStarted()
{
QProcess* process = (QProcess*)sender();
sendMessage(Message(Message::State::Started, QStringList({process->objectName()})));
}
void LocalServer::onDisconnected()
{
if (!m_clientConnected) {
return;
}
m_clientConnected = false;
QLocalSocket* clientConnection = (QLocalSocket*)sender();
clientConnection->deleteLater();
qDebug() << "Diconnected";
}
void LocalServer::sendMessage(const Message& message)
{
if (!m_clientConnection || !m_clientConnected) {
qDebug()<< "Cannot send data, remote peer is not connected";
return;
}
const QString data = message.toString();
2020-12-26 23:17:20 +03:00
bool status = m_clientConnection->write(QString(data + "\n").toUtf8());
2020-12-26 15:03:51 +03:00
qDebug().noquote() << QString("Send message '%1', status '%2'").arg(data).arg(Utils::toString(status));
}