Russian Qt Forum
Ноябрь 23, 2024, 01:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Выключение компьютера через D-Bus  (Прочитано 12600 раз)
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« : Май 07, 2013, 10:39 »

Доброго дня! Улыбающийся как-то давно спрашивал, как можно выключить программно компьютер под управлением Linux не из-под root пользователя! Посоветовали использовать D-Bus. Пробую, но не получается.. причем залочить экран получается, а вот выключить компьютер нет. Вот код:

Код:
#include <QtCore/QCoreApplication>
#include <QtCore/QTimer>
#include <QtDBus/QtDBus>

#define SERVICE_NAME  "org.freedesktop.ConsoleKit.Manager"
//#define SERVICE_NAME "org.freedesktop.ScreenSaver"

int main(int argc, char **argv)
{
     QCoreApplication app(argc, argv);

     // Создаем соединение с системной шиной D-Bus
     QDBusConnection conn = QDBusConnection::systemBus();

     if (!conn.isConnected()) {
         qDebug() << "Err: isConnected systemBus";
         return 1;
     }

     if (!conn.registerService(SERVICE_NAME)) {
         qDebug() << "Err: registerService";
         exit(1);
     }

     QDBusMessage msg = QDBusMessage::createMethodCall("org.freedesktop.ConsoleKit.Manager",
                                                       "/Manager",
                                                       "org.freedesktop.ConsoleKit.Manager",
                                                       "Stop");

//   QDBusMessage msg = QDBusMessage::createMethodCall("org.freedesktop.ScreenSaver",
//                                                     "/ScreenSaver",
//                                                     "org.freedesktop.ScreenSaver",
//                                                     "Lock");

     conn.systemBus().send(msg);
     return 0;
}

Для регисрации сервиса добавил в /etc/dbus-1/system.d файл myProg.conf
Код:
<!DOCTYPE busconfig PUBLIC
 "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
  <policy context="default">
    <allow own="org.freedesktop.ConsoleKit.Manager"/>
    <allow send_destination="org.freedesktop.ConsoleKit.Manager"/>
    <allow receive_sender  ="org.freedesktop.ConsoleKit.Manager"/>
 </policy>
</busconfig>

Предлагалось использовать HAL, но в используемом дистрибутиве OpenSUSE 11.4 он был урезан. Даже из терминала не выключает
Код:
dbus-send --system --print-reply --dest="org.freedesktop.Hal" /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown

А вот через ConsoleKit выключает, но только через терминал
Код:
dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop

Что я в программе делаю не так???


« Последнее редактирование: Май 08, 2013, 10:35 от Vladimir » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Май 07, 2013, 10:46 »

А у юзера есть соответствующие права?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #2 : Май 07, 2013, 10:51 »

А у юзера есть соответствующие права?

Хороший вопрос)) а как это посмотреть/назначить в Linux? Он должен входить в группу root? У меня локальный пользователь входит во все группы) ну так, чтобы уже наверняка.)
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Май 07, 2013, 11:13 »

Почитать маны или гугл. Улыбающийся
На сколько я помню, группа wheel.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #4 : Май 07, 2013, 11:31 »

Почитать маны или гугл. Улыбающийся
На сколько я помню, группа wheel.

Да, есть такая группа и он в нее входит. Я же написал, что пользователь входит во все группы. Может дело в коде или файле myProg.conf?
Потому что в вызове
Код:
QDBusMessage msg = QDBusMessage::createMethodCall("org.freedesktop.ScreenSaver",
                                                     [b]"/ScreenSaver",[/b]
                                                     "org.freedesktop.ScreenSaver",
                                                     "Lock");
Если указать /org/freedesktop/ScreenSaver вместо /ScreenSaver, то экран не лочится.. хотя вроде как тоже самое, только полный путь..
Может нужно использовать QDBusMessage::createSignal() ? Пробовал задавать разные входные параметры, но не с одним не работает..

еще есть org.kde.KSMServerInterface. но с ним тоже не получается, видимо где-то неправильно задаю параметры вызова..? как нужно?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Май 07, 2013, 11:34 »

Попробуй пошуршать на qt-apps, по-любому кто-то уже подобное делал. Я с дбасом не работал, так что, помочь не могу.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #6 : Май 07, 2013, 11:41 »

Попробуй пошуршать на qt-apps, по-любому кто-то уже подобное делал. Я с дбасом не работал, так что, помочь не могу.

Спасибо за совет. может кто работал, подскажет еще что)
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Май 07, 2013, 14:25 »

Попробуй так:
Код
C++ (Qt)
QDBusMessage msg = QDBusMessage::createMethodCall("org.freedesktop.ConsoleKit",
                                                      "/org/freedesktop/ConsoleKit/Manager",
                                                      "org.freedesktop.ConsoleKit.Manager",
                                                      "Stop");
 
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #8 : Май 07, 2013, 14:39 »

Попробуй так:
Код
C++ (Qt)
QDBusMessage msg = QDBusMessage::createMethodCall("org.freedesktop.ConsoleKit",
                                                      "/org/freedesktop/ConsoleKit/Manager",
                                                      "org.freedesktop.ConsoleKit.Manager",
                                                      "Stop");
 

и так пробовал. тоже не работает Грустный
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Май 07, 2013, 14:47 »

и так пробовал. тоже не работает Грустный
Запусти qdbusviewer и попробуй через него отключить.
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #10 : Май 07, 2013, 14:56 »

и так пробовал. тоже не работает Грустный
Запусти qdbusviewer и попробуй через него отключить.


ух ты. это типо такая прога визуализации команд D-Bus? круто) да, через него отключил теми же командами
org->freedesktop->ConsoleKit->Manager->Stop. так и через терминал ConsoleKit отключает, почему тогда программно не хочет??
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Май 07, 2013, 15:14 »

.почему тогда программно не хочет??
Что-то делаешь не так. Посмотри ее исходники, как она вызывает методы.
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #12 : Май 07, 2013, 15:23 »

.почему тогда программно не хочет??
Что-то делаешь не так. Посмотри ее исходники, как она вызывает методы.


да, я и подумал глянуть исходники, а где их можно взять?! что-то в инете не получается найти..
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #13 : Май 07, 2013, 15:24 »

ты что-то не так понял, registerService() регистрирует свой сервис, а тебе нужно подключиться к существующему. И конфигурацию в system.d для этого не нужно класть, это нужно только для сервиса dbus, а у тебя клиент.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #14 : Май 07, 2013, 15:34 »

вот так попробуй

Код
C++ (Qt)
   QDBusInterface remoteApp("org.freedesktop.ConsoleKit",
                               "/org/freedesktop/ConsoleKit/Manager",
                               "org.freedesktop.ConsoleKit.Manager",
                               QDBusConnection::systemBus());
 
   remoteApp.call("Stop"); // нужно ещё проверить ответ если он есть и вывести ошибку если есть
 
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.116 секунд. Запросов: 22.