From 08cf05e4cb9a5367eae210205e38ce33a871b9e7 Mon Sep 17 00:00:00 2001 From: Ivan Kohler Date: Sun, 27 Jul 2014 12:29:12 -0700 Subject: [PATCH] status, RT#30241 --- FS/FS/Mason.pm | 2 + httemplate/elements/menu.html | 3 + httemplate/view/Status.html | 131 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 136 insertions(+) create mode 100644 httemplate/view/Status.html diff --git a/FS/FS/Mason.pm b/FS/FS/Mason.pm index 7c9dad65d..2db693627 100644 --- a/FS/FS/Mason.pm +++ b/FS/FS/Mason.pm @@ -85,6 +85,7 @@ if ( -e $addl_handler_use_file ) { use IO::File; use IO::Scalar; use IO::String; + use File::Slurp qw( slurp ); #not actually using this yet anyway...# use IPC::Run3 0.036; use Net::Whois::Raw qw(whois); if ( $] < 5.006 ) { @@ -362,6 +363,7 @@ if ( -e $addl_handler_use_file ) { use FS::sched_avail; use FS::export_batch; use FS::export_batch_item; + use FS::queue_stat; # Sammath Naur if ( $FS::Mason::addl_handler_use ) { diff --git a/httemplate/elements/menu.html b/httemplate/elements/menu.html index 78388bfc8..8355d7a2c 100644 --- a/httemplate/elements/menu.html +++ b/httemplate/elements/menu.html @@ -493,6 +493,9 @@ $tools_menu{'Importing'} = [ \%tools_importing, 'Import tools' ] if $curuser->access_right('Import'); $tools_menu{'Exporting'} = [ \%tools_exporting, 'Export tools' ] if $curuser->access_right('Export'); +$tools_menu{'Status'} = [ $fsurl.'view/Status.html', 'System status' ] + if $curuser->access_right('Configuration'); # 'View system status'); + tie my %config_employees, 'Tie::IxHash', 'Employees' => [ $fsurl.'browse/access_user.html', 'Setup internal users' ], diff --git a/httemplate/view/Status.html b/httemplate/view/Status.html new file mode 100644 index 000000000..019470eb9 --- /dev/null +++ b/httemplate/view/Status.html @@ -0,0 +1,131 @@ +<& /elements/header.html &> +% foreach my $section ( keys %status ) { +<% mt($section) |h %> + +% foreach my $item ( @{ $status{$section} } ) { + + + +% } +
<% $item->{title} %> + <% $item->{value} %>
+

+% } +<& /elements/footer.html &> +<%init> + +my $os; +-e '/usr/bin/lsb_release' and run( ['lsb_release', '-d'], '>',\$os ); +if ( ! $@ && $os =~ /^\s*Description:\s*(.+)$/ ) { + $os = $1; +} elsif ( my $deb_version = slurp('/etc/debian_version') ) { + $os = "Debian $deb_version"; +} + +( my $perl_ver = $^V ) =~ s/^v//; + +my $db = driver_name; +$db = 'PostgreSQL' if $db =~ /^Pg/; +$db = 'MySQL' if $db =~ /^mysql/; + +my $db_ver = FS::Record->scalar_sql('SELECT VERSION()'); +if ( $db eq 'PostgreSQL' && $db_ver =~ /^\s*PostgreSQL\s+([\w\.]+)\s+on\s+/ ) { + $db_ver = $1; +} + +tie my %status, 'Tie::IxHash', + 'Basics' => [ + { 'title' => 'Freeside version', + 'value' => $FS::VERSION, + }, + { 'title' => 'Operating System', + 'value' => $os, + }, + { 'title' => 'Perl version', + 'value' => $perl_ver, + }, + { 'title' => 'Database engine', + 'value' => $db, + }, + { 'title' => 'Database version', + 'value' => $db_ver, + }, + ], + 'Required Daemons' => [ + { 'title' => 'Queue daemon', + 'value' => _is_running('queued') ? 'Running' : 'Not running', + }, + ], + 'Optional Daemons' => [ + { 'title' => 'Self-service server(s)', + 'value' => '(Not checked)', #XXX multiple pid files, per machine etc + }, + { 'title' => 'Self-service XML-RPC server', + 'value' => _is_running('selfservice-xmlrpcd') ? 'Running' : 'Not running', + }, + { 'title' => 'Back office XML-RPC server', + 'value' => _is_running('xmlrpcd') ? 'Running' : 'Not running', + }, + { 'title' => 'RADIUS accounting import daemon', + 'value' => _is_running('sqlradius-radacctd') ? 'Running' : 'Not running', + }, + { 'title' => 'Prepaid daemon', + 'value' => _is_running('prepaidd') ? 'Running' : 'Not running', + }, + { 'title' => 'CDR Rewrite daemon', + 'value' => _is_running('cdrrewrited') ? 'Running' : 'Not running', + }, + { 'title' => 'CDR Prepaid daemon', + 'value' => _is_running('cdrd') ? 'Running' : 'Not running', + }, + { 'title' => 'CDR Real-time rating daemon', + 'value' => _is_running('cdrrated') ? 'Running' : 'Not running', + }, + #{ 'title' => 'Network monitoring port combiner', #? + # 'value' => _is_running('torrus-srvderive') ? 'Running' : 'Not running', + #}, + ], +; + +if ( _is_running('cdrd') ) { + + my $delay = FS::Record->scalar_sql(' + SELECT AVG(end_date-insert_date) + FROM queue_stat + GROUP BY statnum + ORDER BY statnum DESC + LIMIT 100 + '); + if ( $delay ) { + my $h = int($delay/3600); + my $m = int( ($delay%3600) / 60 ); + my $s = $delay%60; + + $delay = ( $h ? $h. 'h' : '' ). + ( $h||$m ? $m. 'm' : ''). + $s. 's'; + + } + + $status{'CDR Processing'} = [ + { 'title' => 'Current processing delay', + 'value' => $delay, + }, + ]; + +} + +sub _is_running { + my $thing = shift; + + my $pid_path = '/var/run'; #XXX hardcoded path + + my $pidfile = + -e "$pid_path/freeside/$thing.pid" ? "$pid_path/freeside/$thing.pid" : + -e "$pid_path/freeside-$thing.pid" ? "$pid_path/freeside-$thing.pid" : + return 0; + + -e $pidfile and kill 0, slurp($pidfile) +} + + -- 2.11.0