diff --git a/etc/admin.conf b/etc/admin.conf index 304cb0b..96c11b9 100644 --- a/etc/admin.conf +++ b/etc/admin.conf @@ -21,6 +21,11 @@ product_features="0" numberblock_features="0" lnp_features="0" + [% IF voisniff.admin_panel == "yes" %] + voisniff_features="1" + [% ELSE %] + voisniff_features="0" + [% END %] cc_dial_prefix="[% www_admin.cc_dial_prefix %]" ac_dial_prefix="[% www_admin.ac_dial_prefix %]" voicebox_domain="[% ossbss.provisioning.routing.voicebox_domain %]" diff --git a/lib/admin/Controller/subscriber.pm b/lib/admin/Controller/subscriber.pm index b6724a8..8c82e81 100644 --- a/lib/admin/Controller/subscriber.pm +++ b/lib/admin/Controller/subscriber.pm @@ -1312,6 +1312,62 @@ sub call_data : Local { return; } +sub sipstats : Local { + my ( $self, $c ) = @_; + $c->stash->{template} = 'tt/subscriber_sipstats.tt'; + + my $subscriber_id = $c->request->params->{subscriber_id}; + my $subscriber; + return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber_by_id', + { subscriber_id => $subscriber_id }, + \$subscriber + ); + $c->stash->{subscriber} = $subscriber; + $c->stash->{subscriber}{subscriber_id} = $subscriber_id; + + my $calls; + return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber_sipstat_calls', + { username => $$subscriber{username}, + domain => $$subscriber{domain}, + }, + \$calls + ); + $c->stash->{calls} = $calls; + + return; +} + +sub sipstats_pcap : Local { + my ( $self, $c ) = @_; + + $c->stash->{template} = 'tt/subscriber_sipstats.tt'; + my $subscriber_id = $c->request->params->{subscriber_id}; + my $callid = $c->request->params->{callid}; + my $subscriber; + return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber_by_id', + { subscriber_id => $subscriber_id }, + \$subscriber + ); + $c->stash->{subscriber} = $subscriber; + $c->stash->{subscriber}{subscriber_id} = $subscriber_id; + + my $packets; + return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber_sipstat_packets', + { username => $$subscriber{username}, + domain => $$subscriber{domain}, + callid => $callid, + }, + \$packets + ); + my $pcap = admin::Utils::generate_pcap($packets); + my $filename = $callid . '.pcap'; + $c->stash->{current_view} = 'Plain'; + $c->stash->{content_type} = 'application/octet-stream'; + $c->stash->{content_disposition} = qq[attachment; filename="$filename"]; + $c->stash->{content} = eval { $pcap }; + return; +} + sub edit_cf : Local { my ( $self, $c ) = @_; $c->stash->{template} = 'tt/subscriber_callforward.tt'; @@ -1669,8 +1725,6 @@ sub edit_cf_updatepriority : Local { return; } -# fooooooooo - sub edit_cf_times : Local { my ( $self, $c ) = @_; $c->stash->{template} = 'tt/subscriber_callforward_times.tt'; @@ -1822,8 +1876,6 @@ sub edit_cf_times_createset : Local { $c->response->redirect("/subscriber/edit_cf_times?subscriber_id=$subscriber_id"); } -# fooooo - sub edit_cf_times_saveperiod : Local { my ( $self, $c ) = @_; $c->stash->{template} = 'tt/subscriber_callforward_times.tt'; diff --git a/lib/admin/Utils.pm b/lib/admin/Utils.pm index 73936b0..ced2b31 100644 --- a/lib/admin/Utils.pm +++ b/lib/admin/Utils.pm @@ -557,4 +557,40 @@ sub tz_offset { return $tz_offset->{offset} ; } +=head2 generate_pcap + +Returns pcap data from packets + +=cut + +sub generate_pcap { + my $packets = shift; + + my $pcap = pack("LSSlLLL", + 0xa1b2c3d4, # magic number + 2, 4, # major/minor version number + 0, 0, # gmt offset and timestamp accuracy + 0xffff, # snap length + 192, # data link type (http://www.tcpdump.org/linktypes.html) + ); + + foreach my $pkg(@{$packets}) { + my($ts_sec, $ts_usec) = $pkg->{timestamp} =~ /^(\d+)\.(\d+)$/; + my $packet_type = 1; + $pkg->{was_fragmented} and $packet_type = 101; + my $ppi = pack("CCvV", 0, 0, 8, $packet_type); + my $len = length($pkg->{header}) + length($pkg->{payload}) + length($pkg->{trailer}) + length($ppi); + + $pcap .= pack("LLLLa*a*a*a*", + $ts_sec, $ts_usec, # timestamp + $len, $len, # bytes on-wire/off-wire + $ppi, + $pkg->{header}, + $pkg->{payload}, + $pkg->{trailer}, + ); + } + return $pcap; +} + 1; diff --git a/lib/admin/View/Binary.pm b/lib/admin/View/Binary.pm index c2d3928..1696b88 100644 --- a/lib/admin/View/Binary.pm +++ b/lib/admin/View/Binary.pm @@ -22,6 +22,8 @@ sub process { my ( $self, $c ) = @_; $c->response->content_type($c->stash->{content_type}); + $c->res->header('Content-Disposition', $c->stash->{content_disposition}) + if(defined $c->stash->{content_disposition}); $c->response->body($c->stash->{content}); return 1; diff --git a/lib/admin/View/Plain.pm b/lib/admin/View/Plain.pm index ced3896..29f8a51 100644 --- a/lib/admin/View/Plain.pm +++ b/lib/admin/View/Plain.pm @@ -22,6 +22,8 @@ sub process { my ( $self, $c ) = @_; $c->response->content_type($c->stash->{content_type}); + $c->res->header('Content-Disposition', $c->stash->{content_disposition}) + if(defined $c->stash->{content_disposition}); $c->response->body($c->stash->{content}); return 1; diff --git a/root/tt/subscriber_call_data.tt b/root/tt/subscriber_call_data.tt index 52da5b3..1bc42f5 100644 --- a/root/tt/subscriber_call_data.tt +++ b/root/tt/subscriber_call_data.tt @@ -10,6 +10,9 @@ [% IF Catalyst.session.admin.call_data %]
  • CDRs
  • [% END %] + [% IF Catalyst.config.voisniff_features %] +
  • SIP Stats
  • + [% END %]
    diff --git a/root/tt/subscriber_detail.tt b/root/tt/subscriber_detail.tt index e7fbebb..889d170 100644 --- a/root/tt/subscriber_detail.tt +++ b/root/tt/subscriber_detail.tt @@ -11,6 +11,9 @@ [% IF Catalyst.session.admin.call_data %]
  • CDRs
  • [% END %] + [% IF Catalyst.config.voisniff_features %] +
  • SIP Stats
  • + [% END %]
    diff --git a/root/tt/subscriber_preferences.tt b/root/tt/subscriber_preferences.tt index c8da8cc..ea69c3f 100644 --- a/root/tt/subscriber_preferences.tt +++ b/root/tt/subscriber_preferences.tt @@ -11,6 +11,9 @@ [% IF Catalyst.session.admin.call_data %]
  • CDRs
  • [% END %] + [% IF Catalyst.config.voisniff_features %] +
  • SIP Stats
  • + [% END %]
    diff --git a/root/tt/subscriber_sipstats.tt b/root/tt/subscriber_sipstats.tt new file mode 100644 index 0000000..8cfbd94 --- /dev/null +++ b/root/tt/subscriber_sipstats.tt @@ -0,0 +1,41 @@ +

    Subscriber + + [% subscriber.username %]@[% subscriber.domain %] +

    + +
    + +
    +
    + +

    Captured Call-IDs

    + +