Maschinendeckbot (XMPP): Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
>Ranlvor Keine Bearbeitungszusammenfassung |
>Ranlvor (vervollständigt) |
||
Zeile 3: | Zeile 3: | ||
|What = software | |What = software | ||
|Who = Ranlvor | |Who = Ranlvor | ||
|Status = | |Status = running | ||
|Tags = XMPP, Raumstatus | |Tags = XMPP, Raumstatus | ||
}} | }} | ||
Der Maschinendeckbot soll in Jabber online gehen, wenn der Raumstatus offen ist und offline gehen, wenn der Raumstatus geschlossen ist. | Der Maschinendeckbot soll in Jabber online gehen, wenn der Raumstatus offen ist und offline gehen, wenn der Raumstatus geschlossen ist. | ||
verwendete Software: https://github.com/tpltnt/hackerspace-api-bot (mit leichten Modifikationen) | |||
Jabberid: [[Has XMPP address::status@maschinendeck.org]] | |||
== Details == | |||
Der Bot prüft alle 60 Sekunden über die [http://state.maschinendeck.org/spaceapi.php SpaceAPI] den aktuellen Raumstatus. Wenn der Raum offen ist, geht der Bot online, wenn er geschlossen ist, geht der Bot offline. Der Bot akzeptiert, wenn er online ist, automatisch alle authorize-Anfragen. | |||
== Software modifizierungen == | |||
Aus Gründen von „das wirft Exceptions“ bis „das kann so nicht gehen“ habe ich kleinere Änderungen an der Software durchgeführt. | |||
<nowiki> | |||
#!/usr/bin/env python3 | |||
""" | |||
Make your hackerspace a XMPP buddy. | |||
""" | |||
from configparser import ConfigParser | |||
from optparse import OptionParser | |||
import logging | |||
import requests | |||
import sleekxmpp | |||
import sys | |||
import time | |||
import urllib.request | |||
import json | |||
class HackerspaceApiBot(sleekxmpp.ClientXMPP): | |||
""" | |||
A SleekXMPP based bot that will mimic the on-/offline | |||
status of a given hackerspace. It also authorizes other | |||
automatically to allow status tracking. | |||
""" | |||
def __init__(self, jid, password): | |||
super(HackerspaceApiBot, self).__init__(jid, password, plugin_whitelist=['xep_0199']) | |||
self.auto_authorize = True | |||
self.add_event_handler('session_start', self.start) | |||
self.schedule('checkstatus', 60, self.checkstatus, args=None, | |||
kwargs=None, repeat=True) | |||
def start(self, event): | |||
self.send_presence("hello world") | |||
self.get_roster() | |||
def checkstatus(self): | |||
try: | |||
jsondata = requests.get(opts.jsonurl) | |||
except AttributeError: | |||
print("reading from URL failed") | |||
return | |||
if 200 != jsondata.status_code: | |||
print("reading from URL failed") | |||
return | |||
spacestate = json.loads(jsondata.text) | |||
#print("spacestate: " + str(spacestate['state']['open'])) | |||
if not spacestate['state']['open']: | |||
self.disconnect(wait=True) | |||
if __name__ == '__main__': | |||
# Setup the command line arguments. | |||
optp = OptionParser() | |||
# JID and password as arguments | |||
optp.add_option("-c", "--config", dest="config", | |||
help="configuration file (ini-format) to use") | |||
optp.add_option("-j", "--jid", dest="jid", | |||
help="JID to use") | |||
optp.add_option("-p", "--password", dest="password", | |||
help="XMPP account password to use") | |||
optp.add_option("-u", "--url", dest="jsonurl", | |||
help="URL to load hackerspace API json file from") | |||
opts, args = optp.parse_args() | |||
if None == opts.config: | |||
if None == opts.jid: | |||
print("no JID given ...") | |||
sys.exit(1) | |||
if None == opts.jsonurl: | |||
print("no URL given ...") | |||
sys.exit(1) | |||
if None == opts.password: | |||
print("no XMPP account password given ...") | |||
sys.exit(1) | |||
else: | |||
configfile = ConfigParser() | |||
configfile.read(opts.config) | |||
if 1 != len(configfile.sections()): | |||
print("can not process more than on section/hackerspace currently ...") | |||
sys.exit(2) | |||
# iterate over all sections (hackerspace configs) | |||
for section in configfile: | |||
# skip default | |||
if "DEFAULT" == section: | |||
continue | |||
print("using \"" + section + "\" configuration") | |||
opts.jid = configfile[section]['jid'] | |||
opts.jsonurl = configfile[section]['url'] | |||
opts.password = configfile[section]['password'] | |||
# set up logging (for debugging) | |||
#logging.basicConfig(level=logging.INFO, | |||
# format='%(levelname)-8s %(message)s') | |||
# just run in an endless loop and check from time to time | |||
while(True): | |||
try: | |||
jsondata = requests.get(opts.jsonurl) | |||
except AttributeError: | |||
print("reading from URL failed") | |||
continue | |||
if 200 != jsondata.status_code: | |||
print("reading from URL failed") | |||
continue | |||
spacestate = json.loads(jsondata.text) | |||
#print("spacestate: " + str(spacestate['state']['open'])) | |||
if spacestate['state']['open']: | |||
# validate TLS Certificates | |||
#xmpp.ca_certs = "path/to/ca/cert" | |||
# set up the bot | |||
xmpp = HackerspaceApiBot(opts.jid, opts.password) | |||
xmpp.register_plugin('xep_0030') # Service Discovery | |||
xmpp.register_plugin('xep_0004') # Data Forms | |||
xmpp.register_plugin('xep_0060') # PubSub | |||
xmpp.register_plugin('xep_0199') # XMPP Ping | |||
# connect to server and set status | |||
if xmpp.connect(('jabber.brandin.de', 5222), use_tls=True, use_ssl=False): | |||
xmpp.process(block=True) | |||
else: | |||
print("unable to connect to server") | |||
# wait 5 minutes before checking again | |||
time.sleep(60) | |||
</nowiki> |
Version vom 16. August 2014, 21:16 Uhr
Maschinendeckbot (XMPP) | |
---|---|
Weshalb | Raumstatus-XMPP Bot |
Was | software |
Wer | Ranlvor |
Status | läuft |
Der Maschinendeckbot soll in Jabber online gehen, wenn der Raumstatus offen ist und offline gehen, wenn der Raumstatus geschlossen ist.
verwendete Software: https://github.com/tpltnt/hackerspace-api-bot (mit leichten Modifikationen)
Jabberid: Has XMPP address::status@maschinendeck.org
Details
Der Bot prüft alle 60 Sekunden über die SpaceAPI den aktuellen Raumstatus. Wenn der Raum offen ist, geht der Bot online, wenn er geschlossen ist, geht der Bot offline. Der Bot akzeptiert, wenn er online ist, automatisch alle authorize-Anfragen.
Software modifizierungen
Aus Gründen von „das wirft Exceptions“ bis „das kann so nicht gehen“ habe ich kleinere Änderungen an der Software durchgeführt.
#!/usr/bin/env python3 """ Make your hackerspace a XMPP buddy. """ from configparser import ConfigParser from optparse import OptionParser import logging import requests import sleekxmpp import sys import time import urllib.request import json class HackerspaceApiBot(sleekxmpp.ClientXMPP): """ A SleekXMPP based bot that will mimic the on-/offline status of a given hackerspace. It also authorizes other automatically to allow status tracking. """ def __init__(self, jid, password): super(HackerspaceApiBot, self).__init__(jid, password, plugin_whitelist=['xep_0199']) self.auto_authorize = True self.add_event_handler('session_start', self.start) self.schedule('checkstatus', 60, self.checkstatus, args=None, kwargs=None, repeat=True) def start(self, event): self.send_presence("hello world") self.get_roster() def checkstatus(self): try: jsondata = requests.get(opts.jsonurl) except AttributeError: print("reading from URL failed") return if 200 != jsondata.status_code: print("reading from URL failed") return spacestate = json.loads(jsondata.text) #print("spacestate: " + str(spacestate['state']['open'])) if not spacestate['state']['open']: self.disconnect(wait=True) if __name__ == '__main__': # Setup the command line arguments. optp = OptionParser() # JID and password as arguments optp.add_option("-c", "--config", dest="config", help="configuration file (ini-format) to use") optp.add_option("-j", "--jid", dest="jid", help="JID to use") optp.add_option("-p", "--password", dest="password", help="XMPP account password to use") optp.add_option("-u", "--url", dest="jsonurl", help="URL to load hackerspace API json file from") opts, args = optp.parse_args() if None == opts.config: if None == opts.jid: print("no JID given ...") sys.exit(1) if None == opts.jsonurl: print("no URL given ...") sys.exit(1) if None == opts.password: print("no XMPP account password given ...") sys.exit(1) else: configfile = ConfigParser() configfile.read(opts.config) if 1 != len(configfile.sections()): print("can not process more than on section/hackerspace currently ...") sys.exit(2) # iterate over all sections (hackerspace configs) for section in configfile: # skip default if "DEFAULT" == section: continue print("using \"" + section + "\" configuration") opts.jid = configfile[section]['jid'] opts.jsonurl = configfile[section]['url'] opts.password = configfile[section]['password'] # set up logging (for debugging) #logging.basicConfig(level=logging.INFO, # format='%(levelname)-8s %(message)s') # just run in an endless loop and check from time to time while(True): try: jsondata = requests.get(opts.jsonurl) except AttributeError: print("reading from URL failed") continue if 200 != jsondata.status_code: print("reading from URL failed") continue spacestate = json.loads(jsondata.text) #print("spacestate: " + str(spacestate['state']['open'])) if spacestate['state']['open']: # validate TLS Certificates #xmpp.ca_certs = "path/to/ca/cert" # set up the bot xmpp = HackerspaceApiBot(opts.jid, opts.password) xmpp.register_plugin('xep_0030') # Service Discovery xmpp.register_plugin('xep_0004') # Data Forms xmpp.register_plugin('xep_0060') # PubSub xmpp.register_plugin('xep_0199') # XMPP Ping # connect to server and set status if xmpp.connect(('jabber.brandin.de', 5222), use_tls=True, use_ssl=False): xmpp.process(block=True) else: print("unable to connect to server") # wait 5 minutes before checking again time.sleep(60)