Assorted away-tpope updates
[tpope-extra.git] / perl / phone-monitor
1 #!/usr/bin/perl
2 # $Id$
3 # -*- perl -*- vim: ft=perl sw=4 sts=4
4
5 # Watches my modem on ttyS4 for new calls and reports the caller id.
6 # Requires a $HOME/bin/phone-call to handle them.
7
8 use strict;
9 use Device::Modem;
10 my $number;
11 #my %status;
12 my %values;
13
14 my $modem = new Device::Modem( port => '/dev/ttyS4', baudrate => '38400', log => 'file,/dev/null');
15
16 $SIG{INT}  = 'death';
17 $SIG{TERM} = 'death';
18 $SIG{QUIT} = 'death';
19
20 sub initialize {
21     my $modem=shift;
22     $modem->connect() || return 0;
23     $modem->atsend( 'AT#CID=1' . Device::Modem::CR );
24     $modem->answer();
25     return 1;
26 }
27
28 daemonize() if (shift eq "-d");
29
30 initialize($modem) || die "Could not initialize modem: $!";
31
32 while(1) {
33         sleep 1;
34         %values = wait_for_ring();
35         #%values=("NMBR" => "2102130787", "NAME" => "WIRELESS CALLER");
36         if($values{"NMBR"}) {
37             print $values{"NMBR"}. " " .$values{"NAME"}, "\n";
38             ring($values{"NMBR"}.' "'.$values{"NAME"}.'"');
39         } elsif (!%values) {last;}
40 }
41 $modem->disconnect();
42
43 sub wait_for_ring {
44     local $_;
45     #eval {
46         #local $SIG{ALRM} = sub { die "alarm\n" };
47         #alarm 15;
48         $_ = $modem->answer("NMBR = [0-9A-Z]*[^0-9A-Z]");
49         #alarm 0
50         #};
51     #if($@) {
52         #die unless $@ eq "alarm\n";
53         #return undef;
54     #} else {
55         #my $CR = Device::Modem::CR;
56         my %values = ("success" => 1);
57         #print ("$_\n"); # if ($_);
58         foreach (split /\r\n/) {
59             if(m/^(.*) = (.*)$/) {
60                 $values{$1} = $2;
61             }
62         }
63         return %values;
64     #}
65 }
66
67 sub ring {
68     system($ENV{"HOME"} . "/bin/phone-call " . $_[0]);
69 }
70
71 sub daemonize {
72     chdir "/";
73     my $pid=fork();
74     if($pid) {
75         exit(0)
76     }
77     elsif(defined($pid))
78     {
79         close STDIN;
80         close STDOUT;
81         open(STDOUT,">/tmp/.phone.log") or die "$!";
82         close STDERR;
83     }
84     else { exit(1); }
85 }
86
87 sub death {
88     $modem->disconnect() if($modem);
89     unlink "/tmp/.phone.log";
90     exit(0);
91 }