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 )