#!/bin/bash # visitas.cgi - Livro de Visitas em Shell Script # # Site....: http://thobias.org # Autor...: Thobias Salazar Trevisan # Licença.: GPL # # Changelog: # 14/03/2005 - limpeza/reescrita do codigo. (ta **muito** mais legivel) # - nao usa mais arquivos temporarios (valeu aurelio pelas dicas) # - urldecode (sai sed gigante, entra 'echo -e' e um sedizinho) # - adicionado opcao para 'esconder' o mail # - adicionado limite maximo para o tamanho da mensagem # - pequenos bugs fixed # 25/03/2004 - primeira versao # ############################################################################# ### CONFIGS # # arquivo que contera todas as mensagens do livro # o usuario do apache deve ter permissao de escrever neste arquivo file='/tmp/visitas.html' # # titulo da pagina titulo='Livro de Visitas da Página do Thobias' # # cores da pagina page_color='black' text_color='snow' link_color='lightgreen' # # tamanho maximo da mensagem # (o form atual gera um input de 44 caracteres) # ,ie, o limite real para o usuario eh de 956 caracteres max_size='1000' # # link e texto do rodape da pagina link_rodape='http://thobias.org' texto_rodape='Voltar para a página inicial.' # # email que recebera uma copia de cada novo post do livro. # se nao especificado, nenhum mail eh enviado MAILTO='' # mascara os mails (esconde dos robos de spam). 1 liga 0 desliga mask_mail='1' # ############################################################################# ############################################################################# # Mostra o cabecalho HTML da pagina ############################################################################# cabecalho_html(){ cat <<FIM_HEADER content-type: text/html <html> <head> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8"> <title> $titulo </title> </head> <body bgcolor="$page_color" text="$text_color" link="$link_color"> <center><h1>$titulo</h1></center> <hr size=6 noshade> FIM_HEADER } ############################################################################# # Monta o formulario para a postagem de uma nova mensgem ############################################################################# 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" cat <<FIM_FORM <form method="post" action="${0##*/}"> nome: <input type="text" name="nome" maxlength="50" size="30"><p> email: <input type="text" name="email" maxlength="50" size="30"><p> cidade: <input type="text" name="cidade" maxlength="50" size="30"> Estado: <select name="estado"> <option value="none">--- $(for i in $estados;do echo \<option value="$i"\> $i;done) </select><p> Sua mensagem:<br> <textarea name="mensagem" wrap="physical" rows="6" cols="65"></textarea><p> <input type="submit" value="Enviar Mensagem"> <input type="reset" value="Limpar"> </form> <hr size=6 noshade> FIM_FORM } ############################################################################# # Recebe e formata a nova mensagem ############################################################################# read_msg(){ local nome email cidade estado mensagem POST # testa tamanho do input [ $CONTENT_LENGTH -gt $max_size ] && { echo "Sua mensagem ultrapassou o limite de $max_size caracteres. Por favor, diminua o tamanho da mensagem. Obrigado."; exit; } # variavel no shell recebe conteudo da variavel do form POST=$(sed 's/&/\ /g') ; eval "$POST" # URL decode nome=$(echo "$nome" | sed 's/+/ /g;s/%/\\x/g;s/.*/echo -e "&"/' | bash) email=$(echo "$email" | sed 's/+/ /g;s/%/\\x/g;s/.*/echo -e "&"/' | bash) cidade=$(echo "$cidade" | sed 's/+/ /g;s/%/\\x/g;s/.*/echo -e "&"/' | bash) mensagem=$(echo "$mensagem" | sed 's/+/ /g;s/%/\\x/g;s/.*/echo -e "&"/' |bash) # arruma as variaveis [ "$mask_mail" = "1" -a "$email" ] && email=$(echo "$email" | sed 's/@/ [at] /;s/\./ dot /g') email="${email:=no mail}"; nome="${nome:=anônimo}" mensagem="$(echo "$mensagem" | sed 's/[\r\n]/<br>/g')" # a variavel POST contem a mensagem no template utilizado no livro. # facil de modificar para um formato diferente POST=" $(date '+%d/%m/%Y') - <b>$nome</b> <$email> ($cidade - $estado)<br> $mensagem <hr noshade> " # adiciona a nova mensagem adiciona_msg "$POST" } ############################################################################# # Adiciona a nova mensagem no inicio do arquivo ############################################################################# adiciona_msg(){ # adiciona a nova mensagem no arquivo echo "<!-- inicio msg --> $1 <!-- fim msg -->" >> $file echo >> $file # se necessario, envia copia do novo post por mail [ "$MAILTO" ] && echo "$1" | mail -s "Livro de Visitas - $titulo" $MAILTO } ############################################################################# ###### Principal ############################################################################# cabecalho_html # mostra o cabecalho do html monta_formulario # mostra o formulario [ "$REQUEST_METHOD" = "POST" ] && read_msg # recebe a nova mensagem # mostra as mensagens atuais # as ultimas mensagens estao no final do arquivo. esses seds fazem o # trabalho sujo de ajeitar o arquivo para mostrar as ultimas primeiro sed '1!G;h;$!d' $file 2> /dev/null | sed '/^ <!-- fim msg -->/{:a;/<!-- inicio msg -->/!{N;ba;};s/^[^\n]*/\ &§/;s/$/\ /;:b;s/\(.*\)§\(\n[^\n]*\)\n/\2\1§\ /;tb;s/^\n\(.*\).\n$/\1/;}' # termina o html echo "<a href=\"$link_rodape\">$texto_rodape</a>" echo "</body>" echo "</html>"