Skip to content

Commit

Permalink
Feature - Add custom actions -> Refresh local DNS
Browse files Browse the repository at this point in the history
 * This will use pkexec and rely on the fact that we're running systemd
  • Loading branch information
SneWs committed Jul 18, 2024
1 parent e7246bd commit 191216c
Show file tree
Hide file tree
Showing 7 changed files with 81 additions and 4 deletions.
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ set(PROJECT_SOURCES
TailSettings.h
AccountsTabUiManager.cpp
AccountsTabUiManager.h
SysCommand.cpp
SysCommand.h
)

qt_add_executable(tail-tray
Expand Down
35 changes: 35 additions & 0 deletions SysCommand.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
//
// Created by marcus on 2024-07-18.
//

#include "SysCommand.h"

#include <QDebug>

void SysCommand::refreshDns()
{
QStringList args;
args << "restart";
args << "systemd-resolved";

runCommand("systemctl", args, false, true);
}

void SysCommand::runCommand(const QString& cmd, QStringList args, bool jsonResult, bool usePkExec)
{
pProcess = std::make_unique<QProcess>(this);
connect(pProcess.get(), &QProcess::finished, this, [this](int exitCode, QProcess::ExitStatus status) {
qDebug() << "Process exit code " << exitCode << " - " << status;
});

if (jsonResult)
args << "--json";

if (usePkExec) {
args.insert(0, cmd);
pProcess->start("/usr/bin/pkexec", args);
}
else {
pProcess->start(cmd, args);
}
}
22 changes: 22 additions & 0 deletions SysCommand.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
//
// Created by marcus on 2024-07-18.
//
#ifndef SYSCOMMAND_H
#define SYSCOMMAND_H

#include <QObject>
#include <QProcess>

class SysCommand : public QObject
{
Q_OBJECT
public:
void refreshDns();

private:
std::unique_ptr<QProcess> pProcess;

void runCommand(const QString& cmd, QStringList args, bool jsonResult = false, bool usePkExec = false);
};

#endif //SYSCOMMAND_H
2 changes: 1 addition & 1 deletion TailRunner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ void TailRunner::stop() {
runCommand("down", QStringList());
}

void TailRunner::runCommand(QString cmd, QStringList args, bool jsonResult, bool usePkExec) {
void TailRunner::runCommand(const QString& cmd, QStringList args, bool jsonResult, bool usePkExec) {
if (pProcess != nullptr) {
if (pProcess->state() == QProcess::Running) {
qDebug() << "Process already running!" << "Will queue up " << cmd << args << "command";
Expand Down
2 changes: 1 addition & 1 deletion TailRunner.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ class TailRunner : public QObject
void loginFlowCompleted();

private:
void runCommand(QString cmd, QStringList args, bool jsonResult = false, bool usePkExec = false);
void runCommand(const QString& cmd, QStringList args, bool jsonResult = false, bool usePkExec = false);
void onProcessCanReadStdOut();

void parseStatusResponse(const QJsonObject& obj);
Expand Down
12 changes: 12 additions & 0 deletions TrayMenuManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ TrayMenuManager::TrayMenuManager(TailSettings& s, TailRunner* runner, QObject* p
, pAbout(nullptr)
, pThisDevice(nullptr)
, pExitNodeNone(nullptr)
, pRefreshLocalDns(nullptr)
, pSysCommand(std::make_unique<SysCommand>())
{
pTrayMenu = new QMenu("Tailscale");

Expand Down Expand Up @@ -56,6 +58,7 @@ TrayMenuManager::TrayMenuManager(TailSettings& s, TailRunner* runner, QObject* p
pExitNodeNone->setCheckable(true);
pExitNodeNone->setChecked(true);
pExitNodeNone->setEnabled(false);
pRefreshLocalDns = new QAction("Refresh Local DNS");

setupWellKnownActions();

Expand Down Expand Up @@ -138,6 +141,8 @@ void TrayMenuManager::buildNotConnectedMenu(TailStatus const* pTailStatus) const
if (pTailStatus != nullptr && pTailStatus->user != nullptr)
pThisDevice->setText(pTailStatus->user->loginName);
pTrayMenu->addAction(pThisDevice);
auto* actions = pTrayMenu->addMenu("Custom Actions");
actions->addAction(pRefreshLocalDns);
pTrayMenu->addSeparator();
pTrayMenu->addAction(pPreferences);
pTrayMenu->addAction(pAbout);
Expand Down Expand Up @@ -187,6 +192,9 @@ void TrayMenuManager::buildConnectedMenu(TailStatus const* pTailStatus) const
}
}

auto* actions = pTrayMenu->addMenu("Custom Actions");
actions->addAction(pRefreshLocalDns);

pTrayMenu->addSeparator();
auto* exitNodes = pTrayMenu->addMenu("Exit nodes");
exitNodes->addAction(pExitNodeNone);
Expand Down Expand Up @@ -316,4 +324,8 @@ void TrayMenuManager::setupWellKnownActions() const {
}
}
);

connect(pRefreshLocalDns, &QAction::triggered, this, [this](bool) {
pSysCommand->refreshDns();
});
}
10 changes: 8 additions & 2 deletions TrayMenuManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,28 @@
#ifndef TRAYMENUMANAGER_H
#define TRAYMENUMANAGER_H

#include <memory>

#include <QSystemTrayIcon>
#include <QMenu>
#include <QString>

#include "models.h"
#include "TailRunner.h"
#include "TailSettings.h"
#include "SysCommand.h"

class TrayMenuManager : public QObject
{
Q_OBJECT
public:
explicit TrayMenuManager(TailSettings& s, TailRunner* runner, QObject* parent = nullptr);
virtual ~TrayMenuManager();
~TrayMenuManager() final;

void onAccountsListed(const QList<TailAccountInfo>& foundAccounts);
void stateChangedTo(TailState newState, TailStatus const* pTailStatus) const;

QSystemTrayIcon* trayIcon() const { return pSysTray; }
[[nodiscard]] QSystemTrayIcon* trayIcon() const { return pSysTray; }

private:
QList<TailAccountInfo> accounts;
Expand All @@ -42,6 +45,9 @@ class TrayMenuManager : public QObject
QAction* pAbout;
QAction* pThisDevice;
QAction* pExitNodeNone;
QAction* pRefreshLocalDns;

std::unique_ptr<SysCommand> pSysCommand;

private:
void buildNotLoggedInMenu() const;
Expand Down

0 comments on commit 191216c

Please sign in to comment.