2 |
use Moose; |
use Moose; |
3 |
|
|
4 |
extends 'Frey'; |
extends 'Frey'; |
5 |
with 'Frey::Web'; |
with 'Frey::Web', 'Frey::jQuery', 'Frey::File', 'Frey::Web::IFrame'; |
|
#with 'Frey::Storage'; |
|
|
with 'Frey::jQuery'; |
|
|
with 'Frey::File'; # FIXME inline on demand? |
|
6 |
|
|
7 |
use DateTimeX::Easy; |
use DateTimeX::Easy; |
8 |
|
|
9 |
use lib 'lib'; |
use lib 'lib'; |
|
use Frey::Shell::sar; |
|
10 |
use JSON; |
use JSON; |
11 |
|
|
12 |
has sar_command => ( |
has 'sponge' => ( |
13 |
is => 'rw', |
is => 'rw', |
14 |
isa => 'Str', |
isa => 'Sponge', |
15 |
required => 1, |
required => 1, |
|
default => 'ssh www.rot13.org sar -n 1', |
|
16 |
); |
); |
17 |
|
|
18 |
sub as_markup { |
sub as_markup { |
25 |
<script language="javascript" type="text/javascript" src="/$path/jquery.flot.js"></script> |
<script language="javascript" type="text/javascript" src="/$path/jquery.flot.js"></script> |
26 |
|); |
|); |
27 |
|
|
28 |
my $sponge = Frey::Shell::sar->new( sar_command => $self->sar_command )->as_sponge; |
my $sponge = $self->sponge; |
|
#warn $self->dump( $sponge ); |
|
29 |
|
|
30 |
my $by_col; |
my $by_col; |
31 |
my $unit_by_col; |
my $unit_by_col; |
32 |
|
|
33 |
foreach my $row ( @{ $sponge->{rows} } ) { |
foreach my $row ( @{ $sponge->{rows} } ) { |
34 |
my $x = DateTimeX::Easy->new( $row->[0] )->epoch * 1000; # ms |
my $time = eval { |
35 |
|
DateTimeX::Easy->new( $row->[0] )->epoch * 1000; # ms |
36 |
|
}; |
37 |
|
die "FATAL: sponge first column ", $self->dump( $row->[0] ), " isn't valid time because of: $@" if $@; |
38 |
foreach my $col ( 1 .. $#$row ) { |
foreach my $col ( 1 .. $#$row ) { |
39 |
my $v = $row->[$col]; |
my $v = $row->[$col]; |
40 |
$unit_by_col->{$col} = $1 if $v =~ s{([M%])$}{}; |
$unit_by_col->{$col} = $1 if $v =~ s{([M%])$}{}; |
41 |
push @{ $by_col->{$col} }, [ $x, $v ]; |
push @{ $by_col->{$col} }, [ $time, $v ]; |
42 |
} |
} |
43 |
} |
} |
44 |
|
|
57 |
my $data_js = ''; |
my $data_js = ''; |
58 |
if ( $dataset ) { |
if ( $dataset ) { |
59 |
$data_js = 'var datasets = ' . to_json( $dataset ) . ";\n"; |
$data_js = 'var datasets = ' . to_json( $dataset ) . ";\n"; |
60 |
$placeholder = qq|<div id="placeholder" style="width:600px;height:300px;"></div>|; |
$placeholder = qq| |
61 |
|
<div id="placeholder" style="width:600px;height:300px;"></div> |
62 |
|
<div id="selection">no selection</div> |
63 |
|
| |
64 |
|
. $self->iframe_html |
65 |
|
; |
66 |
} |
} |
67 |
|
|
68 |
warn "# $data_js" if $self->debug; |
warn "# $data_js" if $self->debug; |
69 |
|
|
70 |
my $sar = $self->sar_command; |
my $form = '<!-- no sar_command in sponge -->'; |
71 |
my $c = $sar; |
my $sar_command = $sponge->{sar_command} || warn "no sar_command in spunge"; |
72 |
$c =~ s{(-n\s*\d+).*}{$1}; |
if ( my $c = $sar_command ) { |
73 |
|
$c =~ s{sar\s(-n\s*\d+)?(.*?)$}{sar $1}; |
74 |
my $form = qq| |
|
75 |
<form method="post"> |
$form = qq| |
76 |
<b>From</b> <input type="submit" value="refresh"><br> |
<form method="post"> |
77 |
|; |
<b>From</b> <input type="submit" value="refresh"><br> |
78 |
|
|; |
79 |
|
|
80 |
|
my $flags = `atsar help 2>&1`; |
81 |
|
$flags =~ s{^.+flags:\s+}{}s; |
82 |
|
$flags =~ s{^\s*-[AS].+$}{}gm; # remove -A and -S flags which doesn't make sense |
83 |
|
$flags =~ s{^\s+}{}s; |
84 |
|
|
85 |
|
foreach my $line ( split(/\s*\n\s*/, $flags ) ) { |
86 |
|
my ( $flag, $desc ) = split(/\s+/, $line, 2 ); |
87 |
|
warn "# $flag | $desc" if $self->debug; |
88 |
|
my $v = "$c $flag"; |
89 |
|
my $checked = ''; |
90 |
|
$checked = " checked" if $sar_command =~ m{$flag}; |
91 |
|
$form .= qq|<input type="radio" name="sar_command" value="$v"$checked>$desc<br>\n|; |
92 |
|
} |
93 |
|
|
94 |
my $flags = `atsar help 2>&1`; |
$form .= qq| |
95 |
$flags =~ s{^.+flags:\s+}{}s; |
</form> |
96 |
$flags =~ s{^\s*-[AS].+$}{}gm; # remove -A and -S flags which doesn't make sense |
|; |
97 |
$flags =~ s{^\s+}{}s; |
|
98 |
|
$self->add_css(q| |
99 |
foreach my $line ( split(/\s*\n\s*/, $flags ) ) { |
#choices, form { float: left; } |
100 |
my ( $flag, $desc ) = split(/\s+/, $line, 2 ); |
|); |
|
warn "# $flag | $desc"; |
|
|
my $v = "$c $flag"; |
|
|
my $checked = ''; |
|
|
$checked = " checked" if $v eq $self->sar_command; |
|
|
$form .= qq|<input type="radio" name="sar_command" value="$v"$checked>$desc<br>\n|; |
|
101 |
} |
} |
102 |
|
|
|
$form .= qq| |
|
|
</form> |
|
|
|; |
|
|
|
|
|
$self->add_css(q| |
|
|
#choices, form { float: left; } |
|
|
|); |
|
|
|
|
103 |
return |
return |
104 |
qq| |
qq| |
105 |
|
|
106 |
<code>$sar</code> |
<code>$sar_command</code> |
107 |
|
|
108 |
$placeholder |
$placeholder |
109 |
|
|
132 |
|; |
|; |
133 |
} |
} |
134 |
|
|
135 |
|
__PACKAGE__->meta->make_immutable; |
136 |
|
no Moose; |
137 |
|
|
138 |
1; |
1; |