add helper proto

This commit is contained in:
arcan1s 2014-08-08 19:33:36 +04:00
parent 1ae30b0821
commit 6a3e3b14b3
23 changed files with 875 additions and 60 deletions

View File

@ -19,15 +19,24 @@
#include "taskadds.h"
TaskResult runTask(const QString cmd)
TaskResult runTask(const QString cmd, const bool sudo)
{
return Task::await<TaskResult>( [ & ]() {
SandboxProcess command;
command.start(cmd);
command.waitForFinished(-1);
TaskResult r;
r.exitCode = command.exitCode();
r.output = command.readAllStandardOutput();
if (sudo) {
QProcess command;
command.start(cmd);
command.waitForFinished(-1);
r.exitCode = command.exitCode();
r.output = command.readAllStandardOutput();
}
else {
RootProcess command;
command.start(cmd);
command.waitForFinished(-1);
r.exitCode = command.exitCode();
r.output = command.readAllStandardOutput();
}
return r;
});

View File

@ -25,9 +25,9 @@
#include "task.h"
class SandboxProcess : public QProcess
class RootProcess : public QProcess
{
protected:
protected:
void setupChildProcess()
{
::setuid(0);
@ -40,7 +40,7 @@ struct TaskResult
int exitCode;
QByteArray output;
};
TaskResult runTask(const QString cmd);
TaskResult runTask(const QString cmd, const bool sudo = false);
#endif /* TASKADDS_H */

View File

@ -24,10 +24,11 @@ message (STATUS "Build date: ${CURRENT_DATE}")
option (USE_QT5 "Use Qt5 instead of Qt4" ON)
# components
option (BUILD_GUI "Build GUI" ON)
option (BUILD_HELPER "Build helper" ON)
option (BUILD_LIBRARY "Build library" ON)
option (BUILD_DATAENGINE "Build data engine" ON)
option (BUILD_PLASMOID "Build plasmoid" ON)
if (BUILD_GUI)
if (BUILD_GUI OR BUILD_HELPER)
set (BUILD_LIBRARY ON)
endif ()
if (BUILD_PLASMOID)
@ -58,7 +59,10 @@ add_subdirectory (${PROJECT_RESOURCE_DIR})
# components
if (BUILD_LIBRARY)
add_subdirectory (${PROJECT_LIBRARY})
endif()
endif ()
if (BUILD_HELPER)
add_subdirectory (helper)
endif ()
if (BUILD_GUI)
add_subdirectory (gui)
endif ()

View File

@ -60,5 +60,4 @@ endif()
add_executable (${SUBPROJECT} ${UI_HEADERS} ${HEADERS} ${SOURCES} ${MOC_SOURCES} ${QRC_SOURCES} ${TRANSLATIONS})
target_link_libraries (${SUBPROJECT} ${PROJECT_LIBRARY} ${QT_NEEDED_LIBS})
# install properties
install (TARGETS ${SUBPROJECT} DESTINATION bin
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE SETUID)
install (TARGETS ${SUBPROJECT} DESTINATION bin)

View File

@ -19,7 +19,6 @@
#include <QApplication>
#include <QDBusConnection>
#include <QDBusMessage>
#include <QDebug>
#include <QDir>
#include <QTranslator>
#include <iostream>
@ -55,17 +54,12 @@ int main(int argc, char *argv[])
daemon(0, 0);
break;
}
#if QT_VERSION >= 0x050000
QApplication::setSetuidAllowed(true);
qDebug() << QApplication::isSetuidAllowed();
#endif
QApplication a(argc, argv);
QApplication::setQuitOnLastWindowClosed(false);
// check if exists
if (restoreExistSession())
return 0;
// config path
QMap<QString, QVariant> args = getArgs();
// translation
QString language = Language::defineLanguage(args[QString("config")].toString());

View File

@ -19,6 +19,7 @@
#include "ui_mainwindow.h"
#include <QDBusConnection>
#include <QDBusMessage>
#include <QDebug>
#include <QDesktopServices>
#include <QFileDialog>
@ -31,7 +32,6 @@
#include "aboutwindow.h"
#include "bridgewidget.h"
#include "controladaptor.h"
#include "errorwindow.h"
#include "ethernetwidget.h"
#include "generalwidget.h"
@ -39,7 +39,6 @@
#include "language.h"
#include "macvlanwidget.h"
#include "mobilewidget.h"
#include "netctladaptor.h"
#include "netctlautowindow.h"
#include "netctlguiadaptor.h"
#include "passwdwidget.h"
@ -52,9 +51,6 @@
#include "vlanwidget.h"
#include "wirelesswidget.h"
#include <polkit-qt5-1/polkitqt1-authority.h>
#include <polkit-qt5-1/polkitqt1-subject.h>
MainWindow::MainWindow(QWidget *parent,
const QMap<QString, QVariant> args,
@ -157,6 +153,20 @@ QStringList MainWindow::getSettings()
}
bool MainWindow::isHelperActive()
{
if (debug) qDebug() << "[MainWindow]" << "[isHelperActive]";
QList<QVariant> responce = sendDBusRequest(DBUS_HELPER_SERVICE, DBUS_CONTROL_PATH,
DBUS_HELPER_INTERFACE, QString("Active"));
if (responce.size() == 1)
return true;
else
return false;
}
void MainWindow::closeEvent(QCloseEvent *event)
{
if (debug) qDebug() << "[MainWindow]" << "[closeEvent]";
@ -279,14 +289,6 @@ void MainWindow::createDBusSession()
new NetctlGuiAdaptor(this),
QDBusConnection::ExportAllContents))
if (debug) qDebug() << "[MainWindow]" << "[createDBusSession]" << ":" << "Could not register GUI object";
if (!bus.registerObject(QString(DBUS_LIB_PATH),
new NetctlAdaptor(this, configuration),
QDBusConnection::ExportAllContents))
if (debug) qDebug() << "[MainWindow]" << "[createDBusSession]" << ":" << "Could not register library object";
if (!bus.registerObject(QString(DBUS_CONTROL_PATH),
new ControlAdaptor(this, configuration),
QDBusConnection::ExportAllContents))
if (debug) qDebug() << "[MainWindow]" << "[createDBusSession]" << ":" << "Could not register control object";
}
@ -342,6 +344,7 @@ void MainWindow::deleteObjects()
{
if (debug) qDebug() << "[MainWindow]" << "[deleteObjects]";
QDBusConnection::sessionBus().unregisterObject(QString(DBUS_OBJECT_PATH));
QDBusConnection::sessionBus().unregisterService(QString(DBUS_SERVICE));
if (netctlCommand != nullptr) delete netctlCommand;
if (netctlProfile != nullptr) delete netctlProfile;
@ -378,6 +381,20 @@ void MainWindow::keyPressEvent(QKeyEvent *pressedKey)
}
QList<QVariant> MainWindow::sendDBusRequest(const QString service, const QString path,
const QString interface, const QString cmd)
{
if (debug) qDebug() << "[MainWindow]" << "[sendDBusRequest]";
QDBusConnection bus = QDBusConnection::sessionBus();
QDBusMessage request = QDBusMessage::createMethodCall(service, path, interface, cmd);
QDBusMessage response = bus.call(request);
QList<QVariant> arguments = response.arguments();
return arguments;
}
void MainWindow::setIconsToTabs()
{
if (debug) qDebug() << "[MainWindow]" << "[setIconsToTabs]";
@ -488,6 +505,37 @@ void MainWindow::showSettingsWindow()
}
void MainWindow::forceStartHelper()
{
if (debug) qDebug() << "[MainWindow]" << "[forceStartHelper]";
QProcess process;
QString cmd = configuration[QString("HELPER_PATH")] + QString(" -c ") + configPath;
process.startDetached(cmd);
}
void MainWindow::forceStopHelper()
{
if (debug) qDebug() << "[MainWindow]" << "[forceStartHelper]";
sendDBusRequest(DBUS_HELPER_SERVICE, DBUS_CONTROL_PATH,
DBUS_HELPER_INTERFACE, QString("Close"));
}
void MainWindow::startHelper()
{
if (debug) qDebug() << "[MainWindow]" << "[startHelper]";
if (isHelperActive())
return forceStopHelper();
else
return forceStartHelper();
}
void MainWindow::setTab(int tab)
{
if (debug) qDebug() << "[MainWindow]" << "[setTab]";

View File

@ -59,6 +59,7 @@ public:
~MainWindow();
QString getInformation();
QStringList getSettings();
bool isHelperActive();
protected:
void closeEvent(QCloseEvent *event);
@ -70,6 +71,10 @@ public slots:
void showMainWindow();
void showNetctlAutoWindow();
void showSettingsWindow();
// helper
void forceStartHelper();
void forceStopHelper();
void startHelper();
// main
void setTab(int tab);
void updateConfiguration(const QMap<QString, QVariant> args = QMap<QString, QVariant>());
@ -141,6 +146,8 @@ private:
void createObjects();
void deleteObjects();
void keyPressEvent(QKeyEvent *pressedKey);
QList<QVariant> sendDBusRequest(const QString service, const QString path,
const QString interface, const QString cmd);
void setIconsToTabs();
QString configPath;
bool debug;

View File

@ -27,7 +27,7 @@ class MainWindow;
class NetctlGuiAdaptor : public QDBusAbstractAdaptor
{
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "org.freedesktop.netctlgui")
Q_CLASSINFO("D-Bus Interface", "org.netctlgui.netctlgui")
public:
explicit NetctlGuiAdaptor(MainWindow *parent = 0);

View File

@ -53,21 +53,22 @@ void SettingsWindow::createActions()
connect(ui->buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked(bool)), this, SLOT(close()));
connect(ui->buttonBox->button(QDialogButtonBox::Reset), SIGNAL(clicked(bool)), this, SLOT(setDefault()));
connect(ui->buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked(bool)), this, SLOT(saveSettings()));
connect(ui->buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked(bool)), this, SLOT(close()));
connect(ui->buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked(bool)), this, SLOT(closeWindow()));
connect(ui->checkBox_enableTray, SIGNAL(stateChanged(int)), this, SLOT(setTray()));
connect(ui->treeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),
this, SLOT(changePage(QTreeWidgetItem *, QTreeWidgetItem *)));
// buttons
connect(ui->pushButton_interfaceDir, SIGNAL(clicked(bool)), SLOT(selectIfaceDir()));
connect(ui->pushButton_netctlPath, SIGNAL(clicked(bool)), SLOT(selectNetctlPath()));
connect(ui->pushButton_netctlAutoPath, SIGNAL(clicked(bool)), SLOT(selectNetctlAutoPath()));
connect(ui->pushButton_profilePath, SIGNAL(clicked(bool)), SLOT(selectProfileDir()));
connect(ui->pushButton_rfkill, SIGNAL(clicked(bool)), SLOT(selectRfkillDir()));
connect(ui->pushButton_sudo, SIGNAL(clicked(bool)), SLOT(selectSudoPath()));
connect(ui->pushButton_systemctlPath, SIGNAL(clicked(bool)), SLOT(selectSystemctlPath()));
connect(ui->pushButton_wpaCliPath, SIGNAL(clicked(bool)), SLOT(selectWpaCliPath()));
connect(ui->pushButton_wpaSupPath, SIGNAL(clicked(bool)), SLOT(selectWpaSupPath()));
connect(ui->pushButton_helperPath, SIGNAL(clicked(bool)), this, SLOT(selectHelperPath()));
connect(ui->pushButton_interfaceDir, SIGNAL(clicked(bool)), this, SLOT(selectIfaceDir()));
connect(ui->pushButton_netctlPath, SIGNAL(clicked(bool)), this, SLOT(selectNetctlPath()));
connect(ui->pushButton_netctlAutoPath, SIGNAL(clicked(bool)), this, SLOT(selectNetctlAutoPath()));
connect(ui->pushButton_profilePath, SIGNAL(clicked(bool)), this, SLOT(selectProfileDir()));
connect(ui->pushButton_rfkill, SIGNAL(clicked(bool)), this, SLOT(selectRfkillDir()));
connect(ui->pushButton_status, SIGNAL(clicked(bool)), this, SLOT(startHelper()));
connect(ui->pushButton_sudo, SIGNAL(clicked(bool)), this, SLOT(selectSudoPath()));
connect(ui->pushButton_systemctlPath, SIGNAL(clicked(bool)), this, SLOT(selectSystemctlPath()));
connect(ui->pushButton_wpaCliPath, SIGNAL(clicked(bool)), this, SLOT(selectWpaCliPath()));
connect(ui->pushButton_wpaSupPath, SIGNAL(clicked(bool)), this, SLOT(selectWpaSupPath()));
}
@ -103,6 +104,16 @@ void SettingsWindow::changePage(QTreeWidgetItem *current, QTreeWidgetItem *previ
}
void SettingsWindow::closeWindow()
{
if (debug) qDebug() << "[SettingsWindow]" << "[closeWindow]";
saveSettings();
close();
((MainWindow *)parent())->updateConfiguration();
}
void SettingsWindow::saveSettings()
{
if (debug) qDebug() << "[SettingsWindow]" << "[saveSettings]";
@ -115,8 +126,6 @@ void SettingsWindow::saveSettings()
for (int i=0; i<settings.keys().count(); i++)
out << settings.keys()[i] << QString("=") << settings[settings.keys()[i]] << endl;
configFile.close();
((MainWindow *)parent())->updateConfiguration();
}
@ -144,6 +153,20 @@ void SettingsWindow::setDefault()
}
void SettingsWindow::selectHelperPath()
{
if (debug) qDebug() << "[SettingsWindow]" << "[selectHelperPath]";
QString filename = QFileDialog::getOpenFileName(
this,
QApplication::translate("SettingsWindow", "Select helper command"),
QString("/usr/bin/"),
QApplication::translate("SettingsWindow", "All files (*)"));
if (!filename.isEmpty())
ui->lineEdit_helperPath->setText(filename);
}
void SettingsWindow::selectIfaceDir()
{
if (debug) qDebug() << "[SettingsWindow]" << "[selectIfaceDir]";
@ -273,6 +296,7 @@ void SettingsWindow::showWindow()
setSettings(getSettings());
setTray();
updateHelper();
show();
}
@ -283,12 +307,21 @@ QMap<QString, QString> SettingsWindow::readSettings()
if (debug) qDebug() << "[SettingsWindow]" << "[readSettings]";
QMap<QString, QString> settings;
if (ui->checkBox_helperClose->checkState() == 2)
settings[QString("CLOSE_HELPER")] = QString("true");
else
settings[QString("CLOSE_HELPER")] = QString("false");
if (ui->checkBox_closeToTray->checkState() == 2)
settings[QString("CLOSETOTRAY")] = QString("true");
else
settings[QString("CLOSETOTRAY")] = QString("false");
settings[QString("CTRL_DIR")] = ui->lineEdit_wpaDir->text();
settings[QString("CTRL_GROUP")] = ui->lineEdit_wpaGroup->text();
if (ui->checkBox_forceSudo->checkState() == 2)
settings[QString("FORCE_SUDO")] = QString("true");
else
settings[QString("FORCE_SUDO")] = QString("false");
settings[QString("HELPER_PATH")] = ui->lineEdit_helperPath->text();
settings[QString("IFACE_DIR")] = ui->lineEdit_interfacesDir->text();
settings[QString("LANGUAGE")] = ui->comboBox_language->currentText();
settings[QString("NETCTL_PATH")] = ui->lineEdit_netctlPath->text();
@ -308,6 +341,10 @@ QMap<QString, QString> SettingsWindow::readSettings()
settings[QString("SYSTRAY")] = QString("true");
else
settings[QString("SYSTRAY")] = QString("false");
if (ui->checkBox_useHelper->checkState() == 2)
settings[QString("USE_HELPER")] = QString("true");
else
settings[QString("USE_HELPER")] = QString("false");
settings[QString("WPACLI_PATH")] = ui->lineEdit_wpaCliPath->text();
settings[QString("WPASUP_PATH")] = ui->lineEdit_wpaSupPath->text();
settings[QString("WPA_DRIVERS")] = ui->lineEdit_wpaSupDrivers->text();
@ -323,12 +360,21 @@ void SettingsWindow::setSettings(const QMap<QString, QString> settings)
{
if (debug) qDebug() << "[SettingsWindow]" << "[setSettings]";
if (settings[QString("CLOSE_HELPER")] == QString("true"))
ui->checkBox_helperClose->setCheckState(Qt::Checked);
else
ui->checkBox_helperClose->setCheckState(Qt::Unchecked);
if (settings[QString("CLOSETOTRAY")] == QString("true"))
ui->checkBox_closeToTray->setCheckState(Qt::Checked);
else
ui->checkBox_closeToTray->setCheckState(Qt::Unchecked);
ui->lineEdit_wpaDir->setText(settings[QString("CTRL_DIR")]);
ui->lineEdit_wpaGroup->setText(settings[QString("CTRL_GROUP")]);
if (settings[QString("FORCE_SUDO")] == QString("true"))
ui->checkBox_forceSudo->setCheckState(Qt::Checked);
else
ui->checkBox_forceSudo->setCheckState(Qt::Unchecked);
ui->lineEdit_helperPath->setText(settings[QString("HELPER_PATH")]);
ui->lineEdit_interfacesDir->setText(settings[QString("IFACE_DIR")]);
ui->comboBox_language->setCurrentIndex(0);
for (int i=0; i<ui->comboBox_language->count(); i++)
@ -351,6 +397,10 @@ void SettingsWindow::setSettings(const QMap<QString, QString> settings)
ui->checkBox_enableTray->setCheckState(Qt::Checked);
else
ui->checkBox_enableTray->setCheckState(Qt::Unchecked);
if (settings[QString("USE_HELPER")] == QString("true"))
ui->checkBox_useHelper->setCheckState(Qt::Checked);
else
ui->checkBox_useHelper->setCheckState(Qt::Unchecked);
ui->lineEdit_wpaCliPath->setText(settings[QString("WPACLI_PATH")]);
ui->lineEdit_wpaSupPath->setText(settings[QString("WPASUP_PATH")]);
ui->lineEdit_wpaSupDrivers->setText(settings[QString("WPA_DRIVERS")]);
@ -365,9 +415,12 @@ QMap<QString, QString> SettingsWindow::getDefault()
if (debug) qDebug() << "[SettingsWindow]" << "[getDefault]";
QMap<QString, QString> settings;
settings[QString("CLOSE_HELPER")] = QString("false");
settings[QString("CLOSETOTRAY")] = QString("true");
settings[QString("CTRL_DIR")] = QString("/run/wpa_supplicant_netctl-gui");
settings[QString("CTRL_GROUP")] = QString("users");
settings[QString("FORCE_SUDO")] = QString("false");
settings[QString("HELPER_PATH")] = QString("/usr/bin/netctlgui-helper");
settings[QString("IFACE_DIR")] = QString("/sys/class/net/");
settings[QString("LANGUAGE")] = QString("en");
settings[QString("NETCTL_PATH")] = QString("/usr/bin/netctl");
@ -381,6 +434,7 @@ QMap<QString, QString> SettingsWindow::getDefault()
settings[QString("SUDO_PATH")] = QString("/usr/bin/kdesu");
settings[QString("SYSTEMCTL_PATH")] = QString("/usr/bin/systemctl");
settings[QString("SYSTRAY")] = QString("true");
settings[QString("USE_HELPER")] = QString("true");
settings[QString("WPACLI_PATH")] = QString("/usr/bin/wpa_cli");
settings[QString("WPASUP_PATH")] = QString("/usr/bin/wpa_supplicant");
settings[QString("WPA_DRIVERS")] = QString("nl80211,wext");
@ -417,3 +471,29 @@ QMap<QString, QString> SettingsWindow::getSettings()
return settings;
}
void SettingsWindow::startHelper()
{
if (debug) qDebug() << "[SettingsWindow]" << "[startHelper]";
((MainWindow *)parent())->startHelper();
updateHelper();
}
void SettingsWindow::updateHelper()
{
if (debug) qDebug() << "[SettingsWindow]" << "[updateHelper]";
if (((MainWindow *)parent())->isHelperActive()) {
ui->label_status->setText(QApplication::translate("SettingsWindow", "Active"));
ui->pushButton_status->setText(QApplication::translate("SettingsWindow", "Stop"));
ui->pushButton_status->setIcon(QIcon::fromTheme("process-stop"));
}
else {
ui->label_status->setText(QApplication::translate("SettingsWindow", "Inactive"));
ui->pushButton_status->setText(QApplication::translate("SettingsWindow", "Start"));
ui->pushButton_status->setIcon(QIcon::fromTheme("system-run"));
}
}

View File

@ -42,6 +42,7 @@ public:
QMap<QString, QString> getSettings();
public slots:
void closeWindow();
void setDefault();
void showWindow();
@ -50,7 +51,9 @@ private slots:
void changePage(QTreeWidgetItem *current, QTreeWidgetItem *previous);
void saveSettings();
void setTray();
void updateHelper();
// buttons
void selectHelperPath();
void selectIfaceDir();
void selectNetctlPath();
void selectNetctlAutoPath();
@ -60,6 +63,7 @@ private slots:
void selectSystemctlPath();
void selectWpaCliPath();
void selectWpaSupPath();
void startHelper();
private:
bool debug;

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>660</width>
<height>321</height>
<width>658</width>
<height>319</height>
</rect>
</property>
<property name="windowTitle">
@ -67,6 +67,15 @@
</iconset>
</property>
</item>
<item>
<property name="text">
<string>Helper</string>
</property>
<property name="icon">
<iconset resource="../../resources/resources.qrc">
<normaloff>:/icon.png</normaloff>:/icon.png</iconset>
</property>
</item>
<item>
<property name="text">
<string>netctl</string>
@ -110,7 +119,7 @@
<item>
<widget class="QStackedWidget" name="stackedWidget">
<property name="currentIndex">
<number>0</number>
<number>1</number>
</property>
<widget class="QWidget" name="page_general">
<layout class="QVBoxLayout" name="verticalLayout">
@ -127,8 +136,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>444</width>
<height>260</height>
<width>442</width>
<height>258</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_7">
@ -190,6 +199,125 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="page_helper">
<layout class="QVBoxLayout" name="verticalLayout_12">
<item>
<widget class="QScrollArea" name="scrollArea_helper">
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>442</width>
<height>258</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_13">
<item>
<layout class="QHBoxLayout" name="layout_status">
<item>
<widget class="QLabel" name="label_statusText">
<property name="text">
<string>Helper status</string>
</property>
</widget>
</item>
<item>
<spacer name="spacer_status">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label_status">
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_status">
<property name="text">
<string>Start</string>
</property>
<property name="icon">
<iconset theme="system-run"/>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QCheckBox" name="checkBox_useHelper">
<property name="text">
<string>Use helper</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBox_forceSudo">
<property name="text">
<string>Force use sudo in helper</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBox_helperClose">
<property name="text">
<string>Close helper after exit</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="layout_helperPath">
<item>
<widget class="QLabel" name="label_helperPath">
<property name="text">
<string>Helper command</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_helperPath"/>
</item>
<item>
<widget class="QPushButton" name="pushButton_helperPath">
<property name="text">
<string>Browse</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="spacer_helper">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>104</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_netctl">
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>

View File

@ -0,0 +1,12 @@
# set project name
set (SUBPROJECT netctlgui-helper)
message (STATUS "Subproject ${SUBPROJECT}")
# set directories
set (SUBPROJECT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
# additional targets
set (TARGETS "")
set (HEADERS "")
add_subdirectory (${SUBPROJECT_SOURCE_DIR})

View File

@ -0,0 +1,32 @@
# set files
file (GLOB SOURCES *.cpp)
file (GLOB HEADERS *.h)
# include_path
include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../${PROJECT_LIBRARY}/include/
${CMAKE_CURRENT_BINARY_DIR}/../
${CMAKE_SOURCE_DIR}
${CMAKE_BINARY_DIR}
${CMAKE_CURRENT_BINARY_DIR})
link_directories (${PROJECT_LIBRARY}/src/lib)
if (USE_QT5)
find_package(Qt5Core REQUIRED)
find_package(Qt5DBus REQUIRED)
add_definitions(${Qt5Core_DEFINITIONS})
add_definitions(${Qt5DBus_DEFINITIONS})
include_directories (${Qt5Core_INCLUDE_DIRS} ${Qt5DBus_INCLUDE_DIRS})
set (QT_NEEDED_LIBS ${Qt5Core_LIBRARIES} ${Qt5DBus_LIBRARIES})
qt5_wrap_cpp (MOC_SOURCES ${HEADERS})
else ()
find_package (Qt4 COMPONENTS QtCore QtDBus REQUIRED)
include (${QT_USE_FILE})
set (QT_NEEDED_LIBS ${QT_QTCORE_LIBRARY} ${QT_QTDBUS_LIBRARY})
qt4_wrap_cpp (MOC_SOURCES ${HEADERS})
endif()
add_executable (${SUBPROJECT} ${SOURCES} ${HEADERS} ${MOC_SOURCES})
target_link_libraries (${SUBPROJECT} ${PROJECT_LIBRARY} ${QT_NEEDED_LIBS})
# install properties
install (TARGETS ${SUBPROJECT} DESTINATION bin
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE SETUID)

View File

@ -16,11 +16,14 @@
***************************************************************************/
#include "netctlhelper.h"
#include "controladaptor.h"
ControlAdaptor::ControlAdaptor(QObject *parent, const QMap<QString, QString> configuration)
: QDBusAbstractAdaptor(parent)
ControlAdaptor::ControlAdaptor(NetctlHelper *parent, const QMap<QString, QString> configuration)
: QDBusAbstractAdaptor(parent),
helper(parent)
{
netctlCommand = new Netctl(false, configuration);
netctlProfile = new NetctlProfile(false, configuration);
@ -34,6 +37,20 @@ ControlAdaptor::~ControlAdaptor()
}
// helper
bool ControlAdaptor::Active()
{
return true;
}
bool ControlAdaptor::Close()
{
helper->quitHelper();
return true;
}
// netctlCommand
bool ControlAdaptor::autoDisableAll()
{

View File

@ -23,17 +23,22 @@
#include <netctlgui/netctlgui.h>
class NetctlHelper;
class ControlAdaptor : public QDBusAbstractAdaptor
{
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "org.freedesktop.netctlgui")
Q_CLASSINFO("D-Bus Interface", "org.netctlgui.helper")
public:
explicit ControlAdaptor(QObject *parent = 0,
explicit ControlAdaptor(NetctlHelper *parent = 0,
const QMap<QString, QString> configuration = QMap<QString, QString>());
~ControlAdaptor();
public slots:
// helper
bool Active();
bool Close();
// netctlCommand
bool autoDisableAll();
bool autoEnable(const QString profile);
@ -50,6 +55,7 @@ public slots:
bool Remove(const QString profile);
private:
NetctlHelper *helper;
Netctl *netctlCommand;
NetctlProfile *netctlProfile;
};

121
sources/helper/src/main.cpp Normal file
View File

@ -0,0 +1,121 @@
/***************************************************************************
* This file is part of netctl-gui *
* *
* netctl-gui is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* netctl-gui is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with netctl-gui. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include <QCoreApplication>
#include <QDBusConnection>
#include <QDBusMessage>
#include <QDir>
#include <iostream>
#include <unistd.h>
#include "messages.h"
#include "netctlhelper.h"
#include "version.h"
using namespace std;
bool checkExistSession()
{
QDBusConnection bus = QDBusConnection::sessionBus();
QDBusMessage request = QDBusMessage::createMethodCall(QString(DBUS_HELPER_SERVICE),
QString(DBUS_CONTROL_PATH),
QString(DBUS_HELPER_INTERFACE),
QString("Active"));
QDBusMessage response = bus.call(request);
QList<QVariant> arguments = response.arguments();
return ((arguments.size() == 1) && arguments[0].toBool());
}
int main(int argc, char *argv[])
{
// detach from console
bool isDaemon = true;
for (int i=0; i<argc; i++)
if (QString(argv[i]) == QString("--nodaemon")) {
isDaemon = false;
break;
}
if (isDaemon)
daemon(0, 0);
#if QT_VERSION >= 0x050000
QCoreApplication::setSetuidAllowed(true);
#endif
QCoreApplication a(argc, argv);
// check if exists
if (checkExistSession())
return 0;
QMap<QString, QVariant> args = getArgs();
// reading
for (int i=1; i<argc; i++) {
// config path
if ((QString(argv[i]) == QString("-c")) || (QString(argv[i]) == QString("--config"))) {
args[QString("config")] = QDir().absoluteFilePath(argv[i+1]);
i++;
}
// debug
else if ((QString(argv[i]) == QString("-d")) || (QString(argv[i]) == QString("--debug"))) {
args[QString("debug")] = true;
}
// daemonized
else if (QString(argv[i]) == QString("--nodaemon")) {
args[QString("nodaemon")] = true;
}
// messages
// help message
else if ((QString(argv[i]) == QString("-h")) || (QString(argv[i]) == QString("--help"))) {
args[QString("help")] = true;
}
// info message
else if ((QString(argv[i]) == QString("-i")) || (QString(argv[i]) == QString("--info"))) {
args[QString("info")] = true;
}
// version message
else if ((QString(argv[i]) == QString("-v")) || (QString(argv[i]) == QString("--version"))) {
args[QString("version")] = true;
}
else {
args[QString("error")] = true;
}
}
// running
if (args[QString("error")].toBool()) {
cout << errorMessage().toUtf8().data() << endl;
cout << helpMessage().toUtf8().data();
return 127;
}
if (args[QString("help")].toBool()) {
cout << helpMessage().toUtf8().data();
return 0;
}
if (args[QString("info")].toBool()) {
cout << versionMessage().toUtf8().data() << endl;
cout << infoMessage().toUtf8().data();
return 0;
}
if (args[QString("version")].toBool()) {
cout << versionMessage().toUtf8().data();
return 0;
}
NetctlHelper w(0, args);
return a.exec();
}

View File

@ -0,0 +1,116 @@
/***************************************************************************
* This file is part of netctl-gui *
* *
* netctl-gui is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* netctl-gui is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with netctl-gui. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include <QCoreApplication>
#include <QDir>
#include "messages.h"
#include "version.h"
QString errorMessage()
{
QString errorMessage = QCoreApplication::translate("NetctlHelper", "Unknown flag\n");
return errorMessage;
}
QMap<QString, QVariant> getArgs()
{
QMap<QString, QVariant> args;
args[QString("config")] = QString(QDir::homePath() + QString("/.config/netctl-gui.conf"));
args[QString("debug")] = false;
args[QString("nodaemon")] = false;
args[QString("help")] = false;
args[QString("info")] = false;
args[QString("version")] = false;
args[QString("error")] = false;
return args;
}
QString helpMessage()
{
QString helpMessage = QString("");
helpMessage += QString("%1\n").arg(QCoreApplication::translate("NetctlHelper", "Usage:"));
helpMessage += QString("netctlgui-helper [ options ]\n");
helpMessage += QString("%1\n").arg(QCoreApplication::translate("NetctlHelper", "Options:"));
// windows
helpMessage += QString(" -c, --config <arg> - %1\n")
.arg(QCoreApplication::translate("NetctlHelper", "read configuration from this file"));
helpMessage += QString(" -d, --debug - %1\n")
.arg(QCoreApplication::translate("NetctlHelper", "print debug information"));
helpMessage += QString(" --nodaemon - %1\n")
.arg(QCoreApplication::translate("NetctlHelper", "do not start as daemon"));
helpMessage += QString(" %1\n").arg(QCoreApplication::translate("NetctlHelper", "Show messages:"));
helpMessage += QString(" -v, --version - %1\n")
.arg(QCoreApplication::translate("NetctlHelper", "show version and exit"));
helpMessage += QString(" -i, --info - %1\n")
.arg(QCoreApplication::translate("NetctlHelper", "show build information and exit"));
helpMessage += QString(" -h, --help - %1\n")
.arg(QCoreApplication::translate("NetctlHelper", "show this help and exit"));
return helpMessage;
}
QString infoMessage()
{
QString infoMessage = QString("");
// build information
infoMessage += QCoreApplication::translate("NetctlHelper", "Build date: %1").
arg(QString(BUILD_DATE));
infoMessage += QString("\n%1:\n").arg(QCoreApplication::translate("NetctlHelper", "cmake flags"));
infoMessage += QString("\t-DCMAKE_BUILD_TYPE=%1 \\\n").arg(QString(CMAKE_BUILD_TYPE));
infoMessage += QString("\t-DCMAKE_INSTALL_PREFIX=%1 \\\n").arg(QString(CMAKE_INSTALL_PREFIX));
infoMessage += QString("\t-DBUILD_DOCS=%1 \\\n").arg(QString(PROJECT_BUILD_DOCS));
infoMessage += QString("\t-DBUILD_LIBRARY=%1 \\\n").arg(QString(PROJECT_BUILD_LIBRARY));
infoMessage += QString("\t-DBUILD_GUI=%1 \\\n").arg(QString(PROJECT_BUILD_GUI));
infoMessage += QString("\t-DUSE_QT5=%1 \\\n").arg(QString(PROJECT_USE_QT5));
infoMessage += QString("\t-DBUILD_DATAENGINE=%1 \\\n").arg(QString(PROJECT_BUILD_DATAENGINE));
infoMessage += QString("\t-DBUILD_PLASMOID=%1\n").arg(QString(PROJECT_BUILD_PLASMOID));
// transport information
infoMessage += QString("%1:\n").arg(QCoreApplication::translate("NetctlHelper", "DBus configuration"));
infoMessage += QString("\tDBUS_SERVICE=%1\n").arg(QString(DBUS_SERVICE));
infoMessage += QString("\tDBUS_INTERFACE=%1\n").arg(QString(DBUS_INTERFACE));
infoMessage += QString("\tDBUS_CONTROL_PATH=%1\n").arg(QString(DBUS_CONTROL_PATH));
infoMessage += QString("\tDBUS_LIB_PATH=%1\n").arg(QString(DBUS_LIB_PATH));
infoMessage += QString("\tDBUS_OBJECT_PATH=%1\n").arg(QString(DBUS_OBJECT_PATH));
return infoMessage;
}
QString versionMessage()
{
QString versionMessage = QString("");
versionMessage += QString("%1\n").arg(QString(NAME));
versionMessage += QString("%1 : %2\n")
.arg(QCoreApplication::translate("NetctlHelper", "Version"))
.arg(QString(VERSION));
versionMessage += QString("%1 : %2\n")
.arg(QCoreApplication::translate("NetctlHelper", "Author"))
.arg(QString(AUTHOR));
versionMessage += QString("%1 : %2\n")
.arg(QCoreApplication::translate("NetctlHelper", "License"))
.arg(QString(LICENSE));
return versionMessage;
}

View File

@ -0,0 +1,34 @@
/***************************************************************************
* This file is part of netctl-gui *
* *
* netctl-gui is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* netctl-gui is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with netctl-gui. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#ifndef MESSAGES_H
#define MESSAGES_H
#include <QChar>
#include <QMap>
#include <QString>
#include <QVariant>
QString errorMessage();
QMap<QString, QVariant> getArgs();
QString helpMessage();
QString infoMessage();
QString versionMessage();
#endif /* MESSAGES_H */

View File

@ -27,7 +27,7 @@
class NetctlAdaptor : public QDBusAbstractAdaptor
{
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "org.freedesktop.netctlgui")
Q_CLASSINFO("D-Bus Interface", "org.netctlgui.helper")
public:
explicit NetctlAdaptor(QObject *parent = 0,

View File

@ -0,0 +1,152 @@
/***************************************************************************
* This file is part of netctl-gui *
* *
* netctl-gui is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* netctl-gui is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with netctl-gui. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include <QCoreApplication>
#include <QDBusConnection>
#include <QDebug>
#include <netctlgui/netctlgui.h>
#include "controladaptor.h"
#include "netctladaptor.h"
#include "netctlhelper.h"
#include "version.h"
NetctlHelper::NetctlHelper(QObject *parent, QMap<QString, QVariant> args)
: QObject(parent),
configPath(args[QString("config")].toString()),
debug(args[QString("debug")].toBool())
{
updateConfiguration();
}
NetctlHelper::~NetctlHelper()
{
if (debug) qDebug() << "[NetctlHelper]" << "[~NetctlHelper]";
deleteInterface();
}
QMap<QString, QString> NetctlHelper::getDefault()
{
if (debug) qDebug() << "[NetctlHelper]" << "[getDefault]";
QMap<QString, QString> settings;
settings[QString("CLOSETOTRAY")] = QString("true");
settings[QString("CTRL_DIR")] = QString("/run/wpa_supplicant_netctl-gui");
settings[QString("CTRL_GROUP")] = QString("users");
settings[QString("IFACE_DIR")] = QString("/sys/class/net/");
settings[QString("LANGUAGE")] = QString("en");
settings[QString("NETCTL_PATH")] = QString("/usr/bin/netctl");
settings[QString("NETCTLAUTO_PATH")] = QString("/usr/bin/netctl-auto");
settings[QString("NETCTLAUTO_SERVICE")] = QString("netctl-auto");
settings[QString("PID_FILE")] = QString("/run/wpa_supplicant_netctl-gui.pid");
settings[QString("PREFERED_IFACE")] = QString("");
settings[QString("PROFILE_DIR")] = QString("/etc/netctl/");
settings[QString("RFKILL_DIR")] = QString("/sys/class/rfkill/");
settings[QString("STARTTOTRAY")] = QString("false");
settings[QString("SUDO_PATH")] = QString("/usr/bin/kdesu");
settings[QString("SYSTEMCTL_PATH")] = QString("/usr/bin/systemctl");
settings[QString("SYSTRAY")] = QString("true");
settings[QString("WPACLI_PATH")] = QString("/usr/bin/wpa_cli");
settings[QString("WPASUP_PATH")] = QString("/usr/bin/wpa_supplicant");
settings[QString("WPA_DRIVERS")] = QString("nl80211,wext");
for (int i=0; i<settings.keys().count(); i++)
if (debug) qDebug() << "[NetctlHelper]" << "[getDefault]" << ":" <<
settings.keys()[i] + QString("=") + settings[settings.keys()[i]];
return settings;
}
QMap<QString, QString> NetctlHelper::getSettings()
{
if (debug) qDebug() << "[NetctlHelper]" << "[getSettings]";
QMap<QString, QString> settings = getDefault();
QFile configFile(configPath);
QString fileStr;
if (!configFile.open(QIODevice::ReadOnly))
return settings;
while (true) {
fileStr = QString(configFile.readLine()).trimmed();
if ((fileStr.isEmpty()) && (!configFile.atEnd())) continue;
if ((fileStr[0] == QChar('#')) && (!configFile.atEnd())) continue;
if ((fileStr[0] == QChar(';')) && (!configFile.atEnd())) continue;
if (fileStr.contains(QChar('=')))
settings[fileStr.split(QChar('='))[0]] = fileStr.split(QChar('='))[1];
if (configFile.atEnd()) break;
}
configFile.close();
for (int i=0; i<settings.keys().count(); i++)
if (debug) qDebug() << "[NetctlHelper]" << "[getSettings]" << ":" <<
settings.keys()[i] + QString("=") + settings[settings.keys()[i]];
return settings;
}
void NetctlHelper::quitHelper()
{
if (debug) qDebug() << "[NetctlHelper]" << "[quitHelper]";
QCoreApplication::quit();
}
void NetctlHelper::createInterface()
{
if (debug) qDebug() << "[NetctlHelper]" << "[createInterface]";
QDBusConnection bus = QDBusConnection::sessionBus();
if (!bus.registerService(QString(DBUS_HELPER_SERVICE)))
if (debug) qDebug() << "[NetctlHelper]" << "[createInterface]" << ":" << "Could not register service";
if (!bus.registerObject(QString(DBUS_LIB_PATH),
new NetctlAdaptor(this, configuration),
QDBusConnection::ExportAllContents))
if (debug) qDebug() << "[NetctlHelper]" << "[createInterface]" << ":" << "Could not register library object";
if (!bus.registerObject(QString(DBUS_CONTROL_PATH),
new ControlAdaptor(this, configuration),
QDBusConnection::ExportAllContents))
if (debug) qDebug() << "[NetctlHelper]" << "[createInterface]" << ":" << "Could not register control object";
}
void NetctlHelper::deleteInterface()
{
if (debug) qDebug() << "[NetctlHelper]" << "[deleteInterface]";
QDBusConnection::sessionBus().unregisterObject(QString(DBUS_LIB_PATH));
QDBusConnection::sessionBus().unregisterObject(QString(DBUS_CONTROL_PATH));
QDBusConnection::sessionBus().unregisterService(QString(DBUS_HELPER_SERVICE));
}
void NetctlHelper::updateConfiguration()
{
if (debug) qDebug() << "[NetctlHelper]" << "[updateConfiguration]";
deleteInterface();
configuration = getSettings();
createInterface();
}

View File

@ -0,0 +1,50 @@
/***************************************************************************
* This file is part of netctl-gui *
* *
* netctl-gui is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* netctl-gui is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with netctl-gui. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#ifndef NETCTLHELPER_H
#define NETCTLHELPER_H
#include <QMap>
#include <QObject>
#include <QVariant>
class NetctlHelper : public QObject
{
Q_OBJECT
public:
explicit NetctlHelper(QObject *parent = 0,
QMap<QString, QVariant> args = QMap<QString, QVariant>());
~NetctlHelper();
public slots:
QMap<QString, QString> getDefault();
QMap<QString, QString> getSettings();
void quitHelper();
private:
QString configPath;
QMap<QString, QString> configuration;
bool debug;
void createInterface();
void deleteInterface();
void updateConfiguration();
};
#endif /* NETCTLHELPER_H */

View File

@ -27,10 +27,12 @@
#define PROJECT_BUILD_PLASMOID "@BUILD_PLASMOID@"
#define PROJECT_USE_QT5 "@USE_QT5@"
#define DBUS_CONTROL_PATH "/ctrl"
#define DBUS_INTERFACE "org.freedesktop.netctlgui"
#define DBUS_LIB_PATH "/netctl"
#define DBUS_SERVICE "org.netctlgui.netctlgui"
#define DBUS_INTERFACE "org.netctlgui.netctlgui"
#define DBUS_OBJECT_PATH "/netctlgui"
#define DBUS_SERVICE "org.freedesktop.netctlgui"
#define DBUS_HELPER_SERVICE "org.netctlgui.helper"
#define DBUS_HELPER_INTERFACE "org.netctlgui.helper"
#define DBUS_CONTROL_PATH "/ctrl"
#define DBUS_LIB_PATH "/netctl"
#endif /* VERSION_H */