diff --git a/misc/CMakeLists.txt b/misc/CMakeLists.txt index 107a080..3409599 100644 --- a/misc/CMakeLists.txt +++ b/misc/CMakeLists.txt @@ -33,6 +33,13 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/deepin-service-group@.service.system RENAME deepin-service-group@.service ) +# Install drop-in configuration for deepin-daemon group +configure_file(deepin-service-group@deepin-daemon.service.d/override.conf.in + deepin-service-group@deepin-daemon.service.d/override.conf @ONLY) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/deepin-service-group@deepin-daemon.service.d/override.conf + DESTINATION lib/systemd/system/deepin-service-group@deepin-daemon.service.d/ +) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/deepin-service-plugin@.service.system DESTINATION lib/systemd/system/ RENAME deepin-service-plugin@.service diff --git a/misc/deepin-service-group@.service.in b/misc/deepin-service-group@.service.in index 98f146f..fd9ba6a 100644 --- a/misc/deepin-service-group@.service.in +++ b/misc/deepin-service-group@.service.in @@ -10,5 +10,10 @@ ExecStart=/usr/bin/deepin-service-manager -g %i Restart=on-failure RestartSec=3 @SYSTEMD_SLICE@ +# 如果 group 是 deepin-daemon,使用 deepin-daemon 用户启动 +# 可以通过 systemd drop-in 配置覆盖: /etc/systemd/system/deepin-service-group@deepin-daemon.service.d/override.conf +# 内容: [Service] +# User=deepin-daemon +# Group=deepin-daemon @SYSTEMD_INSTALL@ diff --git a/misc/deepin-service-group@deepin-daemon.service.d/override.conf.in b/misc/deepin-service-group@deepin-daemon.service.d/override.conf.in new file mode 100644 index 0000000..9e16cdc --- /dev/null +++ b/misc/deepin-service-group@deepin-daemon.service.d/override.conf.in @@ -0,0 +1,5 @@ +# Override configuration for deepin-daemon group +# This file specifies that the deepin-daemon group should run as deepin-daemon user +[Service] +User=deepin-daemon +Group=deepin-daemon diff --git a/src/deepin-service-manager/main.cpp b/src/deepin-service-manager/main.cpp index e38596a..924cf38 100644 --- a/src/deepin-service-manager/main.cpp +++ b/src/deepin-service-manager/main.cpp @@ -15,6 +15,7 @@ #include #include +#include Q_LOGGING_CATEGORY(dsm_Main, "[Main]") int main(int argc, char *argv[]) @@ -22,10 +23,18 @@ int main(int argc, char *argv[]) // 声明一个指向 QCoreApplication 或 QGuiApplication 的指针 QCoreApplication *a; uid_t euid = geteuid(); - if (euid != 0) { - a = new QGuiApplication(argc, argv); - } else { + bool useCoreApp = (euid == 0); + + // 检查是否是deepin-daemon 用户 + if (!useCoreApp) { + struct passwd *pw = getpwuid(euid); + useCoreApp = (pw && QString::fromUtf8(pw->pw_name) == "deepin-daemon"); + } + + if (useCoreApp) { a = new QCoreApplication(argc, argv); + } else { + a = new QGuiApplication(argc, argv); } a->setApplicationName("org.deepin.service.manager"); diff --git a/src/deepin-service-manager/servicemanager.cpp b/src/deepin-service-manager/servicemanager.cpp index 64b9b3b..41aa25c 100644 --- a/src/deepin-service-manager/servicemanager.cpp +++ b/src/deepin-service-manager/servicemanager.cpp @@ -21,7 +21,7 @@ Q_LOGGING_CATEGORY(dsm_ServiceManager, "[ServiceManager]") -static const QStringList GroupSiral{ "core", "dde", "app" }; +static const QStringList GroupSiral{ "core", "dde", "app", "deepin-daemon" }; ServiceManager::ServiceManager(QObject *parent) : QObject(parent)