#!/bin/bash
#
# Livro de Visitas
# Thobias Salazar Trevisan
#
# atualizações:
# 25/03/2004 - Primeira versão
#
#
########################################################################
#
### CONFIGS
#
# arquivo que conterá todas as mensagens do livro
# quando criar este arquivo é necessário que ele tenha pelo menos
# um caractere para podermos utilizar 'sed 1r arquivo', então
# use 'echo > $arq_visita'
arq_visita='/tmp/visitas_meu_site.html'
#
# arquivo temporário para guardar a mensagem vinda do POST
temp_file='/tmp/visitas_post.txt'
#
# diretório para criar arquivos temporários
temp_dir='/tmp'
#
# diretório utilizado como lock pelo script
# podemos utilizar está abordagem por sabermos que a
# criação de um diretório é atômica
dir_lock='/tmp/lock_diretorio_livro_de_visitas'
#
# título da página
titulo='Livro de Visitas'
#
# cores da página
page_color='black'
text_color='snow'
link_color='lightgreen'
#
# coloque 1 para quando receber uma mensagem no livro receber também
# uma cópia por email
SEND_MAIL=0
# email que receberá uma cópia
MAIL='seu_email'
#
########################################################################
# ----------------------------------------------------------------------
# monta o formulário para a postagem de uma nova mensgem no livro
# ----------------------------------------------------------------------
monta_formulario(){
local estados="AC AL AM AP BA CE DF ES GO MA MG MS MT PA PB PE PI PR RJ \
RN RO RR RS SC SE SP TO"
echo "
"
}
# ----------------------------------------------------------------------
# adiciona uma nova mensagem no livro
# ----------------------------------------------------------------------
adiciona_msg(){
# temp_html arquivo que conterá a mensagem recebia via POST
# já formatada para o livro de visitas, isto é, em html
local tem temp_html="$temp_dir/livro_visitas_temp.html"
# link de fd 6 com a stdout e redireciona a stdout para um arquivo.
# a partir daqui toda a stdout vai para $temp_html
exec 6>&1; exec > $temp_html
echo ""
date '+%d/%m/%Y'
# pega somente o nome
tem=$(sed -n '1s/nome=\([^&]*\)&.*/\1/p' $temp_file)
[ "$tem" ] && echo "$tem" || echo 'anônimo'
# pega somente o mail
tem=$(sed -n '1s/.*mail=\([^&]*\)&.*/\1/p' $temp_file)
[ "$tem" ] && echo "< $tem >" || echo '< none@somewhere >'
# pega o estado
sed -n '1s/.*cidade=\([^&]*\)&estado=\([^&]*\)&.*/(\1 - \2)/p' $temp_file
echo "
"
# imprime a mensagem trocando o final de linha por
sed '1s/.*&mensagem=//;s/$/
/' $temp_file
echo "
"
# restaura a stdout e fecha o fd 6
exec 1>&6 6>&- ;
# testa se já existe o arquivo com as mensagens
[ -f "$arq_visita" ] || echo > $arq_visita # precisamos de pelo menos um char
# adiciona a nova mensagem no início do arquivo
( rm -f $arq_visita; sed "1r $temp_html" > $arq_visita ) < $arq_visita
# envia uma cópia da mensagem recebia para um e-mail
[ "$SEND_MAIL" = "1" ] && mail -s 'Livro de Visitas' $MAIL < $temp_file
}
# ----------------------------------------------------------------------
# testa se o script está recebendo dados via POST e trata
# os mesmos se necessário
# ----------------------------------------------------------------------
testa_post(){
# utilizamos um diretório como lock para não sobrescrevermos o arquivo
# com os dados recebidos via POST enquanto o mesmo está sendo processado
trap 'rmdir ${dir_lock:-VARIAVEL_VAZIA} >/dev/null 2>&1;return' 1 2 3 15
while ! mkdir $dir_lock >/dev/null 2>&1 ; do sleep 1;done
# faz o urldecode. copiado com algumas modificações de
# http://aurelio.net/sed/programas/unescape.sed
sed 's/+/ /g;s/%40/@/g;s/%0[Dd]%0[Aa]/\
/g;s/%09/ /g;s/%21/!/g;s/%22/"/g;s/%23/#/g;s/%24/$/g;s/%26/\&/g;s/%27/'\''/g
s/%28/\(/g;s/%29/\)/g;s/%2B/+/g;s/%2C/,/g;s/%2F/\//g;s/%3A/:/g;s/%3B/;/g
s/%3C//g;s/%3F/?/g;s/%5B/[/g;s/%5C/\\/g;s/%5D/]/g
s/%5E/^/g;s/%60/`/g;s/%7B/{/g;s/%7C/|/g;s/%7D/}/g;s/%7E/~/g;s/%A1/¡/g
s/%A2/¢/g;s/%A3/£/g;s/%A4/¤/g;s/%A5/¥/g;s/%A6/¦/g;s/%A7/§/g;s/%A8/¨/g
s/%A9/©/g;s/%AA/ª/g;s/%AB/«/g;s/%AC/¬/g;s/%AD//g;s/%AE/®/g;s/%AF/¯/g
s/%B0/°/g;s/%B1/±/g;s/%B2/²/g;s/%B3/³/g;s/%B4/´/g;s/%B5/µ/g;s/%B6/¶/g
s/%B7/·/g;s/%B8/¸/g;s/%B9/¹/g;s/%BA/º/g;s/%BB/»/g;s/%BC/¼/g;s/%BD/½/g
s/%BE/¾/g;s/%BF/¿/g;s/%C0/À/g;s/%C1/Á/g;s/%C2/Â/g;s/%C3/Ã/g;s/%C4/Ä/g
s/%C5/Å/g;s/%C6/Æ/g;s/%C7/Ç/g;s/%C8/È/g;s/%C9/É/g;s/%CA/Ê/g;s/%CB/Ë/g
s/%CC/Ì/g;s/%CD/Í/g;s/%CE/Î/g;s/%CF/Ï/g;s/%D0/Ð/g;s/%D1/Ñ/g;s/%D2/Ò/g
s/%D3/Ó/g;s/%D4/Ô/g;s/%D5/Õ/g;s/%D6/Ö/g;s/%D7/×/g;s/%D8/Ø/g;s/%D9/Ù/g
s/%DA/Ú/g;s/%DB/Û/g;s/%DC/Ü/g;s/%DD/Ý/g;s/%DE/Þ/g;s/%DF/ß/g;s/%E0/à/g
s/%E1/á/g;s/%E2/â/g;s/%E3/ã/g;s/%E4/ä/g;s/%E5/å/g;s/%E6/æ/g;s/%E7/ç/g
s/%E8/è/g;s/%E9/é/g;s/%EA/ê/g;s/%EB/ë/g;s/%EC/ì/g;s/%ED/í/g;s/%EE/î/g
s/%EF/ï/g;s/%F0/ð/g;s/%F1/ñ/g;s/%F2/ò/g;s/%F3/ó/g;s/%F4/ô/g;s/%F5/õ/g
s/%F6/ö/g;s/%F7/÷/g;s/%F8/ø/g;s/%F9/ù/g;s/%FA/ú/g;s/%FB/û/g;s/%FC/ü/g
s/%FD/ý/g;s/%FE/þ/g;s/%FF/ÿ/g;s/%25/%/g' > $temp_file
# se temos input ele está em $temp_file
[ -s $temp_file ] && adiciona_msg
# apaga o nosso diretório de lock
rmdir "${dir_lock:-VARIAVEL_VAZIA}"
}
########################################################################
#
# ----------------------------------------------------------------------
# Principal
# ----------------------------------------------------------------------
echo "content-type: text/html"
echo
echo " $titulo "
echo ""
echo "$titulo
"
monta_formulario
echo "
"
testa_post
cat $arq_visita
echo ""
echo ""