fix status page
[freeside.git] / httemplate / view / Status.html
1 <& /elements/header.html &>
2 % foreach my $section ( keys %status ) {
3 <FONT CLASS="fsinnerbox-title"><% mt($section) |h %></FONT>
4 <TABLE CLASS="fsinnerbox">
5 %   foreach my $item ( @{ $status{$section} } ) {
6       <TR>
7         <TD ALIGN="right"><% $item->{title} %></TH>
8         <TD><B><% $item->{value} %></B></TD>
9       </TR>
10 %   }
11 </TABLE>
12 <BR><BR>
13 % }
14 <& /elements/footer.html &>
15 <%init>
16
17 my $os;
18 -e '/usr/bin/lsb_release' and run( ['lsb_release', '-d'], '>',\$os );
19 if ( ! $@ && $os =~ /^\s*Description:\s*(.+)$/ ) {
20   $os = $1;
21 } elsif ( my $deb_version = slurp('/etc/debian_version') ) {
22   $os = "Debian $deb_version";
23 }
24
25 ( my $perl_ver = $^V ) =~ s/^v//;
26
27 my $db = driver_name;
28 $db = 'PostgreSQL' if $db =~ /^Pg/;
29 $db = 'MySQL'      if $db =~ /^mysql/;
30
31 my $db_ver = FS::Record->scalar_sql('SELECT VERSION()');
32 if ( $db eq 'PostgreSQL' && $db_ver =~ /^\s*PostgreSQL\s+([\w\.]+)\s+on\s+/ ) {
33   $db_ver = $1;
34 }
35
36 tie my %status, 'Tie::IxHash',
37   'Basics' => [
38     { 'title' => 'Freeside version',
39       'value' => $FS::VERSION,
40     },
41     { 'title' => 'Operating System',
42       'value' => $os,
43     },
44     { 'title' => 'Perl version',
45       'value' => $perl_ver,
46     },
47     { 'title' => 'Database engine',
48       'value' => $db,
49     },
50     { 'title' => 'Database version',
51       'value' => $db_ver,
52     },
53   ],
54   'Required Daemons' => [
55     { 'title' => 'Queue daemon',
56       'value' => _is_running('queued') ? 'Running' : 'Not running',
57     },
58   ],
59   'Optional Daemons' => [
60     { 'title' => 'Self-service server(s)',
61       'value' => '(Not checked)', #XXX multiple pid files, per machine etc
62     },
63     { 'title' => 'Self-service XML-RPC server',
64       'value' => _is_running('selfservice-xmlrpcd') ? 'Running' : 'Not running',
65     },
66     { 'title' => 'Back office XML-RPC server',
67       'value' => _is_running('xmlrpcd') ? 'Running' : 'Not running',
68     },
69     { 'title' => 'RADIUS accounting import daemon',
70       'value' => _is_running('sqlradius-radacctd') ? 'Running' : 'Not running',
71     },
72     { 'title' => 'Prepaid daemon',
73       'value' => _is_running('prepaidd') ? 'Running' : 'Not running',
74     },
75     { 'title' => 'CDR Rewrite daemon',
76       'value' => _is_running('cdrrewrited') ? 'Running' : 'Not running',
77     },
78     { 'title' => 'CDR Prepaid daemon',
79       'value' => _is_running('cdrd') ? 'Running' : 'Not running',
80     },
81     { 'title' => 'CDR Real-time rating daemon',
82       'value' => _is_running('cdrrated') ? 'Running' : 'Not running',
83     },
84     #{ 'title' => 'Network monitoring port combiner', #?
85     #  'value' => _is_running('torrus-srvderive') ? 'Running' : 'Not running',
86     #},
87   ],
88 ;
89
90 if ( _is_running('cdrd') ) {
91
92   my $delay = FS::Record->scalar_sql('
93     SELECT AVG(end_date-insert_date)
94       FROM queue_stat
95       GROUP BY statnum
96       ORDER BY statnum DESC
97       LIMIT 100
98   ');
99   if ( $delay ) {
100     my $h = int($delay/3600);
101     my $m = int( ($delay%3600) / 60 );
102     my $s = $delay%60;
103
104     $delay = ( $h     ? $h. 'h' : '' ).
105              ( $h||$m ? $m. 'm' : '').
106                         $s. 's';
107
108   }
109   $status{'CDR Processing'} = [
110     { 'title' => 'Current processing delay',
111       'value' => $delay,
112     },
113   ];
114
115   my $pr_delay = FS::Record->scalar_sql('
116     SELECT AVG(end_date-start_date)
117       FROM queue_stat
118       GROUP BY statnum
119       ORDER BY statnum DESC
120       LIMIT 100
121   ');
122   if ( $pr_delay ) {
123     my $h = int($delay/3600);
124     my $m = int( ($delay%3600) / 60 );
125     my $s = $delay%60;
126
127     $pr_delay = ( $h     ? $h. 'h' : '' ).
128                 ( $h||$m ? $m. 'm' : '').
129                            $s. 's';
130
131   }
132   $status{'CDR Processing'} = [
133     { 'title' => 'Average billing time',
134       'value' => $pr_delay,
135     },
136   ];
137
138   my $dayago = time2str('%Y-%m-$d %X', time - 86400);
139   my $cdrs = FS::Record->scalar_sql(qq{
140     SELECT COUNT(*) FROM cdr
141       WHERE ( freesidestatus IS NULL OR freesidestatus = '' )
142         AND calldate > '$dayago'
143   });
144   $status{'CDR Processing'} = [
145     { 'title' => 'Unprocessed CDRs (last 24 hours)',
146       'value' => $cdrs,
147     },
148   ];
149
150 }
151
152 sub _is_running {
153   my $thing = shift;
154
155   my $pid_path = '/var/run'; #XXX hardcoded path
156
157   my $pidfile =
158     -e "$pid_path/freeside/$thing.pid" ? "$pid_path/freeside/$thing.pid" :
159     -e "$pid_path/freeside-$thing.pid" ? "$pid_path/freeside-$thing.pid" :
160    return 0;
161
162   -e $pidfile and kill 0, slurp($pidfile)
163 }
164
165 </%init>