Hackriculture

Il faut bidouiller notre jardin...
Blog Jocelyn Delalande

ForeignKey cross-database avec Django

Django permet d’utiliser plusieurs bases de données pour un même projet, certains modèles seront stockés dans une base, d’autres dans une autres.

Parmis les applications intéressantes, utiliser les données groupes/utilisateurs provenant d’un LDAP et une base de données relationnelle pour les modèles “métier” de l’application.

Contexte

Il suffit de les définir dans settings.py (ici une base sqlite3 et un annuaire LDAP, qui nécessite, utilisant le module django-ldapdb).

Voici un extrait de settings.py associé :

…
DATABASES = {
    'ldap': {
        'ENGINE': 'ldapdb.backends.ldap',
        'NAME': 'ldap://localhost',
        'USER': '',
        'PASSWORD': '',
        'BASE_DN' : 'ou=user,dc=example,dc=net'
     },
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'tatami.db',
        'USER': '',
        'PASSWORD': '',
        'HOST': '', 
        'PORT': '',
    }
  }
DATABASE_ROUTERS = ['ldapdb.router.Router']

Noter la dernière ligne, il s’agit de l’utilisation d’un routeur, (notion django-ienne) qui permettra à Django de prendre une décision quand à la base de données à utiliser pour tel ou tel modèle. Il est possible facilement d’écrire facilement son propre routeur pour gérer ça finement.

Si j’écris mes deux modèles :

import ldapdb.models

class LdapUser(ldapdb.models.Model):
    base_dn = "ou=user,dc=example,dc=net"
    object_classes = ['inetOrgPerson']

    login = CharField(db_column='cn', primary_key=True, max_length=200)

class Membership(models.Model):
    member = models.ForeignKey(LdapUser)</pre></code>

Jusqu’ici tout va bien…

Le problème

Si, par exemple, j’essaye de créer un Membership dans l’interface d’admin django. Patatras :

DatabaseError at /admin/members/membership/add/ no such table: membership_ldapuser

Après inspection minutieuse de Django ((ndlr: mettre des print “coucou” partout dans le code de Django)), il s’avère que lors de la validation du modèle avant sauvegarde, l’existence de la ForeignKey est vérifiée (normal), mais que cette vérification s’opère forcément dans la même base de données que le modèle contenant (Membership).

Le problème est connu et ne sera pas résolu, Django ne supportant pas les relations inter-bdd par choix de conception

Mais si on veut quand-même ?

On peut faire un petit hack en héritant de ForeignKey pour changer ce qui ne nous va pas :

class CrossDbForeignKey(models.ForeignKey):
    def validate(self, value, model_instance):
        if self.rel.parent_link:
            return
        super(models.ForeignKey, self).validate(value, model_instance)
        if value is None:
            return

        # Here is the trick, get db relating to fk, not to root model
        using = router.db_for_read(self.rel.to, instance=model_instance)

        qs = self.rel.to._default_manager.using(using).filter(
                **{self.rel.field_name: value}
             )
        qs = qs.complex_filter(self.rel.limit_choices_to)
        if not qs.exists():
            raise exceptions.ValidationError(self.error_messages['invalid'] % {
                'model': self.rel.to._meta.verbose_name, 'pk': value})

et en utilisant ensuite ce champ :

class Membership(models.Model):
    member = CrossDbForeignKey(LdapUser)

Hop, comme ça c’est un hack mais un hack “contenu qui dit ce qu’il fait”… et puis dans mon cas, pouvoir utiliser plusieurs bases de données sans pouvoir lier les utilisateurs LDAP aux autres modèles limitait grandement l’intérêt du multi-db…

RCCEM : fournisseur d’accès à internet Municipal à Montataire (60)

La ville de Montataire (60) et ses 12 000 âmes, traditionnellement communiste a la particularité de disposer d’une gestion municipale du réseau électrique et HFC (Hybride coaxial/optique)…

Logo RCCEM

Ces deux réseaux physiques permettent à la RCCEM de proposer un raccordement électrique, des abonnements TV, internet et téléphoniques aux habitants.

Nous avons, le 18 mai dernier, avec Pierrick, président de Rhizome rencontré Alexandre Dunnoyer directeur de la régie communale du câble et de l’électricité de Montataire, l’occasion de se présenter entre “voisins” nos projets respectifs et de visiter leurs installations.

Réseau et fournisseur d’électricité

Logo RCCEM

Transformateur électrique 10.000V→230V/400V

La Régie Communale du Câble de Montataire a été créée en 1921 au sortir de la première guerre Mondiale. À l’époque, l’électricité n’est pas sous monopole d’état global mais gérée localement, au cas par cas,par des entreprises, privées ou publiques.

En 1946, EDF est créé et toutes les entreprises privées sont nationalisées. Les régies publiques peuvent conserver leur indépendance si elles le souhaitent. La RCCEM fait ce choix, ainsi que par exemple le SICAE dans l’Oise. Ces deux structures sont toujours actives en 2012. Le vivier le plus dense de régies municipale se trouve en Alsase-Loraine. Un bout de liste est disponible sur wikipedia. (note : toutes ne sont pas restées publiques). Une partie d’entre elles est regroupée au sein de l’ANROC (Association Nationale Régie Services Publics Organismes).

Actuellement, la RCCEM possède le réseau électrique de la ville, et opère dessus en revendant au tarif réglementé de l’électricité achetée en gros à EDF.

Puis vint le câble…

Pylône supportant les antennes de réception TV

Pylône des antennes TV + local technique

Montataire se trouve être dans une zone blanche de télévision Hertzienne : signal TV de mauvaise qualité. En 1994 la régie a pris les choses en main. Profitant des chemins de câbles électriques (aériens ou souterrains) la municipalité a construit son réseau :

  • Dorsale en fibre optique
  • Raccordements des foyers en câble coaxial, éventuellement en passant par plusieurs amplificateurs

Ce réseau fibre/coaxial (HFC) permet depuis lors de diffuser le signal reçu par des antennes satellite placée sur des pylônes appartenant à la RCCEM jusque chez les habitants.

La TNT n’a pas spécialement arrangé les choses niveau qualité de TV, surtout avant le passage au “tout-numérique” lorsque les émetteurs TNT diffusaient à puissance réduite.

… Et enfin, l’internet

Équipements TV (à gauche) et de routage/Fibre optique (à droite)

Équipements TV (à gauche) et de routage/Fibre optique (à droite)

La télé c’est pas marrant, on peut pas parler dedans

On peut utiliser un réseau câblé/fibre pour faire autre-chose que de la TV, de l’internet par exemple ! Aussi, après être passée à deux doigts du rachat par un opérateur privé, la régie fournit depuis 2012, de l’accès internet sur son réseau HFC avec des forfaits allant de 2Mbps/256kbps à 40M/1M pour des prix n’ayant rien à envier aux “trois gros”.

Petite déception ? les débits sont largement asymétriques, plus même qu’en ADSL. Pourquoi ? C’est un choix de partage des fréquences :

  • Une partie du spectre pour la TV (découpée en sous-bandes pour chaque bouqet de chaînes) ;
  • Une partie pour l’accès à internet, voie descendante (download) ;
  • Une partie (plus faible) pour l’accès à l’internet, voie montante (upload).

N’empêche que malheureusement, comme pour l’ADSL, cette répartition ne facilite pas l’auto-hébergement face à la minitelisation du net

L’interconnexion RCCEM ↔ internet

Elle est effectuée par une autre régie Alsacienne Vialys. L’ensemble des abonnés se partage un lien de 60Mbps qui chemine en fibre optique à travers plusieurs réseaux d’initiative publique depuis Montataire jusqu’à… Colmar, en Alsace (surprenant !) où s’effectue le raccordement au reste du monde. Le réseau IP est infogéré à distance par Vialys, la RCCEM ne s’occupant que de la partie réseau de collecte local (entretien, réglages, évolution) et des rapports avec les abonnés (facturation/gestion/installations/support), le travail de proximité donc.

La suite ?

Actuellement, le signal passe parfois par plusieurs amplificateurs sur câble coaxial avant d’arriver jusque chez l’abonné. L’objectif à terme, pour pouvoir proposer des débits de 100Mbps, est de faire arriver la fibre optique plus près des prises coaxiales, présentes dans les logements, supprimant ainsi ces amplificateurs intermédiaires et de réaliser ainsi un réseau FTTLA (Fiber To The Last Amplifier).

Conclusion

Nous évoluons avec Rhizome dans les structures de FAI associatifs de la FFDN. Ce fut l’occasion de découvrir avec la RCCEM un autre modèle qui participe lui aussi à faire un bout d’internet local en-dehors de l’offre des 3 FAI principaux. Une bonne découverte qui gagnerait à se répandre… L’occasion de rappeler aussi que le très haut-débit rural est possible et souhaitable, bien que délaissé par les grands opérateurs et qu’on peut faire de belles choses localement avec un peu de volonté politique :-).

Merci en tout cas à Alexandre Dunnoyer pour la visite, et à bientôt !

Ressources

Injecteur PoE DIY sur batterie 12V pour access-point ubiquiti

Pour Rhizome, nous avons besoin de pouvoir effectuer des tests de couverture ou de lien wifi : voir si tel point d’accès est joignable depuis un endroit de la ville… Seulement voilà, les Access-Point que nous utilisons (Ubiquiti M5) ont le fil électrique à la patte. Pas pratique pour se promener…

L’idée est donc de réaliser pour pas trop cher une alimentation qui permette de se promener Access-point en main, batterie 12V dans le sac et netbook sous le bras dans les rues pour effectuer des tests/relevés.

 continue reading

Dropbox-like auto-hébergé avec DVCS-autosync

DVCS-autosync2 est un dropbox-like, basiquement, il s’agit de synchroniser un dossier entre plusieurs machines par internet, et plus précisément :

  • Synchronisation en (quasi) temps réel;
  • Transparence pour l’utilisateur (la synchronisation se fait en arrière-plan, sans intervention de l’utilisateur) ;
  • Fonctionnement hors-ligne (la synchronisation est faite lorsque le réseau redevient disponible) ;
  • Conservation d’un historique des modifications pour revenir en arrière au besoin.

DVCS-autosync fonctionne également sous OSX et Windows (je n’ai pas testé).

Ce Billet couvre l’installation de DVCS-autosync sur un système debian-like (mais peut s’adapter simplement à d’autres distributions).

 continue reading

Installer Snowy, gardien de vos post-its en ligne (debian+lighttpd)

Snowy est un serveur de notes, cela permet de partager des prises de notes genre post-it entre plusieurs machines, fixes ou mobiles et un site web. Idéal pour vos TODO et autres listes de trucs à procrastiner sans les oublier pour autant… etc.

Ce service peut se substituer à la fonctionnalité “liste de tâches” de gmail (et va bien au-delà).

Le présent billet explique comment installer et configurer son propre serveur Snowy sous Debian avec le serveur web lighttpd.

 continue reading

Pyzor bouffe-t-il mes spams ?

Si vous hébergez votre courrier électronique, vous aurez probablement besoin un jour ou l’autre d’un antispam. Ce dératiseur des temps modernes est hélas nécessaire dès l’instant où vous avez eu le malheur de laisser votre adresse email traîner quelque part sur le web

Heureusement, des solutions libres et rodées de dératisation existent. Le but est toujours le même, distinguer un spam (message indésirable) d’un ham (message légitime).

Plusieurs méthodes existent :

  • Basées sur des listes noires d’IPs de “spameurs”, par exemple spamhaus ;
  • exploitant un filtre bayésien, c’est à dire un filtre dont vous affinez le jugement au fur et à mesure que vous l’éduquez en lui indiquant lorsqu’il se trompe, c’est le cas de SpamAssassin ;
  • utilisant une base de données de spams connus, c’est le cas de pyzor, solution étudiée dans cet article.
 continue reading

Améliorer les flux RSS de Rue89

Si comme moi vous appréciez la lecture dans un agrégateur de flux, vous avez sûrement déjà remarqué que certains sites n’utilisent les flux RSS que comme un “appel” vers l’article complet sur le site. Le flux ne contenant alors qu’un résumé de l’article.

C’est le cas de Rue89… Et il se trouve que je trouve leur site extrêmement lourd et fouillis…

Que faire alors ? Succomber à une crise d’épilepsie quotidienne ? Se priver du contenu de Rue89 ?

Que nenni…

 continue reading