Stem
view release on metacpan or search on metacpan
lib/Stem/Boot.pm view on Meta::CPAN
},
] ;
my %name2boot ;
sub new {
my( $class ) = shift ;
my $self = Stem::Class::parse_args( $attr_spec, @_ ) ;
return $self unless ref $self ;
my $boot_info = Stem::Util::load_file( $self->{'boot_file'} ) ;
return $boot_info unless ref $boot_info ;
foreach my $boot ( @{$boot_info} ) {
die "boot entry is not a hash\n" unless ref $boot eq 'HASH' ;
if ( my $skip = $boot->{'skip'} ) {
next if lc $skip eq 'yes' ;
}
my $boot_obj = Stem::Class::parse_args( $attr_spec,
%{$self},
%{$boot}
) ;
die "boot entry error: $boot_obj\n" unless ref $boot_obj ;
my $cmd = $boot_obj->{'cmd'} ;
die "boot entry is missing 'cmd'\n" unless $cmd ;
my $name = $boot_obj->{'name'} ;
die "boot entry is missing 'name'\n" unless $name ;
$name2boot{ $name } = $boot_obj ;
if ( $boot_obj->{'boot_now'} ) {
$boot_obj->run_cmd() ;
}
}
return ;
}
sub run_cmd {
my( $self ) = @_ ;
#print Store $self ;
my $cmd ;
if ( my $user = $self->{'user'} ) {
if ( getpwuid($<) ne $user ) {
$cmd .= "su - $user ; " ;
}
}
if ( my $wrap = $self->{'wrap'} ) {
$cmd .= qq{$wrap "} ;
$self->{'wrap_end'} ||= '"' ;
}
if ( my $chdir = $self->{'chdir'} ) {
$cmd .= "cd $chdir ; " ;
}
if ( my $stem_env = $self->{'stem_env'} ) {
my $cmd_env = join ' ', map(
"$_='$stem_env->{$_}'", keys %{$stem_env} ) ;
$cmd =~ s/run_stem/run_stem $cmd_env/ ;
}
$cmd .= $self->{'cmd'} ;
$cmd .= $self->{'wrap_end'} if $self->{'wrap_end'} ;
my $handle = gensym ;
#print "$cmd\n" ;
if ( my $pid = open( $handle, '-|' ) ) {
#print "pid $pid\n" ;
$self->{'pid'} = $pid ;
$self->{'handle'} = $handle ;
}
elsif ( defined( $pid ) ) {
local( %ENV ) = ( %ENV, %{ $self->{'env'} || {} } ) ;
open( STDERR, '>&STDOUT' ) ;
exec $cmd ;
die "Couldn't exec [$cmd]\n" ;
}
else {
die "couldn't fork\n" ;
}
my $aio = Stem::AsyncIO->new(
'object' => $self,
'read_fh' => $handle,
'read_method' => 'boot_read',
'closed_method' => 'boot_closed',
) ;
( run in 2.016 seconds using v1.01-cache-2.11-cpan-995e09ba956 )