Коммит 00b17f74 создал по автору sgakerru's avatar sgakerru Зафиксировано автором Проскурнев Артем Сергеевич
Просмотр файлов

DBus-сервис для гостя

владелец 95e327e1
cmake_minimum_required(VERSION 3.16)
set(PROJECT_NAME mos-guest-dbus-service)
project(${PROJECT_NAME} LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
include(GNUInstallDirs)
# Useful tools from KDE
find_package(ECM 1.4.0 REQUIRED NO_MODULE)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH})
include(KDECompilerSettings NO_POLICY_SCOPE)
include(KDEClangFormat)
# add clang-format target
file(GLOB_RECURSE ALL_CLANG_FORMAT_SOURCE_FILES *.cpp *.h *.c)
kde_clang_format(${ALL_CLANG_FORMAT_SOURCE_FILES})
# For Qt
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
find_package(Qt5 REQUIRED COMPONENTS
Core
DBus
)
set(SRCS
src/guestdbusservice.h src/guestdbusservice.cpp
src/main.cpp
)
add_executable(${PROJECT_NAME} ${SRCS})
target_link_libraries(${PROJECT_NAME}
Qt::Core
Qt::DBus
)
install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR})
<!DOCTYPE busconfig PUBLIC
"-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
<!-- Only user guest can own this service -->
<policy user="guest">
<allow own="org.mos.auth.guest"/>
</policy>
<!-- Only root user call the service -->
<policy user="root">
<allow send_destination="org.mos.auth.guest"/>
</policy>
</busconfig>
#include "guestdbusservice.h"
#include "qobject.h"
#include <QDebug>
#include <QProcess>
#include <QUrl>
GuestDBusService::GuestDBusService(QObject *parent)
: QObject(parent)
{
}
QString GuestDBusService::run(const QString &cmd)
{
const QString msg = QString("run command: %1").arg(cmd);
qInfo() << msg;
QProcess *myProcess = new QProcess(this);
myProcess->start("bash", QStringList() << "-c" << cmd);
if (!myProcess->waitForStarted())
return "Can't run command";
if (!myProcess->waitForFinished())
return "Can't wait command finish";
return myProcess->readAll();
}
QString GuestDBusService::runFromFile(const QString &path)
{
const QString msg = QString("run command from file: %1").arg(path);
qInfo() << msg;
QUrl appUrl(path);
QProcess *myProcess = new QProcess(this);
myProcess->start(appUrl.path(), QStringList());
if (!myProcess->waitForStarted())
return "Can't run command";
if (!myProcess->waitForFinished())
return "Can't wait command finish";
return myProcess->readAll();
}
#ifndef GUESTDBUSSERVICE_H
#define GUESTDBUSSERVICE_H
#include <QObject>
#define SERVICE_NAME "org.mos.auth.guest"
class GuestDBusService : public QObject
{
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", SERVICE_NAME)
public:
explicit GuestDBusService(QObject *parent = nullptr);
public slots:
Q_SCRIPTABLE QString run(const QString &cmd);
Q_SCRIPTABLE QString runFromFile(const QString &path);
};
#endif // GUESTDBUSSERVICE_H
#include "guestdbusservice.h"
#include <QCoreApplication>
#include <QDBusConnection>
#include <QDBusError>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
GuestDBusService *dbus = new GuestDBusService();
auto connection = QDBusConnection::systemBus();
if (!connection.isConnected()) {
qWarning() << "Cannot connect to the D-Bus session bus.";
return 1;
}
if (!connection.registerService(SERVICE_NAME)) {
qWarning() << qPrintable(connection.lastError().message());
return 1;
}
connection.registerObject("/", dbus, QDBusConnection::ExportAllSlots);
return a.exec();
}
......@@ -55,6 +55,13 @@ then
fi
cp --recursive --no-target-directory '/etc/skel' "${HOME}"
cat << EOF > "${HOME}/.config/autostart/mos-guest-dbus-service.desktop"
[Desktop Entry]
Name=MOS Guest DBus Service
Exec=mos-guest-dbus-service
Type=Application
EOF
chown --recursive "$PAM_USER:" "${HOME}"
fi
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать