Changes between Version 3 and Version 4 of IOC20_T06


Ignore:
Timestamp:
Mar 27, 2020, 1:01:24 PM (5 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • IOC20_T06

    v3 v4  
    1616Le browser web (p.ex. firefox) sera sur votre PC local, il devra communiquer avec votre serveur HTTP sur votre PC du réseau enseignement. Nous allons devoir faire quelques manipulations pour rendre cela possible. En effet, nous avons deux obstacles. Le premier est que les machines du réseau enseignement ne sont pas directement accessibles, elles sont derrière une machine ''proxy'' (''durian''), le second est que le port d'écoute standard des serveurs web est 80 et que celui-ci est déjà utilisé par un serveur préinstallé (''apache''), nous devrons donc utiliser un autre port. Nous allons utiliser un tunnel ssh et de la redirection de port.
    1717
    18 
    19 
    20 Ce serveur web est écrit en Python, à la réception des requêtes du client, il exécute des scripts CGI (Common Gateway Interface) écrit également en Python pour produire des pages HTML dynamiques. Les scripts CGI devront communiquer avec le programme écrit en C contrôlant les LEDs. La communication entre les scripts et l'applic se fera par fifo UNIX. Le programme en C sera : soit la version permettant le contrôle depuis une application utilisateur (avec les droits de **root**), soit par une application utilisateur qui communique avec un driver. Je ne demande pas cette seconde possibilité parce que vous allez devoir insérer un module dans le noyau et c'est une difficulté supplémentaire qui n'apporte rien vis-à-vis de ce que vous allez voir aujourd'hui, mais je ne vous interdit pas de le faire.
     18== création du tunnel ssh ==
     19
     20Je vais supposer que vous êtes sur une machine Unix (Linux ou MacOS). Je sais que certains d'entrevous sont sur Windows et ce que je vous demande de faire est possible, mais, en l'état, je ne sais pas le faire. Je pourrai essayer si nécessaire en utilisant une machine virtuelle et un Windows10.
     21
     22Sur le schéma ci-dessous :
     23* `localhost` : c'est votre machine chez vous
     24* `durian`: c'est la machine passerelle par laquelle vous devez passer pour entrer dans le réseau enseignement.
     25* `musicien`: c'est le nom d'une machine des salles 305-307, par exemple `mozart`
     26* 8022, 2280, 22 et 8000 : sont des ports d'écoute utilisés par le serveur ssh et le serveur HTTP.
     27
     28  [[Image(htdocs:png/IOC6_tunnel-ssh.png,nolink,600px)]]
     29
     301. Commençons par renseigner durian de votre clé publique ssh, afin que vous n'ayez pas à taper votre mot de passe à chaque fois. Vous avez déjà fait ça pour l'accès aux !RaspberryPi 1. Ce sera à faire une seule fois. Sur votre PC chez vous:
     31{{{#!bash
     32ssh-keygen -t rsa
     33ssh-copy-id -i $HOME/.ssh/id_rsa.pub loginname@durian.lip6.fr
     34ssh loginname@durian.lip6.fr
     35}}}
     36  * Remplacer `loginname` par votre nom de login.
     37  * Pour la première commande, vous devez taper 3 fois sur la touche entrée pour choisir les valeurs par défaut.
     38  * Pour la deuxième commande,  vous tapez votre mot de passe d'accès à la passerelle (ce sera la dernière fois).
     39  * La troisième est là pour vérifier que vous n'avez plus besoin du mot de passe.
     40
     412. Création des tunnels. Nous allons en créer deux pour traverser la passerelle. Malheureusement, ces opérations devront être réalisés à chaque fois.[[BR]].
     42  * Vous ouvrez deux terminaux sur votre machine locale. Sur le premier terminal, vous taper la commande suivante:
     43{{{#!bash
     44ssh loginname@durian.lip6.fr -L 2222:musicien:22
     45}}}
     46   Ainsi, vous vous connectez sur durian (vous n'avez pas à taper votre mot de passe si vous avez bien fait l'étape 1.) et vous configurez un tunnel sur `durian` dont l'entrée est `localhost:2222` et la sortie est `musicien:22`, c'est-à-dire que ce que vous envoyez sur le port 2222 depuis votre machine chez vous, arrive sur le port 22 de la machine `musicien`. Vous ne devez pas vous déloguer de Durian, sinon vous cassez le tunnel, par contre, vous pouvez aller sur la machine `musicien` depuis ce terminal (vous pouvez refaire le 1. parce que je crois ce n'est pas exactement le même compte).[[BR]].
     47  * Sur l'autre terminal, que vous n'aviez pas encore utilisé, vous tapez:
     48{{{#!bash
     49ssh -p 2280 localhost -L 8080:musicien:8000
     50}}}
     51   Vous faites un ssh sur `localhost` au port 8080 et grâce au premier tunnel, vos paquets vont être reçus par le serveur ssh de la machine `musicien` en passant à travers le proxy `durian`. Grâce à cette seconde commande, vous construisez un tunnel sur `musicien`, dont l'entrée est `localhost:8080` et la sortie est `musicien:8000`.[[BR]].
     52  * On aurait pu choisir d'autres numéros de port à la place de 2222 et 8080. J'ai choisi des numéros en rapport avec les numéros standard. Pour le port 8000, vous aurez peut-être à changer ce numéro, si vous êtes deux sur la même machine du réseau enseignement.
     53
     54
     55== Plan de la séance ==
     56
     57Ce serveur web est écrit en Python, à la réception des requêtes du client, il exécute des scripts CGI (Common Gateway Interface) écrit également en Python pour produire des pages HTML dynamiques. Les scripts CGI devront communiquer avec le programme écrit en C contrôlant les LEDs. La communication entre les scripts et l'application se fera par fifo UNIX. Le programme en C sera : soit la version permettant le contrôle depuis une application utilisateur (avec les droits de **root**), soit par une application utilisateur qui communique avec un driver. Je ne demande pas cette seconde possibilité parce que vous allez devoir insérer un module dans le noyau et c'est une difficulté supplémentaire qui n'apporte rien vis-à-vis de ce que vous allez voir aujourd'hui, mais je ne vous interdis pas de le faire.
    2158
    2259Pour ce faire, nous allons procéder en deux temps.
     
    3572├── Makefile
    3673├── reader.c    : lit une fifo et affiche le message reçu jusqu'à recevoir le message end
    37 ├── reader.py   : idem reader.c mais en python
     74├── reader.py   : idem reader.c, mais en python
    3875├── writer.c    : écrit dans une fifo 5 fois et écrit le message end
    39 └── writer.py   : idem writer.c mais en python
     76└── writer.py   : idem writer.c, mais en python
    4077}}}
    4178
     
    1241611. modifier le nom des fifo pour éviter les conflits (changer p. ex. fw avec vos initiales)
    1251621. modifier le select dans fake pour lire les deux fifos d'entrées stdin et s2f.
    126 1. modifier server.py pour lire la valeur lue sur stdin afin que ce que server.py envoi ne soit pas "w hello" mais soit une chaine tapée au clavier. Le but est de "simuler" le comportement du script CGI et de vous obliger à écrire un peu de code Python.
     1631. modifier server.py pour lire la valeur lue sur stdin afin que ce que server.py envoi ne soit pas "w hello", mais soit une chaine tapée au clavier. Le but est de "simuler" le comportement du script CGI et de vous obliger à écrire un peu de code Python.
    127164
    128165**fake.c**
     
    241278    - Le premier avec le logo.
    242279    - Le second est contient la case et le bouton. Le code html de cette case est obtenu par l'exécution du programme Python `cgi-bin/main.py`.
    243       - Notez qu'il n'est pas très utile d'avoir produit cette page par un programme python, car la page n'est pas dynamique (son code est toujours le même) mais c'est pour donner la possibilité de la rendre dynamique.
     280      - Notez qu'il n'est pas très utile d'avoir produit cette page par un programme python, car la page n'est pas dynamique (son code est toujours le même), mais c'est pour donner la possibilité de la rendre dynamique.
    244281  - Lorsque vous écrivez quelque chose dans la case, la page index.html demande l'exécution de script `cgi-bin/led.py`
    245282  - le script `led.py` envoi le contenu de la case sur la fifo `s2f` attendue par `fake` et produit une page presque identique à main.py avec deux différences.