--- /dev/null
+#!/usr/bin/perl -w
+
+use strict;
+my $fh;
+my $fifofile = "/tmp/door_cmd.fifo";
+
+my $keys;
+my %good;
+
+open $keys,'/flash/realraum/keys';
+while (<$keys>)
+{
+ if ($_ =~ /([0-9A-Fa-f]{8})\s(\S+)/)
+ {
+ $good{$1}=$2;
+ }
+}
+
+sub send_to_fifo
+{
+ if( -p $fifofile)
+ {
+ open(my $fifo,"> $fifofile");
+ print $fifo shift(@_)."\n";
+ close($fifo);
+ }
+}
+
+while (sleep 1)
+{
+ open $fh,'/flash/realraum/mifare-read 0 2>&1 |';
+ while (<$fh>)
+ {
+ next unless /UID/;
+ my ($id) = /UID=(\S+)\s+/;
+ if ($good{$id})
+ {
+ send_to_fifo("toggle Card ".$good{$id});
+ } else {
+ send_to_fifo("log InvalidCard $id");
+ }
+ }
+}
+
+###############################################################
+# mifare-read
+#
+# writes:
+# UID=<4 byte in hex, upper-case>
+#
+#
+###############################################################
+# /dev/ttyUSB0: door key printer
+#
+#
+# Ok
+# Ok, closing now
+# Already closed
+# Already opened
+# close forced manually\nOk
+# open forced manually\nOk
+# Error: .*
+# .* be: unknown command
+# Operation in progress
+# open/close took too long!
+# last open/close operation took to long!
+#
+# commands:
+# c ... close
+# response: "Ok", "Already closed", "Error: .*"
+# o ... open
+# response: "Ok", "Already opened", "Error: .*"
+# s ... status
+# response: "Status: closed|opened|<->, opening|waiting|closing|idle"
+# or "Error: .*"
+# r ... reset
+# "Ok, closing now" or "Error: .*"
+#
+# open/close will only be accepted if Status: ..., idle
+# Reset overrules all other operations in progress
+# s will always be accepted
+#
+###############################################################
+#
+#
--- /dev/null
+#!/usr/bin/perl -w
+use IO::Handle;
+use IO::Select;
+use Date::Format;
+use strict;
+
+my $url_door_open = "https://www.realraum.at/";
+my $url_door_closed = "https://www.realraum.at/";
+
+my $door_ttyS = "/dev/ttyUSB0";
+my $fifofile = "/tmp/door_cmd.fifo";
+unless( -p $fifofile)
+{
+ unlink $fifofile;
+ system("mkfifo -m 600 $fifofile") && die "Can't mkfifo $fifofile: $!";
+ system("setfacl -m u:realraum:rw $fifofile");
+ system("setfacl -m u:asterisk:rw $fifofile");
+}
+
+my $logfile;
+open($logfile,'>>/var/log/tuer.log');
+$logfile->autoflush(1);
+sub door_log
+{
+ print $logfile Date::Format::time2str("%Y-%m-%d %T: ",time()).shift()."\n";
+}
+door_log("Door Daemon started");
+
+
+$main::door_open=1;
+$main::door_closed=0;
+$main::tuer_status=$main::door_closed;
+#system('wget --no-check-certificate -q -O /dev/null '.$url_door_closed.' &>/dev/null &');
+
+
+my $fifo=undef;
+my $ttyS=undef;
+sub handler
+{
+ #local($sig) = @_;
+ door_log("Door Daemon stopped");
+ close $logfile;
+ close $fifo if (defined $fifo);
+ close $ttyS if (defined $ttyS);
+ exit(0);
+}
+$SIG{'INT'} = 'handler';
+$SIG{'QUIT'} = 'handler';
+$SIG{'KILL'} = 'handler';
+
+while (1)
+{
+ unless (defined $fifo) { open($fifo,"< $fifofile"); }
+ unless (defined $ttyS) { open($ttyS,"< $door_ttyS"); }
+ my $read_set = new IO::Select();
+ $read_set->add($fifo);
+ $read_set->add($ttyS);
+
+ print $ttyS "s\n";
+
+ do
+ {
+ my ($rh_set) = IO::Select->select($read_set, undef, undef);
+ foreach my $fh (@$rh_set)
+ {
+ if ($fh == $fifo)
+ {
+ my $fifo_msg = <$fh>;
+ if ($fifo_msg =~ /^(\w+)\s*(.*)/)
+ {
+ handle_cmd($1,$2);
+ }
+ }
+ elsif ($fh == $ttyS)
+ {
+ my $ttyS_msg = <$fh>;
+ #last unless ($ttyS_msg);
+ print($ttyS_msg);
+ door_log($door_ttyS.": ".$ttyS_msg);
+ my $tuer=$main::tuer_status;
+ $tuer=$main::door_open if $ttyS_msg =~ /open/;
+ $tuer=$main::door_closed if $ttyS_msg =~ /close/;
+ if ($tuer != $main::tuer_status)
+ {
+ $main::tuer_status=$tuer;
+ if ($tuer == $main::door_open)
+ {
+ system('wget --no-check-certificate -q -O /dev/null '.$url_door_open.' &>/dev/null &');
+ }
+ else
+ {
+ system('wget --no-check-certificate -q -O /dev/null '.$url_door_closed.' &>/dev/null &');
+ }
+ }
+ }
+ }
+ } until (eof $fifo or eof $ttyS);
+ if (eof $fifo) {close($fifo); $fifo=undef;}
+ if (eof $ttyS) {close($ttyS); $ttyS=undef;}
+}
+
+sub handle_cmd
+{
+ my $cmd = shift;
+ my $who = shift;
+ print "c:'$cmd' w:'$who'\n";
+ my $tuer=$main::tuer_status;
+ if ($cmd eq "open") { $tuer=$main::door_open; }
+ elsif ($cmd eq "close") {$tuer=$main::door_closed; }
+ elsif ($cmd eq "toggle") {$tuer=!$tuer;}
+ elsif ($cmd eq "log") {door_log($who)}
+ else {door_log("Invalid Command: $cmd $who")}
+
+ if ($tuer != $main::tuer_status)
+ {
+ if ($tuer == $main::door_open)
+ {
+ door_log("Door opened by $who");
+ print $ttyS "o\n";
+ system('wget --no-check-certificate -q -O /dev/null '.$url_door_open.' &>/dev/null &');
+ }
+ else
+ {
+ door_log("Door closed by $who");
+ print $ttyS "c\n";
+ system('wget --no-check-certificate -q -O /dev/null '.$url_door_closed.' &>/dev/null &');
+ }
+
+ }
+}
+++ /dev/null
-#!/usr/bin/perl
-
-use strict;
-my $fh;
-
-my $keys;
-my %good;
-my $status = 'c';
-
-open $keys,'/flash/realraum/keys';
-while (<$keys>)
-{
- my ($code,$comment) = split /\s/,$_,2;
- $good{$code}=$comment;
-}
-
-
-while (sleep 1)
-{
- open $fh,'/flash/realraum/mifare-read 0 2>&1 |';
- while (<$fh>)
- {
- next unless /UID/;
- my ($id) = /UID=(\S+)\s+/;
- if ($good{$id})
- {
- my $newstat;
- if ($status eq 'o')
- {
- $newstat='c';
-
- } else {
- $newstat = 'o';
- }
- print "$newstat: $good{$id}";
- system ( "echo -n $newstat > /dev/ttyUSB0");
- $status = $newstat;
- } else {
- print "boese\n";
- }
- }
-
-}
-
-###############################################################
-# mifare-read
-#
-# writes:
-# UID=<4 byte in hex, upper-case>
-#
-#
-###############################################################
-# /dev/ttyUSB0: door key printer
-#
-#
-# Ok
-# Ok, closing now
-# Already closed
-# Already opened
-# close forced manually\nOk
-# open forced manually\nOk
-# Error: .*
-# .* be: unknown command
-# Operation in progress
-# open/close took too long!
-# last open/close operation took to long!
-#
-# commands:
-# c ... close
-# response: "Ok", "Already closed", "Error: .*"
-# o ... open
-# response: "Ok", "Already opened", "Error: .*"
-# s ... status
-# response: "Status: closed|opened|<->, opening|waiting|closing|idle"
-# or "Error: .*"
-# r ... reset
-# "Ok, closing now" or "Error: .*"
-#
-# open/close will only be accepted if Status: ..., idle
-# Reset overrules all other operations in progress
-# s will always be accepted
-#
-###############################################################
-#
-#
\ No newline at end of file