webash‎ > ‎

doc_it

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...

 

Comments