Spaceapi
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 :
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/
- Sans argument, elle affiche le statut: http://breizh-entropy.org/api/
- Elle permet également d'ouvrir et de fermer le lab:
Il est possible de la contrôler depuis un navigateur web, mais aussi en ligne de commande, à l'aide de curl ou wget:
- curl http://breizh-entropy.org/api/?open
- wget http://breizh-entropy.org/api/?open -o /dev/null
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-) :
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.