+sub ddx2hash {
+ my $self = shift;
+ my $ddx_xml = slurp($ddxfile);
+ my $xs = new XML::Simple(RootName=> undef, SuppressEmpty => '',
+ ForceArray => 1, );
+ return $xs->XMLin($ddx_xml);
+}
+
+sub get_router_serviceids {
+ my $self = shift;
+ my $router = shift;
+ my $find_serviceid = shift;
+ my $found_serviceid = 0;
+ my $ddx_hash = $self->ddx2hash;
+ return '' unless $ddx_hash->{'host'};
+
+ my @hosts = @{$ddx_hash->{host}};
+ foreach my $host ( @hosts ) {
+ my $param = $host->{param};
+ if($param && $param->{'snmp-host'}
+ && (!$router || $param->{'snmp-host'}->{'value'} eq $router)
+ && $param->{'RFC2863_IF_MIB::external-serviceid'}) {
+ my $serviceids =
+ $param->{'RFC2863_IF_MIB::external-serviceid'}->{'content'};
+ my %hash = ();
+ if ($serviceids) {
+ my @serviceids = split(',',$serviceids);
+ foreach my $serviceid ( @serviceids ) {
+ $serviceid =~ s/^\s+|\s+$//g;
+ my @s = split(':',$serviceid);
+ next unless scalar(@s) == 4;
+ $hash{$s[1]} = $s[0] if $router;
+ if ($find_serviceid && $find_serviceid eq $s[0]) {
+ $hash{$param->{'snmp-host'}->{'value'}} = $s[1];
+ $found_serviceid = 1;
+ }
+ }
+ }
+ return \%hash if ($router || $found_serviceid);
+ }
+ }
+ '';
+}
+
+#false laziness and probably should be merged w/above, but didn't want to mess
+# that up
+sub all_router_serviceids {
+ my $self = shift;
+ my $ddx_hash = $self->ddx2hash;
+ return () unless $ddx_hash->{'host'};
+
+ my %hash = ();
+ my @hosts = @{$ddx_hash->{host}};
+ foreach my $host ( @hosts ) {
+ my $param = $host->{param};
+ if($param && $param->{'snmp-host'}
+ && $param->{'RFC2863_IF_MIB::external-serviceid'}) {
+ my $serviceids =
+ $param->{'RFC2863_IF_MIB::external-serviceid'}->{'content'};
+ if ($serviceids) {
+ my @serviceids = split(',',$serviceids);
+ foreach my $serviceid ( @serviceids ) {
+ $serviceid =~ s/^\s+|\s+$//g;
+ my @s = split(':',$serviceid);
+ next unless scalar(@s) == 4;
+ $hash{$s[0]}=1;
+ }
+ }
+ }
+ }
+ return sort keys %hash;
+}
+
+sub port_graphs_link {
+ # hardcoded for 'main' tree for now
+ my $self = shift;
+ my $serviceid = shift;
+ my $hash = $self->get_router_serviceids(undef,$serviceid) or return '';
+ my @keys = keys %$hash; # yeah this is weird...
+ my $host = $keys[0];
+ my $iface = $hash->{$keys[0]};
+
+ #Torrus::ConfigTree is only available when running under the web UI
+ eval 'use Torrus::ConfigTree;';
+ die $@ if $@;
+
+ my $config_tree = new Torrus::ConfigTree( -TreeName => 'main' );
+ my $token = $config_tree->token("/Routers/$host/Interface_Counters/$iface/InOut_bps");
+ return $Torrus::Freeside::FSURL."/torrus/main?token=$token";
+}
+
+sub find_svc {
+ my $self = shift;
+ my $serviceid = shift;
+ return '' unless $serviceid =~ /^[0-9A-Za-z_\-.\\\/ ]+$/;
+
+ my @svc_port = qsearch('svc_port', { 'serviceid' => $serviceid });
+ return '' unless scalar(@svc_port);
+
+ # for now it's like this, later on just change to qsearchs
+
+ return $svc_port[0];
+}
+
+sub find_torrus_srvderive_component {
+ my $self = shift;
+ my $serviceid = shift;
+ return '' unless $serviceid =~ /^[0-9A-Za-z_\-.\\\/ ]+$/;
+
+ qsearchs('torrus_srvderive_component', { 'serviceid' => $serviceid });
+}
+
+sub report {
+ my $self = shift;
+
+ my @ls = localtime(time);
+ my ($d,$m,$y) = ($ls[3], $ls[4]+1, $ls[5]+1900);
+ if ( $ls[3] == 1 ) {
+ $m--;
+ if ($m == 0) { $m=12; $y-- }
+ #i should have better error checking
+ system('torrus', 'report', '--report=MonthlyUsage', "--date=$y-$m-01");
+ system('torrus', 'report', '--genhtml', '--all2tree=main');
+ }
+
+}
+