HacklabMQ
The lab has an AMQP-based message queuing infrastructure shared between various services. The broker RabbitMQ is located on moa (192.168.111.14), which is on the lab's LDAP system.
Exchanges
- door.entry - Fanout exchange, one message gets pushed to the exchange
- Format: XML format described on the doorbot page each time a card is swiped at the door.
- notification.graphic - Fanout exchange, messages pushed to this exchange indicate animated graphics which should be sent to lab occupants somehow (e.g. LED sign)
- Format: Name of the animation to display. Currently "ostrich" is the only supported animation.
- notification.general - Fanout exchange, messages pushed to this exchange indicate graphics which should be sent to lab occupants somehow (e.g. LED sign, twitter, doorbot)
- Format: JSON, 'text' and 'image' keys, images referenced should be in NFS user home directories
- statistics.bandwidth - Fanout exchange, messages pushed to this exchange indicate bandwidth statistics that can be stored/reported by other systems
- Format: TBD
- statistics.power - Fanout exchange, messages pushed to this exchange indicate power statistics that can be stored/reported by other systems
- Format: TBD
Queues
Queues are named <exchange>.<service>, e.g. doorbot's door.entry queue would be is door.entry.doorbot.
Message Flow Diagram
<graphviz> digraph graphname {
node [ style=filled fillcolor="papayawhip" ] "Building Door System" [shape=house style=filled fillcolor="palevioletred1"] "Building Power System" [shape=house style=filled fillcolor="palevioletred1"] "LED Sign\nsign0" [shape=house style=filled fillcolor="palevioletred1"] "Stats Sign\nsign1" [shape=house style=filled fillcolor="palevioletred1"]
"door.entry" [shape=trapezium style=filled fillcolor="paleturquoise1"] "notification.general" [shape=trapezium style=filled fillcolor="paleturquoise1"] "notification.graphic" [shape=trapezium style=filled fillcolor="paleturquoise1"] "statistics.power" [shape=trapezium style=dotted] "statistics.bandwidth" [shape=trapezium style=dotted]
"door.entry.twitter" [shape=box style=filled fillcolor="palegreen1"] "door.entry.notification" [shape=box style=filled fillcolor="palegreen1"] "notification.general.doorbot" [shape=box style=filled fillcolor="palegreen1"] "notification.general.ledsign" [shape=box style=filled fillcolor="palegreen1"] "notification.graphic.ledsign" [shape=box style=filled fillcolor="palegreen1"] "statistics.power.statssign" [shape=box style=dotted style=dotted] "statistics.bandwidth.statssign" [shape=box style=dotted] "HTTP API\nTwitter" [shape=hexagon style=filled fillcolor="royalblue1"] "IRC #hacklabto (recv)" [shape=hexagon style=filled fillcolor="royalblue1"] "IRC #hacklabto (send)" [shape=hexagon style=filled fillcolor="royalblue1"] "Building Door System" -> "HTTP Service\ncard_event" -> "door.entry" "door.entry" -> "door.entry.notification" "door.entry" -> "door.entry.twitter" "door.entry.notification" -> "doormsg_to_notification" -> "notification.general" "door.entry.twitter" -> "hacklab_door_tweeter" -> "HTTP API\nTwitter"
"notification.general" -> "notification.general.doorbot" "notification.general" -> "notification.general.ledsign" "notification.general.doorbot" -> "doorbot (HacklabMQ)" "doorbot (HacklabMQ)" -> "IRC #hacklabto (send)" "notification.general.ledsign" -> "gennotification_sign_feeder"; "gennotification_sign_feeder" -> "HTTP Service\nSign Text Renderer" "HTTP Service\nSign Text Renderer" -> bmix bmix -> "LED Sign\nsign0"
"IRC #hacklabto (recv)" -> "doorbot (HacklabMQPublisher)"
"doorbot (HacklabMQPublisher)" -> "notification.general" [ label="!sign" ] "doorbot (HacklabMQPublisher)" -> "notification.graphic" [ label="*ostrich*" ] "notification.graphic" -> "notification.graphic.ledsign" "notification.graphic.ledsign" -> "ledsign_ostrich_feeder" "ledsign_ostrich_feeder" -> "bmix"
"Building Power System" -> "HTTP Service\npowerdata" -> "statistics.power" "statistics.power" -> "statistics.power.statssign" "statistics.power.statssign" -> "statssignd"
"Firewall SNMP" -> "bandwidth_feeder" -> "statistics.bandwidth" "statistics.bandwidth" -> "statistics.bandwidth.statssign" "statistics.bandwidth.statssign" -> "statssignd"
"statssignd" -> "Stats Sign\nsign1"
} </graphviz>
</graphviz>