Mittagsbestellungen bei NETWAYS

Mittagsbestellungen in einem größeren Büro zu organisieren, ist gar nicht so einfach. Die Kollegen müssen gefragt werden, was sie denn gerne bestellen wollen und irgendjemand muss das Geld jeweils passend einsammeln (“Ich hab’ aber nur einen 50 Euro-Schein!”).
Sobald das Essen dann da ist, müssen die Kollegen benachrichtigt werden, die inzwischen vielleicht in einem Meeting sitzen und gar nicht mehr daran denken, dass sie vor einer halben Stunde eine Pizza bestellt haben.
Um diesen Prozess zu vereinfachen, haben wir uns einige Automatismen ausgedacht, die uns sowohl Zeit sparen als auch den Bestellvorgang komfortabler gestalten.
Zunächst einmal habe ich hierfür eine Webseite entwickelt, über die Bestellungen entgegengenommen werden können:
order-form
Unsere Mitarbeiter bekommen dazu täglich um 10:15 Uhr eine E-Mail, in der die heutigen Angebote stehen (z.B. Pizza oder Döner). Auf der Bestellseite gibt es auch für den jeweiligen Laden die aktuelle Speisekarte, in der einfach die gewünschten Gerichte inkl. derer Optionen (groß, klein, mit extra Käse, usw.) ausgewählt werden können. Alternativ kann auch über einen Jabber-Bot bestellt werden.
Händler können über die Webseite auch Trinkgeld für den jeweiligen Laden einsammeln, das dann gerecht auf alle Bestellungen aufgeteilt wird. Auch sind Rabattaktionen möglich (z.B. 30% auf alles).
Der Bestellschluss ist um 11:15 Uhr. Danach können sich unsere Händler die Liste der Bestellungen über die Webseite als PDF herunterladen und entsprechend bestellen. Sobald das Essen im Büro angekommen ist, ändern die Händler den Bestellstatus über die Webseite, wodurch auch gleichzeitig Jabber-Benachrichtigungen an alle Kollegen verschickt werden, die am jeweiligen Tag mitbestellt haben.
In Zukunft wird dieser Schritt dann über einen Taster erledigt, der neben der Eingangstür angebracht ist. Dabei gibt es für die Kollegen, von denen die meisten Bestellungen ausgeführt werden, jeweils einen Taster:
fhem-buttons
Bleibt eigentlich nur noch die Frage, wie die Händler an das Geld kommen, um die Bestellungen bezahlen zu können. Anstatt täglich Kleinstbeträge für Döner (3€) und ähnliches einzusammeln, erhält jeder Mitarbeiter ein Konto, über das die Bestellungen abgerechnet werden:
bank
Dies ermöglicht uns auch, Bargeld an einer zentralen Stelle einzusammeln. Hierfür haben wir eine Geldkasette, in der wir jeweils eine ausreichende Summe Bargeld vorhalten, um für die nächsten 1-2 Wochen Bestellungen ausführen zu können.
Einzahlungen sind allerdings auch über SEPA-Überweisungen möglich. Hierzu fragt ein Cronjob stündlich ein externes Bankkonto per HBCI ab und schreibt es dem jeweiligen Mitarbeiter auf seinem Essenskonto gut.
Überweisungen zwischen Mitarbeitern sind auch möglich (inkl. SMS-TAN zur Sicherheit) und wir räumen jedem Kollegen einen zinsfreien Dispokredit von 20€ ein.
Der Sourcecode für die beiden Anwendungen ist auf GitHub in den beiden Repositories https://github.com/gunnarbeutner/shop-app und https://github.com/gunnarbeutner/bank-app. Aktuell fehlt leider jegliche Dokumentation (ups!) und der Code ist an einigen Stellen nicht wirklich schön.

Weekly Snap: DevOps Days Berlin & OSDC, Icinga 2 & Jabber

weekly snap14 – 18 July brought event news from OSMC and DevOps Days Berlin, as well as guides to RAID and Icinga 2 notifications with Jabber.
Eva counted 134 days to the OSMC with Sven Nierlein’s talk on the Thruk monitoring GUI.
She then went on to announce our participation at this year’s DevOps Days Berlin, as part of the organizing team.
Finally Gunnar followed with his script to send Icinga 2 notifications via Jabber, and Tobias shared a couple educational, yet amusing videos on RAID levels.

Jabber-Notifications mit Icinga 2

Um mit Icinga 2 einfach Notifications an Jabber-Kontakte senden zu können, habe ich mir folgendes Script geschrieben:

#!/usr/bin/env python
import xmpp, os, sys
if len(sys.argv) < 3:
    print "Syntax:", sys.argv[0], " "
    sys.exit(1)
jid = xmpp.protocol.JID(os.environ["XMPP_USER"])
cl = xmpp.Client(jid.getDomain(), debug = [])
con = cl.connect()
cl.auth(jid.getNode(), os.environ["XMPP_PASSWORD"])
cl.sendInitPresence()
msg = xmpp.Message(sys.argv[1], sys.argv[2])
msg.setAttr('type', 'chat')
cl.send(msg)

Das Script wird dabei in /etc/icinga2/scripts mit dem Dateinamen jabber-notification.py abgelegt werden. Zusätzlich muss noch die Python-XMPP-Library installiert werden, für die es z.B. in Debian das Paket python-xmpp gibt.
Um das Script mit Icinga verwenden zu können, müssen zunächst folgende allgemeine Templates definiert werden:

template NotificationCommand "jabber-template" {
  import "plugin-notification-command"
  command = [
    SysconfDir + "/icinga2/scripts/jabber-notification.py",
    "$xmpp_recipient$",
    "$xmpp_message$"
  ]
  vars.xmpp_recipient = "$jabber$"
  // Wir übergeben den Benutzernamen und das Passwort per Environment-
  // Variablen an das Script, damit diese nicht per ps(1)
  // für andere Benutzer einsehbar sind.
  env = {
    XMPP_USER = "$xmpp_user$"
    XMPP_PASSWORD = "$xmpp_password$"
  }
}
template NotificationCommand "jabber-host-notification" {
  import "jabber-template"
  vars.xmpp_message = {{{Notification Type: $notification.type$
Host: $host.display_name$
Address: $address$
State: $host.state$
Date/Time: $icinga.long_date_time$
Additional Info: $host.output$
Comment: [$notification.author$] $notification.comment$}}}
}
template NotificationCommand "jabber-service-notification" {
  import "jabber-template"
  vars.xmpp_message = {{{Notification Type: $notification.type$
Service: $service.name$
Host: $host.display_name$
Address: $address$
State: $service.state$
Date/Time: $icinga.long_date_time$
Additional Info: $service.output$
Comment: [$notification.author$] $notification.comment$}}}
}

Den beiden Templates "jabber-host-notification" und "jabber-service-notification" fehlen dabei noch die Custom Attribute für den Jabber-Benutzernamen und -Passwort. Um diese anzugeben, definieren wir zwei Commands:

object NotificationCommand "jabber-host-netways" {
  import "jabber-host-notification"
  vars.xmpp_user = "jabber-user@example.org"
  vars.xmpp_password = "passwort"
}
object NotificationCommand "jabber-service-netways" {
  import "jabber-service-notification"
  vars.xmpp_user = "jabber-user@example.org"
  vars.xmpp_password = "passwort"
}

Anschließend können wir diese Commands für Notifications verwenden:

object User "gunnar" {
  vars.jabber = "gunnar@beutner.name"
}
apply Notification "jabber-host" to Host {
  command = "jabber-host-netways"
  users = [ "gunnar" ]
  assign where true
}
apply Notification "jabber-service" to Service {
  command = "jabber-service-netways"
  users = [ "gunnar" ]
  assign where true
}

Die Command-Templates sind dabei so parametrisiert, dass in den einzelnen Notifications bei Bedarf auch die Texte für die Jabber-Messages über das Custom-Attribut xmpp_message überschrieben werden können.

Jitsi – aka SIP Communicator

Der heutige Post ist recht kurz und bündig, aber mit gutem Inhalt gefüllt. Wir möchten Euch einen der zahlreichen Chat und Telefon Clients vorstellen, welcher sich in der Praxis gut bewährt hat und wohl die aktuell gängigsten Protokolle unterstützt. Die Rede ist von Jitsi oder auch bekannt als SIP Communicator.
Dieser dient nicht nur als Chat Client für IRC, Jabber, Facebook und CO, sondern kann dank SIP auch gleichzeitig mit als Soft-Phone genutzt werden. Zusammen mit dem Bezug auf Mikrofon und auch Kamera lässt sich das ganze auch noch weiter aufbessern und z.B. in einen Jabber Server mit Openfire als Videokonferenz Tool einbinden.
Wer also auf der Suche nach einem neuen Client ist, kann sich hier einmal ausprobieren. Und Open-Source typisch ist er sogar für alle Plattformen erhältlich.