rewrite CDRs for forwarded Asterisk calls to be billable, RT#3196
[freeside.git] / FS / bin / freeside-cdrrewrited
1 #!/usr/bin/perl -w
2
3 use strict;
4 use vars qw( $conf );
5 use FS::Daemon ':all'; #daemonize1 drop_root daemonize2 myexit logfile sig*
6 use FS::UID qw( adminsuidsetup );
7 use FS::Record qw( qsearch ); #qsearchs);
8 #use FS::cdr;
9 #use FS::cust_pkg;
10 #use FS::queue;
11
12 my $user = shift or die &usage;
13
14 #daemonize1('freeside-sprepaidd', $user); #keep unique pid files w/multi installs
15 daemonize1('freeside-cdrrewrited');
16
17 drop_root();
18
19 adminsuidsetup($user);
20
21 logfile( "%%%FREESIDE_LOG%%%/cdrrewrited-log.". $FS::UID::datasrc );
22
23 daemonize2();
24
25 $conf = new FS::Conf;
26
27 die "not running; cdr-asterisk_forward_rewrite conf is off\n"
28   unless _shouldrun();
29
30 #--
31
32 my $domestic_prefix = 1; #hmm, global config?
33
34 while (1) {
35
36   #hmm... don't want to do an expensive search with an ever-growing bunch
37   # of unprocessed CDRs during the month... better to mark them all as
38   # rewritten "skipped", i.e. why we're a daemon in the first place
39   # instead of just doing this search like normal CDRs
40
41   my $found = 0;
42   foreach my $cdr ( 
43     qsearch( {
44       'table'     => 'cdr',
45       'extra_sql' => 'FOR UPDATE',
46       'hashref'   => {},
47       'extra_sql' => 'WHERE freesidestatus IS NULL'.
48                      ' AND freesiderewritestatus IS NULL'.
49                      ' LIMIT 1024', #arbitrary, but don't eat too much memory
50     } )
51   ) {
52
53     $found = 1;
54
55     if ( $cdr->dstchannel =~ /^Local\/($domestic_prefix)?(\d+)/i
56          && $2 ne $cdr->dst
57        )
58     {
59
60       my $dst = $2;
61
62       warn "dst ". $cdr->dst. " does not match dstchannel $dst ".
63            "(". $cdr->dstchannel. "); rewriting CDR as a forwarded call";
64
65       $cdr->charged_party($cdr->dst);
66       $cdr->dst($dst);
67       $cdr->amaflags(2);
68
69       $cdr->freesiderewritestatus('asterisk_forward');
70
71     } else {
72       $cdr->freesiderewritestatus('skipped')
73     }
74
75     my $error = $cdr->replace;
76
77     if ( $error ) {
78       warn "WARNING: error rewriting CDR (will retry in 30 seconds):".
79            " $error\n";
80       sleep 30; #i dunno, wait and see if the database comes back?
81     }
82
83   }
84
85   myexit() if sigterm() || sigint();
86   #sleep 1 unless $found;
87   sleep 5 unless $found;
88
89 }
90
91 #--
92
93 sub _shouldrun {
94   $conf->exists('cdr-asterisk_forward_rewrite');
95 }
96
97 sub usage { 
98   die "Usage:\n\n  freeside-cdrrewrited user\n";
99 }
100
101 =head1 NAME
102
103 freeside-cdrrewrited - Real-time daemon for CDR rewriting
104
105 =head1 SYNOPSIS
106
107   freeside-cdrrewrited
108
109 =head1 DESCRIPTION
110
111 Runs continuously, searches for CDRs and does forwarded-call rewriting if
112 the "cdr-asterisk_forward_rewrite" option is enabled.
113
114 =head1 SEE ALSO
115
116 =cut
117
118 1;