#!/bin/bash # datas - programa em modo texto de calendario e compromissos # # Autor....: Thobias Salazar Trevisan # Site.....: http://thobias.org/datas # Licenca..: GPL # # Changelog: # 25/11/2005 - colore dia de hoje com cor diferente (valeu elias) # - colore os compromissos mesmo que o mes/ano nao seja atual # - variavel $SED especifica qual sed utilizar (valeu Josevan) # 20/09/2005 - adicionada opcao --list # - sort dos lembretes do mes # - aviso de lembrete para o celular (valeu ataliba) # - adicionado o "mes 00". nao precisa mais adicionar o # mesmo lembrete em todos os meses (valeu aurelio) # 15/01/2005 - Primeira versao # ############################################################################# # # Configuracoes # ============= # # arquivo que contem as datas a serem lembradas # baixe o arquivo modelo no site: http://thobias.org/datas dados='/home/thobias/devel/datas/1.2/datas.txt' # # endereco de mail de quem vai receber o lembrete (utilizado apenas quando # for passado o parametro --cron mailto='thobias' # # o seu celular recebe mail?! # ex: celmail='seunumero@suaoperadora.com.br' celmail='' # # numero de dias de antecedencia que sera enviado o lembrete por mail days='1' # comando para enviar o mail cmd_mail="mail -s 'datas: lembrete de data(s) importante(s)' $mailto" # # especifique a versao/implementacao do sed que voce quer usar. este script so # foi testado com o GNU Sed, se voce usa algum BSD por exemplo, instale o # gsed e coloque o gsed na variavel abaixo: (Exemplo: SED='gsed') SED='sed' # # definindo as possiveis cores VERDE="\\033[1;32m" BRANCO="\\033[1;37m" AZUL="\\033[1;36m" AMARELO="\\033[1;33m" VERMELHO="\\033[1;31m" PRETO="\\033[1;30m" NORMAL="\\033[0;39m" # # escolha quais cores serao utilizadas para destacar os dias com # compromissos e o dia de "hoje". Se nao quiser nenhuma cor, defina # como NORMAL. Exemplo: COR_HJ="$NORMAL" COR_DATA="$AZUL" # cor que ficara o dia de hoje COR_HJ="$VERDE" # versao='1.2' # # sedao que arruma o mes especial no arquivo com os lembretes # so mexa se voce souber _realmente_ o que esta fazendo SEDMES00='/^ *# *00 *-/,/^ *# *[0-9][0-9] *-/{/^ *# *00 *-/d; /^ *# *[0-9][0-9] *-/ba;H;};:a;/^ *# *[0-9][0-9] *-/G' # # ############################################################################# ############# Funcoes ############################################################################# ##### funcao que envia o lembrete por mail e/ou celular (parametro --cron) cron(){ local i hj mes ano [ "$1" -a "${1//[0-9]}" ] && { echo "Número de dias inválido"; return; } hj=$(date '+%d' --date "${1:-$days} days" | $SED 's/^0//') ms=$(date '+%m' --date "${1:-$days} days" | $SED 's/^.$/0&/') ano=$(date '+%Y' --date "${1:-$days} days") # verifica se existe algum compromisso i=$(cat $dados | $SED "$SEDMES00"| $SED -n "/^ *# *$ms *- /,/#/{//d;/^ *$/d; s/^ *0//;/\b$hj\b/!d;p;}") # tem algum compromisso?! if [ "$i" ]; then # envia mail. facil de personalizar o mail enviado echo " Hoje é: $(date '+%d de %b de %Y') $(cal $ms $ano) Lembrete(s): $i" | eval $cmd_mail # envia para o celular. facil de personalizar a mensagem enviada [ "$celmail" ] && echo "Lembrete do programa datas: dia $i"|mail $celmail fi } ##### mostra o calendario com os lembretes na stdout cmd(){ local hj ms ano cal a cor diacor # sed que colore o dia no calendario diacor='"s/\(^\| \)$a\( \|$\)/\1$(echo -en $cor)$a$(echo -en $NORMAL)\2/"' hj=$(date '+%d' | $SED 's/^0//') [ "$1" ] && ms="$1" || ms=$(date '+%m'); ms=$(echo $ms | $SED 's/^.$/0&/') [ "$2" ] && ano="$2" || ano=$(date '+%Y') # testa se o mes e valido [ "$(echo $ms | $SED 's/^.$/0&/;s/^\(0[1-9]\|1[0-2]\)$//')" ] && { echo Erro: mês inválido; exit 1; } [ "$(echo $ano | $SED 's/^200[0-9]$//')" ] && # testa se o ano e valido { echo "Erro: ano inválido"; exit 1; } cal=$(cal "$ms" $ano) # se for este mes e ano, colore o dia de hoje [ "$ms" = "$(date '+%m')" -a "$ano" = "$(date '+%Y')" ] && { cor="$COR_HJ"; a=$hj; cal="$(echo "$cal"| eval $SED "$diacor")"; } # colore o calendario cor=$COR_DATA ; while read a; do cal="$(echo "$cal"| eval $SED "$diacor")" done < <(cat $dados | $SED "$SEDMES00" | $SED -n "/^ *# *$ms *- /,/#/{//d;/^ *$/d;s/^ *0//;s/ \+/ /g;s/ \?-.*//;p;}") [ "$ms" = "$(date '+%m')" -a "$ano" = "$(date '+%Y')" ] || COR_HJ=$NORMAL # monta o calendario com os lembretes paste <(echo "$cal") <(cat $dados | $SED "$SEDMES00" | $SED -n "/^ *# *$ms *- /,/#/{//d;/^ *$/d;s/^ *0//;s/ \+/ /g;p;}" | sort -n | $SED "s/^[0-9] / &/;/\b$hj\b/s/.*/$(echo -en $COR_HJ)&$(echo -en $NORMAL)/") } ############################################################################# ############# Main ############################################################################# [ "$1" = "--versao" -o "$1" = "-v" ]&&{ echo "datas versao $versao";exit; } # edita o arquivo de configuracao [ "$1" = "--edit" -o "$1" = "-e" ] && { ${EDITOR:-${2:-vi}} $dados ; exit; } # envia o(s) lembrete(s) por mail e/ou celular (se necessario) [ "$1" = "--cron" ] && { shift; cron "$1"; exit; } # lista todos os compromissos cadastrados [ "$1" = "--list" -o "$1" = "-l" ] && { $SED "$SEDMES00" $dados | $SED -n "/^ *$/d;s/^[0-9] /0&/;/^ *# *01 *-/,\${ s/^ *# *[0-9].*/$(echo -en $VERDE)&$(echo -en $NORMAL)/;p;}" | $SED '1i **** tecla Q sai' | ${PAGER:-less -r}; exit; } # mostra help [ "$1" = "--help" -o "$1" = "-h" ] && { echo "datas.: script que mostra o calendário destacando as datas importantes Site..: http://thobias.org/datas Versão: $versao Uso: datas [opções] [mês] [ano] especifica o mês a ser consultado (pode ser indicado o ano) --cron [N] envia o mail com de N dias de antecedência da data do lembrete -e, --edit abre o arquivo com os lembretes em um editor de texto -l, --list mostra todos os lembretes cadastrados -h, --help mostra a ajuda -v, --versao mostra a versão Consulte a documentação completa no site. " ; exit; } # mostra o calendario com os compromissos cmd "$@"