Usando os servicemenus do KDE 3.x

Mais uma aplicação interessante para os shell scripts são os menus de contexto do KDE, que aparecem ao clicar com o botão direito sobre arquivos e pastas.

Uma determinada operação pode aparecer para todos os arquivos, todas as pastas, ou apenas para alguns formatos de arquivos específicos. Ao clicar sobre uma pasta, você tem a opção de criar um CD de dados no K3B, ao clicar num arquivo .zip você tem a opção de descompactá-lo, e assim por diante. Você pode adicionar servicemenus para todo tipo de tarefa.

Os scripts dos servicemenus vão na pasta “/usr/share/apps/konqueror/servicemenus“:

Todos os arquivos dentro da pasta são scripts, que seguem um padrão próprio, começando pelo nome, que deve sempre terminar com “.desktop“.

Por exemplo, o servicemenu responsável pela opção “Acessar arquivos dentro do ISO”, que aparece apenas ao clicar sobre um arquivo com a extensão .iso, é o arquivo “montar-iso.desktop“, que tem o seguinte conteúdo:

[Desktop Entry]
Actions=montar
Encoding=UTF-8
ServiceTypes=application/x-iso
[Desktop Action montar]
Exec=acessar-iso-servicemenu %u
Icon=cdrom_unmount
Name=Acessar arquivos dentro do ISO

A linha “ServiceTypes=application/x-iso” é importante neste caso, pois é nela que você especifica a que tipos de arquivos o servicemenu se destina. É por isso que eles também são chamados em português de “Menus de contexto”, pois são mostradas opções diferentes para cada tipo de arquivo. Você pode ver todos os formatos de arquivos reconhecidos pela sua instalação do KDE, e adicionar novas extensões caso necessário no Centro de Controle do KDE, em “Componentes do KDE > Associações de arquivos”.

Veja que no início do script você especifica as ações disponíveis no parâmetro “Actions“. Mais adiante, você cria uma seção para cada ação especificada contendo o nome (da forma como aparecerá no menu) ícone e o comando que será executado ao acionar a ação no menu.

Neste exemplo é executado o comando “acessar-iso-servicemenu %u“. O “%u” é uma variável, que contém o nome do arquivo clicado. Este parâmetro pode ser usado apenas nos scripts dos servicemenus, não em scripts regulares. O KDE oferece um conjunto de variáveis que podem ser utilizadas nos servicemenus:

%u: Esta é a variável que estamos utilizando no script acessar-iso. Ela contém o caminho completo para o arquivo selecionado (como em “file:/home/joao/kurumin.iso”).

%U: Também armazena os caminhos completos para os arquivos, a diferença é que o “%u” permite selecionar apenas um arquivo (se você selecionar vários na janela do Konqueror ao executar o script, ele vai ficar apena com o último), enquanto o “%U” permite selecionar vários arquivos. O “%U” pode ser usado em servicemenus que permitem manipular vários arquivos de uma vez, renomeando arquivos ou convertendo de .mp3 para .ogg, por exemplo.

%n: Contém apenas o nome do arquivo selecionado, sem o caminho completo. Faz par com a variável “%N“, que permite selecionar vários arquivos.

%d: Esta variável armazena um diretório. Pode ser usada em scripts que manipulem de uma vez todos os arquivos dentro de um diretório, como no caso de um script que gerasse thumbmails de todas as imagens dentro dele. Mesmo que você selecione um arquivo, o KDE remove o nome do arquivo e fica apenas com a pasta. Existe também a variável “%D“, que permite selecionar vários diretórios de uma vez. A “%D” poderia ser usada para criar um script que permite criar um CD de dados incluindo o conteúdo de várias pastas, por exemplo.

O “acessar-iso-servicemenu” é um script separado, que pode ir em qualquer uma das pastas de executáveis do sistema: “/usr/local/bin/”, “/usr/bin/”, “/bin”, ou em outra pasta adicionada manualmente no patch.

Este script contém os comandos para montar o arquivo .iso numa pasta e abrir uma janela do Konqueror mostrando o conteúdo. Ao fechar a janela do Konqueror, o arquivo é desmontado, para evitar problemas caso o usuário tente montar vários arquivos em seqüência:

#!/bin/sh
kdesu “mkdir /mnt/iso; umount /mnt/iso; mount -t iso9660 -o loop $1 /mnt/iso”
clear
konqueror /mnt/iso
kdesu umount /mnt/iso

O kdesu é um componente do KDE que permite executar comandos como root. Ao executar um “kdesu konqueror”, por exemplo, ele pede a senha de root numa janela e depois executa o comando, abrindo uma janela do Konqueror com permissões de root. Você pode executar uma seqüência de comandos dentro de uma única instância do kdesu (para que ele peça a senha apenas uma vez), colocando os comandos entre aspas, separados por ponto-e-vírgula, como no exemplo. É possível também utilizar o sudo, caso ativado.

Note que neste segundo script não uso a variável “%u” (que pode ser usada apenas dentro do script do servicemenu), mas sim a variável “$1“.

Quando você executa um comando qualquer, via linha de comando, a variável “$1” é o primeiro parâmetro, colocado depois do comando em si. Para entender melhor, vamos criar um script “teste”, com o seguinte conteúdo:

#!/bin/sh
echo $1
echo $2
echo $3

Execute o script, incluindo alguns parâmetros e você verá que ele vai justamente repetir todos os parâmetros que incluir.

Quando clicamos sobre um arquivo chamado “kurumin.iso” e acionamos o servicemenu, a variável “%u” contém o nome do arquivo, ou seja, “kurumin.iso”. O servicemenu por sua vez chama o segundo script, adicionando o nome do arquivo depois do comando, o que automaticamente faz com que a variável “$1” também contenha o nome do arquivo. Ou seja, as variáveis “%u” e “$1” neste caso vão sempre possuir o mesmo conteúdo, muda apenas o contexto em que são usadas.

Você pode usar este tipo de troca de parâmetro para desmembrar seus scripts, criando “módulos” que possam ser usados em outros scripts.

Por exemplo, os ícones mágicos do Kurumin utilizam o sudo para executar comandos como root (como ao usar o apt-get para instalar um programa), sem ficar pedindo a senha de root a todo instante. O sudo pode ser ativado e desativado a qualquer momento, fornecendo a senha de root, de forma que você pode mantê-lo desativado, e ativar apenas ao executar algum script que precisa deles.

Para que isso funcione, os scripts sempre executam uma função, que verifica se o sudo está ativado. Caso esteja, eles são executados diretamente, sem pedir senha, caso contrário eles pedem a senha de root.

Isto foi implementado incluindo esta função no início de cada script:

sudo-verificar
if [ "$?" = "2" ]; then exit 0; fi

O script “sudo-verificar”, chamado por ela, tem o seguinte conteúdo:

#!/bin/sh

sudoativo=`sudo whoami`

if [ "$sudoativo" != "root" ]; then

    kdialog --warningyesno "O script que você executou precisa utilizar o sudo para executar alterações no sistema
. Atualmente o Kurumin está operando em modo seguro, com o sudo desativado para o usuário atual.
Você gostaria de mudar para o modo root, ativando o sudo? Para isso será necessário fornecer a senha de root. Caso
 prefira abortar a instalação, responda Não. Você pode também executar o script desejado diretamente como root."

retval=$?
    if [ "$retval" = "0" ]; then
        sudo-ativar
    fi

    if [ "$retval" = "1" ]; then
        exit 2
    fi
fi

Este script verifica se o sudo está ativo usando o comando “whoami“, que retorna o nome do usuário que o chamou. Caso o sudo esteja ativo, então o “sudo whoami” é executado pelo root e retorna “root”. É uma estratégia simples, mas que funciona.

Caso o retorno não seja “root”, significa que o sudo está desativado, o que dispara a pergunta. Respondendo “sim”, ele executa o script “sudo-ativar”, que pede a senha de root. Caso seja respondido “não” ou caso a janela com a pergunta seja fechada, ele roda o comando “exit 2“.

O comando “exit” é usado para terminar o script. Você pode incluir um parâmetro depois do exit, (no nosso caso o “2”) que é um status de saída, repassado ao primeiro script. Isto permite que os scripts “conversem”.

Como vimos, depois de chamar o “sudo-verificar”, o primeiro script verifica o status de saída do comando “sudo-verificar”, usando a função: “if [ “$?” = “2” ]; then exit 0; fi”.

Ou seja, se o status de saída do sudo-verificar for “2”, o que significa que o sudo está desativado e o usuário não quis fornecer a senha de root, então o primeiro script roda o comando “exit” e também é finalizado.

Ok, demos uma grande volta agora. Mas, voltando aos servicemenus, é possível incluir várias ações dentro de um mesmo script, que se aplicam a um mesmo tipo de arquivo. Você pode, por exemplo, adicionar uma opção de redimensionar imagens, colocando várias opções de tamanho, ou uma opção para converter arquivos de áudio para vários outros formatos.

Este é um exemplo de script com várias ações, que permite redimensionar imagens:

[Desktop Entry]
ServiceTypes=image/*
Actions=resize75;resize66;resize50;resize33;resize25;
X-KDE-Submenu=Redimensionar a imagem
[Desktop Action resize75]
Name=Redimensionar para 75% do tamanho original
Icon=thumbnail
Exec=img-resize 75 %u
[Desktop Action resize66]
Name=Redimensionar para 66% do tamanho original
Icon=thumbnail
Exec=img-resize 66 %u
[Desktop Action resize50]
Name=Redimensionar para 50% do tamanho original
Icon=thumbnail
Exec=img-resize 50 %u
[Desktop Action resize33]
Name=Redimensionar para 33% do tamanho original
Icon=thumbnail
Exec=img-resize 33 %u
[Desktop Action resize25]
Name=Redimensionar para 25% do tamanho original
Icon=thumbnail
Exec=img-resize 25 %u

Veja que nas primeiras linhas é necessário especificar que ele só se aplica a imagens (ServiceTypes=image/*), e depois especificar todas as ações disponíveis, adicionando uma seção para cada uma mais adiante. Não existe limite para o número de ações que podem ser adicionadas neste caso, só depende da sua paciência :).

Como no exemplo anterior, este script chama um script externo, o “img-resize“, para executar as operações. Ele é um script simples, que usa o “convert” (que vimos ao estudar sobre o Kommander) para fazer as conversões:

#!/bin/sh
echo “Convertendo $2 para $1% do tamanho original.”
echo “Backup da imagem original salvo em: $2.original”
cp $2 $2.original
convert -quality 90 -sample $1%x$1% $2 $2-out
rm -f $2; mv $2-out $2; sleep 1
echo “Ok!”

Os parâmetros “$1” e “$2” são recebidos do script do servicemenu. O $1 é a percentagem de redimensionamento da imagem, enquanto o $2 é o nome do arquivo.

Você pode ainda chamar funções de aplicativos do KDE dentro dos servicemuenus, usando funções do dcop, que estudamos anteriormente. Este é o script do servicemenu que permite adicionar arquivos na playlist do Kaffeine:

ServiceTypes=all/all
Actions=kaffeine_append_file
Encoding=UTF8
[Desktop Action kaffeine_append_file]
Name=Append to Kaffeine Playlist
Name[hu]=Felvétel a Kaffeine Lejátszólistába
Name[de]=Zur Kaffeine Stückliste hinzufügen
Name[sv]=Lägg till i Kaffeine spellista
Exec=dcop kaffeine KaffeineIface appendURL %u
Icon=kaffeine

Veja que ele usa a função ” dcop kaffeine KaffeineIface appendURL %u” para contatar o Kaffeine e instruí-lo a adicionar o arquivo na playlist.

Os servicemenus podem ser internacionalizados, com traduções das legendas para várias línguas. Para adicionar a tradução para o português neste servicemenu do Kaffeine, basta adicionar a linha “Name[pt_BR]=Adicionar na Playlist do Kaffeine“.

Para que a opção seja exibida apenas ao clicar sobre arquivos de vídeo, e não mais sobre qualquer arquivo, substitua a linha “ServiceTypes=all/all” por “ServiceTypes=video/*“.

Ver Mais

Esta postagem foi modificada pela última vez em 25/09/2010 15:50

Postagem relacionada