Ignorar permissão de desligamento do botão liga / desliga

0

Eu sei que há várias perguntas sobre as opções do botão de energia, mas isso é um pouco diferente.

No meu sistema, compartilhado com minha família, desativei o desligamento do menu do dispositivo, os usuários podem sair apenas. A energia é gerenciada separadamente, para evitar desligamentos acidentais se o SSH estiver ativo ou quando alguém estiver transmitindo para a TV, etc. Em vez disso, o computador monitora os logins e conexões e dorme após 20 minutos de inatividade. Desativei o desligamento adicionando:

[Disable lightdm PowerMgmt]
Identity=unix-user:*
Action=org.freedesktop.login1.reboot;org.freedesktop.login1.reboot-multiple-sessions;org.freedesktop.login1.power-off;org.freedesktop.login1.power-off-multiple-sessions;org.freedesktop.login1.suspend;org.freedesktop.login1.suspend-multiple-sessions;org.freedesktop.login1.hibernate;org.freedesktop.login1.hibernate-multiple-sessions
ResultAny=no
ResultInactive=no
ResultActive=no

para /etc/polkit-1/localauthority/50-local.d/disable-shutdown.pkla

Isso funciona como esperado.

No entanto , gostaria de substituir esta política quando o próprio botão de energia é pressionado - há momentos em que alguém deseja que o computador seja desligado, reinicializado ou suspenso imediatamente, ignorando o software de gerenciamento. Eu acho que o botão liga / desliga não é algo que você pode pressionar acidentalmente. Existe alguma coisa na política do Polkit que eu possa mudar para permitir essas ações se o botão liga / desliga foi pressionado, mas não permitir isso? Os usuários geralmente não são contas de administrador, portanto, não podem autenticar com o sudo para forçar um desligamento. Eu sei que posso fazer o botão de energia acionar um desligamento imediatamente, mas eu ainda quero o menu do Ubuntu que pergunta ao usuário qual ação executar (Desligar, Reinicializar, Dormir como no menu quando não está desabilitado) e não apenas desligar imediatamente.

Se não for possível no Polkit, existe uma maneira de mostrar o menu normal de opções de energia do Ubuntu, mas executá-lo como o superusuário quando o botão liga / desliga é pressionado?

    
por seanlano 09.07.2014 / 15:39

1 resposta

1

Tudo bem, tenho uma solução que funciona bem, pelo menos para mim. Estou executando o Ubuntu 14.04. Eu não testei extensivamente, mas parece fazer o trabalho. Comente se você vir problemas.

Crie regras de Polkit

Execute este comando em um terminal:

gksudo gedit /etc/polkit-1/localauthority/50-local.d/disable-shutdown.pkla

E copie isso para ele:

[Disable shutdown/reboot]
Identity=unix-user:*
Action=org.freedesktop.login1.reboot;org.freedesktop.login1.reboot-multiple-sessions;org.freedesktop.login1.power-off;org.freedesktop.login1.power-off-multiple-sessions;
ResultAny=no
ResultInactive=no
ResultActive=no

Salve e feche, depois execute também:

gksudo gedit /etc/polkit-1/localauthority/50-local.d/disable-suspend.pkla

e cole isso:

[Disable suspend/hibernate]
Identity=unix-user:*
Action=org.freedesktop.upower.suspend;org.freedesktop.upower.hibernate;org.freedesktop.login1.suspend;org.freedesktop.login1.suspend-multiple-sessions;org.freedesktop.login1.hibernate;org.freedesktop.login1.hibernate-multiple-sessions
ResultAny=no
ResultInactive=no
ResultActive=no

Salve e feche.

Estes dois arquivos irão dizer ao Ubuntu para não permitir que qualquer usuário inicie uma ação de desligamento, reinicialização, suspensão ou hibernação. Eles podem ser modificados para desativar apenas algumas dessas ações, se desejado.

Editar powerbtn.sh

Execute este comando para editar o script que é executado quando o botão de energia é pressionado:

gksudo gedit /etc/acpi/powerbtn.sh

Sobre a linha 6, insira o seguinte:

initctl emit power-button-press

A parte superior do arquivo deve estar assim:

#!/bin/sh
# /etc/acpi/powerbtn.sh
# Initiates a shutdown when the power putton has been
# pressed.


initctl emit power-button-press 


[ -r /usr/share/acpi-support/power-funcs ] && . /usr/share/acpi-support/power-funcs

# If logind is running, it already handles power button presses; desktop
# environments put inhibitors to logind if they want to handle the key
# themselves.
if pidof systemd-logind >/dev/null; then
    exit 0
fi

O que isto faz é emitir um sinal que o Upstart irá usar (o que nós vamos fazer em seguida) para alterar as permissões na operação de desligamento. Ele não inibirá o procedimento normal de pressionar o botão liga / desliga, portanto, você ainda verá o menu normal de desligamento do Ubuntu Unity (ou pelo menos eu fiz: P)

Salve e feche o gedit.

Crie trabalhos de Upstart

Eu li em algum lugar que o Ubuntu estará se movendo para systemd em vez de Upstart algum tempo nos próximos lançamentos, então isso funcionará para 14.04 mas pode não ser para liberações depois disso

Execute este comando em um terminal:

gksudo gedit /etc/init/power-button-pressed.conf

Isso criará um novo arquivo, que se tornará uma tarefa executada quando você pressionar o botão liga / desliga.

Copie o seguinte para ele:

description "Allow shutdown when power button is pressed"

start on power-button-press
stop on shutdown 

emits power-button-timeout

task

script 
    mv /etc/polkit-1/localauthority/50-local.d/disable-shutdown.pkla /etc/polkit-1/localauthority/50-local.d/disable-shutdown.ignore 2> /dev/null
    mv /etc/polkit-1/localauthority/50-local.d/disable-suspend.pkla /etc/polkit-1/localauthority/50-local.d/disable-suspend.ignore 2> /dev/null

    sleep 1m

    initctl emit power-button-timeout

end script

pre-stop script
    initctl emit power-button-timeout

end script

Salve e feche e execute:

gksudo gedit /etc/init/power-button-restore.conf

e cole isso:

description "Re-disable shutdown, on boot or when signalled"

start on (power-button-timeout or local-filesystems)

task

script 
    mv /etc/polkit-1/localauthority/50-local.d/disable-shutdown.ignore /etc/polkit-1/localauthority/50-local.d/disable-shutdown.pkla 2> /dev/null
    mv /etc/polkit-1/localauthority/50-local.d/disable-suspend.ignore /etc/polkit-1/localauthority/50-local.d/disable-suspend.pkla 2> /dev/null

end script

Eles renomearão temporariamente os arquivos da política de segurança para que eles sejam ignorados, permitindo assim que o usuário desligue, reinicie, suspenda e hiberne. Isso pode, é claro, ser modificado como você deseja apenas para habilitar alguns deles. Após um minuto, os arquivos serão renomeados de volta para o que deveriam ser, desabilitando assim o gerenciamento de energia do usuário mais uma vez. A seção pré-parada deve restaurar as permissões no desligamento. Caso contrário, o segundo trabalho do Upstart será executado na inicialização para restaurar a política.

Isso é tudo que existe para isso! Para os usuários nesta máquina, também ocultei a opção de desligamento do menu do dispositivo, para que os usuários visualizem apenas uma opção de "logout". Execute dconf-editor , navegue até "apps" > "Indicator-session" e marque "suppress-restart-menuitem" e "suppress-shutdown-menuitem". Isso não faz nada para as permissões, apenas ajuda a não confundir as pessoas quando elas pressionam "Desligar" e isso não funciona.

Então, para esclarecer, agora quando o botão liga / desliga é pressionado, o usuário será apresentado com o menu de energia do Ubuntu, que se o desligamento e reinicialização forem suprimidos mostrará apenas uma opção de logout. Escolha se desconectar e, a partir da tela de login, o menu de desligamento funcionará e o computador poderá ser desligado por um minuto apenas.

    
por seanlano 01.08.2014 / 02:22