Spaceapi

De Breizh-Entropy
Révision datée du 8 mai 2014 à 15:22 par Geb (discussion | contributions) (Changement lien stats => breizh-entropy)
Aller à la navigation Aller à la recherche

Qu'est ce que c'est ?

D'après le site oueb : The purpose of the Space API is to define a unified specification across the hackerspaces that can be used to expose information to web apps or any other application.

À partir de là un certain nombre d'application a été développé, pour avoir des statistiques, un plugin firefox ou même une application android :

Myhackerspace.png

C'est justement l'application Android qui m'a donné envie d'implémenter ça, pour avoir une info de présence.

Comment

Le json est situé ici. Sur la machine il est là :

 $ ls -l /var/www/breizh-entropy.org/spaceapi.json
 lrwxrwxrwx 1 root root 38 avril 26 16:39 /var/www/breizh-entropy.org/spaceapi.json -> /home/petrus/public_html/spaceapi.json

Il est facile de modifier le json en utilisant jq :

 $ cat /home/petrus/public_html/spaceapi.json | jq '.state.open'
 false

Pour ouvrir le lab :

 $ cat /home/petrus/public_html/spaceapi.json | jq '.state.open=true' > /tmp/spaceapi.json; mv /tmp/spaceapi.json /home/petrus/public_html/spaceapi.json

Pour fermer le lab :

 $ cat /home/petrus/public_html/spaceapi.json | jq '.state.open=false' > /tmp/spaceapi.json; mv /tmp/spaceapi.json /home/petrus/public_html/spaceapi.json

Ces commandes sont dans les scripts lab_open et lab_closed sur la vm.

Le bot irc

argos est le bot qui permet de changer l'état (ouvert ou fermé) du lab :

 <petrus> !open
 <argos> Lab is open!
 <petrus> !closed
 <argos> On ferme :(
 <petrus> !status
 <argos> Lab is closed :(

argos est un eggdrop actuellement et tourne sur ma machine, mais pourrait être installé sur la vm du hackerspace voire recodé simplement en utilisant supybot.

Le script eggdrop est très simple et communique avec le serveur en ssh, en utilisant les scripts lab_open et lab_close montrés plus haut :

 ################
 # spaceapi.tcl #
 ################
 
 bind pub - "!open" spaceapi:open
 bind pub - "!closed" spaceapi:closed
 bind pub - "!close" spaceapi:closed
 bind pub - "!status" spaceapi:status
 bind msg - "!open" spaceapi:open
 bind msg - "!closed" spaceapi:closed
 bind msg - "!close" spaceapi:closed
 bind msg - "!status" spaceapi:status
 
 proc spaceapi:open {nick uhost handle chan text} {
   exec lab_open
   set msg "\00312Lab is \0033open!"
   putnow "PRIVMSG $chan :$msg"
 }
 
 proc spaceapi:closed {nick uhost handle chan text} {
   exec lab_closed
   set msg "\00312On \0033ferme :("
   putnow "PRIVMSG $chan :$msg"
 }
 
 proc spaceapi:status {nick uhost handle chan text} {
   set state [exec curl -s http://breizh-entropy.org/spaceapi.json | jq ".state.open"]
   switch $state {
     "true" {
       set msg "\00312Lab is \0033open!"
     }
     "false" {
       set msg "\00312Lab is \0033closed :("
     }
     default {
       set msg "ça a po marché :("
     }
   }
   putnow "PRIVMSG $chan :$msg"
 }
 
 putlog "\003spaceapi.tcl V0.2"

version web

Une version Web du script pour afficher/ouvrir/fermer le lab est disponible là: http://breizh-entropy.org/api/

Il est possible de la contrôler depuis un navigateur web, mais aussi en ligne de commande, à l'aide de curl ou wget:

Le code de l'interface web est (temporairement) disponible ici: http://pastebin.com/aTJAjU8R

Intégration à supybot

Le bot qui tourne sur le chan permet va voir les URL qui sont écrites sur le chan et affiche leur titre. Il suffit donc d'écrire

http://breizh-entropy.org/api/?open

pour qu'il ouvre le lab, et affiche son statut.

On peut également programmer des alias

<geb> !alias add status title http://breizh-entropy.org/api/
<bebot> geb: The operation succeeded.
<geb> !status
<bebot> geb: lab is open !

Pour l'instant, il n'y a pas d'alias pour l'ouverture et la fermeture, afin d'éviter que les deux bots se marchent dessus

Le capteur

On pourrait utiliser un interrupteur qui crée une loopback sur un port ethernet d'un wrt/pc, et avec ifplugd/ifup/netlink on exécute un script (directement sur la vm ou dans le chan irc) pour changer l'état.

Utilisation de 2 clés ssh passwordless sur la vm avec "command=lab_open" et "command=lab_closed".

Pour une loopback ethernet il faut relier les ports 1 (Tx+)et 3(Rx+) et 2(Tx-) et 6(Rx-) : Loopback.jpg

Pour détecter une ouverture (=port down), il suffit de couper l'un ou l'autre, pas besoin de couper les deux.

Pour avoir plein de port d'I/O on pourrait sinon utiliser un switch manageable, et envoyer un trap snmp à chaque changement d'état d'un port. Voir snmptrapd pour l'inspiration.

Autre possibilité : utiliser un routeur cisco, et au lieu d'avoir du snmp avoir un script tcl+eem qui 1) ssh ou 2) se connecte à l'irc pour executer les commandes.