#! /usr/bin/perl use strict; use warnings; use Getopt::Long; my $title = 'CGI Self Extractor'; my $start_msg = 'starting extraction...'; my $end_msg = 'done'; my ($use_nph, $use_delete, $use_help); GetOptions( 'title=s' => \$title, 'start=s' => \$start_msg, 'end=s' => \$end_msg, nph => \$use_nph, delete => \$use_delete, help => \$use_help, ) or exit 1; if ($use_help) { print << "EOT"; Usage: $0 [options] < package.tar.gz > installer.cgi Options: --title=title title when run as a CGI --start=msg start message --end=msg end message --nph create nph CGI --delete delete installer cgi on success --help show help EOT exit 0; } print << '__EOT__'; #! /usr/bin/perl sub abort { print $_[0]; exit 1; } if ($ENV{SCRIPT_FILENAME}) { print << "EOT"; __EOT__ if ($use_nph) { print << '__EOT__' HTTP/1.0 200 OK\r __EOT__ } print << '__EOT__'; Content-Type: text/html; charset=utf8\r __EOT__ print << "__EOT__"; $title $start_msg
__EOT__
print << '__EOT__';
EOT
}
open FH, '| uudecode -o /dev/stdout | gzcat | tar xvf -'
    or abort("failed to start extraction:$!");
print FH << '__end_of_archive__';
__EOT__
;

open my $fh, '-|', 'uuencode - < /dev/stdin'
    or die "failed to call uuencode:$!";
while (my $l = <$fh>) {
    print $l;
}
print << '__EOT__';
__end_of_archive__
close FH;
__EOT__
if ($use_delete) {
print << '__EOT__';
if ($ENV{SCRIPT_FILENAME}) {
    unlink $ENV{SCRIPT_FILENAME}
        or print 'could not delete installer';
}
__EOT__
}
print << "__EOT__";
if (\$ENV{SCRIPT_FILENAME}) {
    print << "EOT";
$end_msg
The installer CGI was generated by tgz2.cgi.pl, written by Kazuho Oku at Cybozu Labs, Inc. EOT } __EOT__