Review Sheeva Plug partie 2 : Debian, Django, Lighttpd et Couchdb sont sur un Plug Computer

Cette deuxième partie n’est pas vraiment une review. En effet, vous trouverez la liste des paquets disponibles pour processeur ARM (celui du sheeva plug) sur les sites officiels des distributions concernées. Seule remarque : le Sheeva Plug n’est pas fourni avec des outils faciles pour réinitialiser les OS installés sur les cartes.
Je vais donc me contenter d’un petit tutorial permettant d’installer un Django (Framework web) accessible via un serveur Lighttpd (serveur web léger) et utilisant une base de données SQLite ainsi qu’une base Couchdb sur une Debian 6.0 (Squeeze). La bonne nouvelle est que tout est disponible dans les paquets d’origine, la mauvaise est que c’est très long.

Ce tutorial permettra ainsi de montrer qu’il est donc possible de déployer un serveur web avancé sur Sheeva Plug.

Connexion au Sheeva Plug

Tout d’abord vous devez connaitre l’adresse IP de votre plug computer. Pour cela il faut vous connecter via USB sur le Sheeva plug et taper la commande

ifconfig

S’en suit une série d’instructions. Ce qui nous intéresse est la partie suivante :

eth0      Link encap:Ethernet  HWaddr 00:24:8c:43:63:1f
          inet adr:192.168.1.15  Bcast:192.168.1.255  Masque:255.255.255.0

Les quatres chiffres derrière inet adr représentent l’adresse IP recherchée. La série de chiffres derrière HWaddr correspond à la mac adress du Sheeva plug.  Via votre espace Freebox, vous pouvez forcer l’allocation d’adresse IP en associant la mac adress du Sheeva plug à une IP que vous choisissez.

Pour pouvoir accéder à la ligne de commande du Sheeva Plug une simple connexion ssh suffira :

ssh root@192.168.1.15

Le mot de passe par défaut est : nosoup4u. Ca y est une invite root nous est proposé. Nous pouvons commencer !

La Debian installée est bien une squeeze :

cat /etc/debian_version
squeeze/sid

En tant qu’utilisateur consciencieux vous changez immédiatement votre mot de passe avec :

passwd

Utilitaires

Avant de commencer on met à jours les paquets :
apt-get update
apt-get upgrade
Puis on installe Python et Vim :
apt-get install python
apt-get install vim
Le Sheeva Plug n’est pas une foudre de guerre, on ne prend donc pas peur que cela rame un peu. Plusieurs warnings apparaissent sur la locale utilisée (comprenez traduction des messages). La commande suivante permet de régler ce problème. Celle-ci permet de sélectionner une locale à générer. apt-get m’indiquait que c’est la local fr_FR qui manquait. Je l’ai donc sélectionnée et me suis ainsi débarrassé des messages intempestifs.
dpkg-reconfigure locales

Serveur web

La commande suivante vous installera un beau serveur lighttpd configuré pour être accédé via le port 80.

apt-get install lighttpd

Vous pouvez vérifier que tout a bien fonctionné en vous connectant sur votre adresse IP via votre navigateur, en d’autres termes si votre adresse est 192.168.1.15  mettez http://192.168.1.15/ dans votre barre d’adresses. Si tout va bien vous devriez voir un message vous indiquant que cela marche ou alors une arborescence de fichiers devrait apparaitre.

Django

L’installation de Django se fait tout aussi facilement :

apt-get install python-django

Nous allons adjoindre un gestionnaire de bases de données : SQLite en premier lieu :

apt-get install sqlite
apt-get install python-sqlite

Création d’une application django

On crée tout d’abord un utilisateur spécial pour cette application :

adduser newebe

Puis on prend sa peau :

su newebe
cd
Et on crée notre appli :
django-admin startproject newebe

Puis on remplit le fichier de configuration (settings.py). Voici les zones à changer :

DATABASES = {
  'default': {
    'ENGINE': 'sqlite3',
    'NAME': '/home/newebe/newebe/newebe.db',
    'USER': '',
    'PASSWORD': '',
    'HOST': '',
    'PORT': '',
  }
}
MEDIA_ROOT = '/home/newebe/media/'
TEMPLATE_DIRS = (
  '/home/newebe/newebe/templates/'
)
INSTALLED_APPS = (
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.sites',
  'django.contrib.messages',
  'django.contrib.admin',
  'couchdbkit.ext.django',
  'newebe.main',
)

On crée ensuite les répertoires correspondants :

mkdir /home/newebe/media/
mkdir /home/newebe/newebe/templates/

On demande de générer l’appli main :

django-manage.py startapp main

On indique que la racine de l’URL du serveur renverra le contenu du template greetings.html (fichier ~ /newebe/main/urls.py) :

urlpatterns = patterns('django.views.generic.simple',
     (r'^$', 'direct_to_template', {'template': 'greetings.html'}),
)

On redirige les urls de la racine vers le main (~ /newebe/urls.py) :

urlpatterns = patterns('',
  (r'^', include('main.urls')),
)

On remplit le template en question (~ /newebe/templates/greetings.html)  :

<html>
  <body>
Hello, it is the Gelnior's Django-Sheeva Plug.
  </body>
</html>

Voilà notre application terminée ! Il ne nous reste plus qu’à la brancher sur notre serveur lighttpd :

Interfaçage avec lighttpd

Avant toute chose on ajoute la ligne suivantes au fichier settings.py de l’application newebe :

FORCE_SCRIPT_NAME=""

On modifie ensuite le fichier de configuration de Lighttpd :

Ajout du module “mod_fastcgi” :
server.modules = (
  "mod_access",
  "mod_alias",
  "mod_compress",
  "mod_rewrite",
  "mod_fastcgi", # <= ici)

Et on ajoute à la fin du fichier la redirection vers le socket du serveur django :

### Django Configuration for Newebe ###
server.document-root = "/home/newebe/newebe"
fastcgi.server = ( "/newebe.fcgi" => ((
 "socket" => "/home/newebe/newebe/newebe.sock",
 "check-local" => "disable",
 )))

Ces premières lignes indiquent où trouver notre serveur django. Les lignes suivantes permettent de monter le dossier media pour accéder facilement aux images.

alias.url = (
 "/media" => "/usr/share/pyshared/django/contrib/admin/media/",
)

url.rewrite-once = (
 "^(/media.*)$" => "$1",
 "^/favicon\.ico$" => "/media/favicon.ico",
 "^(/.*)$" => "/newebe.fcgi$1",
)

Il faut démarrer le serveur django afin qu’il renvoie ses informations sur le socket newebe.sock. Pour cela on réalise un script permettant de démarrer le serveur et de fournir les bons droits dessus :

#!/bin/bash

PROJDIR="/home/newebe/newebe/"
PIDFILE="$PROJDIR/newebe.pid"
SOCKET="$PROJDIR/newebe.sock"

cd $PROJDIR
if [ -f $PIDFILE ]; then
 kill `cat -- $PIDFILE`
 rm -f -- $PIDFILE
fi

exec /usr/bin/env - \
 PYTHONPATH="../python:.." \
 python manage.py runfcgi socket=$SOCKET pidfile=$PIDFILE

exec chmod 774 newebe.sock

Et on ajoute le user www-data au groupe newebe :

usermod -G newebe www-data

Enfin on démarre le serveur avec un appel au script :

sh start_newebe.sh

On vérifie que le contenu du template apparait bien maintenant à l’adresse :

http://192.168.1.15/

Installation Couchdb

On installe le paquet couchdb  :

sudo apt-get install couchdb
il faut modifier le fichier /ect/couchdb/local.ini afin de décommenter la ligne suivante (retirer le point virgule de début de ligne) :
;bind_adress = 127.0.0.1

Et remplacer 127.0.0.1 par l’adresse IP de votre Sheeva Plug ou par 0.0.0.0 pour qu’elle soit accessible même si l’IP change ;

bind_adress = 0.0.0.0

On vérifie ensuite que tout a bien fonctionné en se connectant à l’adresse suivante (en remplaçant mon.ip par l’IP de votre Sheeva Plug) : http://mon.ip:5984/_utils/

Couchdb et Django.

L’utilitaire d’interface utilisé est couchdbkit. On commence par l’installer :

sudo apt-get install python-couchdbkit

On suit le tutorial indiqué sur le site officiel de couchdbkit.
On met à jour le fichier settings.py en ajoutant :

COUCHDB_DATABASES = (
  ('newebe.main’, 'http://127.0.0.1:5984/main’),
)

On ajoute la ligne suivante aux applications installés :

'couchdbkit.ext.django’,

On ajoute au modèle de notre application un objet Tweet en étendant la classe Document proposée par couchdbkit. Les champs du modèle sont désormais des propriétés spécifiques à couchdbkit.

import datetime
from django.db import models
from couchdbkit.ext.django.schema import *

class Tweet(Document):
    author = StringProperty()
    content = StringProperty(required=True)
    date = DateTimeProperty(default=datetime.datetime.now())

Dans un fichier forms.py, on génère l’objet formulaire Django correspondant en étendant la classe DocumentForm de couchdbkit :

from couchdbkit.ext.django.forms import DocumentForm
from newebe.main.models import Tweet

class TweetForm(DocumentForm):
    class Meta:
         document = Tweet

Puis on crée notre vue Django :

from django.views.decorators.csrf import csrf_protect

from django.shortcuts import render_to_response
from django.template import RequestContext

from newebe.main.models import Tweet
from newebe.main.forms import TweetForm

# Home renvoie au format HTML le formulaire de création de Tweet,
# le tweet posté dans le cas d'envoi d'une reqûete post et l'ensemble
# des tweets déjà posté.
@csrf_protect
def home(request):
    tweet = None
    form = None

    # On regarde si la requête est un post de formulaire.
    if request.POST:
        form = TweetForm(request.POST)

    # Si le formulaire est valide,
    # l'objet est généré localement.
    if form and form.is_valid():
        tweet = form.save()
    else:
        form = TweetForm()

    # On récupère la liste des tweets déjà postés en requêtant le
    # chemain main/all de la base de données.
    tweets = Tweet.view("main/all")

    # Renvoie le template home.html en lui fournissant les variables de contexte
    # form (le formulaire à afficher), tweet (le tweet posté) et tweets (la liste
    # des tweets postés.
    return render_to_response("home.html", {
        "form": form,
        "tweet": tweet,
        "tweets": tweets
    }, context_instance=RequestContext(request))

Pour que notre base de données fournisse la liste des tweets à travers le chemin main/all, on crée le fichier main/_design/views/all/map.js. C’est un bout de code javascript qui indique quelles données doivent être rappatriés. Ici on fait simple, on récupère toutes les données en vrac et on les affiche :

function(doc) {
    if("Tweet" == doc.doc_type) {
        emit(null, doc);
    }
}

On appelle ensuite la commande de synchronisation de bases de données pour que cette vue couchdb soit enregistrée sur le serveur couchdb :

python manage.py syncdb

Voici le template HTML utilisé  (main/templates/home.html) :

<html>
<body>
<form action="/couchdb/" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>

{% if tweet %}
<p>You posted : </p>
<p>{{ tweet.content }}</p>
{% endif %}

{% for tweet in tweets %}
<p>{{ tweet.author }}</p>
<p>{{ tweet.content }}</p>
<p>{{ tweet.date }}</p>
{% endfor %}

</body>
</html>

Et enfin on route le chemion /tweets/ vers notre vue :

(r'^tweets/$', views.home),

On peut vérifier que tout fonctionne bien à l’URL suivante :

http://192.168.1.15/tweets/

Voilà cette review est plus un tutorial qu’une review mais cela permet de montrer que toutes ces technos fonctionnent bien sur notre Sheeva Plug. Je n’ai pas fait de benchmark smais si vous avez un bon protocole de tests de performance à me transmettre je suis preneur.

Pour la prochaine partie on verra comment installer Diaspora sur le Sheeva Plug, en espérant que j’y arrive car pour l’instant ce n’est pas le cas. Enfin c’est plus dû à un problème de versions de paquets ubuntu  qu’au Sheeva Plug !

6 Responses to Review Sheeva Plug partie 2 : Debian, Django, Lighttpd et Couchdb sont sur un Plug Computer

  1. nico says:

    yo j’ai essayé le
    http://192.168.1.15/tweets/
    et ça me fait un 404.

  2. Gelnior says:

    Est-ce que hormis ça tout fonctionne ?

  3. Thatoo says:

    Ah ben ça c’est technique!!!
    J’ai, comment dire… survolé.
    J’attendrais la version intermédiaire entre celle là et celle pour Mme Michu.
    Bon courage.

    • Gelnior says:

      Effectivement ce sont des posts assez techniques. En fait j’ai réuni pas mal d’infos que je devais chercher à droite à gauche. le prochain post sera du même ressort mais après je me remets aux posts lisibles !

  4. thanks for admin wonderfull information…

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: