#!/bin/bash # # bt_ - Implementazione prototipo in Bash # # Realizzato da: icosaedro.it di Umberto Salsi - www.icosaedro.it # # Versione: 2004-02-14 # # Maggiori info: www.icosaedro.it/bt_/implementazione.html # # Programmi esterni utilizzati: # date cat dd md5sum urlencode urldecode mkdir mv sed grep tr umask 0077 BASE_DIR=/tmp export PATH=/bin:/usr/bin:/usr/local/bin ##################################################### # # bt_ core # ##################################################### function log() { echo "$( date "+%m-%d, %H:%M:%S" ) $0, $REMOTE_ADDR: $@, query=$query" | cat -vt >&2 } # Formato del bt_file # ------------------- # # Il bt_file e' costituito da zero o piu' righe. Ogni riga e' # costituita da 3 o piu' colonne: # # 1. Indice come risulta dal parametro "i" (se la pagina e' stata # invocata con metodo GET) o dal nome del bottone "buttonXX" (se la # pagina e' stata invocata con metodo POST). # # 2. "forw" e' la call-forward; "back" e' la call-backward. Ad una # call-forw. puo' corrispondere zero o una call-back. # # 3. Eventuali argomenti della funzione di call-forw. o call-back. # Contatore dei link (ancore e bottoni): link_n=0 function _encode_parameters() { local p p="" while [ $# -gt 0 ]; do [ -n "$p" ] && p="$p " if [ -z "$1" ]; then p="$p %00" else p="$p$( printf %s "$1" | urlencode )" fi shift done echo "$p" } function bt_stack_push() { if [ $# -lt 1 ]; then log "stack_push(): manca parametro" exit 1 fi _encode_parameters "$@" >> $bt_stack } function bt_stack_pop() { if [ ! -s $bt_stack ]; then log "bt_stack_pop(): stack vuoto o assente" menu exit fi tos="$( tail -1 $bt_stack )" sed \$d $bt_stack > $bt_stack.x mv $bt_stack.x $bt_stack } function bt_link() # # bt_link FUNCTION { ARGUMENT } # # Genera URL del link che chiama la call-forward proc. indicata. # Ritorna l'URL nella var. globale $link. # NOTA: sarebbe stato piu' elegante ritornare il risultato della # funzione su stdout. Pero' questo avrebbe richiesto l'esecuzione # in un sottoprocesso, impedendo cosi' di incrementare il valore # della var. globale $link_n. # # Esempio: # # bt_link MostraMenu file edit view # echo "Mostra il menu" # { if [ $# -lt 1 ]; then log "bt_link(): manca parametro" exit 1 fi if [ $link_n -eq 0 ]; then > $bt_file fi link_n=$(( link_n + 1 )) echo "$link_n forw $( _encode_parameters "$@" )" >> $bt_file link="$SELF?i=$link_n" } function bt_alink() # # Come bt_link(), ma genera in output l'ancora ... # # Parametri: # $1: testo dell'ancora # $2: funzione call-forward da chiamare # $3, ...: eventuali parametri da passare alla call-forward proc. # # Esempio: # # bt_alink "MENU PRINCIPALE" MostraMenu file edit view # { if [ $# -lt 2 ]; then log "bt_alink(): mancano parametri" exit 1 fi local text text="$1" shift bt_link "$@" echo -n "$text" } function bt_form() { echo "
Per la visualizzazione del programma dimostrativo inserire "demo" come nome e come password.
EOT } function logout_sicuro() { set_cookie "bt_session" "" 0 login } function logout() { header title "Logout" echo "Sei sicuro di voler eseguire il logout?
" bt_form center bt_button Annulla menu hspace bt_button Logout logout_sicuro center_ bt_form_ footer } function vspace() { echo "" echo "" } function hspace() { echo " " } function center() { echo "
| " if [ "$col_curr" = "$color" ]; then s="X" else s=" " fi bt_alink "$s" bt_return ok $color echo " | " done done echo "
"
echo -n ""
echo " "
echo " ## ## "
echo " ## #### "
echo " #### ## "
echo " ## # ## "
echo " ##### ### "
echo " #### "
echo -n " "
echo ""
echo " |
" echo "" bt_get titolo "(senza titolo)" | text2html echo "
" center_ bt_alink "Colore del quadro" scegli_colore "Colore del quadro:" $col_quadro bt_return_to arte col_quadro echo "" bt_alink "Colore della cornice" scegli_colore "Colore della cornice:" $col_cornice bt_return_to arte col_cornice echo "
" bt_alink "Titolo" titolo bt_return_to arte echo "
" bt_alink "Azzera" azzera bt_return_to arte echo "
" bt_form center bt_button OK bt_return center_ bt_form_ center_ footer } function altra_finestra() { header title "Finestra" echo "
Bè? che ti aspettavi mai di trovare? ;-)
" bt_form center bt_button OK bt_return center_ echo "" footer } function menu() # # Pagina base dell'applicazione. # { header title "Menu principale" bt_alink "Arte astratta" arte bt_return_to menu vspace bt_alink "Finestra 2" altra_finestra bt_return_to menu vspace center bt_form bt_button Logout logout bt_form_ center_ footer } # # main: # # # Individua la $query: # if [ "$REQUEST_METHOD" = POST ]; then query=$( head --bytes="$CONTENT_LENGTH" ) else query="$QUERY_STRING" fi # # Individua il cookie di sessione: # bt_session="$( get_cookie bt_session | tr -d -c 0-9a-f )" if ! printf %s "$bt_session" | grep -q '^[0-9a-f]\{32\}$' \ || [ ! -d "$BASE_DIR/$bt_session" ]; then # Sessione non valida. name="$( get_parameter name )" if [ -n "$name" ]; then # E' il POST dalla maschera di login: login_valida else # Presenta la maschera di login: login exit fi fi # # La sessione esiste: # SELF="$SCRIPT_NAME" bt_file=$BASE_DIR/$bt_session/bt_file bt_stack=$BASE_DIR/$bt_session/bt_stack # rinfresca scadenza cookie: set_cookie bt_session $bt_session 300 # # Richiama la funzione dal bt_file: # i="" if [ "$REQUEST_METHOD" = GET ]; then i="$( get_parameter i | tr -d -c 0-9 )" elif [ "$REQUEST_METHOD" = POST ]; then i=$( echo "$query" | tr '&' '\n' | grep "^button[0-9]\\+=" | head -1 \ | sed "s/^button\\([0-9]\\+\\).*/\1/" ) fi if [ -n "$i" ]; then bt_go "$i" else menu fi # #### Fine!