Некоторое время назад shutdown/reboot/suspend/hibernate в XFCE работали посредством следующей конфигурации: # tail -3 /etc/sudoers ALL ALL=(ALL) NOPASSWD: /usr/sbin/pm-suspend ALL ALL=(ALL) NOPASSWD: /usr/sbin/pm-hibernate ALL ALL=(ALL) NOPASSWD: /sbin/shutdown Похоже, что уже не работают. Что изменилось и можно ли это исправить?
Хм, мне тоже казалось, что там прямой запуск команд через sudo. Либо я что-то не уже помню, либо с чем-то путаю. На самом деле там запуск через sudo helper'а, его и надо разрешать: /usr/lib{,64}/xfce4/session/xfsm-shutdown-helper. Остальные команды можно не разрешать, так и раньше не должно было работать.
# tail -1 /etc/sudoers ALL ALL=(ALL) NOPASSWD: /usr/lib/xfce4/session/xfsm-shutdown-helper При попытке перезагрузиться в логах ничего кроме: Jul 26 07:58:25 bigmobile dbus[1961]: [system] Activating service name='org.freedesktop.login1' (using servicehelper) Jul 26 07:58:25 bigmobile dbus[1961]: [system] Activated service 'org.freedesktop.login1' failed: Launch helper exited with unknown return code 1 Перезагрузки не происходит, просто выходим из xfce :(
Выполните echo REBOOT | sudo -H -S -p XFSM_SUDO_PASS -- /usr/lib/xfce4/session/xfsm-shutdown-helper от пользователя. Что происходит?
Происходит перезагрузка. А при выборе Выйти -> Перезагрузить не происходит. $ rpm -qa | grep xfce xfce4-notifyd-0.2.4-alt1 xfce4-session-engines-4.10.0-alt6.git20130610 altlinux-freedesktop-menu-xfce-0.65-alt1 libxfce4panel-4.10.1-alt0.M70P.1 xfce4-panel-4.10.1-alt0.M70P.1 xfce4-battery-plugin-1.0.5-alt1 xfce4-settings-4.10.1-alt0.M70P.1 xfce4-minimal-4.10-alt4 xfce-settings-simple-1.0-alt5 libxfce4util-4.10.1-alt0.M70P.1 xfce4-common-4.10-alt4 libxfce4ui-4.10.0-alt2 xfce4-xkb-plugin-0.5.6-alt1.M70P.1 xfce4-session-4.10.0-alt6.git20130610 xfce4-screenshooter-1.8.1-alt2 xfce4-icon-theme-4.4.3-alt1.qa1 xfce4-mixer-4.10.0-alt2.git20130324 xfce4-taskmanager-1.0.0-alt2 Что еще показать?
Замена бинарника /usr/lib/xfce4/session/xfsm-shutdown-helper одноименным шелл-скриптом показывает, что xfce4-session вообще его не вызывает. Я пытаюсь читать код xfce4-session и вставлять отладочный вывод. Пока выходит, что не выполняется условие if (shutdown->helper_state == SUDO_AVAILABLE). Где и как определяется shutdown->helper_state пока не пойму.
(В ответ на комментарий №5) > Замена бинарника /usr/lib/xfce4/session/xfsm-shutdown-helper одноименным > шелл-скриптом показывает, что xfce4-session вообще его не вызывает. Я пытаюсь > читать код xfce4-session и вставлять отладочный вывод. Пока выходит, что не > выполняется условие if (shutdown->helper_state == SUDO_AVAILABLE). Где и как > определяется shutdown->helper_state пока не пойму. См. xfsm_shutdown_sudo_init(). Там просто запускается helper через sudo с -p XFSM_SUDO_PASS и потом проверяется ответ. Должно быть либо XFSM_SUDO_PASS от sudo (если есть пароль), либо XFSM_SUDO_DONE от helper'а (если NOPASSWD). Helper должен запуститься уже просто при открытии диалога выхода из меню (или просто запустить xfce4-session-logout).
(В ответ на комментарий №6) > (В ответ на комментарий №5) > > Замена бинарника /usr/lib/xfce4/session/xfsm-shutdown-helper одноименным > > шелл-скриптом показывает, что xfce4-session вообще его не вызывает. Я пытаюсь > > читать код xfce4-session и вставлять отладочный вывод. Пока выходит, что не > > выполняется условие if (shutdown->helper_state == SUDO_AVAILABLE). Где и как > > определяется shutdown->helper_state пока не пойму. > > См. xfsm_shutdown_sudo_init(). Там просто запускается helper через sudo с -p > XFSM_SUDO_PASS и потом проверяется ответ. Должно быть либо XFSM_SUDO_PASS от > sudo (если есть пароль), либо XFSM_SUDO_DONE от helper'а (если NOPASSWD). > Helper должен запуститься уже просто при открытии диалога выхода из меню (или > просто запустить xfce4-session-logout). Отладочного вывода, вставленного в самое начало xfsm_shutdown_sudo_init, я не вижу - значит эта функция не вызывается.
> Отладочного вывода, вставленного в самое начало xfsm_shutdown_sudo_init, я не > вижу - значит эта функция не вызывается. Ее должна вызывать xfsm_manager_dbus_can_restart, однако прямого вызова этой функции grep уже не находит.
Его и нет, это DBUS-интерфейс, насколько я понимаю. Смотрите лучше xfsm_logout_dialog_init() в xfce4-session/xfsm-logout-dialog.c.
Проблема, видимо, в функции xfsm_systemd_can_method из xfsm-systemd.c, которая возвращает FALSE только при неудачном вызове polkit_authority_check_authorization_sync. Как бы это переписать, чтобы FALSE возвращалось еще и в том случае, если systemd не запущен? А еще интересно, как это работает у вас. По идее не должно ;)
(В ответ на комментарий №10) > Проблема, видимо, в функции xfsm_systemd_can_method из xfsm-systemd.c, которая > возвращает FALSE только при неудачном вызове > polkit_authority_check_authorization_sync. Как бы это переписать, чтобы FALSE > возвращалось еще и в том случае, если systemd не запущен? Понятно, там сейчас только опрашивается polkit можно ли использовать данный метод. Нужно еще спрашивать у самого systemd-logind возможно ли использовать этот метод. С upower так и было, кстати. > А еще интересно, как это работает у вас. По идее не должно ;) У меня polkit разрешает только то, что я явно прописал в правилах, а не все что угодно.
> > А еще интересно, как это работает у вас. По идее не должно ;) > > У меня polkit разрешает только то, что я явно прописал в правилах, а не все что > угодно. А покажите ваши правила. Я пытался разрешить только udisks2, но ничего не изменилось.
Пожалуйста: polkit.addRule(function(action, subject) { if (subject.isInGroup("wheel") && (action.id.indexOf("org.freedesktop.udisks2.") == 0 || action.id.indexOf("org.fedoraproject.FirewallD1.") == 0 || action.id.indexOf("org.libvirt.unix.") == 0 || action.id.indexOf("org.freedesktop.policykit.") == 0)) { return polkit.Result.YES; } }); polkit.addRule(function(action, subject) { if (subject.isInGroup("_nmconnect") && (action.id.indexOf("org.freedesktop.NetworkManager.") == 0 )) { return polkit.Result.YES; } }); Но лучше проверьте xfce4-session из задания #104838. Если работает, то отправлю в Сизиф.
> Но лучше проверьте xfce4-session из задания #104838. Если работает, то отправлю > в Сизиф. Работает, спасибо! Можно и в p7 сразу отправить?
(В ответ на комментарий №13) > action.id.indexOf("org.freedesktop.policykit.") == 0)) { Раз уж я это сюда закидывал, то стоит сказать, что этой строчки тут быть не должно. У меня это были ошметки каких-то экспериментов, видимо. Наличие такого правила позволяет запустить все что угодно через pkexec от root без всякой аутентификации.
> > action.id.indexOf("org.freedesktop.policykit.") == 0)) { > > Раз уж я это сюда закидывал, то стоит сказать, что этой строчки тут быть не > должно. У меня это были ошметки каких-то экспериментов, видимо. Наличие такого > правила позволяет запустить все что угодно через pkexec от root без всякой > аутентификации. Ага, спасибо.