From: Tyler Riddle Date: Tue, 13 Nov 2012 19:18:35 +0000 (-0800) Subject: experiment to test white listing Devel::GlobalDestruction and not shipping XS X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=c003f065a0f7f8e88e3454ce9067d92f12cd249c;p=scpubgit%2FObject-Remote.git experiment to test white listing Devel::GlobalDestruction and not shipping XS --- diff --git a/lib/Object/Remote/FatNode.pm b/lib/Object/Remote/FatNode.pm index a1bf143..3a7025c 100644 --- a/lib/Object/Remote/FatNode.pm +++ b/lib/Object/Remote/FatNode.pm @@ -6,7 +6,7 @@ use B qw(perlstring); my @exclude_mods = qw(XSLoader.pm DynaLoader.pm); -#used by t/watchdog_fatnode +#used by t/watchdog_fatnode our $INHIBIT_RUN_NODE = 0; sub stripspace { @@ -41,9 +41,11 @@ my $command = qq( $command =~ s/\n/ /g; +#warn $command; chomp(my @inc = qx($command)); -my %exclude = map { $_ => 1 } @exclude_mods; +my %exclude = map { $_ => 1 } @exclude_mods; +my %mod_files = @inc; my %mods = reverse @inc; foreach(keys(%mods)) { @@ -52,14 +54,31 @@ foreach(keys(%mods)) { } } -sub filter_not_core { - not ( - /^\Q$Config{privlibexp}/ or /^\Q$Config{archlibexp}/ - ) -} +#TODO quick and dirty mod for testing - vendorarchexp from a perlbrew build +#was set to '' which evaluates as a true regex + +#use Data::Dumper; +#print STDERR Dumper([keys %mod_files]); +#print STDERR Dumper([keys %mods]); -my @before_inc = grep { filter_not_core() } keys %mods; -my @after_inc; +my @non_core_non_arch = ( $mod_files{'Devel/GlobalDestruction.pm'} ); +push @non_core_non_arch, grep +( + not ( + $Config{privlibexp} ne '' && /^\Q$Config{privlibexp}/ + or $Config{archlibexp} ne '' && /^\Q$Config{archlibexp}/ + or $Config{vendorarchexp} ne '' && /^\Q$Config{vendorarchexp}/ + or $Config{sitearchexp} ne '' && /^\Q$Config{sitearchexp}/ + ) +), grep !/\Q$Config{archname}/, grep !/\Q$Config{myarchname}/, keys %mods; + +my @core_non_arch = grep +( + $Config{privlibexp} ne '' && /^\Q$Config{privlibexp}/ + and not($Config{archlibexp} ne '' && /^\Q$Config{archlibexp}/ + or /\Q$Config{archname}/ or /\Q$Config{myarchname}/) +), keys %mods; + +#print STDERR "non-core non-arch ", Dumper(\@non_core_non_arch); +#print STDERR "core non-arch ", Dumper(\@core_non_arch); #TODO this is the wrong path to go down - fork() will bring #the env vars with it and the ssh connector can handle @@ -82,8 +101,6 @@ if (defined($ENV{OBJECT_REMOTE_LOG_FORWARDING})) { $env_pass .= '$ENV{OBJECT_REMOTE_LOG_FORWARDING} = "' . $forwarding . "\";\n"; } - - my $start = stripspace <<'END_START'; # This chunk of stuff was generated by Object::Remote::FatNode. To find # the original file's code, look for the end of this BEGIN block or the @@ -129,22 +146,26 @@ sub load_from_hash { END_END my %files = map +($mods{$_} => scalar do { local (@ARGV, $/) = ($_); <> }), - @before_inc, @after_inc; + @non_core_non_arch, @core_non_arch; +my %did_pack; sub generate_fatpack_hash { my ($hash_name, $orig) = @_; (my $stub = $orig) =~ s/\.pm$//; my $name = uc join '_', split '/', $stub; my $data = $files{$orig} or die $orig; $data =~ s/^/ /mg; + return () if $did_pack{$hash_name}{$orig}; + $did_pack{$hash_name}{$orig} = 1; return '$'.$hash_name.'{'.perlstring($orig).qq!} = <<'${name}';\n! .qq!${data}${name}\n!; } my @segments = ( - map(generate_fatpack_hash('fatpacked', $_), sort map $mods{$_}, @before_inc), - map(generate_fatpack_hash('fatpacked_extra', $_), sort map $mods{$_}, @after_inc), + map(generate_fatpack_hash('fatpacked', $_), sort map $mods{$_}, @non_core_non_arch), + map(generate_fatpack_hash('fatpacked_extra', $_), sort map $mods{$_}, @core_non_arch), ); +#print STDERR Dumper(\@segments); our $DATA = join "\n", $start, $env_pass, @segments, $end; 1;