Archive

Archive for the ‘Shell Script’ Category

Obtendo o tempo ocioso em uma sessão do X


Recentemente me deparei com uma pergunta no VOL a respeito do tempo ocioso em uma sessão em modo gráfico. A ideia era que estando o usuário sem realizar qualquer atividade na frente do PC depois de um determinado tempo, fosse deslogado automaticamente. Em modo texto, é possível fazer isso  através da variável TMOUT, mas isso não funciona em modo gráfico.  Em modo gráfico seria necessário obter o tempo ocioso de um usuário que estivesse usando KDE, GNOME, etc, verificar se esse tempo era maior ou igual a um tempo limite e caso fosse, executar um script que desconecta o usuário. A parte de desconectar o usuário não é difícil, mas obter o tempo ocioso do usuário se fez mais complicado. A saída do comando w tinha informações para as sessões em modo texto, mas nada de uma sessão do X. Pensei em obter esse tempo também via D-Bus, perguntando ao gnome-screensaver (no caso de um usuário estiver usando o GNOME ou XFCE), mas notei que o método GetIdleTime, não estava mais disponível.

Dessa maneira, decidi escrever um humilde programa em C usando a Xlib para obter essa informação e então aproveitá-la em um script. Não sou um expert com essa biblioteca, mas o procedimento era bem simples. O programa xidle, como chamei, retorna o tempo ocioso de uma sessão do X em segundos. Segue abaixo o programa, bem como uma explicação nos comentários sobre como compilar ele:

/*---------------------------------------------------------------------
 *    Imprime o tempo de inatividade de uma sessão do X em segundos.
 *
 *    Obs: Compile esse programa com o comando:
 *         $ gcc -o xidle xidle.c -lX11 -lXss
 *
 *         Depois mova-o para um diretório no seu PATH (um bom local
 *         seria o diretório /usr/local/bin)
 *
 *    No Fedora, é necessário instalar o pacote 'libXScrnSaver-devel'
 *    e 'libX11-devel' para poder seguir com a compilação.
 *
 *                 Autor: Elder Marco <eldermarco@gmail.com>
 *                 Data : 13/09/2010
 *    Última modificação: 07/11/2010
 *---------------------------------------------------------------------*/
#include <X11/extensions/scrnsaver.h>
#include <X11/Xlib.h>
#include <X11/Xlibint.h>
#include <stdio.h>

int main() {
     XScreenSaverInfo *info;
     Display *display;

     info = XScreenSaverAllocInfo();
     display = XOpenDisplay(NULL);

     XScreenSaverQueryInfo(display,
                           DefaultRootWindow(display),
                           info);
     printf("%.0f s\n", (float)info->idle/1000);

     Xfree(info);
     XCloseDisplay(display);

     return 0;
}

Considerando que você moveu o programa compilado para algum diretório no seu PATH, basta fazer:

cut -f 1 -d' ' <(xidle)

para obter esse tempo. 🙂

Obviamente, se você executar o programa xidle a partir do terminal, ele sempre vai retornar 0s, já que você acabou de dar um ENTER… mas se quer testar, você pode usar o comando sleep para esperar um tempo e depois executar o xidle (só não toque no teclado e nem mexa no mouse enquanto isso!). Veja:

$ sleep 11 && xidle
11 s
$ sleep 11 && cut -f 1 -d ' ' <(xidle)
11

E pra finalizar, depois que terminei esse programa, encontrei um outro que embora não retorne o tempo ocioso — até onde pude ver –, ele executa um script depois de um tempo de ociosidade do usuário. Procure por xautolock no Google.

Auto-completando opções de comandos com o bash completion


Um recurso que achei muito bom no Ubuntu  e me dei conta que não tinha no fedora é o de auto-completar opções de vários comandos no terminal apenas como a tecla TAB. Já é sabido que o bash é capaz de completar o nome de um de um comando, um arquivo ou um caminho através dessa tecla, mas o que muitos não sabem é que também é possível completar as opções dos comandos passados ou até mesmo o nome de um pacote que você quer remover ou instalar do seu sistema. Vejamos um exemplo (o caractere ‘|’ representa a posição do cursor, abaixo):

# yum l|[TAB]
list          localinstall

Note que eu me referi a uma opção que começa com ‘l’ do comando yum e teclei TAB (duas vezes na primeira vez) e como retorno, o shell me mostrou as duas opções possíveis para o comando yum que começam com a letra ‘l’: list e localinstall. Nesse caso, se eu colocar mais uma letra e dar um TAB, a opção já fica automaticamente definida.  Assim, se fizer:

# yum lo|[TAB]

o shell irá expandir para

# yum localinstall |

Vejamos mais dois exemplos. Um ainda com o yum e outro com o comando update-alternatives:

# yum ins|[TAB]

Expande para

# yum install |

E depois tento instalar um programa que começa com ea:

# yum install ea|[TAB]
earcandy.noarch                           easymock2-javadoc.noarch
earth-and-moon-backgrounds-common.noarch  easymock2.noarch
earth-and-moon-backgrounds-dual.noarch    easymock-javadoc.noarch
earth-and-moon-backgrounds-kdm.noarch     easymock.noarch
earth-and-moon-backgrounds.noarch         easystroke.x86_64
earth-and-moon-backgrounds-single.noarch  easytag.x86_64

isto é, uma lista de todos os programas que posso instalar no meu sistema. Agora veja:

# yum install easyt|[TAB]

e então..

# yum install easytag |

Agora com o update-alternatives:

# update-alternatives --|[TAB]
--admindir  --auto      --display   --install   --remove    --verbose
--altdir    --config    --help      --quiet     --set       --version
# update-alternatives --c|[TAB]

E será expandido para:

# update-alternatives --config |

LOL! Ficou com vontade de ter um recurso desse no seu Pinguim? Então, como uso fedora, vou passar o procedimento para obter esses efeitos nele. Se você usa outra distro, procure por esse pacote e instale ele. No caso do fedora, é bem simples.  Instale o pacote bash-completion no seu sistema:

# yum install bash-completion

E é somente isso. 🙂

Você pode ver uma lista de comandos que permitem utilizar o recurso de auto-completar listando o conteúdo do diretório /etc/bash_completion.d:

$ ls /etc/bash_completion.d

Onde cada arquivo nesse diretório se refere a um comando do sistema.

É até possível criar suas funções que permitem auto-completar comandos que você queira ou de programas que criou, mas isso está fora do escopo desse post. Só com esses você já terá muitos comandos com esse recurso.

Shell Script: Extrair trechos de uma linha


Acompanhando meus feeds, vi um post interessante do InFog com o título de Expressões Regulares:  Casar texto entre chaves .  Nesse post, ele demonstra como obter um texto que se encontra entre chaves em uma linha usando a linguagem Python e PHP.  Essa era uma coisa que eu estava procurando em meu aprendizado com Shell Script e resolvi tentar achar uma solução nessa linguagem.  Depois de umas tentativas sem sucesso, obtive ajuda de colegas da lista shell-script no Yahoo! Grupos.

Eis então duas abordagens interessantes:

Primeira: Obter os textos juntamente com as chaves.

Essa solução é a mais simples. Vou usar o mesmo texto que foi usado no post dele no script abaixo:

#!/bin/bash

texto="ola, {sou} uma string com {varios} caracteres {especiais}"

grep -o '[{][^}]*[}]' <<< "$texto"

Se executar esse script, a saída será:

{sou}
{varios}
{especiais}

Interessante! Mas eu ainda queria algo que também eliminasse as chaves e ficasse somente o texto dentro delas, cada um em uma linha. O sed é ótimo pra isso.

Segunda: Obter os textos sem as chaves na saída

#!/bin/bash

texto="ola, {sou} uma string com {varios} caracteres {especiais}"

sed '
        s/^[^{]*[{]//;
        s/[}][^{]*[{]/\n/g;
        s/[}].*$//
' <<< "$texto"

O primeiro comando do sed apaga do início da linha até a primeira chave. O segundo, substitui todo o conteúdo entre as chaves por um caractere de nova linha (\n) e o terceiro apaga desde a última chave até a final da linha.

E se executarmos o script…

sou
varios
especiais

Exatamente como eu queria!

Categorias:Linux, Shell Script Tags:, , ,

Sugerindo artistas do Jamendo no Twitter


Eu andava meio sem nada para fazer agora de tarde e resolvi escrever um script por aqui. Tempos atrás eu havia escrito um que fazia a mesma coisa que uma função do Choqok e enviava uma música que a pessoa estivesse ouvindo no Amarok 2 — o melhor player de música do planeta!! — para o Twitter. Tinha ficado empolgado com o fato de poder enviar um Tweet pelo curl…

Pois é, então depois pensei.. “Por que não escrever um que permita compartilhar as músicas que estou ouvindo com os meus seguidores?” É claro, não poderia ser músicas protegidas e blábláblá. Eu já havia falado sobre o Jamendo nesse blog faz um bom tempo  e disse que o site se baseia em licenças livres e qualquer usuário pode fazer download gratuitamente dos álbuns por lá.  Existem excelentes artistas a serem explorados e a quantidade de albuns só cresce. No momento em que escrevo, existem 27801 disponíveis para serem baixados! E ainda existe um monte de pessoas que nunca se quer ouviram falar do Jamendo!

Então a idéia é justamente a de compartilhar essas músicas, divulgar o Jamendo e o artista que se está ouvindo.  Uma URL curta para o download é obtida usando usando o TinyURL.com.

Use, modifique, mostre para os outros, xingue caso encontrar algum erro, como quiser! Faça o download aqui

Depois de baixado, mova o script para seu diretório ~/bin, edite-o colocando seu username (e não o meu, como está lá) e execute com o comando

$ jamtwitter

É possível personalizar  um pouco mais o script, se você quiser. Usar o URL da faixa, do álbum ou do artista em questão, etc. Dê uma lida no script.

Mas se a música não for do Jamendo, sem chance.  Que fique claro! 🙂

JDownloader, um excelente gerenciador de downloads


Faz um certo tempo e meio sem querer fui apresentado ao JDownloader, um gerenciador de downloads que permite o download de uma grande quantidade de serviços de hospedagem de arquivos. Quem hoje, usuário de um serviço de banda larga, não costuma baixar arquivos grandes do Megaupload, Rapidshare, etc? Acho que quase todas as pesssoas.

Pois é, o JDownloader está aí pra isso.  A grande vantagem desse gerenciador é que o Dowload costuma ficar bem mais prático. Para se ter uma idéia, quando você copia um link para  a área de transferência com o programa aberto, ele imediatamente captura esse link e já coloca na lista. Se você tiver um problema e sua conexão cair, não se preocupe que o JDownloader irá começar o download de onde havia parado antes. Isso é com certeza um grande recurso se comparado ao navegador, onde caso tenha perdido o download, provavelmente terá de começar tudo novamente.  É possível deixar uma lista de arquivos em diversos servidores e deixar que o software realize o restante da tarefa. Nem mesmo aqueles códigos chatos que existem naqueles site (chamado CAPTCHAs) serão necessários, o JDownloader dá conta do recado sozinho.

Ele tem uma versão para Windows, Linux e  Mac e necessita do Java instalado para funcionar. Obviamente, irei tratar da da instalação para o Linux aqui. No entanto, você pode dar uma visitada nessa página e baixar a versão para o seu sistema operacional. Usuários Linux, existe um um script chamado jd.sh que praticamente automatiza todo o processo. O JDowloader é instalado somente para o usuário em questão através desse script.  Vá até a página de dowload e clique sobre o ícone do Pinguim para fazer o download referente ao Linux. Abaixo dessas opções, há o script jd.sh. Baixe-o e coloque num diretório que esteja no seu PATH. Provavelmente, o diretório ~/bin deve estar. Depois dê permissões de execução para esse script e simplesmente execute-o. Na primeira vez que você fizer isso, será baixado um programa de atualização do JDownloader que irá se encarregar de baixá-lo e instalar ele em ~/.jd. Depois disso, toda vez que você executar esse script, o programa será carregado. Quando o executar pela primeira vez, tome cuidado ao escolher a pasta onde ele irá fazer o download porque, por padrão os downloads são guardado em um diretório oculto abaixo ~/.jd

Alternativamente, se você é daqueles  que gosta de usar tudo em linha de comando, existe o plowshare que é um conjunto de scripts que permitem o downloads de arquivos de alguns serviços bem famosos também. Não é como o JDownloader, mas é bem útil. Note no site que há algumas dependências a serem satisfeitas. Usuários do Fedora, podem fazer o download de um pacote rpm que criei e permite a instalação e já resolve automaticamente as dependências necessárias via yum. Baixe o pacote aqui, vá té o diretório onde baixou o arquivo  e instale com o comando

# yum localinstall plowshare-0.8.1-1.fc11.noarch.rpm --nogpgcheck

Onde a versão apresentada acima é a versão no momento em que escrevo esse artigo. Como costumo usar tanto o JDownloader quanto o plowshare, sempre atualizo o pacote rpm e você poderá ver uma versão mais atual dele através desse link. Para saber como usar o plowshare, dou a dica de dar uma lida nesse post no Viva o Linux. Foi lá que fiquei sabendo dele. 🙂

Parando o gnome-screensaver durante uma reprodução de video


Imagine a cena. Você chega ancioso na frente do seu PC com um arquivo de video e logo chama o mplayer pra rodar ele. Na melhor parte, aquela que você não poderia perder,  justo aquela, aparece o Gnome screensaver!  A única coisa que você vê — ou ouve —  é o som que você não queria  para não perder a surpresa! Vai ter de ir P da vida até o PC, digitar a senha, voltar a cena..  Foi depois de passar um pouco de raiva com isso que resolvi dar um jeito na coisa…

Meu player preferido para ver videos é o mplayer e a solução principal que busquei foi pra ele.  Mas eu obtive duas soluções para esse problema. A primeira é específica do mplayer e a segunda você pode aplicar a qualquer outro programa que não forneça a opção de parar a proteção de tela.

A primeira e mais fácil é dar uma “cutucada” no gnome-screensaver  antes que seja ativado.  O comando responsável por isso é o

$ gnome-screensaver-command --poke

Essa opção permite simular alguma atividade no PC como se você estivesse na frente dele. No entanto, o comando precisa ser executado periodicamente para que o screensaver não seja ativado…

O mplayer tem a opção heartbeat-cmd que permite que uma determinado comando seja executado a cada 30 segundos via função system(). Essa função executa um determinado comando no shell. Assim, podemos fazer com que ele dê essas cutucadas no gnome-screensaver pra nós! Olha que beleza! Adicione a seguinte linha ao seu arquivo ~/.mplayer/config

heartbeat-cmd="gnome-screensaver-command --poke"

Ou então use essa opção diretamente na linha de comando para executar o arquivo meu_filme.avi (mas isso é falta de elegância e um tédio, que fique claro! :-))

$ mplayer -heartbeat-cmd "gnome-screensaver-command --poke" meu_filme.avi

Essa foi a primeira opção que me deparei e sim, resolve o problema. Mas pode surgir outro. Eu percebia que a cada 30 segundos o video que estava assistindo dava uma pequena travada e isso começou a incomodar. Pode ser que não ocorra com você, mas comigo não teve jeito. Acredito que seja por causa a pouco memória que estava usando. De qualquer maneira,  isso me levou ao plano B que achei mais foi mais adequado nessa situação: parar o gnome-screensaver, executar o video e depois fazer ele rodar de novo.  Na verdade, até acho mais inteligente essa alternativa do que ficar se “lembrando” a todo momento de cutucar o pobre coitado.

Assim, escrevi um pequeno script — stopgs.sh — que permite que isso seja feito. Ele funciona no Gnome ou no XFCE 4 (ambos usam gnome-screensaver) e o testei no Fedora 10, mas acredito que funcione em outra distro sem problemas.. Futuramente pretendo também incluir o KDE na jogada, mas todas as minhas tentativas de fazer funcionar no KDE falharam. Eu ainda não achei um jeito de controlar o screensaver do KDE. 😦

Como deixei o script muito bem comentado, vou dispensar a parte de explicar como proceder, deixando para os comentários que estão nele fazerem isso. Ele está disponível para download aqui.

Divirta-se! 🙂