Summary: | sudo for shutdown/reboot/suspend/hibernate | ||
---|---|---|---|
Product: | Sisyphus | Reporter: | enp <enp> |
Component: | xfce4-session | Assignee: | Mikhail Efremov <sem> |
Status: | CLOSED FIXED | QA Contact: | qa-sisyphus |
Severity: | normal | ||
Priority: | P3 | CC: | cas, oddity, sem |
Version: | unstable | ||
Hardware: | all | ||
OS: | Linux |
Description
enp
2013-07-24 13:11:53 MSK
Хм, мне тоже казалось, что там прямой запуск команд через 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 без всякой
> аутентификации.
Ага, спасибо.
|