hunk ./lib/Continuity/Monitor/Plugin/CallStack.pm 3 -use Moose; -use Method::Signatures; hunk ./lib/Continuity/Monitor/Plugin/CallStack.pm 4 -use Data::Visitor::Callback; hunk ./lib/Continuity/Monitor/Plugin/CallStack.pm 5 -# has trace => ( is => 'rw' ); +sub new { + my $package = shift; + # bless $package, { }; + return $package; # ... not an instance; use the goo in $monitor, including it's coroutine context. +} hunk ./lib/Continuity/Monitor/Plugin/CallStack.pm 11 -with qw( - MooseX::Coro - MooseX::Continuity::Request - MooseX::Continuity::CallbackLinks -); +sub process { + my $self= shift; # ... and we don't use this self, instead delegating back to $monitor. + my $monitor = shift; + print_trace($monitor); +} hunk ./lib/Continuity/Monitor/Plugin/CallStack.pm 17 -method print_trace { - $self->print("
"); hunk ./lib/Continuity/Monitor/Plugin/CallStack.pm 36 -method print_lexicals { +sub print_lexicals { hunk ./lib/Continuity/Monitor/Plugin/CallStack.pm 38 - my $lexicals = Devel::StackTrace::WithLexicals->new( - ignore_package => [qw( Devel::StackTrace Continuity::Monitor::CGI )] - ); + my $monitor = shift; + my $lexicals = shift; hunk ./lib/Continuity/Monitor/Plugin/CallStack.pm 48 - my $fieldname = $self->field_name($fieldnum++); - $self->print(qq|"); + $monitor->print(""); + $monitor->print(""); hunk ./lib/Continuity/Monitor/Plugin/CallStack.pm 87 -method main { - while(1) { - $self->print_trace; - $self->yield(1); - $self->process_callbacks; - } -} - hunk ./lib/Continuity/Monitor.pm 11 -use PadWalker 'peek_my'; -use Moose; - -use Method::Signatures; hunk ./lib/Continuity/Monitor.pm 15 -use Devel::StackTrace::WithLexicals; - hunk ./lib/Continuity/Monitor.pm 21 - hunk ./lib/Continuity/Monitor.pm 65 + hunk ./lib/Continuity/Monitor.pm 67 - my $self = { - port => 8081, # override default port to avoid a conflict - %ops, - }; - + hunk ./lib/Continuity/Monitor.pm 73 - $self->{continuity} = Continuity->new( - port => $self->{port}, - cookie_session => 'monitor_sid', - callback => sub { $self->main(@_) }, - docroot => $docroot, + # sdw -- what weird things? + + my $self = bless { + callback => { }, + request => undef, + server => delete $ops{server}, + # %ops, # do we want any of these options ever? guess they all go straight to Continuity. + }, $class; + + $self->{monitor_server} = Continuity->new( + cookie_session => 'monitor_sid', + callback => sub { $self->main(@_) }, + docroot => $docroot, + port => 8081, # override default port to avoid a conflict + %ops, hunk ./lib/Continuity/Monitor.pm 90 - bless $self, $class; + return $self; hunk ./lib/Continuity/Monitor.pm 94 -has request => ( is => 'rw' ); -has trace => ( is => 'rw' ); - -method main ($request) { - $self->request($request); - # my $sessions = $self->{server}->{mapper}->{sessions} or die; - # my $session_count = scalar keys %$sessions; - # my @sess = sort keys %$sessions; +sub main { + my $self = shift; + my $request = shift; + $self->{request} = $request; # cache it so we can make shorthands like $self->print and $self->param hunk ./lib/Continuity/Monitor.pm 108 -# my $trace = Devel::StackTrace::WithLexicals->new( -# ignore_package => [qw( Devel::StackTrace Continuity::Monitor::CGI )] -# ); hunk ./lib/Continuity/Monitor.pm 109 - Continuity::Monitor::Plugin::REPL->new( request => $request ), - # Continuity::Monitor::Plugin::CallStack->new( request => $request, trace => $trace ), # XXX silly! - Continuity::Monitor::Plugin::CallStack->new( request => $request ), - Continuity::Monitor::Plugin::Exit->new( request => $request ), - Continuity::Monitor::Plugin::Counter->new( request => $request ), - Continuity::Monitor::Plugin::FileEdit->new( request => $request ), + Continuity::Monitor::Plugin::REPL->new( request => $request, ), + Continuity::Monitor::Plugin::CallStack->new( request => $request, ), + Continuity::Monitor::Plugin::Exit->new( request => $request, ), + Continuity::Monitor::Plugin::Counter->new( request => $request, ), + Continuity::Monitor::Plugin::FileEdit->new( request => $request, ), hunk ./lib/Continuity/Monitor.pm 119 - # $continue &&= $plugin->process(); - # Continuity::Inspector->new( callback => sub { - # $continue &&= $plugin->process(); - # })->inspect( $sessions->{$session} ); - $self->{server}->mapper->inspect($session, sub { $continue &&= $plugin->process() }); + $self->{server}->mapper->inspect($session, sub { $continue &&= $plugin->process($self) }); hunk ./lib/Continuity/Monitor.pm 123 - + $self->process_callbacks; hunk ./lib/Continuity/Monitor.pm 129 -method print_header { -$SIG{__DIE__} = sub { use Carp; Carp::confess; }; +sub print_header { + my $self = shift; hunk ./lib/Continuity/Monitor.pm 150 -method print_footer { +sub print_footer { + my $self = shift; hunk ./lib/Continuity/Monitor.pm 159 -1; +# +# taken from the MooseX crap... should go back into a library that can be use'd. +# hunk ./lib/Continuity/Monitor.pm 163 +sub cb_link { + my ($self, $text, $subref) = @_; + (my $name) = scalar($subref) =~ m/CODE\(0x(.*)\)/; + $self->{callback}->{$name} = $subref; + return qq{$text}; +} hunk ./lib/Continuity/Monitor.pm 170 -__END__ - -the old stuff: +sub cb_button { + my ($self, $text, $subref) = @_; + (my $name) = scalar($subref) =~ m/CODE\(0x(.*)\)/; + $self->{callback}->{$name} = $subref; + return qq{}; +} hunk ./lib/Continuity/Monitor.pm 177 -sub main { - my ($self, $request) = @_; - $self->{request} = $request; - while(1) { - my $sessions = $self->{server}->{mapper}->{sessions} or die; - my $session_count = scalar keys %$sessions; - my @sess = sort keys %$sessions; - @sess = map { qq{
  • $_
  • \n} } @sess; - $request->print("$session_count sessions:
    "); - $request->next; - my $sess = $request->param('inspect_sess'); - if($sess) { - $self->inspect_session($sessions->{$sess}); +sub process_callbacks { + my ($self, $clear) = @_; + defined($clear) or $clear = 1; # $clear //= 1; + my $callback = $self->{callback}; + $self->{callback} = { } if $clear; + my $name = $self->param('callback'); + if($name && defined $callback->{$name}) { + # handle URLs with parameters like ?callback=deadbeef + $callback->{$name}->($self); + return 1; + } + foreach my $name (keys %$callback) { + # handle URLs with parameters like ?deadbeef=blargh + if($self->param($name)) { + $callback->{$name}->($self); + return 1; hunk ./lib/Continuity/Monitor.pm 195 + return 0; hunk ./lib/Continuity/Monitor.pm 198 -sub get_session_vars { - my ($self, $session) = @_; - my $request = $self->{request}; - my @vars; - my $inspector = Continuity::Inspector->new( callback => sub { - $Data::Dumper::Sortkeys = 1; - $Data::Dumper::Terse = 1; - $Data::Dumper::Maxdepth = 2; - for my $i (1..100) { - my $vars = eval { peek_my($i) } or last; - my ($package, $filename, $line, $subroutine) = caller($i-1); - my ($package2, $filename2, $line2, $subroutine2) = caller($i); - # Skip over Continuity and Coro specific frames - next if $package =~ /^(Continuity|Coro)/; - next if $subroutine2 =~ /^(Continuity|Coro)::/; - push @vars, { - level => $i, - package => $package, - filename => $filename, - line => $line, - subroutine => $subroutine2, - vars => $vars, - expand => 0, - }; - } - }); - $inspector->inspect( $session ); - return @vars; +sub field_name { + # unique field names for auto-generated input fields + my $self = shift; + my $name = shift; + $self->{last_field_name}++; + return join '_', $name, 0+$self, 0+$Coro::current, $self->{last_field_name}; hunk ./lib/Continuity/Monitor.pm 206 +# little shorthand things over $self->{request}->print and the like hunk ./lib/Continuity/Monitor.pm 208 -sub inspect_session { - my ($self, $session) = @_; - my $request = $self->{request}; - - my @explore = $self->get_session_vars($session); - - #$Data::Dumper::Maxdepth = 4; - #$request->print("
    DUMP:\n\n" . Dumper(\@explore) . "\n\n");
    -
    -  while(1) {
    -    $request->print(qq{
    -      Exit
    - REPL
    - '); - $request->next; - last if $request->param('action') eq 'exit'; - if($request->param('action') eq 'repl') { - $self->repl($session); - } - my $scope = $request->param('toggle'); - $explore[$scope]->{expand} += 1; - $explore[$scope]->{expand} %= 2; - } +sub request :lvalue { + $_[0]->{request} = $_[1] if @_ == 2; + $_[0]->{request}; hunk ./lib/Continuity/Monitor.pm 213 -sub repl { - my ($self, $session) = @_; - my $inspector = Continuity::Inspector->new( callback => sub { - my $repl = Continuity::Monitor::REPL->new( request => $self->{request} ); - $repl->repl->run; - }); - $inspector->inspect( $session ); +sub param { + my ($self, @v) = @_; + return $self->request->param(@v); +} + +sub params { + my ($self, @v) = @_; + return $self->request->params(@v); +} + +sub next { + my ($self) = @_; + $self->request->next; + return $self; +} + +sub print { + my $self = shift @_; + $self->request->print(@_); hunk ./lib/Continuity/Monitor.pm 234 - hunk ./lib/MooseX/Continuity/CallbackLinks.pm 19 + +use Carp 'confess'; +$self->uuid or confess; +$name or confess; + hunk ./lib/Continuity/Monitor.pm 16 -use Continuity::Monitor::Plugin::REPL; +use Continuity::Monitor::Plugin::REPLother; hunk ./lib/Continuity/Monitor.pm 109 - Continuity::Monitor::Plugin::REPL->new( request => $request, ), + Continuity::Monitor::Plugin::REPLother->new( request => $request, ), hunk ./lib/Continuity/Monitor/CGI.pm 3 +# XXX this needs to use those various MooseX::Continuity roles + hunk ./lib/Continuity/Monitor/CGI.pm 102 - $continue &&= $plugin->process(); + $continue &&= $plugin->process($self); hunk ./lib/Continuity/Monitor/Plugin/CallStack.pm 4 +use Data::Visitor::Callback; addfile ./lib/Continuity/Monitor/Plugin/REPLother.pm hunk ./lib/Continuity/Monitor/Plugin/REPLother.pm 1 +package Continuity::Monitor::Plugin::REPLother; + +use strict; +use warnings; + +our $VERSION = '0.01'; + +# a simpler REPL that doesn't want its own coroutine so it can be injected +# into other coroutines to operate. + +sub new { + my $package = shift; + bless { }, $package; +} + +sub process { + my $self = shift; + my $monitor = shift; + my $request = $monitor->request; + + my $output = $self->{output} || ''; + + $request->print(qq{ +
    +
    +    $output
    +  });
    +  if(my $code = $request->param('cmd')) {
    +      # $request->{request}->{conn} or die;
    +      select $request->{request}->{conn};
    +      my $new_output = $code . "\n\n";
    +      $new_output .= eval($code);
    +      $new_output .= "Error:\n$@\n" if $@;
    +      $new_output =~ s{<}{\<}g;
    +      $request->print($new_output);
    +      $output .= $new_output;
    +  }
    +  $request->print(qq{
    +      
    + +
    + }); + + $self->{output} = $output; # XXX tail to the last 1000 lines or something? + + 1; +} + +=head1 SEE ALSO + +L, L, L + +=head1 AUTHOR + + Brock Wilcox - http://thelackthereof.org/ + +=head1 COPYRIGHT + + Copyright (c) 2008 Brock Wilcox . All rights + reserved. This program is free software; you can redistribute it and/or modify + it under the same terms as Perl 5.10 or later. + +=cut + +1; +