package FS::part_export::phone_sqlopensips; use vars qw(@ISA @EXPORT_OK %info %options); use Exporter; use Tie::IxHash; use FS::Record qw( dbh qsearch qsearchs ); use FS::part_export; use FS::svc_phone; use FS::export_svc; use LWP::UserAgent; use FS::DBI; @ISA = qw(FS::part_export); tie %options, 'Tie::IxHash', 'datasrc' => { label=>'DBI data source ' }, 'username' => { label=>'Database username' }, 'password' => { label=>'Database password' }, 'xmlrpc_url' => { label=>'XMLRPC URL' }, # XXX: in future, add non-agent-virtualized config, i.e. per-export setting of gwlist, routeid, description, etc. # and/or setting description from the phone_name column ; %info = ( 'svc' => 'svc_phone', 'desc' => 'Export DIDs to OpenSIPs dr_rules table', 'options' => \%options, 'no_machine' => 1, 'notes' => 'Export DIDs to OpenSIPs dr_rules table', ); sub rebless { shift; } sub _export_insert { my($self, $svc_x) = (shift, shift); my $conf = new FS::Conf; my $agentnum = $svc_x->cust_svc->cust_pkg->cust_main->agentnum || 0; my $gwlist = $conf->config('opensips_gwlist',$agentnum) || ''; my $description = $conf->config('opensips_description',$agentnum) || ''; my $route = $conf->config('opensips_route',$agentnum) || ''; my $dbh = $self->opensips_connect; my $sth = $dbh->prepare("insert into dr_rules ". "( groupid, prefix, timerec, routeid, gwlist, description ) ". " values ( ?, ?, ?, ?, ?, ? )") or die $dbh->errstr; $sth->execute('0',$svc_x->phonenum,'',$route,$gwlist,$description) or die $sth->errstr; $dbh->disconnect; $self->dr_reload; # XXX: if this fails, do we delete what we just inserted? } sub opensips_connect { my $self = shift; FS::DBI->connect($self->option('datasrc'),$self->option('username'), $self->option('password')) or die $FS::DBI::errstr; } sub _export_replace { ''; } sub _export_suspend { my( $self, $svc_phone ) = (shift, shift); ''; } sub _export_unsuspend { my( $self, $svc_phone ) = (shift, shift); ''; } sub _export_delete { my( $self, $svc_x ) = (shift, shift); my $dbh = $self->opensips_connect; my $sth = $dbh->prepare("delete from dr_rules where prefix = ?") or die $dbh->errstr; $sth->execute($svc_x->phonenum) or die $sth->errstr; $dbh->disconnect; $self->dr_reload; # XXX: if this fails, do we re-insert what we just deleted? } sub dr_reload { my $self = shift; my $reqxml = " dr_reload "; my $ua = LWP::UserAgent->new; my $resp = $ua->post( $self->option('xmlrpc_url'), Content_Type => 'text/xml', Content => $reqxml ); return "invalid HTTP response from OpenSIPS: " . $resp->status_line unless $resp->is_success; ''; } 1;