App-aep
view release on metacpan or search on metacpan
lib/App/aep.pm view on Meta::CPAN
# As client
sub afunixcli_server_error ( $self, $syscall, $errno, $error, $wid )
{
my $debug = poe->heap->{ '_' }->{ 'debug' };
if ( !$errno )
{
$error = "Normal disconnection for wheel: $wid";
}
$debug->( 'STDERR', __LINE__, "Server session encountered $syscall error $errno: $error", 'error' );
return;
}
# --- Command execution via POE::Wheel::Run ---
# Start the child command process
sub command_start
{
my $debug = poe->heap->{ '_' }->{ 'debug' };
my $opt = poe->heap->{ '_' }->{ 'opt' };
# Do not start if already running
if ( poe->heap->{ 'command' }->{ 'running' } )
{
$debug->( 'STDERR', __LINE__, "Command already running, skipping start." );
return;
}
my $cmd = $opt->command || 'aep --help';
my $cmd_args = $opt->command_args || '';
# Build the program + args array for Wheel::Run
my @args = grep { $_ ne '' } split( /,/, $cmd_args );
$debug->( 'STDERR', __LINE__, "Starting command: $cmd " . join( ' ', @args ) );
# Reset trigger state for this run
poe->heap->{ 'command' }->{ 'trigger_ok' } = 0;
my $wheel = POE::Wheel::Run->new(
'Program' => $cmd,
'ProgramArgs' => \@args,
'StdoutEvent' => 'command_stdout',
'StderrEvent' => 'command_stderr',
'CloseEvent' => 'command_close',
'ErrorEvent' => 'command_error',
);
poe->heap->{ 'command' }->{ 'wheel' } = $wheel;
poe->heap->{ 'command' }->{ 'pid' } = $wheel->PID;
poe->heap->{ 'command' }->{ 'running' } = 1;
$debug->( 'STDERR', __LINE__, "Command started with PID: " . $wheel->PID );
# Tell the kernel to watch this child
poe->kernel->sig_child( $wheel->PID, 'sig_chld' );
# If we are a lock client with a time-based trigger, set the timer now
if ( $opt->lock_client )
{
_lock_trigger_setup();
}
return;
}
# Handle stdout from the child process
sub command_stdout ( $self, $line, $wid )
{
my $debug = poe->heap->{ '_' }->{ 'debug' };
my $opt = poe->heap->{ '_' }->{ 'opt' };
# Pass through to our own stdout
say STDOUT $line;
# Check lock trigger if we are a lock client
if ( $opt->lock_client && !poe->heap->{ 'command' }->{ 'trigger_ok' } )
{
_lock_trigger_check( 'stdout', $line );
}
return;
}
# Handle stderr from the child process
sub command_stderr ( $self, $line, $wid )
{
my $debug = poe->heap->{ '_' }->{ 'debug' };
my $opt = poe->heap->{ '_' }->{ 'opt' };
# Pass through to our own stderr
say STDERR $line;
# Check lock trigger if we are a lock client
if ( $opt->lock_client && !poe->heap->{ 'command' }->{ 'trigger_ok' } )
{
_lock_trigger_check( 'stderr', $line );
}
return;
}
# Handle child process close (all filehandles closed)
sub command_close ( $self, $wid )
{
my $debug = poe->heap->{ '_' }->{ 'debug' };
my $opt = poe->heap->{ '_' }->{ 'opt' };
$debug->( 'STDERR', __LINE__, "Command process closed (wheel $wid)." );
poe->heap->{ 'command' }->{ 'running' } = 0;
delete poe->heap->{ 'command' }->{ 'wheel' };
# Do not restart if we are shutting down
if ( poe->heap->{ 'command' }->{ 'shutting_down' } )
{
$debug->( 'STDERR', __LINE__, "Command exited during shutdown, not restarting." );
return;
( run in 0.931 second using v1.01-cache-2.11-cpan-f4a522933cf )