Implement basic sipstats feature.

3.3
Andreas Granig 15 years ago
parent 65a7666c85
commit d37661d41d

@ -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 %]"

@ -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';

@ -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;

@ -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;

@ -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;

@ -10,6 +10,9 @@
[% IF Catalyst.session.admin.call_data %]
<li class="selected"><a href="call_data?subscriber_id=[% subscriber.subscriber_id %]"><span>CDRs</span></a></li>
[% END %]
[% IF Catalyst.config.voisniff_features %]
<li><a href="sipstats?subscriber_id=[% subscriber.subscriber_id %]"><span>SIP Stats</span></a></li>
[% END %]
</ul>
</div>
<div class="topsubmenudivider"> </div>

@ -11,6 +11,9 @@
[% IF Catalyst.session.admin.call_data %]
<li><a href="call_data?subscriber_id=[% subscriber.subscriber_id %]"><span>CDRs</span></a></li>
[% END %]
[% IF Catalyst.config.voisniff_features %]
<li><a href="sipstats?subscriber_id=[% subscriber.subscriber_id %]"><span>SIP Stats</span></a></li>
[% END %]
</ul>
</div>
<div class="topsubmenudivider"> </div>

@ -11,6 +11,9 @@
[% IF Catalyst.session.admin.call_data %]
<li><a href="call_data?subscriber_id=[% subscriber.subscriber_id %]"><span>CDRs</span></a></li>
[% END %]
[% IF Catalyst.config.voisniff_features %]
<li><a href="sipstats?subscriber_id=[% subscriber.subscriber_id %]"><span>SIP Stats</span></a></li>
[% END %]
</ul>
</div>
<div class="topsubmenudivider"> </div>

@ -0,0 +1,41 @@
<h3> Subscriber
<a class="noarrow" href="detail?subscriber_id=[% subscriber.subscriber_id %]">
[% subscriber.username %]@[% subscriber.domain %]</a>
</h3>
<div class="topsubmenu">
<ul>
<li><a href="detail?subscriber_id=[% subscriber.subscriber_id %]"><span>User</span></a></li>
<li><a href="preferences?subscriber_id=[% subscriber.subscriber_id %]"><span>Preferences</span></a></li>
[% IF Catalyst.session.admin.call_data %]
<li><a href="call_data?subscriber_id=[% subscriber.subscriber_id %]"><span>CDRs</span></a></li>
[% END %]
[% IF Catalyst.config.voisniff_features %]
<li class="selected"><a href="sipstats?subscriber_id=[% subscriber.subscriber_id %]"><span>SIP Stats</span></a></li>
[% END %]
</ul>
</div>
<div class="topsubmenudivider"> </div>
<h3 id="calldata">Captured Call-IDs</h3>
<ul class="cleanlist">
[% IF !calls.defined || calls.size == 0 %]
<li class="ui-state-default">
<div class="span-14">No Call-IDs found.</div>
</li>
[% ELSE %]
<li class="ui-state-default">
<div class="span-4">Timestamp</div>
<div class="span-10">Call-ID</div>
<div class="span-2 last">Method</div>
</li>
[% END %]
[% FOREACH call IN calls %]
<li class="ui-state-default">
<div class="span-4">[% call.timestamp %]</div>
<div class="span-10"><a href="sipstats_pcap?subscriber_id=[% subscriber.subscriber_id %]&callid=[% call.call_id %]">[% IF call.call_id.length > 50 %][% call.call_id.substr(0, 50) %]...[% ELSE %][% call.call_id %][% END %]</a></div>
<div class="span-2 last">[% call.method %]</div>
</li>
[% END %]
</ul>
Loading…
Cancel
Save