level 177
[zc] / pg-listen-zc.pl
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4 use autodie;
5
6 use DBI;
7 use IO::Select;
8 use POSIX qw(strftime);
9 use Data::Dump qw(dump);
10
11 $|=1;
12
13 my $filter = 'bakaceva';
14 $filter = $ARGV[0] if @ARGV;
15
16 my $alert_config = "alert-$filter.txt";
17 die "no $alert_config config" unless -e $alert_config;
18
19 my $pn2name;
20 open(my $n, '<', 'subvision-numbers.txt');
21 while(<$n>) {
22         chomp;
23         my ( $number, $pn, $imei, $name ) = split(/ /,$_);
24         next if $name !~ m/$filter/;
25         $pn2name->{$pn} = $number;
26 }
27
28 sub ts {
29         strftime("%Y-%m-%d %H:%M:%S ", localtime(time()));
30 }
31
32 my $dbh = DBI->connect("dbi:Pg:dbname=zc","dpavlin","", { RaiseError => 1, AutoCommit => 1 });
33
34 $dbh->do("LISTEN zc");
35 print ts,"LISTEN zc for $filter ", join(' ', keys %$pn2name), "\n";
36
37
38 my $fd = $dbh->func("getfd");
39 my $sel = IO::Select->new($fd);
40
41 my $sth = $dbh->prepare( "select * from sub_$filter where pn = ? order by time desc limit 1" );
42
43
44 while (1) {
45         $sel->can_read;
46         my $notify = $dbh->func("pg_notifies");
47         if ($notify) {
48                 #warn "# notify = ",dump($notify);
49                 my ($relname, $pid, $payload) = @$notify;
50                 #print ts,"$relname from PID $pid $payload\n";
51                 my ($pn, $_id) = split(/,/, $payload);
52                 if ( exists $pn2name->{$pn} ) {
53                         $sth->execute($pn);
54                         my $row = $sth->fetchrow_hashref;
55                         #warn "# row = ",dump($row);
56                         # FIXME hard-coded 0.1
57                         if ( abs( $row->{x_axis_angle} ) > 0.1 || abs( $row->{y_axis_angle} ) > 0.1 ) {
58                                 if ( ! -e "alert/$pn" ) {
59                                         print ts,"ALERT $pn\n";
60
61                                         open(my $fh, '>', "alert/$pn");
62                                         print $fh dump($row);
63                                         close($fh);
64
65                                         # send sms
66                                         my ( undef, $time ) = split(/ /,$row->{time});
67                                         $time =~ s{\..+$}{}; # remove decimal time
68                                         my $name = $pn2name->{$pn};
69
70                                         open(my $cfg, '<', $alert_config);
71                                         my $msg = <$cfg>;
72                                         chomp($msg);
73                                         $msg =~ s/\Q{{name}}\E/$name/g;
74                                         $msg =~ s/\Q{{time}}\E/$time/g;
75                                         print ts,"$msg\n";
76
77                                         # consume email <email> number
78                                         while(<$cfg>) {
79                                                 chomp;
80                                                 my $email = $_;
81                                                 my $number = $1 if $email =~ s{\s+(?:\+385|0)([0-9]+)$}{};
82                                                 $number = '+385' . $number;
83
84                                                 print ts,"ALERT $email\n";
85
86                                                 open(my $s, '|-', '/usr/sbin/sendmail -t');
87                                                 print $s "From: Senzori Alert <alert\@senzori.subvision.hr>\nTo: $email\nSubject: alert $name $time\n\n$msg\n\n" . dump($row) . "\n.\n";
88                                                 close($s);
89
90                                                 my $cmd = "ssh -p 22022 -i /home/dpavlin/.ssh/sendsms_rsa asterisk\@192.168.200.240 $number $msg";
91                                                 print ts,"## $cmd\n";
92                                                 system $cmd;
93                                         }
94                                 } else {
95                                         print ts,"SKIP ALERT $pn already sent\n";
96                                 }
97                         }
98                 }
99         }
100 }
101