Versão 0.2: Integrar/Sincronizar Firefox/Thunderbird com o KDE
Publicado por Claudio Polegato Junior 12/04/2005
[ Hits: 6.100 ]
Quando clico sobre um arquivo em uma página no Firefox ou anexo no Thunderbird sempre preciso escolher um programa para abrí-lo, mas este já tem um padrão no KDE. Pensando nisso (e no usuário final), li um pouco da documentação de como é feita a associaçao no KDE e nos Mozilla's Softwares, dei uma raqueada e construi um script que sincroniza o programa padrão que escolho ou já vem pré-configurado no KDE para ser uma opção pronta no Firefox e no Thunderbird. Pode executar automaticamente (cron).
#!/bin/bash ###################################################### # # # Programa: criar_mime.types # # Autor: Claudio Polegato Junior # # e-mail: cpolegatojr_lsts@pop.com.br # # Versão: 0.2 # # Data: 12 de Abril de 2004 # # # ###################################################### ################################################################################ # # # Quando clico sobre um arquivo em uma página no Firefox ou anexo no # # Thunderbird sempre preciso escolher um programa para abrí-lo, mas este já # # tem um padrão no KDE. Pensando nisso (e na impossibilidade de um usuário # # final - mas final mesmo - encontrar o programa correto no sistema de # # arquivos do linux), li um pouco da documentação de como é feita a associaçao # # no KDE e nos Mozilla's Softwares, dei uma raqueada e construi um script que # # sincroniza o programa padrão que escolho ou já vem pré-configurado no KDE # # para ser uma opção pronta no Firefox e no Thunderbird. # # # ################################################################################ # # # Versão 0.1: # # # # Este script faz basicamente uma varredura sobre os "mime types" (tipos # # que especificam o conteúdo o arquivo) com .desktop contidos nos diretórios # # $HOME/.kde/share/mimelnk (tipos definidos ou alterados pelo usuário), # # $KDEDIR/share/mimelnk (tipos padrões do KDE) e /usr/share/mimelnk (tipos que # # alguns outros softwares definem no Linux). Dessa varredura são então # # encontrados os "mime types" e as extensões que estão associadas (isso é uma # # tentativa que faço e aparentemente dá certo). # # Para cada "mime type" encontrado, primeiramente é verificado se este # # consta no arquivo $HOME/.kde/share/config/profilerc (definido pelo usuário e # # contém uma lista dos "mime types" seguida por um traço e um número e então # # propriedade associadas a esta prioridade de "mime type") ou no arquivo # # $KDEDIR/share/config/profilerc (global para o KDE e características ídem ao # # anterior). Se for encontrado em um destes arquivos, é escolhido o link para # # aplicativo (.desktop) de prioridade 1, senão realiza uma varredura nos links # # para aplicativos definidos no KDE constantes nos diretórios # # $HOME/.kde/share/applnk (links definidos pelo usuário) e em # # $KDEDIR/share/applnk (links globais do KDE), ondem é verificado em cada link # # se há uma referencia para o "mime type" em questão e cria-se uma lista # # destes links. A partir desta lista, verifica-se qual tem o maior valor na # # propriedade InitialPreference e este então é dado como o link padrão. Caso # # houver empate na ordenaçao por InitialPreference, pega o primeiro da lista # # como link padrão. Caso não encontre InitialPreference em nenhum, pega o # # primeiro da lista para ser o link padrão. # # A partir deste arquivo de link padrão encontrado, procura-se a propriede # # Exec, a qual indica o programa a ser usado para abrir o arquivo que casa com # # o "mime type" que está sendo analisado. # # Ufa! Neste ponto tenho um "mime type", as extensões associadas com ele e # # o programa padrão utilizado pelo KDE. Então crio uma entrada no arquivo # # $HOME/.mime.types (primeiro o "mime type" e depois as extensões separadas # # por espaço) e no arquivo $HOME/.mailcap (primeiro o "mime type" e depois o # # programa separados por ponto e vírgula - ; - e terminado por %s). # # Fazendo-se isso para cada "mime type" do KDE consigo associar os # # programas padrões do KDE para ser o padrão no Firefox e no Thunderbird. Cada # # vez que se altera o programa padrão no KDE ou insere um tipo novo deve-se # # rodar este script para fazer o sincronismo real sem ser necessário sair e/ou # # reiniciar o Firefox e/ou o Thunderbird. # # # # Espero que seja útil para a comunidade... # # # ################################################################################ # # # Versão 0.2: # # # # - Sanado o problema econtrado quando existia 10 (dez) ou mais referências à # # um "mime type" em algum dos arquivos profilerc. # # - Alterada a estrutura do script para se ter apenas um bloco de # # processamento de procura e construção dos arquivos $HOME/.mime.types e # # $HOME/.mailcap a patir de uma lista de diretórios inicialmente fornecida.# # - Verificação se há pelo menos um arquivo com data mais recente que # # $HOME/.mailcap nos diretórios que contém os links para então, caso haja # # algum realizar o sincronismo somente neste caso. # # - Após sincronicação de "mime types" com o KDE, o usuário será perguntado se # # deseja fazer esta sincronicação automaticamente a cada minutos e, # # caso queira, cria uma entrada no cron para isto. Repare que, para tanto, # # o usuário precisa logar como root (será perguntada a senha). Atenção: # # "Cuidado! Talves isso torne seu sistema muito lento.". O usuário pode # # escolher o tempo entre sincronizações em minutos sendo válidos 1, 2, 3, # # 4, 5, 6, 10, 12, 15, 20 e 30, isto é, divisores de 60. Também é possível # # escolher o arquivo de log que conterá a saída da última execução pelo # # cron, sendo este arquivo colocado em $HOME. # # - Foi detectado um problema quanto o KDE escreve informações para o arquivo # # $HOME/.kde/share/config/profilerc notado quando exitem várias entradas # # para um mesmo aplicativo "A", uma entrada para o aplicativo que quermos # # como padrão "B" e este com InitialPreference presente ou não. Este # # problema consiste em que quando "B" estiver entre os "A" ele se torna # # padrão para o KDE mesmo não estando no topo, porém no # # $HOME/.kde/share/config/profilerc ele fica na posição correta, e, além # # disso, se tentarmos tirar do meio e colocar no topo não é atualizado o # # $HOME/.kde/share/config/profilerc. Assim sendo, para o aplicativo "B" # # ficar no topo no arquivo $HOME/.kde/share/config/profilerc é preciso # # colocá-lo primeiro abaixo de todos os "A", aplicar esta alteração e # # então colocar acima de todos. # # Este teste foi feito no KDE 3.1.5 do Conectiva Linux 9: "Dado um arquivo # # .zip, este tem 3 entradas para Ark. Cliquei com o botão direito do # # mouse sobre o arquivo e depois em 'Editar tipo de arquivo...', depois no # # botão 'Adicionar' e digitei 'unzip' na janela para escolha do # # novo aplicativo que quero adicionar e marquei a caixa 'Executar no # # Terminal'. Este agora aparece em último na lista. Clico em 'Ok'. Clico # # com o botão direito do mouse sobre o arquivo e passo este sobre 'Abrir # # com' e vejo que 'unzip' é o quarto. Clico sobre 'Editar tipo de # # arquivo...', novo ele para terceiro e dou 'Ok'. Percebo que em # # $HOME/.kde/share/config/profilerc ele fica em terceiro dos # # application/x-zip porém quando novamente clico com o botão direito do # # mouse sobre o arquivo .zip e passo este sobre 'Abrir com', vejo que # # 'unzip' é o primeiro quando creio eu que deveira ser o terceiro. Clico # # sobre 'Editar tipo de arquivo...', e vejo que 'unzip' é o primeiro mas # # em $HOME/.kde/share/config/profilerc continua em terceiro e então não # # tenho como movê-lo para primeiro, pois para o KDE ele já é o primeiro. # # Dá no mesmo se movê-lo para segundo. O único jeito e movê para último, # # clicar em 'Aplicar' e depois mover para primeiro e então clicar em 'Ok', # # daí sim em $HOME/.kde/share/config/profilerc ele fica em primeiro e é # # possível sincronizar corretamente o comportamento do KDE para com os # # programas que abrem os arquivos com os Mozilla's Software." # # # ################################################################################ ######################################## # Função que insere uma linha no cron. # ######################################## function cron(){ while true; do echo echo -n "Deseja colocar uma entrada no cron [S/n]? " read -n 1 RESPOSTA echo if [ "$RESPOSTA" != "" ]; then echo fi if [ "$RESPOSTA" == "" ] || [ "$RESPOSTA" == "S" ] || [ "$RESPOSTA" == "s" ]; then while true; do echo "De quantos em quantos minutos deseja sincronizar?" echo " São válidos: 1 2 3 4 5 6 10 12 15 20 e 30." echo " Somente pressione [Enter] para cancelar." echo -n " Tempo: " read TEMPO if [ -z "$TEMPO" ]; then echo exit 0; else ACHOU="`expr " 1 2 3 4 5 6 10 12 15 20 30 " : ".* $TEMPO .*"`" if [ "$ACHOU" == "0" ]; then echo echo "Tempo inválido!" echo continue fi break fi done echo echo "Digite o nome do arquivo de log do cron que ficará em $HOME..." echo " Por padrão, se pressionar [Enter], o nome será criar_mime.types.log." echo " Para anular a saída de log, digite \"/dev/null\" sem as aspas." echo -n " Nome do arquivo: " read ARQUIVO_LOG if [ -z "$ARQUIVO_LOG" ]; then ARQUIVO_LOG="$HOME/criar_mime.types.log" elif [ "$ARQUIVO_LOG" != "/dev/null" ]; then ARQUIVO_LOG="$HOME/$ARQUIVO_LOG" fi export ARQUIVO_LOG TEMPO DIR_USER="$HOME $KDEDIR" PROG_PATH="$0" echo echo "Quando aparecer 'Password: ' digite a senha do root." if `su -c 'cp -f $PROG_PATH /usr/local/bin/criar_mime.types ; SAIDA="\`sed /usr.local.bin.criar_mime.types/d /etc/crontab\`\`echo -e "\n*/$TEMPO * * * * $USER /usr/local/bin/criar_mime.types $DIR_USER 2>&1 > $ARQUIVO_LOG"\`"; echo "$SAIDA" > /etc/crontab'`; then echo "Atualização gerenciada pelo cron efetuada com sucesso!" echo else echo "Erro em fazer a atualização ser gerenciada pelo cron!" echo fi break fi if [ "$RESPOSTA" == "N" ] || [ "$RESPOSTA" == "n" ]; then break fi echo "Resposta inválida!" done } ##################################################################### # Função que verifica se existe algum arquivo relevante modificado. # ##################################################################### function Verificar(){ if [ ! -e $HOME/.mailcap ]; then MODIF_MIME="Tudo" MODIF_APP="Tudo" else # Zerando MODIF_MIME e procurando arquivos em DIR_MIME com mudanças # mais recentes que em $HOME/.mailcap MODIF_MIME="" MODIF_MIME="`find $DIR_MIME -cnewer $HOME/.mailcap -name \"*.desktop\"`" # Zerando MODIF_APP e procurando arquivos em DIR_APP com mudanças # mais recentes que em $HOME/.mailcap MODIF_APP="" MODIF_APP="`find $DIR_APP -cnewer $HOME/.mailcap -name \"*.desktop\"`" fi } ##################################### # Função que realiza o sincronismo. # ##################################### function Sincronizar(){ # Fazendo cópia dos arquivos $HOME/.mime.types e $HOME/.mailcap. if [ -e $HOME/.mime.types ]; then mv $HOME/.mime.types $HOME/.mime.types_`date +"%Y.%m.%d_%H.%M.%S"` fi if [ -e $HOME/.mailcap ]; then mv $HOME/.mailcap $HOME/.mailcap_`date +"%Y.%m.%d_%H.%M.%S"` fi PASSEDS="" # Para cada diretório ONE_MIME_DIR de "mime types" encontrado em DIR_MIME for ONE_MIME_DIR in $DIR_MIME; do echo echo "*****************************************************" echo "$ONE_MIME_DIR" echo "*****************************************************" echo # Lista em MIME_DESKTOPS todos os arquivo .desktop no diretório ONE_MIME_DIR MIME_DESKTOPS=`find $ONE_MIME_DIR -name "*.desktop"` # Para cada .desktop MIME_DESKTOP encontrado em MIME_DESKTOPS for MIME_DESKTOP in $MIME_DESKTOPS; do MIME=`expr "$MIME_DESKTOP" : '.*mimelnk/\(.*\).desktop'` echo "Mime: $MIME" EXTS=`grep "Patterns\=" "$MIME_DESKTOP" | sed s/Patterns=// | sed s/'*'//g | sed s/'\.'//g | sed y/\;/' '/` # Verificando se já foi passada por uma entrada para este "mime type" PASSED="`expr "$PASSEDS" : ".* $MIME .*"`" if [ "$PASSED" == "0" ]; then PASSED="`expr "$PASSEDS" : "$MIME .*"`" fi if [ "$PASSED" != "0" ]; then echo "Exts: *** Modified *** $EXTS" echo continue fi PASSEDS="$PASSEDS$MIME " echo "Exts: $EXTS" PROFILE="" PROFILERC="$HOME/.kde/share/config/profilerc" if [ -a "$PROFILERC" ]; then PROFILE=`expr "\`grep -n "\[$MIME - 1\]" "$PROFILERC"\`" : '\(.*\):.*'` if [ -z "$PROFILE" ]; then PROFILERC="$KDEDIR/share/config/profilerc" if [ -a "$PROFILERC" ]; then PROFILE=`expr "\`grep -n "\[$MIME - 1\]" "$PROFILERC"\`" : '\(.*\):.*'` fi fi fi if [ -z "$PROFILE" ]; then DESKTOPS=`grep -rl $MIME $DIR_APP` if [ -n "$DESKTOPS" ]; then LEVELS=`grep "InitialPreference" $DESKTOPS | rev | sort -r | rev` if [ -z "$LEVELS" ]; then for DESKTOP in $DESKTOPS; do break done else POS=`expr index "$LEVELS" ':'` if [ $POS == 0 ]; then DESKTOP=`grep -l "InitialPreference" $DESKTOPS` else DESKTOP=`expr substr "$LEVELS" 1 \`expr $POS \- 1\`` fi fi else DESKTOP="" fi else PROFILE=`expr $PROFILE \+ 2` DESKTOP=`expr "\`sed -n ${PROFILE}p "$PROFILERC"\`" : 'Application=\(.*\)'` DESKTOP="$HOME/.kde/share/applnk/$DESKTOP" fi if [ -n "$DESKTOP" ]; then PROG=`expr "\`grep '^Exec' "$DESKTOP"\`" : 'Exec=\(.*\)'` POS=`expr index "$PROG" ' '` if [ "$POS" != "0" ]; then PROG=`expr substr "$PROG" 1 \`expr $POS \- 1\`` fi PROG=`echo "$PROG" | sed s/"'"//g | sed s/'"'//g` fi echo "Prog: $PROG" echo if [ -n "$PROG" ]; then if [ -z "$EXTS" ]; then echo "$MIME" >> $HOME/.mime.types else echo "$MIME $EXTS" >> $HOME/.mime.types fi echo "$MIME;$PROG %s" >> $HOME/.mailcap fi done done } ############################### # Corpor principal do script. # ############################### # O argumento que aceita é diretório HOME, que é passado pelo cron. if [ "$1" != "" ]; then HOME="$1" KDEDIR="$2" fi # Diretórios em DIR_MIME onde estão os "mime types" no KDE. DIR_MIME="$HOME/.kde/share/mimelnk $KDEDIR/share/mimelnk /usr/share/mimelnk" # Diretórios em DIR_APP onde estão os atalhos para aplicativos no KDE. DIR_APP="$HOME/.kde/share/applnk $KDEDIR/share/applnk" # Chamada à função Verificar que retorna as mudanças em MODIF_MIME e MODIF_APP Verificar # Se não houve mudanças para por aqui mesmo. if [ -z "$MODIF_MIME" ] && [ -z "$MODIF_APP" ];then echo echo "*********************************************" echo "* *" echo "* A sincronização não é necessária! *" echo "* *" echo "*********************************************" echo "Data: `date +"%Y.%m.%d_%H.%M.%S"`" echo else echo echo "*****************************************" echo "* *" echo "* A sincronização é necessária! *" echo "* *" echo "*****************************************" echo "Data: `date +"%Y.%m.%d_%H.%M.%S"`" echo Sincronizar fi if [ "$1" == "" ]; then cron fi
Configuração do Iptables em modo texto.
GETDOWN - Baixa arquivos e descompacta
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Vou voltar moderar conteúdos de Dicas e Artigos (1)
SysAdmin ou DevOps: Qual curso inicial pra essa área? (3)
É cada coisa que me aparece! - não é só 3% (3)
Melhorando a precisão de valores flutuantes em python[AJUDA] (5)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta