App-Fetchware
view release on metacpan or search on metacpan
bin/fetchware view on Meta::CPAN
Fetchware's database is simply the directory C</var/log/fetchware> (on Unix when
run as root), or whatever File::HomeDir recommends. When packages are installed
the final version of that package that ends with C<.fpkg> is copied to your
fetchware database path. So after you install apache your fetchware database
will look like:
ls /var/log/fetchware
httpd-2.4.3.fpkg
It's not a real database or anything cool like that. It is simply a directory
containting a list of fetchware packages that have been installed. However, this
directory is managed by fetchware, and should not be messed with unless you are
sure of what you are doing.
=head2 What exactly is a fetchware package?
A fetchware package is a gziped tar archive with its file extension changed to
C<.fpkg>. This archive consists of the package that was downloaded in addition
to your Fetchwarefile. For example.
tar tvf httpd-2.4.3.fpkg
lib/App/Fetchware.pm view on Meta::CPAN
=back
Verifies the downloaded package stored in $package_path by downloading
$download_path.{asc,sha1,md5}> and comparing the two together. Uses the
helper subroutines C<{gpg,sha1,md5,digest}_verify()>.
=over
=item LIMITATIONS
Uses gpg command line, and the interface to gpg is a little brittle.
Crypt::OpenPGP is buggy and not currently maintainted again, so fetchware cannot
make use of it, so were stuck with using the command line gpg program.
=back
=over
=item drop_privs() NOTES
This section notes whatever problems you might come accross implementing and
debugging your Fetchware extension due to fetchware's drop_privs mechanism.
lib/App/Fetchware/Util.pm view on Meta::CPAN
###BUGALERT### Add support for dry-run functionality!!!!
sub run_prog {
my (@args) = @_;
# Kill weird "Insecure dependency in system while running with -T switch."
# fatal exceptions by clearing the taint flag with a regex. I'm not actually
# running in taint mode, but it bizarrely thinks I am.
for my $arg (@args) {
if ($arg =~ /(.*)/) {
$arg = $1;
} else {
die <<EOD;
php.Fetchwarefile: Match anything pattern match failed! Huh! This shouldn't
happen, and is probably a bug.
EOD
}
}
lib/App/Fetchware/Util.pm view on Meta::CPAN
$url =~ s!^file://!!; # Strip useless URL scheme.
# Prepend original_cwd() only if the $url is *not* absolute, which will mess
# it up.
$url = catdir(original_cwd(), $url) unless file_name_is_absolute($url);
# Download the file:// URL to the current directory, which should already be
# in $temp_dir, because of start()'s chdir().
#
# Don't forget to clear taint. Fetchware does *not* run in taint mode, but
# for some reason, bug?, File::Copy checks if data is tainted, and then
# retaints it if it is already tainted, but for some reason I get "Insecure
# dependency" taint failure exceptions when drop priving. The fix is to
# always untaint my data as done below.
###BUGALERT### Investigate this as a possible taint bug in perl or just
#File::Copy. Perhaps the cause is using File::Copy::cp(copy) after drop
#priving with data from root?
$url =~ /(.*)/;
my $untainted_url = $1;
my $cwd = cwd();
$cwd =~ /(.*)/;
my $untainted_cwd = $1;
cp($untainted_url, $untainted_cwd) or die <<EOD;
App::Fetchware: run-time error. Fetchware failed to copy the download URL
[$untainted_url] to the working directory [$untainted_cwd]. Os error [$!].
EOD
# Return just file filename of the downloaded file.
return file($url)->basename();
}
lib/App/Fetchware/Util.pm view on Meta::CPAN
EOD
my @variables;
for my $variable (split(/$MAGIC_NUMBER/, $$output)) {
# And some error handling just in case.
die <<EOD if not defined $variable;
fetchware: Huh? The child failed to write the proper variable back to the
parent! The variable is [$variable]. This should be defined but it is
not!
EOD
# Clear possibly tainted variables. It's a weird bug that makes no
# sense. I don't turn -t or -T on, so what gives??? If you're curious
# try commenting out the taint clearing code below, and running the
# t/bin-fetchware-install.t test file (Or any other ones that call
# drop_privs().).
my $untainted;
# Need the m//ms options to match strings with newlines in them.
if ($variable =~ /(.*)/ms) {
$untainted = $1;
} else {
die <<EOD;
App::Fetchware::Util: Untaint failed! Huh! This just shouldn't happen! It's
probably a bug.
EOD
}
# Push $untainted instead of just $variable, because I want to return
# untatined data instead of potentially tainted data.
push @variables, $untainted;
}
return @variables;
}
###BUGALERT### Add some pipe parsers that use Storable too.
} # End $MAGIC_NUMBER bare block.
t/App-Fetchware-Util.t view on Meta::CPAN
ok(run_prog("$Config{perlpath}", '-e print "Testing 1...2...3!!!\n"') >> 8 == 0,
'test run_prog() success');
# Set bin/fetchware's $quiet to false.
$fetchware::quiet = 0;
};
subtest 'test create_tempdir()' => sub {
# Create my own original_cwd(), because it gets tainted, because I chdir
# more than just once.
my $original_cwd = cwd();
# Test create_tempdir() successes.
my $temp_dir = create_tempdir();
ok(-e $temp_dir, 'checked create_tempdir() success.');
ok(-e 'fetchware.sem', 'checked fetchware semaphore creation.');
# chdir back to original_cwd(), so that this tempdir can be deleted.
chdir original_cwd() or fail("Failed to chdir back to original_cwd()!");
t/App-FetchwareX-HTMLPageSync.t view on Meta::CPAN
expect_quit();
};
##BROKEN####TEST### t/App-FetchwareX-HTMLPageSync-new works great at testing new(), but for some
##BROKEN####TEST### reason I can't figure out Expect screws up this longer test of new() just as
##BROKEN####TEST### it screws it my Expect test for App::Fetchware's new(). So, this test is being
##BROKEN####TEST### commented out too. Consider reating a Test::IO::React, but IO::React has had
##BROKEN####TEST### no new releases for like a decade, so its either unmaintainted and broken, or
##BROKEN####TEST### perhaps unmaintainted, and still works. Don't know...
##BROKEN####TEST##subtest 'test HTMLPageSync new() success' => sub {
##BROKEN####TEST## skip_all_unless_release_testing();
##BROKEN####TEST##
##BROKEN####TEST## plan(skip_all => 'Optional Test::Expect testing module not installed.')
##BROKEN####TEST## unless eval {require Test::Expect; Test::Expect->import(); 1;};
##BROKEN####TEST##
##BROKEN####TEST## # Have Expect tell me what it's doing for easier debugging.
##BROKEN####TEST## $Expect::Exp_Internal = 1;
##BROKEN####TEST##
##BROKEN####TEST## # Test saying n.
( run in 0.371 second using v1.01-cache-2.11-cpan-d6f9594c0a5 )