Название: [РЕШЕНО] Выключение компьютера через D-Bus Отправлено: Vladimir от Май 07, 2013, 10:39 Доброго дня! :) как-то давно спрашивал, как можно выключить программно компьютер под управлением Linux не из-под root пользователя! Посоветовали использовать D-Bus. Пробую, но не получается.. причем залочить экран получается, а вот выключить компьютер нет. Вот код:
Код: #include <QtCore/QCoreApplication> Для регисрации сервиса добавил в /etc/dbus-1/system.d файл myProg.conf Код: <!DOCTYPE busconfig PUBLIC Предлагалось использовать 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 Что я в программе делаю не так??? Название: Re: Выключение компьютера через D-Bus Отправлено: Пантер от Май 07, 2013, 10:46 А у юзера есть соответствующие права?
Название: Re: Выключение компьютера через D-Bus Отправлено: Vladimir от Май 07, 2013, 10:51 А у юзера есть соответствующие права? Хороший вопрос)) а как это посмотреть/назначить в Linux? Он должен входить в группу root? У меня локальный пользователь входит во все группы) ну так, чтобы уже наверняка.) Название: Re: Выключение компьютера через D-Bus Отправлено: Пантер от Май 07, 2013, 11:13 Почитать маны или гугл. :)
На сколько я помню, группа wheel. Название: Re: Выключение компьютера через D-Bus Отправлено: Vladimir от Май 07, 2013, 11:31 Почитать маны или гугл. :) На сколько я помню, группа wheel. Да, есть такая группа и он в нее входит. Я же написал, что пользователь входит во все группы. Может дело в коде или файле myProg.conf? Потому что в вызове Код: QDBusMessage msg = QDBusMessage::createMethodCall("org.freedesktop.ScreenSaver", Может нужно использовать QDBusMessage::createSignal() ? Пробовал задавать разные входные параметры, но не с одним не работает.. еще есть org.kde.KSMServerInterface. но с ним тоже не получается, видимо где-то неправильно задаю параметры вызова..? как нужно? Название: Re: Выключение компьютера через D-Bus Отправлено: Пантер от Май 07, 2013, 11:34 Попробуй пошуршать на qt-apps, по-любому кто-то уже подобное делал. Я с дбасом не работал, так что, помочь не могу.
Название: Re: Выключение компьютера через D-Bus Отправлено: Vladimir от Май 07, 2013, 11:41 Попробуй пошуршать на qt-apps, по-любому кто-то уже подобное делал. Я с дбасом не работал, так что, помочь не могу. Спасибо за совет. может кто работал, подскажет еще что) Название: Re: Выключение компьютера через D-Bus Отправлено: Old от Май 07, 2013, 14:25 Попробуй так:
Код
Название: Re: Выключение компьютера через D-Bus Отправлено: Vladimir от Май 07, 2013, 14:39 Попробуй так: Код
и так пробовал. тоже не работает :( Название: Re: Выключение компьютера через D-Bus Отправлено: Old от Май 07, 2013, 14:47 и так пробовал. тоже не работает :( Запусти qdbusviewer и попробуй через него отключить.Название: Re: Выключение компьютера через D-Bus Отправлено: Vladimir от Май 07, 2013, 14:56 и так пробовал. тоже не работает :( Запусти qdbusviewer и попробуй через него отключить.ух ты. это типо такая прога визуализации команд D-Bus? круто) да, через него отключил теми же командами org->freedesktop->ConsoleKit->Manager->Stop. так и через терминал ConsoleKit отключает, почему тогда программно не хочет?? Название: Re: Выключение компьютера через D-Bus Отправлено: Old от Май 07, 2013, 15:14 .почему тогда программно не хочет?? Что-то делаешь не так. Посмотри ее исходники, как она вызывает методы.Название: Re: Выключение компьютера через D-Bus Отправлено: Vladimir от Май 07, 2013, 15:23 .почему тогда программно не хочет?? Что-то делаешь не так. Посмотри ее исходники, как она вызывает методы.да, я и подумал глянуть исходники, а где их можно взять?! что-то в инете не получается найти.. Название: Re: Выключение компьютера через D-Bus Отправлено: Alex Custov от Май 07, 2013, 15:24 ты что-то не так понял, registerService() регистрирует свой сервис, а тебе нужно подключиться к существующему. И конфигурацию в system.d для этого не нужно класть, это нужно только для сервиса dbus, а у тебя клиент.
Название: Re: Выключение компьютера через D-Bus Отправлено: Alex Custov от Май 07, 2013, 15:34 вот так попробуй
Код
Название: Re: Выключение компьютера через D-Bus Отправлено: Vladimir от Май 07, 2013, 15:43 вот так попробуй Код
Сделал так, проверил ответ и ошибку! Ответа нет, ошибки нет.. не проходит проверку if(remoteApp.isValid()) Код: int main(int argc, char **argv) iface not valid Название: Re: Выключение компьютера через D-Bus Отправлено: tester64 от Май 07, 2013, 22:09 Можно использовать D-Bus интерфейсы ConsoleKit, UPower, HAL, и десктоп-специфичные интерфейсы.
Какие из D-Bus интерфейсов будут работать - сказать трудно. У меня на OpenSUSE 12.3 работает только UPower, но возможно, что он не позволяет выполнять выключение и перезагрузку (во всяком случае, в коде KShutdown такого нет, а спецификацию искать было лень). Вот навскидку работающий вариант для KDE: Код
Если нужен другой десктоп или список по-максимуму, то наверное будет проще содрать из KShutdown. Название: Re: Выключение компьютера через D-Bus Отправлено: Alex Custov от Май 08, 2013, 00:06 Сделал так, проверил ответ и ошибку! Ответа нет, ошибки нет.. не проходит проверку if(remoteApp.isValid()) Думаю дело в правах или неправильном использовании интерфейса consolekit (в котором я не специалист). Название: Re: Выключение компьютера через D-Bus Отправлено: Vladimir от Май 08, 2013, 10:34 Сделал так, проверил ответ и ошибку! Ответа нет, ошибки нет.. не проходит проверку if(remoteApp.isValid()) Думаю дело в правах или неправильном использовании интерфейса consolekit (в котором я не специалист). Да, дело было в неправильном использовании/написании интерфейса! Правильное написание QDBusInterface dbiConsoleKit("org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit.Manager", QDBusConnection::systemBus()); вместо QDBusInterface iface("org.freedesktop.ConsoleKit.Manager", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit.Manager", QDBusConnection::systemBus()); Спасибо ВСЕМ за помощь! =) Название: Re: Выключение компьютера через D-Bus Отправлено: Alex Custov от Май 08, 2013, 13:16 Да, дело было в неправильном использовании/написании интерфейса! Правильное написание Ну да, я не обратил внимание на то, что ты имя сервиса написал неправильно, хотя в моём сообщении было правильно. |