Versão 0.2: Integrar/Sincronizar Firefox/Thunderbird com o KDE

Publicado por Claudio Polegato Junior 12/04/2005

[ Hits: 6.158 ]

Download criar_mime.types-0.2




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).

  



Esconder código-fonte

#!/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

Scripts recomendados

Wrapper do dd com algumas medidas de segurança

Echoc (Comando echo, mas com cores)

Criador de Hard Link em massa

conversor de bases no shell

Hamachi - Controle Gráfico


  

Comentários
[1] Comentário enviado por cpolegatojr em 13/04/2005 - 09:13h

Olá pessoal! Esta versão veio em substituição à versão 0.1 publicada anteriormente, sendo o processo de execução o mesmo descrito em comentário na versão 0.1. Além desse, pretendo publicar em muito breve outro para fazer interação do Firefox e Thunderbird entre si no KDE e outro para eliminar um probleminha de substituição de página no Firefox quando clica-se sobre um link no Thunderbird e/ou sobre um arquivo que está como padrão ser aberto pelo Firefox.

[]'s

Claudio


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts