#!/bin/bash
#                                            von Mirko Dlle <mid@ct.heise.de>
#                                            Dies ist freie Software nach GPL.
#
# bluevent: Wartet auf dem System-DBus auf ein Signal von de.heise.ct.Signal
#           (dbus-signal), das eine Nachricht von bluefind ber die Rckkehr
#           oder Abwesenheit eines Bluetooth-Gerts enthlt.
#           Fhrt dann fr die betreffende Bluetooth-MAC-Adresse die vom
#           Benutzer in der Datei ~/.bluevent vorgesehenen Aktionen aus.
#
#           Hinweis: Um bluevent zu beenden, sollte nur der dbus-monitor-
#           Prozess gekillt werden.

dbus-monitor --system "type=signal,path=/de/heise/ct/Signal,interface=de.heise.ct.Signal" 2>/dev/null \
| while read msg; do
  if [ -z "${msg/#signal*}" -a \
       -z "${msg/*path=\/de\/heise\/ct\/Signal*}" -a \
       -z "${msg/*interface=de.heise.ct.Signal*}" -a \
       -z "${msg/*member=Signal*}" ]; then
    read msg
    string=${msg#*string }; string=${string#\"}; string=${string%\"}
    
    # Signal-String zerlegen
    if [ -n "${string/#bluefind:*}" ]; then
      # Signal stammt nicht von bluefind, ignorieren
      continue
    fi
    # Bluetooth-Adresse
    BDADDR="${string/*bdaddr=}"
    export BDADDR="${BDADDR//,*}"
    # Event
    EVENT="${string/*event=}"
    EVENT="${EVENT//,*}"

    # Event-Konfigurationsdatei einlesen
    exec 9<${HOME}/.bluevent
    while read -u 9 cline; do
      # Kommentare entfernen
      cline="${cline/\#*}"
      if [ -z "${cline// }" ]; then
        continue
      fi
      case "${cline:0:1}" in
        +|-)
	  ;;
	*)
	  echo "Konfigurationsdatei fehlerhaft"
	  continue
      esac
      
      # Syntax der Zeile prfen
      if [ -n "${cline/#? ??:??:??:??:??:?? *}" ]; then
        echo "Konfigurationsdatei fehlerhaft"
	continue
      fi
      
      # Konfigurationszeile zerlegen
      cEvent="${cline:0:1}"
      cBdaddr="${cline:2:17}"
      cCmd="${cline:20}"
      
      # Kommandos ausfhren
      if [ "${EVENT}" = "left" -a "${cEvent}" = "-" -a \
           "${BDADDR}" = "${cBdaddr}" ]; then
        bash -c "$cCmd" >/dev/null 2>/dev/null
      elif [ "${EVENT}" = "arrived" -a "${cEvent}" = "+" -a \
           "${BDADDR}" = "${cBdaddr}" ]; then
        bash -c "$cCmd" >/dev/null 2>/dev/null
      fi
    done
    exec 9>&-
  fi
done
