
Webash
Bash per il Web
Un concetto tipo "dialog"
Documentazione
La tecnologia CGI funziona come un
ping-pong
a tre, in cui i tre giocatori sono :
browser <-> server http
<->
programma CGI
Il browser richiede la pagina CGI
dal server
http, dopodiche', al click di un eventuale form, manda i dati del form
stesso
al server http il quale li passa via StdIn al programma CGI; esso li
elabora e
rimanda la
risposta via StdOut al server http, il quale la rimandera’ al browser.
Non c’e’ un
sistema
di gestione della sessione, quindi e’ il programmatore CGI che deve
avere
fantasia.
Webash implementa un sistema di
questo tipo:
"prendi input -> vai al punto designato -> elabora ->dai
output e
termina programma".
Dal momento che lo script esce,
per tenere
in memoria i dati Webash fornisce le due funzioni "set_variable_cgi"
e "read_variabile_cgi", oltre a fornire ovviamente un meccanismo per
"ricordarsi" a che punto dell'elaborazione esso si trovava all'ultima
uscita. Questi due tipi di dati, cioe’ le “variabili” da far
sopravvivere alla
chiusura del programma, e la gestione della sessione ( tramite la
variabile
“${form_count}” - impostata tramite il comando “set_cookie [n]” - ),
sono
memorizzati in un file che sara’ cancellato quando sara’ utilizzata la
funzione
“final_message_cgi()”.
Ed ora, entri Webash:
# char_max_number_CONTENT_LENGTH=150
# verify_CONTENT_LENGTH (void)
#
# MYSQL_user="per_piacere_setta_questa_variabile"
# MYSQL_password="per_piacere_setta_questa_variabile"
#
#MESSAGGIO
PRE-FORMATTATO: pre_message__cgi "<num
form progressivo>"(opzionale)
"[colore pagina]" "[colore testo]" "Questo e' un
messaggio preformattato"
#
#MESSAGGIO:
message__cgi "<num form progressivo>"(opzionale) "[colore
pagina]" "[colore testo]" "Questo e' un messaggio"
#
#MESSAGGIO
DI AVVISO: alert_message__cgi "<num
form progressivo>"(opzionale)
"[colore pagina]" "[colore testo]" "Attenzione,
testina che non sei altro..."
#
#MESSAGGIO
OK: ok_message__cgi "<num
form progressivo>"(opzionale)
"[colore
pagina]" "[colore testo]" "Bravo , hai fatto tutto
bene..."
#
#MESSAGGIO
FINALE: final_message__cgi "<num
form progressivo>"(opzionale)
"[colore pagina]" "[colore testo]"
"[INDIRIZZO_A_CUI_RIMANDARE_L_UTENTE]" "Bravo , hai fatto tutto
bene..."
#
#MENU:
options=("Ciccio e Franca" "Caio" "Sempronio e Bubba e
Carla" ) && menu__cgi "<num
form progressivo>"(opzionale)
"[colore pagina]" "[colore testo]"
# options=("Ciccio e
Franca" "Caio" "Sempronio e Bubba e Carla" ) =>
${options[${menu_choice}]}
#
#INPUT: input__cgi "<num
form progressivo>"(opzionale) "[colore pagina]" "[colore testo]" "[text|password]"
"variable_1" "[valore della variable_1]" "[text|password]"
"variable_2" "[valore della variable_2]" "[text|password]"
"variable_n" "[valore della variable_n]"...
#
#TABELLA
INTERATTIVA: table__cgi "<num
form progressivo>"(opzionale)
"[colore pagina]" "[colore testo]" "[colore
tabella]" "[colore testo in tabella]" "Presentazione della
tabella" "1 2 3
#
4
5 6"
#
#TABELLE
NON INTERATTIVE: not_interactive_tables__cgi "<num
form progressivo>"(opzionale)
"[colore pagina]" "[colore testo]" "[colore
tabella]" "[colore testo in tabella]"
"nome_tabella_1,nome_tabella_2,nome_tabella_3"
" \"nome_tabella_1\" \"1\"
\"NULL\" \"3\"
#
\"4\" \"5\"
\"6\"
#
\"NULL\" \"8\"
\"9\"
#
\"nome_tabella_2\"
\"a\" \"b\" \"c\"
#
\"NULL\" \"e\"
\"f\"
#
\"g\"
\"h\" \"i\"
#
\"nome_tabella_3\"
\"ga s\" \"ad sf\" \"NULL\"
#
\"sg f\"
\"werg\" \"rr rg\"
#
\"aaa\" \"c
bv\" \"ar h\"
"
#
#UPLOAD FILE: file_upload__cgi "<num
form progressivo>"(opzionale) "[colore pagina]" "[colore testo]"
"[estensione]" "[dimensione MAX in kb]"
# =>
${uploaded_file_name}
#
#
##get_all_mysql_table_ids
"[nome database]" "[nome tabella]" "<colonna per cui
ordinare>"(opzionale)
#
##read_mysql
"[nome database]" "[colonna1,colonna2,ecc.]" "[nome tabella]" "<colonna per cui
ordinare>"(opzionale)
#
##output_fields_in_tabs__quoted__and__changing_empty_fields_in_NULL
"field1[tab]f.2[tab]f.3
#
f.4[tab][tab]f.6
[tab]f.8[tab]f.9 "
#
##read_mysql_row
"[nome database]" "[id]" "[nome tabella]"
#
##insert_mysql
"[nome database]" "[colonna1,colonna2,ecc.]" "[nome
tabella]" "['valore1','valore2',ecc.]"
#
##change_empty_values_in_NULL
"nome_variabile_1" "nome_variabile_2" ecc.
#
##cancel_mysql
"[nome database]" "[colonna rif.]" "[nome
tabella]" "[dato della colonna rif. se trova il quale mysql cancella
la riga]"
#
##update_mysql
"[nome database]" "[colonna rif.]" "[nome
tabella]" "[dato della colonna rif. se trova il quale mysql updata la
riga]" "[colonna1='valore1',colonna2='valore2',ecc.]"
#
##find_values_in_mysql_row
"[nome database]" "[colonna1,colonna2,ecc]" "[nome
tabella]" "[valore1,valore2,ecc.]"
#
##set_variable__cgi
"[nome_variabile]" "[contenuto variabile]"
##read_variable__cgi "[nome_variabile]"
#
#
#
#
#ancora da fare ... (vedi sotto)
## 1) wait_please_dear_user [n] (n = secondi)
## 2) ask_for_confirm "Continuo?"
#confirm=${?}
#if
[ "${confirm}" -eq 0 ] #"OK"
# then
#
bla-bla
#elif [
"${confirm}" -eq 1 ] #"Do’h"
#
then
#
bla-bla
#fi
Tutorials
Primo passo:
digita visudo al prompt dei comandi e scrivi una riga cosi' :
apache
ALL=/bin/false,NOPASSWD:/usr/local/bin/appendi_stringa_in_file
dopodiche' esci (:wq) .
IMPORTANTE: Devi scaricare e compilare urldecode.c & urlencode.c,
dopodiche' copiare i binari urldecode e urlencode nella tua directory
/usr/local/bin, per poter far fare ad input() il parsing degli
argomenti dello StdIn ! (Vedi la sezione download. )
Creeremo 3 programmi:
il primo dimostrativo, il secondo ed il terzo un pochettino piu’ utili…
1)
Dimmi_Come_Ti_Senti.cgi
Programma
piuttosto inutile che serve giusto per dimostrare le potenzialita’
della
libreria Webash. Apri un editor di testi (io uso Kwrite) e salva il
file col
nome : “Dimmi_Come_Ti_Senti.cgi”,
dopodiche’ mettilo nella directory “/var/www/cgi-bin” del server http
(io uso
Apache).
#!/bin/bash
#questo
lo sai gia’ a che serve…
#
source /path/to/Webash
#“include lib”…
#
if [ ! -d "${Dir_cookies}" ]
then
mkdir
"${Dir_cookies}"
if
[ ! -d "${Dir_cookies}" ]
then
alert_message__cgi
"1" "red" "black" "Attenzione...\nnon esiste
\"\${Dir_cookies}\" ..."
fi
fi
#
input
#
”input()” e’ una funzione che spacca: capisce se sta' iniziando un
upload, in quel caso procede nello scaricamento del file e fa' in modo
che il programma esca, altrimenti va avanti, e SE il browser
manda al server
qualcosa (ovviamente cio’ succede solo se l’utente ha cliccato OK in un
form) allora input() crea la variabile “${remote_browser_data}” ; dopo
questo controllo, ed eventualmente la creazione della variabile, la
funzione esce e rida' il controllo al programma "main" chiamante…
#
[ -z "${remote_browser_data}" ] && \
\
set_cookie "1" && \
\
{
#
message__cgi \
"darkkhaki"
"black" \
"Ciao ! \nCisono
animali e fiori...\ndevi scegliere a seconda di cosa ti senti
oggi…"
# se "${remote_browser_data}" non
e' stata creata, il programma
CGI manda al browser la pagina web col form ed esce
dal flusso logico del programma… ( questa e’ la PRIMA pagina che manda
il programma
CGI quando il browser, per la prima volta, punta all’URL del programma
CGI stesso – la
var. ${remote_browser_data} non esiste ancora - ) …
}
# se,
d'altronde, NON era vera la condizione di prima ( = la variabile e'
gia' settata ) , il
flusso va avanti…
#
create_variables_from_form
#traduce
tutti i dati del form presenti in
${remote_browser_data}, in variabili distinte …
#
react_to_error
#questa
e’ una funzione personalizzabile …
#
check_cookie
#paura
che l’utente manipoli i dati della sessione?
check_cookie() controlla in modo sicuro i dati della sessione dal
browser con
quelli che si aspetta a quel punto ( immagazzinati in un file )…
#
[[ ${form_count} = 1 ]] && \
\
set_cookie "2" && \
\
{
#
#TABELLE
NON INTERATTIVE
not_interactive_tables__cgi
\
"#D3D3D3"
"black" "gray" "white" \
"animali,fiori"
\
"
\"animali\" \"NULL\" \"animali\" \"NULL\"
\"1\"
\"Mulo\" \"NULL\"
\"2\"
\"Toro\" \"NULL\"
\"3\" \"Tigre del Bengala\" \"(my prefered)\"
\"4\"
\"Canarino\" \"NULL\"
\"fiori\" \"NULL\" \"fiori\" \"NULL\"
\"1\" \"Garofano\" \"NULL\"
\"2\" \"Rosa\" \"NULL\"
\"3\" \"Loto della
felicita\" \"NULL\"
\"4\"
\"Violetta\" \"NULL\"
\"5\" \"Geranio\" \"(my prefered)\"
\"6\" \"Crisantemo\" \"NULL\" "
}
#
[[ ${form_count} = 2 ]] && \
\
set_cookie "3" && \
\
{
#
#MENU
options=("Mulo"
"Toro" "Tigre del Bengala" "Canarino") &&
menu__cgi \
"#90EE90" "black"
}
#
[[ ${form_count} = 3 ]] && \
\
set_cookie
"4" && \
\
{
#( dal momento che il programma e’ uscito
dopo l’output
della pagina precedente, l’array “${options[@]}” e’ stato perso, e
bisogna
ricrearlo … )
#
options=("Mulo"
"Toro" "Tigre del Bengala" "Canarino")
#
message__cgi
\
"#E0FFFF"
"black" \
"
Ciao ! ... \nL’elemento ${menu_choice} dell’array \${options[@]} risulta:
\"${options[${menu_choice}]}\" ...)"
}
#
[[ ${form_count} = 4 ]] && \
\
set_cookie "5" && \
\
{
#
alert_message__cgi
\
"white"
"red" \
"
Questo e' un messaggio di avviso... "
}
#
[[ ${form_count} = 5 ]] && \
\
set_cookie "6" && \
\
{
#
ok_message__cgi
\
"white"
"blue"
\
" Questo e'
un messaggio ok... "
}
#
[[ ${form_count} = 6 ]] && \
\
set_cookie "7" && \
\
{
#
pre_message__cgi
\
"white"
"black" \
"Questo
e' un messaggio PRE-formattato...
Nel
mezzo
del cammin
Di
nostra
vita
Mi
ritrovai
In
una
selva oscura
….E te
saluto!
"
}
#
[[ ${form_count} = 7 ]] && \
\
set_cookie "8" && \
\
{
#
input__cgi
\
"#87CEFA"
"black" \
"text"
"User_Defined_Variable_1" "NULL" \
"password" "User_Defined_Variable_2"
"NULL" \
"text" "User_Defined_Variable_3" "NULL" \
}
#
[[ ${form_count} = 8 ]] && \
\
set_cookie "9" && \
\
{
#ora salviamo le variabili “${User_Defined_Variable_ennesime}” come variabili permanenti di
sessione…
set_variable__cgi "User_Defined_Variable_1"
"${User_Defined_Variable_1}"
set_variable__cgi
"User_Defined_Variable_2" "${User_Defined_Variable_2}"
set_variable__cgi
"User_Defined_Variable_3" "${User_Defined_Variable_3}"
#
message__cgi \
"darkkhaki"
"black" \
"Per
piacere, scegli che fiore ti senti oggi…"
}
#
[[ ${form_count} = 9 ]] && \
\
set_cookie "10" && \
\
{
#
options=("Garofano"
"Rosa" "Loto della felicita" "Violetta"
"Geranio" "Crisantemo") && menu__cgi \
"#90EE90" "black"
}
#
[[ ${form_count} = 10 ]] && \
\
set_cookie
"0" && \
\
{
#
options=("Garofano"
"Rosa" "Loto della felicita" "Violetta"
"Geranio" "Crisantemo")
#
User_Defined_Variable_1=$(read_variable__cgi
"User_Defined_Variable_1")
User_Defined_Variable_2=$(read_variable__cgi "User_Defined_Variable_2")
User_Defined_Variable_3=$(read_variable__cgi "User_Defined_Variable_3")
#
#MESSAGGIO FINALE
& PULIZIA FILE DI SESSIONE…
final_message__cgi \
"moccasin"
"black" "www.google.it" \
"
OK!!\nTi senti un fiore \"${options[${menu_choice}]}\" e le var
\"User_Defined_Variable\" erano: \"${User_Defined_Variable_1}\"
\"${User_Defined_Variable_2}\"
e \"${User_Defined_Variable_3}\"...\n"
}
#
#
###
##
#
2)
Gestione_Ore_Lavorative.cgi
Programma
Web per
la gestione delle ore lavorative effettuate giorno per giorno che
fa uso di MySQL. Apri un editor
di testi (io uso Kwrite) e salva il file col nome : “Gestione_Ore_Lavorative.cgi”, dopodiche’
mettilo
nella directory “/var/www/cgi-bin” del server http (io uso Apache).
Prima,
pero’,
devi creare un database mysql (io uso PHPMyAdmin) di nome “webash_test”
e due
tabelle: “table_one” (3 colonne: “id”-primary-,“user”,”password”) e
“table_two”
(4 colonne: “id”-primary-“date”,”start_hour”,”end_hour”)
( Ovviamente in table_one ci deve essere almeno una riga... !! )
Edita
Webash e setta le due variabili mysql ( DEVI farlo ) :
MYSQL_user
MYSQL_password
..
#!/bin/bash
#
source /path/to/Webash
#
if [ ! -d "${Dir_cookies}" ]
then
mkdir
"${Dir_cookies}"
if
[ ! -d "${Dir_cookies}" ]
then
alert_message__cgi
"1" "red" "black" "Attenzione...\nnon esiste
\"\${Dir_cookies}\" ..."
fi
fi
#
input
#
[ -z "${remote_browser_data}" ] && \
\
set_cookie "2" && \
\
{
#
input__cgi
\
"darkkhaki"
"black" \
"text" "Utente"
"NULL" \
"password" "Password" "NULL"
# se e’ vera questa condizione, la
funzione
“input__cgi()” manda al browser la pagina web col form di text input ed
esce
dal flusso del programma… ( questa e’ la PRIMA pagina che manda il
programma
CGI quando il browser, per la prima volta, punta all’URL del nostro
programma
CGI - ${remote_browser_data} non esiste - ) …
}
#se
invece NON era vera la condizione di prima, il
flusso va avanti…
#
create_variables_from_form
#
react_to_error
#
check_cookie
#
[[ ${form_count} = 1 ]] && \
\
set_cookie "2" && \
\
{
#
#INPUT__CGI
input__cgi
\
"darkkhaki"
"black" \
"text"
"Utente" "NULL" \
"password"
"Password" "NULL"
}
#qui
viene mandato l’utente se ha sbagliato qualcosa
tramite il comando : ‘ set_cookie “1” ‘ …
#
[[ ${form_count} = 2 ]] && \
\
{
#
#Utente
#Password
if
[ $(echo -n "${Utente}" | tr -dc [:alnum:] | wc -c) -eq 0 -o $(echo
-n "${Password}" | tr -dc [:alnum:] | wc -c) -eq 0 ]
then
set_cookie
"1" && \
{
#
alert_message__cgi
\
"white"
"red" \
"
Per
favore compila tutti e due i campi... "
}
#se l’utente NON ha
riempito tutti e due i campi, il
programma manda al browser la pagina web creata dalla funzione
“alert_message__cgi” ed esce …
fi
#
responso="$(find_values_in_mysql_row
"webash_test" "user,password" "table_one"
"${Utente},${Password}" )"
if
[[ "${responso}" = *YES* ]]
then
#
set_cookie
"3" && \
{
#
ok_message__cgi
\
"lightgreen"
"black" \
"
Benvenuto in $(basename ${0}) \ngrande \"${Utente}\" ... "
}
else
#
set_cookie
"1" && \
{
#
#MESSAGGIO_DI_AVVISO__CGI
alert_message__cgi \
"white"
"red" \
" Mi dispiace, ma NON sei un utente
autorizzato\n oppure hai sbagliato
la password ... "
}
fi
#
#
}
#se
l’utente e’ stato validato, si va avanti col
“form_count” = 3 …
#
[[ ${form_count} = 3 ]] && \
\
set_cookie "4" && \
\
{
#
table__cgi
\
"darkgray"
"black" "gray" "white" \
"Questo
e' il riassunto della tua attivita’ :" \
"$(read_mysql "webash_test"
"date,start_hour,end_hour" "table_two")"
}
#la
funzione “table__cgi()” da’ la possibilita’ di
inserire nuovi records, modificare o cancellare quelli esistenti; ecco
la
sintassi:
#table__cgi
"<progressive form
number>(opt.)" "[colore pagina]"
"[colore
testo]" "[colore tabella]" "[colore testo in tabella]"
"Presentazione della tabella" "1 2 3
#
4 5 6
#
7 8 9"
#(le
righe della tabella vengono divise dai fine riga
- \n – come quelli che stanno dopo il 3 ed il 6 … facile, no?) …
#Quando
l’utente clicca l’OK del form, si crea la
variabile ${Action}, che puo’ essere:
#Insert
#Modify_[row
number]
#Remove_[row
number]
#NoAction
#
[[ ${form_count} = 4 ]] && \
\
{
#
#
if
[[ "${Action}" = Insert ]]
then
#
set_cookie
"6" && \
{
#
#INPUT__CGI
input__cgi
"lightskyblue" "black" \
"text" "Data"
"NULL"
\
"text" "Ora_Inizio"
"NULL"
\
"text" "Ora_Fine" "NULL"
}
elif
[[ "${Action}" = Modify_* ]]
then
#
set_cookie
"7" && \
{
#
array_degli_elementi_della_colonna_id=(
$(get_all_mysql_table_ids "webash_test" "table_two") )
riga_prescelta=$(echo
"${Action}" | cut -d '_' -f '2')
id_prescelto=${array_degli_elementi_della_colonna_id[${riga_prescelta}]}
#
contenuto_riga="$(read_mysql_row
"webash_test" "${id_prescelto}" "table_two"
)"
#
set_variable__cgi
"id" "${id_prescelto}"
#
message__cgi
\
"white"
"red" \
"Hai
scelto di MODIFICARE la riga : \nID=${contenuto_riga} "
}
elif
[[ "${Action}" = Remove_* ]]
then
#
set_cookie
"3" && \
{
#
array_degli_elementi_della_colonna_id=(
$( get_all_mysql_table_ids "webash_test" "table_two") )
riga_prescelta=$(echo
"${Action}" | cut -d '_' -f '2')
id_prescelto=${array_degli_elementi_della_colonna_id[${riga_prescelta}]}
contenuto_riga="$(read_mysql_row
"webash_test" "${id_prescelto}" "table_two"
)"
#
cancel_mysql
"webash_test" "id" "table_two"
"'${id_prescelto}'"
#
#MESSAGGIO__CGI
message__cgi
\
"white"
"red" \
"Hai
RIMOSSO la riga : \nID=${contenuto_riga} "
#
}
#ritorna
alla tabella…
#
elif
[[ "${Action}" = NoAction ]]
then
set_cookie
"9" && \
{
#
message__cgi
\
"darkgray"
"black" \
"Hai
scelto di non compiere nessuna azione ... "
}
#va al messaggio
finale…
#
fi
#
#
}
#
#sezione
“Insert” …
[[ ${form_count} = 6 ]] && \
\
set_cookie "3" && \
\
{
#
change_empty_values_in_NULL
"Data" "Ora_Inizio" "Ora_Fine"
#
insert_mysql
"webash_test" "date,start_hour,end_hour"
"table_two" "'${Data}','${Ora_Inizio}','${Ora_Fine}'"
#
message__cgi
\
"darkgray"
"black" \
"Hai
inserito : \"'${Data}','${Ora_Inizio}','${Ora_Fine}'\" ... "
}
# =>
ritorna alla tabella ..
#
#inizio
sezione “Modify” …
[[ ${form_count} = 7 ]] && \
\
set_cookie "8" && \
\
{
#
id=$(read_variable__cgi
"id")
contenuto_riga="$(read_mysql_row
"webash_test" "${id}" "table_two" )"
eval
array_riga=( ${contenuto_riga} )
#
input__cgi
"lightskyblue" "black" \
"text" "Data"
"${array_riga[1]}"
\
"text" "Ora_Inizio" "${array_riga[2]}"
\
"text" "Ora_Fine" "${array_riga[3]}"
}
#
[[ ${form_count} = 8 ]] && \
\
set_cookie
"3" && \
\
{
#
change_empty_values_in_NULL
"Data" "Ora_Inizio" "Ora_Fine"
#
id=$(read_variable__cgi
"id")
update_mysql
"webash_test" "id" "table_two" "${id}"
"date='${Data}',start_hour='${Ora_Inizio}',end_hour='${Ora_Fine}'"
#
message__cgi \
"darkgray"
"black" \
"Hai inserito :
\"date='${Data}',start_hour='${Ora_Inizio}',end_hour='${Ora_Fine}'\"
... "
}
#
#fine
sezione “Modify” => ritorna alla tabella…
#
#
#
#Fine
programma …
[[ ${form_count} = 9 ]] && \
\
set_cookie
"0" && \
\
{
#
#
#MESSAGGIO_FINALE__CGI
final_message__cgi
\
"lightgreen"
"black" "192.168.1.1" \
"Grazie per
aver usato \"$(basename ${0})\" "
}
#
#
###
##
#
3)
Struttura_Tabelle_MySQL.cgi
Programma
Web per
visualizzare la struttura delle tabelle di un database mysql tra quelli
presenti nel sistema. Apri un editor di testi (io uso Kwrite) e salva
il file
col nome : “Mostra_Struttura_Tabelle_MySQL.cgi”,
dopodiche’ mettilo nella directory “/var/www/cgi-bin” del server http
(io uso
Apache).
#!/bin/bash
#
source /path/to/Webash
#
if [ ! -d "${Dir_cookies}" ]
then
mkdir
"${Dir_cookies}"
if
[ ! -d "${Dir_cookies}" ]
then
alert_message__cgi
"1" "red" "black" "Attenzione...\nnon esiste
\"\${Dir_cookies}\" ..."
fi
fi
#
input
#
[ -z "${remote_browser_data}" ] && \
\
set_cookie "1" && \
\
{
#
message__cgi
\
"lightgreen"
"black" \
"
Benvenuto in \n<< $(basename ${0}) >> ... \n\nPer favore,
indica nella
prossima pagina il database MySQL \n di cui vuoi vedere la struttura
delle
tabelle !!"
}
#
create_variables_from_form
#
react_to_error
#
check_cookie
#
[[ ${form_count} = 1 ]] && \
\
set_cookie "2" && \
\
{
DB=(
$(mysql --batch --force -u ${MYSQL_user} -h localhost
-p${MYSQL_password} <<<"SHOW
DATABASES;") )
unset DB[0] && db="${DB[@]}"
#
set_variable__cgi
"Tutti_I_Database" "${db}"
#
#MENU
options=(
${db} ) && menu__cgi \
"darkkhaki" "black"
#
}
#
[[ ${form_count} = 2 ]] && \
\
set_cookie
"3" && \
\
{
#
Tutti_I_Database="$(read_variable__cgi
"Tutti_I_Database")" && options=( ${Tutti_I_Database} )
#
Database="${options[${menu_choice}]}"
&& export Database
#
tabelle_con_primo_campo=(
$(mysql --batch --force -u ${MYSQL_user}
-h localhost –p${MYSQL_password}
<<<"USE ${Database}; SHOW TABLES;" ) )
unset
tabelle_con_primo_campo[0] && tabelle=(
${tabelle_con_primo_campo[@]} )
#
titoli_tabelle="$(echo
"${tabelle[@]}" | tr ' ' ',' )"
#
not_interactive_tables__cgi \
"darkgray"
"black" "gray" "white" \
"${titoli_tabelle}"
\
"$(for
tabella in ${tabelle[@]}
do
echo
-n "\"${tabella}\" "
output_fields_in_tabs__quoted__and__changing_empty_fields_in_NULL "$(mysql --batch --force -u ${MYSQL_user} -h
localhost –p${MYSQL_password} <<<"USE ${Database}; DESCRIBE
${tabella};" )"
done)"
#
}
#
[[ ${form_count} = 3 ]] && \
\
set_cookie
"0" && \
\
{
#
#MESSAGGIO FINALE
& PULIZIA FILE DI SESSIONE…
final_message__cgi \
"lightgreen"
"black" "www.webash.tk" \
"Grazie
per aver usato \"$(basename ${0})\" "
}
#
#
###
##
#
Bugs
Programmare con Webash e' molto piu' come il BASIC ( con
i suoi numeri di linea e la sua peculiarita' dei "GOTO" ) che
come linguaggi a flusso strutturato come bash o C.
E' tutto troppo basilare ( p.es.: input__cgi() non ha un testo di
spiegazione all'utente ).
La funzione "set_variable__cgi()" deve essere invocata DOPO
"set_cookie()" ( altrimenti non e' settato nessun file di destinazione
).
Se hai due programmi CGI Webash aperti nel tuo browser e uno di quelli
raggiunge final_message__cgi(), succede che check_cookie() fermera'
anche l'altro, perche' NON fa differenza tra finestre del browser ( e'
come se sono un'unica sessione ). Dovresti non usare
check_cookie()
per risolvere quest'ultimo problema.
Se l'utente web chiude il browser prima
di final_message__cgi(), il file di sessione rimarra' nella directory
"Dir_cookies" per sempre...