File Coverage

blib/lib/Siebel/Srvrmgr/ListParser/Output/Tabular/ListSessions.pm
Criterion Covered Total %
statement 70 83 84.3
branch 16 22 72.7
condition 4 6 66.6
subroutine 12 14 85.7
pod 5 5 100.0
total 107 130 82.3


line stmt bran cond sub pod time code
1             package Siebel::Srvrmgr::ListParser::Output::Tabular::ListSessions;
2              
3 3     3   6771 use Moose 2.0401;
  3         87  
  3         33  
4 3     3   30558 use namespace::autoclean 0.13;
  3         104  
  3         36  
5 3     3   352 use Carp qw(cluck);
  3         10  
  3         276  
6 3     3   25 use Siebel::Srvrmgr::Regexes qw(SIEBEL_SERVER);
  3         9  
  3         3397  
7             our $VERSION = '0.29'; # VERSION
8              
9             =pod
10              
11             =head1 NAME
12              
13             Siebel::Srvrmgr::ListParser::Output::Tabular::ListSessions - subclass to parse list tasks command
14              
15             =cut
16              
17             extends 'Siebel::Srvrmgr::ListParser::Output::Tabular';
18              
19             =pod
20              
21             =head1 SYNOPSIS
22              
23             See L<Siebel::Srvrmgr::ListParser::Output::Tabular> for examples.
24              
25             =head1 DESCRIPTION
26              
27             This subclass of L<Siebel::Srvrmgr::ListParser::Output::Tabular> parses the output of the command C<list sessions>.
28              
29             It is expected that the C<srvrmgr> program has a proper configuration for the C<list sessions> command. The default configuration
30             can be seen below:
31              
32             srvrmgr:> configure list sessions
33             SV_NAME (31): Server name
34             CC_ALIAS (31): Component alias
35             CG_ALIAS (31): Component group alias
36             TK_TASKID (11): Internal task id
37             TK_PID (11): Task process id
38             TK_DISP_RUNSTATE (61): Task run once
39             TK_IDLE_STATE (31): Task idle or not
40             TK_PING_TIME (13): Last ping time for task
41             TK_HUNG_STATE (31): Task hung state
42             DB_SESSION_ID (76): Database session Id
43             OM_LOGIN (76): Object Manager Login
44             OM_BUSSVC (76): OM - Business Service
45             OM_VIEW (76): OM - View State
46             OM_APPLET (76): OM - Applet
47             OM_BUSCOMP (76): OM - Business Component
48              
49             Be sure to include this configuration when generating output, specially because the columns name width.
50              
51             The order of the fields is important too: everytime those fields are parsed, if they do not follow the order above an exception
52             will be raised.
53              
54             An instance of this class will also know how many sessions it has, independently of the sessions state. Since it cannot know which
55             string represents a session state, be sure to use the correct C<list sessions> variation to get the sessions that you're interested in.
56              
57             =cut
58              
59             has 'alias_sessions' => (
60             isa => 'HashRef',
61             is => 'ro',
62             reader => 'get_alias_sessions',
63             writer => '_set_alias_sessions'
64             );
65              
66             =pod
67              
68             =head1 METHODS
69              
70             Some methods from the parent classes are overrided.
71              
72             =head2 get_servers
73              
74             Returns a list of the Siebel Server names from the parsed output.
75              
76             =cut
77              
78             sub get_servers {
79              
80 2     2 1 25 my $self = shift;
81              
82 2         8 return keys( %{ $self->get_data_parsed() } );
  2         127  
83              
84             }
85              
86             =pod
87              
88             =head2 count_server_sessions
89              
90             Returns an integer representing the number of sessions recovered from the parsed output.
91              
92             Expects a string as parameter being the Siebel Server name, so the number of sessions are those related to the
93             server passed as argument.
94              
95             Beware that by number of sessions it means all sessions are the output, independent of the status of the session.
96              
97             =cut
98              
99             sub count_server_sessions {
100              
101 4     4 1 10127 my $self = shift;
102 4         15 my $server = shift;
103              
104 4         24 my $server_ref = $self->_assert_ses_server($server);
105              
106 2         5 return scalar( @{$server_ref} );
  2         16  
107              
108             }
109              
110             sub _assert_ses_server {
111              
112 6     6   19 my $self = shift;
113 6         15 my $server = shift;
114              
115 6 100 66     125 confess 'Siebel Server name parameter is required and must be valid'
116             unless ( ( defined($server) ) and ( $server =~ SIEBEL_SERVER ) );
117              
118 4         211 my $data_ref = $self->get_data_parsed();
119              
120             cluck "servername '$server' is not available in the output parsed"
121 4 50       23 unless ( exists( $data_ref->{$server} ) );
122              
123 4         14 return $data_ref->{$server};
124              
125             }
126              
127             =pod
128              
129             =head2 count_sv_alias_sessions
130              
131             Returns an integer representing the number of sessions retrieved from a C<list sessions> command output for a given
132             component alias in a server.
133              
134             Expects as parameters, in this order:
135              
136             =over
137              
138             =item
139              
140             servername
141              
142             =item
143              
144             component alias
145              
146             =back
147              
148             Beware that by number of sessions it means all sessions are the output, independent of the status of the session.
149              
150             =cut
151              
152             sub count_sv_alias_sessions {
153              
154 2     2 1 15 my $self = shift;
155 2         6 my $server = shift;
156 2         4 my $alias = shift;
157              
158 2         8 my $server_ref = $self->_assert_ses_server($server);
159              
160 2         84 my $alias_ref = $self->get_alias_sessions();
161              
162             cluck "$alias is not a valid component alias for server $server"
163 2 50       10 unless ( exists( $alias_ref->{$server}->{$alias} ) );
164              
165 2         9 return $alias_ref->{$server}->{$alias};
166              
167             }
168              
169             =pod
170              
171             =head2 count_alias_sessions
172              
173             Returns an integer representing the number of sessions retrieved from a C<list sessions> command output for a given
174             component alias. If multiple Siebel servers are available in the output, that will be the sum of all of them.
175              
176             Expects a component alias as parameter.
177              
178             Beware that by number of sessions it means all sessions in the output, independent of the status of the session.
179              
180             =cut
181              
182             sub count_alias_sessions {
183              
184 4     4 1 125 my $self = shift;
185 4         10 my $alias = shift;
186              
187 4 100 66     55 confess 'component alias is required and must be valid'
188             unless ( ( defined($alias) ) and ( $alias ne '' ) );
189              
190 2         99 my $aliases_ref = $self->get_alias_sessions;
191              
192 2         6 my $counter = 0;
193              
194 2         6 foreach my $server_name ( keys( %{$aliases_ref} ) ) {
  2         9  
195              
196             $counter += $aliases_ref->{$server_name}->{$alias}
197 2 50       12 if ( exists( $aliases_ref->{$server_name}->{$alias} ) );
198              
199             }
200              
201 2         11 return $counter;
202              
203             }
204              
205             =pod
206              
207             =head2 get_sessions
208              
209             Returns an iterator to iterate over the list of sessions of a Siebel Server given as argument.
210              
211             At each invocation of the iterator, a hash reference is returned or C<undef> in the case that there are no more sessions.
212              
213             The hash reference will have keys corresponding to the defined columns of the C<list sessions> command and the respective values:
214              
215             =over
216              
217             =item *
218              
219             comp_alias
220              
221             =item *
222              
223             comp_group_alias
224              
225             =item *
226              
227             task_id
228              
229             =item *
230              
231             task_pid
232              
233             =item *
234              
235             task_state
236              
237             =item *
238              
239             task_idle_state
240              
241             =item *
242              
243             task_ping_time
244              
245             =item *
246              
247             task_hung_state
248              
249             =item *
250              
251             db_session_id
252              
253             =item *
254              
255             om_login
256              
257             =item *
258              
259             om_service
260              
261             =item *
262              
263             om_view
264              
265             =item *
266              
267             om_applet
268              
269             =item *
270              
271             om_buscomp
272              
273             =back
274              
275             =cut
276              
277             sub get_sessions {
278              
279 0     0 1 0 my $self = shift;
280 0         0 my $server = shift;
281 0         0 my $counter = 0;
282              
283 0         0 my $server_ref = $self->_assert_ses_server($server);
284              
285 0         0 my $total = scalar( @{$server_ref} ) - 1;
  0         0  
286              
287             return sub {
288              
289 0 0   0   0 if ( $counter <= $total ) {
290              
291 0         0 my $fields_ref = $server_ref->[$counter];
292              
293 0         0 $counter++;
294              
295             return {
296 0         0 comp_alias => $fields_ref->[0],
297             comp_group_alias => $fields_ref->[1],
298             task_id => $fields_ref->[2],
299             task_pid => $fields_ref->[3],
300             task_state => $fields_ref->[4],
301             task_idle_state => $fields_ref->[5],
302             task_ping_time => $fields_ref->[6],
303             task_hung_state => $fields_ref->[7],
304             db_session_id => $fields_ref->[8],
305             om_login => $fields_ref->[9],
306             om_service => $fields_ref->[10],
307             om_view => $fields_ref->[11],
308             om_applet => $fields_ref->[12],
309             om_buscomp => $fields_ref->[13]
310             };
311              
312             }
313             else {
314              
315 0         0 return;
316              
317             }
318              
319             }
320 0         0 }
321              
322             sub _add_alias_ses {
323              
324 10944     10944   21938 my $self = shift;
325 10944         22641 my $server_name = shift;
326 10944         20866 my $alias = shift;
327              
328 10944         626525 my $aliases_ref = $self->get_alias_sessions;
329              
330 10944 100       30298 if ( defined($aliases_ref) ) {
331              
332 10921 100       37955 if ( exists( $aliases_ref->{$server_name} ) ) {
333              
334 852 100       2153 if ( exists( $aliases_ref->{$server_name}->{$alias} ) ) {
335              
336 799         2106 $aliases_ref->{$server_name}->{$alias}++;
337              
338             }
339             else {
340              
341 53         213 $aliases_ref->{$server_name}->{$alias} = 1;
342              
343             }
344              
345             }
346              
347             }
348             else {
349              
350 23         119 $aliases_ref->{$server_name}->{$alias} = 1;
351 23         1265 $self->_set_alias_sessions($aliases_ref);
352              
353             }
354              
355             }
356              
357             sub _consume_data {
358              
359 10944     10944   25108 my $self = shift;
360 10944         21977 my $fields_ref = shift;
361 10944         20827 my $parsed_ref = shift;
362              
363 10944         19740 my $list_len = scalar( @{$fields_ref} );
  10944         23044  
364              
365             # to avoid repeating the servername in the hash reference
366 10944         21101 my $server_name = shift( @{$fields_ref} );
  10944         26648  
367              
368             $parsed_ref->{$server_name} = []
369 10944 100       35098 unless ( exists( $parsed_ref->{$server_name} ) );
370              
371 10944         22347 my %alias_sessions;
372              
373 10944 50       19132 if ( @{$fields_ref} ) {
  10944         27743  
374              
375 10944         20534 push( @{ $parsed_ref->{$server_name} }, $fields_ref );
  10944         29663  
376 10944         39177 $self->_add_alias_ses($server_name, $fields_ref->[0]);
377              
378 10944         55613 return 1;
379              
380             }
381             else {
382              
383 0         0 return 0;
384              
385             }
386              
387             }
388              
389             sub _build_expected {
390              
391 23     23   91 my $self = shift;
392              
393 23         1288 $self->_set_expected_fields(
394             [
395             'SV_NAME', 'CC_ALIAS',
396             'CG_ALIAS', 'TK_TASKID',
397             'TK_PID', 'TK_DISP_RUNSTATE',
398             'TK_IDLE_STATE', 'TK_PING_TIME',
399             'TK_HUNG_STATE', 'DB_SESSION_ID',
400             'OM_LOGIN', 'OM_BUSSVC',
401             'OM_VIEW', 'OM_APPLET',
402             'OM_BUSCOMP'
403             ]
404             );
405              
406             }
407              
408             =pod
409              
410             =head1 CAVEATS
411              
412             Depending on the servers configurations, how output is being read, you might get truncated data from some fields if the
413             fixed width output type is being used.
414              
415             =head1 SEE ALSO
416              
417             =over
418              
419             =item *
420              
421             L<Siebel::Srvrmgr::ListParser::Output::Tabular>
422              
423             =item *
424              
425             L<Moose>
426              
427             =back
428              
429             =head1 AUTHOR
430              
431             Alceu Rodrigues de Freitas Junior, E<lt>arfreitas@cpan.orgE<gt>.
432              
433             =head1 COPYRIGHT AND LICENSE
434              
435             This software is copyright (c) 2013 of Alceu Rodrigues de Freitas Junior, E<lt>arfreitas@cpan.orgE<gt>.
436              
437             This file is part of Siebel Monitoring Tools.
438              
439             Siebel Monitoring Tools is free software: you can redistribute it and/or modify
440             it under the terms of the GNU General Public License as published by
441             the Free Software Foundation, either version 3 of the License, or
442             (at your option) any later version.
443              
444             Siebel Monitoring Tools is distributed in the hope that it will be useful,
445             but WITHOUT ANY WARRANTY; without even the implied warranty of
446             MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
447             GNU General Public License for more details.
448              
449             You should have received a copy of the GNU General Public License
450             along with Siebel Monitoring Tools. If not, see L<http://www.gnu.org/licenses/>.
451              
452             =cut
453              
454             __PACKAGE__->meta->make_immutable;