Versão 0.2: Integrar/Sincronizar Firefox/Thunderbird com o KDE
Publicado por Claudio Polegato Junior 12/04/2005
[ Hits: 6.331 ]
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
Backup em HD Externa com Rsync
Compilação do kernel linux-libre 4.4.6 com cflags -march=native + -Ofast
Menu para liberar / bloquear laboratórios no Squid
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Warcraft II Remastered no Linux? (7)
O programa assinador digital (5)









