Sous-sections

8.6 Création d'un CGI pour le paquetage httpd

8.6.1 Informations générales sur le serveur Web

Le serveur web, qui est utilisé dans fli4l est un mini_httpd de ACME Labs. Les fichiers sources peuvent être téléchargés à partir du site http://www.acme.com/software/mini_httpd/. Cependant, quelques modifications ont été apportées pour fli4l. Les ajustements sont dans le paquetage src et dans le répertoire src/fbr/buildroot/package/mini_httpd.

8.6.2 Nom du script

Le nom du script doit être significatif, de sorte qu'il soit plus facile à distinguer par rapport au autres scripts, il ne doit pas avoir de collision de noms avec les différents OPTs.

Les sauts de ligne dans les scripts exécuté sous DOS, seront convertis en sauts de ligne UNIX, vous devez aussi modifier le fichier opt/<PACKAGE>.txt, voir Table .

8.6.3 Configuration du menu

Pour faire une nouvelle entrée dans le menu, vous devez paramétrer le fichier /etc/httpd/menu. Ce mécanisme permet de faire des modifications du menu pendant le fonctionnement de l'OPT. Pour cela on utilise le script /etc/httpd/menu, il vérifie le format du fichier pour que celui-ci soit toujours consistant. Pour ajouter un nouvel élément dans le menu, vous devez utiliser la commande de la manière suivante :

    httpd-menu.sh add [-p <priority>] <link> <name> [section] [realm]

Si vous indiquez un nom dans <name> il sera inclus dans la section, que vous avez indiquez dans [section]. Si vous omettez la section, le nom sera par défaut inclus dans la section du "paquetage-OPT". Vous indiquez dans <link> la cible du nouveau lien. Dans <priority> vous spécifiez la priorité de l'élément du menu dans sa section. S'il n'est pas spécifié, 500 sera utilisé pour la priorité par défaut. La priorité doit être un nombre à trois chiffres. Le lien qui se situ le plus haut dans la section a une priorité la plus faible, si vous voulez un lien le plus bas, vous devez par exemple choisir une priorité de 900. De même, la priorité des données sont triées avec la cible du lien. Dans [realm] vous indiquez le domaine pour que l'utilisateur connecté puisse avoir les autorisations nécessaires pour voir l'élément du menu qui sera affiché. S'il [realm] n'est pas spécifié, l'élément du menu sera toujours affiché, voir aussi la section «Droits des utilisateurs».

Exemple :

    httpd-menu.sh add "Nouveau-fichier.cgi" "Cliquez ici" "Outils" "outils"

Cet exemple produit dans la section "Outils" un lien avec le titre "Cliquez ici", la destination du lien sera "Nouveau-fichier.cgi", la section sera créé si elle n'est pas définie.

Vous pouvez également supprimer dans le script un enregistrement de lien du menu :

    httpd-menu.sh rem <link>

Avec cette commande le lien <link> qui a été enregistré sera supprimé.


Important: Si plusieurs enregistrements se réfèrent au même fichier dans le menu, toutes ces enregistrements seront supprimés dans le menu.

Puisque des sections peuvent aussi avoir des priorités, celles-ci peuvent être créées manuellement. Si une section est créée automatiquement lorsque vous ajoutez une entré, il recevera automatiquement la priorité 500. Voici la syntaxe pour la création d'une section :

    httpd-menu.sh addsec <priority> <name>

Ici aussi <priority> doit contenir un nombre à trois chiffres.

Pour apprendre à configurer judicieusement les priorités, il est intéressant de regarder le fichier /etc/httpd/menu pendant l'exécution de fli4l les priorités sont dans la deuxième colonne.

Pour être complet, voici un bref commentaire sur le format du fichier menu. Si la commande httpd-menu.sh ne suffit pas, vous pouvez sauter ce paragraphe. Le fichier /etc/httpd/menu a la structure suivante : il est divisé en quatre colonnes. La première colonne il y a une lettre de code, pour diffèrencier les intitulés et les enregistrements. Dans la deuxième colonne il y a les priorités triées. La troisième colonne contient en intitulé un trait d'union, cela veut dire qu'il n'y a aucune signification pour le titre et de la configuration de la cible du lien. Dans le reste de la ligne se trouve le texte qui apparaîtra plus tard dans le menu.

Avec la lettre d'identification «t», une nouvelle section dans le menu sera installée. Pour configurer une entrée normale dans le menu vous utilisez la lettre d'identification «e». Un exemple :

    t 300 - Mon grand OPT
    e 200 monopt1.cgi lien pour grand
    e 500 monopt1.cgi?plus=oui lien plus pour grand

Lors de l'édition de ce fichier vous devez vous assurer que le script httpd-menu.sh soit toujours trié avant de sauvegarde le fichier. Que les différentes sections soit triées et que les sections enregistrées sont triées par section l'algorithme de tri exacte peut être repris par httpd-menu.sh - Cependant, il est possible d'étendre ce script avec de nouvelles fonctionnalités, pour que tous les modifications du menu se produisent à un emplacement central.

8.6.4 Construction d'un script CGI

8.6.4.1 L'en-tête

Tous les scripts du serveur Web sont de simples scripts shell (les interpréteurs tels que Perl, PHP, etc, sont beaucoup trop volumineux pour fli4l). Le script doit obligatoirement commencer par l'en-tête avec (la référence de l'interprèteur, le nom, une indiquation sur le scénario, l'auteur, la licence).

8.6.4.2 Script auxiliaire cgi-helper

Tout de suite après l'en-tête vous devez placer le script auxiliaire cgi-helper avec la commande suivante :

    . /srv/www/include/cgi-helper

L'espace entre le point et le slash (ou la barre oblique) est important !

Ce script auxiliaire permet diverses fonctionnalités pour simplifier la création des CGIs, il est essentiel à fli4l. De plus, avec l'intégration de cgi-helper il effectue également des tâches standard, telles que l'analyse syntaxique des variables, qui ont été associées à des formulaires ou des transitions URL ou de l'affichage de la langue pour le texte ou des fichiers CSS.

Le tableau 8.4 donne un aperçu des fonctionnalitées des scripts cgi-helper.


Tableau 8.4: Les fonctions pour le script cgi-helper
Nom Fonction
check_rights Vérification des droits des utilisateurs
http_header Édition d’une en-tête HTTP standard ou d’une en-tête spécifique, par ex., la manière de télécharger des fichiers
show_html_header Édition complètes d'une en-tête de page (y compris les en-têtes HTTP et les en-têtes du Menu)
show_html_footer Édition de la fin d'une page HTML
show_tab_header Édition d’une fenêtre de contenu pour un tableau
show_tab_footer Édition de la fin de contenu pour un tableau
show_error Édition d'une fenêtre pour les messages d'erreur (couleur: rouge)
show_warn Édition d'une fenêtre pour les messages d'alerte (couleur: jaune)
show_info Édition d'une fenêtre pour les messages d'informations/réussites (couleur: vert)

8.6.4.3 Contenu d'un script CGI

Afin d'assurer un aspect homogène et surtout pour la compatibilité avec les futures versions-fli4l, il est fortement recommandé d'utiliser les fonctions du script auxiliaire cgi-helper, même si nous pouvons théoriquement générer toutes les sorties dans un même CGI.

Un simple script-CGI peut ressembler à ceci :

    #!/bin/sh
    # --------------------
    # Header (c) Autor Datum
    # --------------------
    # get main helper functions
    . /srv/www/include/cgi-helper

    show_html_header "Mon premier CGI"
    echo '   <h2>Bienvenue</h2>'
    echo '   <h3>Ceci est un exemple de script-CGI</h3>'
    show_html_footer

8.6.4.4 Fonction show_html_header

La valeur qui est indiqué dans la fonction show_html_header, est utilisé pour le titre. Il sera généré automatiquement dans le menu, il inclue aussi automatiquement le script CSS et le fichier langue. Il faut pour cela que les fichiers scripts ont le même nom et qu’ils soient dans les répertoires /srv/www/css et /srv/www/lang (bien sûr, avec une extension différente). Exemple :

    /srv/www/admin/OpenVPN.cgi
    /srv/www/css/OpenVPN.css
    /srv/www/lang/OpenVPN.de

L'utilisation du fichier-langue ainsi que le fichier-CSS sont facultatif. Intégré toujours css/nom.css et lang/nom.<lang>, <lang> correspond à la langue choisie.

Vous pouvez placer à côté du titre de la fonction show_html_header d'autres paramètres. Une exécution de la fonction avec tous les paramètres pourrait ressembler à ceci :

show_html_header "Titre" "refresh=$time;url=$url;cssfile=$cssfile;showmenu=no"

Tous les paramètres supplémentaires, comme le montre l'exemple ci-dessus, doivent avoir des guillemets et être séparés par un point-virgule. Autrement le contrôle de syntaxe ne sera pas réussi ! Il est nécessaire de respecter la syntaxe des paramètres.

Voici un bref aperçu des fonctions de ces paramètres :

D'autres conseils pour le contenu du CGI :

8.6.4.5 Fonction show_html_footer

La fonction show_html_footer ferme le bloc dans le script CGI, qui a été lancé par la fonction show_html_header.

8.6.4.6 Fonction show_tab_header

Dans le CGI, pour que le contenu de vos résultats soit bien rangé et affiché sur la page Web, avec l'aide du cgi-helper vous pouvez utiliser la fonction show_tab_header. Il peut générer des titres dans des onglets cliquables dans un 'Tableau', ainsi votre page peut être divisé en plusieurs zones logiquement séparées.

Les paramètres dans la fonction show_tab_header sont toujours écrits deux par deux. Le premier paramètre correspond au titre de l’onglet et le deuxième correspond au lien. Si vous indiquez 'no' comme deuxième paramètre, le titre sera seulement placé dans l'onglet (en couleur) et le lien ne sera pas cliquable.

Dans l'exemple suivant, nous allons créer une 'fenêtre' dans laquelle nous allons mettre le titre 'Une grande fenêtre’. Dans la fenêtre sera écrit 'foo bar' :

    show_tab_header "Une grande fenêtre" "no"
    echo "foo"
    echo "bar"
    show_tab_footer

Dans l'exemple suivant, deux onglets cliquables sont générés, la variable action dans le script va transmettre des valeurs différentes.

    show_tab_header "1. onglet" "$myname?action=machdies" \
                    "2. onglet" "$myname?action=machjenes"
    echo "foo"
    echo "bar"
    show_tab_footer

Maintenant le contenu du script peut exploiter la variable FORM_action (voir ci-dessous pour l’exploitation de la variable) en fonction des différents paramètres. l'onglet apparaîtra et l’on pourra le sélectionner en cliquant dessus, si vous ne voulez pas que cet onglet soit sélectionnable, vous devez placer dans la fonction 'no', pour ce passé du lien comme indiqué plus haut. Cela sera plus facile, si vous utilisez l'exemple suivant :

    _opt_machdies="1. onglet"
    _opt_machjenes="2. onglet"
    show_tab_header "$_opt_machdies" "$myname?action=opt_machdies" \
                    "$_opt_machjenes" "$myname?action=opt_machjenes"
    case $FORM_action in
        opt_machdies) echo "foo" ;;
        opt_machjenes) echo "bar" ;;
    esac
    show_tab_footer

Si vous utilisez une variable pour sélectionner un titre, ce nom correspond à l’action de la variable et commencera par un tiret (_), ainsi l'onglet correspond à ce nom pourra être sélectionné.

8.6.4.7 Fonction show_tab_footer

La fonction show_tab_footer ferme le bloc dans le script CGI, qui a été lancé par la fonction show_tab_header.

8.6.4.8 Supporte le multi-language

Le script cgi-helper contient également une fonction pour faire des scripts CGI en utilisant d'autres langues. Pour ce faire, vous devez 'juste' utiliser les variables commençant par un tiret bas (_) pour traduire le texte et de définir ces variables dans la langue de votre choix.

Exemple :

lang/opt.de contient :

    _opt_machdies="Eine Ausgabe"

lang/opt.en contient :

    _opt_machdies="An Output"

admin/opt.cgi contient :

    ...
    echo $_opt_machdies
    ...

8.6.4.9 Utilisation de formulaires

Afin de traiter des formulaires, il faut savoir certaines choses. L’utilisateur doit choisir la méthode de formulaire GET ou POST, les paramètres peuvent être trouvées après le montage du script cgi-helper (qui à son tour appelle le de programme auxiliaire proccgi) avec la nouvelle variable FORM_<Paramètre>. Si vous avez entré un nom, une "adresse" dans le champ de formulaire et si vous indiquez dans le script CGI $FORM_adresse, cette adresse sera accessible.

Pour plus d'informations sur le programme proccgi vous pouvez les trouver ici http://www.fpx.de/fp/Software/ProcCGI.html.


8.6.4.10 Droits des utilisateurs : Fonction check_rights

Afin de vérifier si l'utilisateur a les droits suffisants pour utiliser un script CGI, la fonction check_rights est appelée au début du script CGI comme ceci :

    check_rights <Section> <Action>

Le script CGI ne sera exécuté que si l'utilisateur est enregistré.

8.6.4.11 Fonction show_error

Cette fonction renvoie un message d'erreur dans une fenêtre rouge. Il a besoin de deux paramètres : un titre et un message. Exemple :

    show_error "Error: No key" "No key was specified!"

8.6.4.12 Fonction show_warn

Cette fonction renvoie un message d'avertissement dans une fenêtre jaune. Il a besoin de deux paramètres : un titre et un message. Exemple :

    show_info "Warnung" "Actuellement, il n'y pas de connexion!"

8.6.4.13 Fonction show_info

Cette fonction renvoie un message de réussite ou d'information dans une fenêtre verte. Il a besoin de deux paramètres : un titre et un message. Exemple :

    show_info "Info" "Action a été exécutée avec succès!"

8.6.4.14 Script auxiliaire cgi-helper-ip4

Immédiatement après le script cgi-helper, vous devez ensuite intégrer le script auxiliaire cgi-helper-ip4 avec la commande suivante :

. /srv/www/include/cgi-helper-ip4

L'espace entre le point et le slash (ou la barre oblique) est important !

Ce script fournit des fonctions pour vous aidez à effectuer des tests d'adresse IPv4.

8.6.4.15 Fonction ip4_isvalidaddr

Cette fonction vérifie si une adresse IPv4 qui a été enregistrée est valide. Exemple :

    if ip4_isvalidaddr ${FORM_inputip}
    then
        ...
    fi

8.6.4.16 Fonction ipv4_normalize

Cette fonction supprime les zéros inutile dans l'adresse IPv4 enregistrée. Exemple :

    ip4_normalize ${FORM_inputip}
    IP=$res
    if [ -n "$IP" ]
    then
        ...
    fi

8.6.4.17 Fonction ipv4_isindhcprange

Cette fonction vérifie si l'adresse IPv4 enregistrée est dans la plage d'adresse de début et de fin. Exemple :

    if ip4_isindhcprange $FORM_inputip $ip_start $ip_end
    then
        ...
    fi

8.6.5 Divers

Des choses et d'autres (et oui, c'est aussi important!) :

8.6.6 Dépannage

Pour faciliter le débogage d'un script CGI, vous pouvez activer le mode débogage avant l'intégration du script cgi-helper. Pour cela, la variable set_debug doit être paramétrée sur "yes". Cela conduit à la création du fichier debug.log, que vous pourrez télécharger sur l'URL http://<fli4l-Host>/admin/debug.log. Cela inclut tous les appels vers ce script CGI. La variable set_debug n'est pas globale, et doit être renouvelée dans tous les scripts CGI en question. Exemple :

    set_debug="yes"
    . /srv/www/include/cgi-helper

En outre, cURL8.9 est idéal pour le dépannage, en particulier lorsque les en-têtes HTTP ne sont pas assemblé correctement ou que le navigateur affiche une page blanche. Et aussi, le comportement de mise cache des navigateurs modernes est un véritable problème.

Exemple : Avec l'exécution suivant, en-tête HTTP ("`dump"', -D) l'affichage normale du CGI admin/mon.cgi sera publié. Vous pouvez utiliser le nom d'utilisateur ("`user"', -u) "`admin"'.

    curl -D - http://fli4l/admin/mon.cgi -u admin



Notes

... (SelfHTML8.8
voir http://de.selfhtml.org/
... cURL8.9
voir http://de.wikipedia.org/wiki/CURL
© 2001-2019 L'équipe fli4l - 15 septembre 2019