[add] Added --noAPI flag in commandline

This commit is contained in:
Leroy.H.Y 2020-01-06 21:42:32 +08:00
parent d9b860fa5f
commit 01b2f3ac96
No known key found for this signature in database
GPG Key ID: 6AC1673B587DC37D
15 changed files with 160 additions and 63 deletions

View File

@ -1 +1 @@
2555 2573

View File

@ -35,12 +35,13 @@ CONFIG += lrelease embed_translations
SOURCES += \ SOURCES += \
src/components/QvComponentsHandler.cpp \ src/components/QvComponentsHandler.cpp \
src/components/QvCore/QvCommandLineArgs.cpp \
src/components/QvKernelInteractions.cpp \
src/components/QvLaunchAtLoginConfigurator.cpp \ src/components/QvLaunchAtLoginConfigurator.cpp \
src/components/QvPACHandler.cpp \ src/components/QvPACHandler.cpp \
src/components/QvSystemProxyConfigurator.cpp \ src/components/QvSystemProxyConfigurator.cpp \
src/components/QvTCPing.cpp \ src/components/QvTCPing.cpp \
src/main.cpp \ src/main.cpp \
src/components/QvCoreInteractions.cpp \
src/components/QvGFWPACConverter.cpp \ src/components/QvGFWPACConverter.cpp \
src/components/QvHTTPRequestHelper.cpp \ src/components/QvHTTPRequestHelper.cpp \
src/components/QvLogHighlighter.cpp \ src/components/QvLogHighlighter.cpp \
@ -84,8 +85,9 @@ HEADERS += \
src/QvCoreConfigOperations.hpp \ src/QvCoreConfigOperations.hpp \
src/QvUtils.hpp \ src/QvUtils.hpp \
src/components/QvComponentsHandler.hpp \ src/components/QvComponentsHandler.hpp \
src/components/QvCoreInteractions.hpp \ src/components/QvCore/QvCommandLineArgs.hpp \
src/components/QvHTTPRequestHelper.hpp \ src/components/QvHTTPRequestHelper.hpp \
src/components/QvKernelInteractions.hpp \
src/components/QvLaunchAtLoginConfigurator.hpp \ src/components/QvLaunchAtLoginConfigurator.hpp \
src/components/QvLogHighlighter.hpp \ src/components/QvLogHighlighter.hpp \
src/components/QvNetSpeedPlugin.hpp \ src/components/QvNetSpeedPlugin.hpp \

View File

@ -74,10 +74,6 @@ const int QV2RAY_CONFIG_VERSION = 6;
#define NEWLINE "\r\n" #define NEWLINE "\r\n"
#ifndef MAX
# define MAX(a, b) (((a) > (b)) ? (a) : (b))
#endif
using namespace std; using namespace std;
using namespace std::chrono; using namespace std::chrono;

View File

@ -69,17 +69,5 @@ namespace Qv2ray
bool cRules = cRule && root["routing"].toObject()["rules"].toArray().count() > 0; bool cRules = cRule && root["routing"].toObject()["rules"].toArray().count() > 0;
return cRules; return cRules;
} }
int FindIndexByTag(INOUTLIST list, const QString &tag)
{
for (int i = 0; i < list.count(); i++) {
auto value = list[i].toObject();
if (value.contains("tag") && value["tag"].toString() == tag)
return i;
}
return -1;
}
} }
} }

View File

@ -20,7 +20,6 @@ namespace Qv2ray
QMap<QString, CONFIGROOT> GetSubscriptionConnection(QString subscription); QMap<QString, CONFIGROOT> GetSubscriptionConnection(QString subscription);
QMap<QString, QMap<QString, CONFIGROOT>> GetSubscriptionConnections(QStringList subscriptions); QMap<QString, QMap<QString, CONFIGROOT>> GetSubscriptionConnections(QStringList subscriptions);
bool CheckIsComplexConfig(CONFIGROOT root); bool CheckIsComplexConfig(CONFIGROOT root);
int FindIndexByTag(INOUTLIST list, const QString &tag);
// //
// -------------------------- BEGIN CONFIG CONVERSIONS -------------------------- // -------------------------- BEGIN CONFIG CONVERSIONS --------------------------

View File

@ -0,0 +1,45 @@
#include "QvCommandLineArgs.hpp"
#include "Qv2rayBase.hpp"
#include <QCommandLineParser>
namespace Qv2ray
{
namespace CommandArgOperations
{
// Instantiation
QvStartupOptions StartupOption = QvStartupOptions{};
QvCommandArgParser::QvCommandArgParser() : QObject(),
noAPIOption("FAKE"), helpOption("FAKE"), versionOption("FAKE")
{
parser.setApplicationDescription(QObject::tr("Qv2ray - An cross-platform Qt frontend for V2ray."));
parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions);
//
noAPIOption = QCommandLineOption("noAPI", QObject::tr("Disable gRPC API subsystems."));
parser.addOption(noAPIOption);
helpOption = parser.addHelpOption();
versionOption = parser.addVersionOption();
}
CommandLineParseResult QvCommandArgParser::ParseCommandLine(QString *errorMessage)
{
if (!parser.parse(QCoreApplication::arguments())) {
*errorMessage = parser.errorText();
return CommandLineError;
}
if (parser.isSet(versionOption))
return CommandLineVersionRequested;
if (parser.isSet(helpOption))
return CommandLineHelpRequested;
if (parser.isSet(noAPIOption)) {
StartupOption.noAPI = true;
}
return CommandLineOk;
}
}
}

View File

@ -0,0 +1,44 @@
#ifndef QVCOMMANDLINEARGS_HPP
#define QVCOMMANDLINEARGS_HPP
#include "Qv2rayBase.hpp"
namespace Qv2ray
{
namespace CommandArgOperations
{
struct QvStartupOptions {
/// No API subsystem
bool noAPI;
};
enum CommandLineParseResult {
CommandLineOk,
CommandLineError,
CommandLineVersionRequested,
CommandLineHelpRequested
};
//
extern QvStartupOptions StartupOption;
class QvCommandArgParser : public QObject
{
Q_OBJECT
public:
QvCommandArgParser();
CommandLineParseResult ParseCommandLine(QString *errorMessage);
const QCommandLineParser *Parser()
{
return &parser;
}
private:
QCommandLineParser parser;
QCommandLineOption noAPIOption;
QCommandLineOption helpOption;
QCommandLineOption versionOption;
};
}
}
using namespace Qv2ray::CommandArgOperations;
#endif

View File

@ -1,10 +1,9 @@
#include <QObject> #include <QObject>
#include <QWidget> #include <QWidget>
#include <QDesktopServices> #include <QDesktopServices>
#include "QvCoreInteractions.hpp" #include "QvKernelInteractions.hpp"
#include "QvCoreConfigOperations.hpp" #include "QvCoreConfigOperations.hpp"
#include "QvCore/QvCommandLineArgs.hpp"
#include "QvTinyLog.hpp"
using namespace v2ray::core::app::stats::command; using namespace v2ray::core::app::stats::command;
using grpc::Channel; using grpc::Channel;
@ -16,9 +15,9 @@ using grpc::Status;
namespace Qv2ray namespace Qv2ray
{ {
namespace QvCoreInteration namespace QvKernelInterations
{ {
bool ConnectionInstance::ValidateConfig(const QString &path) bool V2rayKernelInstance::ValidateConfig(const QString &path)
{ {
auto conf = GetGlobalConfig(); auto conf = GetGlobalConfig();
@ -53,7 +52,7 @@ namespace Qv2ray
} }
} }
ConnectionInstance::ConnectionInstance() V2rayKernelInstance::V2rayKernelInstance()
{ {
auto proc = new QProcess(); auto proc = new QProcess();
vProcess = proc; vProcess = proc;
@ -63,7 +62,7 @@ namespace Qv2ray
ConnectionStatus = STOPPED; ConnectionStatus = STOPPED;
} }
bool ConnectionInstance::StartConnection(CONFIGROOT root, int apiPort) bool V2rayKernelInstance::StartConnection(CONFIGROOT root, int apiPort)
{ {
inboundTags.clear(); inboundTags.clear();
@ -96,7 +95,10 @@ namespace Qv2ray
vProcess->start(GetGlobalConfig().v2CorePath, QStringList() << "-config" << filePath, QIODevice::ReadWrite | QIODevice::Text); vProcess->start(GetGlobalConfig().v2CorePath, QStringList() << "-config" << filePath, QIODevice::ReadWrite | QIODevice::Text);
vProcess->waitForStarted(); vProcess->waitForStarted();
ConnectionStatus = STARTED; ConnectionStatus = STARTED;
{
if (StartupOption.noAPI) {
LOG(MODULE_VCORE, "API is disabled by the command line arg \"--noAPI\"")
} else {
// Config API // Config API
apiFailedCounter = 0; apiFailedCounter = 0;
this->apiPort = apiPort; this->apiPort = apiPort;
@ -106,6 +108,7 @@ namespace Qv2ray
apiTimerId = startTimer(1000); apiTimerId = startTimer(1000);
LOG(MODULE_VCORE, "API Worker started.") LOG(MODULE_VCORE, "API Worker started.")
} }
return true; return true;
} else { } else {
ConnectionStatus = STOPPED; ConnectionStatus = STOPPED;
@ -113,7 +116,7 @@ namespace Qv2ray
} }
} }
void ConnectionInstance::timerEvent(QTimerEvent *event) void V2rayKernelInstance::timerEvent(QTimerEvent *event)
{ {
QObject::timerEvent(event); QObject::timerEvent(event);
@ -134,7 +137,7 @@ namespace Qv2ray
} }
} }
void ConnectionInstance::StopConnection() void V2rayKernelInstance::StopConnection()
{ {
vProcess->close(); vProcess->close();
killTimer(apiTimerId); killTimer(apiTimerId);
@ -144,7 +147,7 @@ namespace Qv2ray
ConnectionStatus = STOPPED; ConnectionStatus = STOPPED;
} }
ConnectionInstance::~ConnectionInstance() V2rayKernelInstance::~V2rayKernelInstance()
{ {
if (ConnectionStatus != STOPPED) { if (ConnectionStatus != STOPPED) {
StopConnection(); StopConnection();
@ -153,7 +156,7 @@ namespace Qv2ray
delete vProcess; delete vProcess;
} }
long ConnectionInstance::CallStatsAPIByName(QString name) long V2rayKernelInstance::CallStatsAPIByName(QString name)
{ {
if (ConnectionStatus != STARTED) { if (ConnectionStatus != STARTED) {
LOG(MODULE_VCORE, "Invalid connection status when calling API") LOG(MODULE_VCORE, "Invalid connection status when calling API")
@ -186,23 +189,23 @@ namespace Qv2ray
return response.stat().value(); return response.stat().value();
} }
// ------------------------------------------------------------- API FUNCTIONS -------------------------- // ------------------------------------------------------------- API FUNCTIONS --------------------------
long ConnectionInstance::getTagSpeedUp(const QString &tag) long V2rayKernelInstance::getTagSpeedUp(const QString &tag)
{ {
return transferSpeed[tag + "_up"]; return transferSpeed[tag + "_up"];
} }
long ConnectionInstance::getTagSpeedDown(const QString &tag) long V2rayKernelInstance::getTagSpeedDown(const QString &tag)
{ {
return transferSpeed[tag + "_down"]; return transferSpeed[tag + "_down"];
} }
long ConnectionInstance::getTagDataUp(const QString &tag) long V2rayKernelInstance::getTagDataUp(const QString &tag)
{ {
return transferData[tag + "_up"]; return transferData[tag + "_up"];
} }
long ConnectionInstance::getTagDataDown(const QString &tag) long V2rayKernelInstance::getTagDataDown(const QString &tag)
{ {
return transferData[tag + "_down"]; return transferData[tag + "_down"];
} }
long ConnectionInstance::getAllDataUp() long V2rayKernelInstance::getAllDataUp()
{ {
long val = 0; long val = 0;
@ -212,7 +215,7 @@ namespace Qv2ray
return val; return val;
} }
long ConnectionInstance::getAllDataDown() long V2rayKernelInstance::getAllDataDown()
{ {
long val = 0; long val = 0;
@ -222,7 +225,7 @@ namespace Qv2ray
return val; return val;
} }
long ConnectionInstance::getAllSpeedUp() long V2rayKernelInstance::getAllSpeedUp()
{ {
long val = 0; long val = 0;
@ -232,7 +235,7 @@ namespace Qv2ray
return val; return val;
} }
long ConnectionInstance::getAllSpeedDown() long V2rayKernelInstance::getAllSpeedDown()
{ {
long val = 0; long val = 0;

View File

@ -1,8 +1,6 @@
#ifndef VINTERACT_H #ifndef VINTERACT_H
#define VINTERACT_H #define VINTERACT_H
#include <QProcess> #include <QProcess>
#include <QString>
#include "Qv2rayBase.hpp"
#include <grpc++/grpc++.h> #include <grpc++/grpc++.h>
#include "QvUtils.hpp" #include "QvUtils.hpp"
#include "v2ray_api_commands.pb.h" #include "v2ray_api_commands.pb.h"
@ -10,7 +8,7 @@
namespace Qv2ray namespace Qv2ray
{ {
namespace QvCoreInteration namespace QvKernelInterations
{ {
enum QvInstanceStatus { enum QvInstanceStatus {
STOPPED, STOPPED,
@ -18,12 +16,12 @@ namespace Qv2ray
STARTED STARTED
}; };
class ConnectionInstance : public QObject class V2rayKernelInstance : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit ConnectionInstance(); explicit V2rayKernelInstance();
~ConnectionInstance() override; ~V2rayKernelInstance() override;
// //
// Speed // Speed
long getTagSpeedUp(const QString &tag); long getTagSpeedUp(const QString &tag);
@ -63,6 +61,6 @@ namespace Qv2ray
} }
} }
using namespace Qv2ray::QvCoreInteration; using namespace Qv2ray::QvKernelInterations;
#endif // VINTERACT_H #endif // VINTERACT_H

View File

@ -11,6 +11,8 @@
#include "w_MainWindow.hpp" #include "w_MainWindow.hpp"
#include "QvCore/QvCommandLineArgs.hpp"
bool verifyConfigAvaliability(QString path, bool checkExistingConfig) bool verifyConfigAvaliability(QString path, bool checkExistingConfig)
{ {
// Does not exist. // Does not exist.
@ -207,6 +209,28 @@ int main(int argc, char *argv[])
LOG(MODULE_UI, "Installing a tranlator from OS: " + _lang.toStdString() + " -- " + (_result_ ? "OK" : "Failed")) LOG(MODULE_UI, "Installing a tranlator from OS: " + _lang.toStdString() + " -- " + (_result_ ? "OK" : "Failed"))
} }
QvCommandArgParser parser;
QString errorMessage;
switch (parser.ParseCommandLine(&errorMessage)) {
case CommandLineOk:
break;
case CommandLineError:
cout << errorMessage.toStdString() << endl;
cout << parser.Parser()->helpText().toStdString() << endl;
return 1;
case CommandLineVersionRequested:
LOG(QCoreApplication::applicationName().toStdString(), QCoreApplication::applicationVersion().toStdString());
return 0;
case CommandLineHelpRequested:
cout << parser.Parser()->helpText().toStdString() << endl;
return 0;
}
//
LOG("LICENCE", NEWLINE "This program comes with ABSOLUTELY NO WARRANTY." NEWLINE LOG("LICENCE", NEWLINE "This program comes with ABSOLUTELY NO WARRANTY." NEWLINE
"This is free software, and you are welcome to redistribute it" NEWLINE "This is free software, and you are welcome to redistribute it" NEWLINE
"under certain conditions." NEWLINE NEWLINE "under certain conditions." NEWLINE NEWLINE
@ -250,7 +274,6 @@ int main(int argc, char *argv[])
// Load the config for upgrade, but do not parse it to the struct. // Load the config for upgrade, but do not parse it to the struct.
auto conf = JsonFromString(StringFromFile(new QFile(QV2RAY_CONFIG_FILE))); auto conf = JsonFromString(StringFromFile(new QFile(QV2RAY_CONFIG_FILE)));
//
auto confVersion = conf["config_version"].toVariant().toString().toInt(); auto confVersion = conf["config_version"].toVariant().toString().toInt();
if (confVersion > QV2RAY_CONFIG_VERSION) { if (confVersion > QV2RAY_CONFIG_VERSION) {
@ -261,7 +284,7 @@ int main(int argc, char *argv[])
QObject::tr("Please check if there's an issue explaining about it.") + NEWLINE + QObject::tr("Please check if there's an issue explaining about it.") + NEWLINE +
QObject::tr("Or submit a new issue if you think this is an error.") + NEWLINE + NEWLINE + QObject::tr("Or submit a new issue if you think this is an error.") + NEWLINE + NEWLINE +
QObject::tr("Qv2ray will now exit.")); QObject::tr("Qv2ray will now exit."));
return -3; return -2;
} }
if (confVersion < QV2RAY_CONFIG_VERSION) { if (confVersion < QV2RAY_CONFIG_VERSION) {
@ -313,7 +336,7 @@ int main(int argc, char *argv[])
QObject::tr("Technical Details") + "\r\n" + QObject::tr("Technical Details") + "\r\n" +
"OSsl.Rq.V=" + osslReqVersion + "\r\n" + "OSsl.Rq.V=" + osslReqVersion + "\r\n" +
"OSsl.Cr.V=" + osslCurVersion); "OSsl.Cr.V=" + osslCurVersion);
return -2; return -3;
} }
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
@ -386,7 +409,7 @@ int main(int argc, char *argv[])
} catch (...) { } catch (...) {
QvMessageBox(nullptr, "ERROR", "There's something wrong happened and Qv2ray will quit now."); QvMessageBox(nullptr, "ERROR", "There's something wrong happened and Qv2ray will quit now.");
LOG(MODULE_INIT, "EXCEPTION THROWN: " __FILE__) LOG(MODULE_INIT, "EXCEPTION THROWN: " __FILE__)
return -9; return -99;
} }
#endif #endif

View File

@ -8,7 +8,7 @@
#include "qzxing/src/QZXing.h" #include "qzxing/src/QZXing.h"
#include "QvUtils.hpp" #include "QvUtils.hpp"
#include "QvCoreInteractions.hpp" #include "QvKernelInteractions.hpp"
#include "QvCoreConfigOperations.hpp" #include "QvCoreConfigOperations.hpp"
#include "w_ScreenShot_Core.hpp" #include "w_ScreenShot_Core.hpp"
@ -70,7 +70,7 @@ void ImportConfigWindow::on_beginImportBtn_clicked()
bool keepInBound = keepImportedInboundCheckBox->isChecked(); bool keepInBound = keepImportedInboundCheckBox->isChecked();
QString path = fileLineTxt->text(); QString path = fileLineTxt->text();
if (!ConnectionInstance::ValidateConfig(path)) { if (!V2rayKernelInstance::ValidateConfig(path)) {
QvMessageBox(this, tr("Import config file"), tr("Failed to check the validity of the config file.")); QvMessageBox(this, tr("Import config file"), tr("Failed to check the validity of the config file."));
return; return;
} }

View File

@ -62,8 +62,8 @@ MainWindow::MainWindow(QWidget *parent):
{ {
MainWindow::mwInstance = this; MainWindow::mwInstance = this;
currentConfig = GetGlobalConfig(); currentConfig = GetGlobalConfig();
vinstance = new ConnectionInstance(); vinstance = new V2rayKernelInstance();
connect(vinstance, &ConnectionInstance::onProcessOutputReadyRead, this, &MainWindow::UpdateVCoreLog); connect(vinstance, &V2rayKernelInstance::onProcessOutputReadyRead, this, &MainWindow::UpdateVCoreLog);
setupUi(this); setupUi(this);
// //
// Two browsers // Two browsers
@ -957,13 +957,13 @@ void MainWindow::timerEvent(QTimerEvent *event)
auto _totalDataUp = vinstance->getAllDataUp(); auto _totalDataUp = vinstance->getAllDataUp();
auto _totalDataDown = vinstance->getAllDataDown(); auto _totalDataDown = vinstance->getAllDataDown();
// //
double max = 0; double _max = 0;
double historyMax = 0; double historyMax = 0;
auto graphVUp = _totalSpeedUp / 1024; auto graphVUp = _totalSpeedUp / 1024;
auto graphVDown = _totalSpeedDown / 1024; auto graphVDown = _totalSpeedDown / 1024;
for (auto i = 0; i < 29; i++) { for (auto i = 0; i < 29; i++) {
historyMax = MAX(historyMax, MAX(uploadList[i + 1], downloadList[i + 1])); historyMax = max(historyMax, max(uploadList[i + 1], downloadList[i + 1]));
uploadList[i] = uploadList[i + 1]; uploadList[i] = uploadList[i + 1];
downloadList[i] = downloadList[i + 1]; downloadList[i] = downloadList[i + 1];
uploadSerie->replace(i, i, uploadList[i + 1]); uploadSerie->replace(i, i, uploadList[i + 1]);
@ -975,8 +975,8 @@ void MainWindow::timerEvent(QTimerEvent *event)
uploadSerie->replace(29, 29, graphVUp); uploadSerie->replace(29, 29, graphVUp);
downloadSerie->replace(29, 29, graphVDown); downloadSerie->replace(29, 29, graphVDown);
// //
max = MAX(MAX(graphVUp, graphVDown), historyMax); _max = max(historyMax, double(max(graphVUp, graphVDown)));
speedChartObj->axes(Qt::Vertical).first()->setRange(0, max * 1.2); speedChartObj->axes(Qt::Vertical).first()->setRange(0, _max * 1.2);
// //
auto totalSpeedUp = FormatBytes(_totalSpeedUp) + "/s"; auto totalSpeedUp = FormatBytes(_totalSpeedUp) + "/s";
auto totalSpeedDown = FormatBytes(_totalSpeedDown) + "/s"; auto totalSpeedDown = FormatBytes(_totalSpeedDown) + "/s";

View File

@ -12,7 +12,7 @@
#include "ui_w_MainWindow.h" #include "ui_w_MainWindow.h"
#include "QvUtils.hpp" #include "QvUtils.hpp"
#include "QvCoreInteractions.hpp" #include "QvKernelInteractions.hpp"
#include "QvCoreConfigOperations.hpp" #include "QvCoreConfigOperations.hpp"
#include "QvHTTPRequestHelper.hpp" #include "QvHTTPRequestHelper.hpp"
#include "QvPACHandler.hpp" #include "QvPACHandler.hpp"
@ -74,7 +74,7 @@ class MainWindow : public QMainWindow, Ui::MainWindow
public: public:
static MainWindow *mwInstance; static MainWindow *mwInstance;
QString CurrentConnectionName = ""; QString CurrentConnectionName = "";
ConnectionInstance *vinstance; V2rayKernelInstance *vinstance;
protected: protected:
void mouseReleaseEvent(QMouseEvent *e) override; void mouseReleaseEvent(QMouseEvent *e) override;

View File

@ -6,7 +6,7 @@
#include <QDesktopServices> #include <QDesktopServices>
#include "QvUtils.hpp" #include "QvUtils.hpp"
#include "QvCoreInteractions.hpp" #include "QvKernelInteractions.hpp"
#include "QvNetSpeedPlugin.hpp" #include "QvNetSpeedPlugin.hpp"
#include "QvCoreConfigOperations.hpp" #include "QvCoreConfigOperations.hpp"

View File

@ -9,7 +9,6 @@ namespace Qv2ray
{ {
namespace Utils namespace Utils
{ {
QTranslator *getTranslator(const QString &lang); QTranslator *getTranslator(const QString &lang);
QStringList GetFileList(QDir dir); QStringList GetFileList(QDir dir);
QString Base64Encode(QString string); QString Base64Encode(QString string);