Permalink
Switch branches/tags
Nothing to show
Find file
Fetching contributors…
Cannot retrieve contributors at this time
114 lines (95 sloc) 2.99 KB
#!/usr/bin/perl
use strict;
my $VERSION = '0.01';
sub sorry ($) {
print "$_[0]\n";
exit 1;
}
print "Content-Type: text/plain; charset=utf-8\n\n";
{
print "Perlバージョンを確認しています...\n";
my $version = '5.008';
eval "require $version";
if ($@) {
sorry "Perl $version 以上がインストールされていません。このPerlは${]}です";
}
print " * perl $version -> OK!\n";
}
{
print "インストールに必要なモジュールが使用可能か確認しています...\n";
my %required = (
'IO::Socket::INET' => 0,
'Digest::MD5' => 0,
'URI' => 0,
);
while (my ($mod, $version) = each %required) {
if ($version) {
eval "use $mod '$version'";
if ($@) {
sorry "必須モジュール $mod ($version) がインストールされていませんでした";
}
print " * $mod ($version) OK!\n";
} else {
eval "use $mod";
if ($@) {
sorry "必須モジュール $mod がインストールされていませんでした";
}
print " * $mod OK!\n";
}
}
}
{
my $get = sub {
my $url = shift;
$url = URI->new($url) unless ref $url;
my $host = $url->host;
my $port = $url->port;
my $sock = IO::Socket::INET->new(
PeerAddr => $host,
PeerPort => $port,
Timeout => 30
);
if (! $sock) {
sorry "接続に失敗しました: $@";
}
$sock->autoflush(1);
$sock->print("GET $url HTTP/1.0\nHost: $host\n\n");
my $content = '';
my $buf;
while (! eof $sock) {
my $read = read $sock, $buf, 4096;
if ($read <= 0) {
last;
}
$content .= $buf;
}
return $content;
};
my $get_and_save = sub {
my ($url, $file, $checksum) = @_;
my $content = $get->($url);
if (Digest::MD5->add($content)->hexdigest ne $checksum) {
sorry "URL $url のチェックサムが合いません";
}
open(my $fh, '>', $file) or
sorry "URL $url の保存に失敗しました:$!";
print $fh $content or
sorry "URL $url の保存に失敗しました:$!";
close($fh) or
sorry "URL $url の保存に失敗しました:$!";
# XXX - need to change permission
};
# get manifest, read from manifest and fetch each file in the manifest
my $host = 'kazuho.31tools.com';
my $port = 80;
my $manifest = get("MANIFEST");
foreach my $line (split /\n/, $manifest) {
my($file, $checksum) = split(/\s/, $line);
my $uri = URI->new();
$uri->schema('http');
$uri->host($host);
$uri->port($port);
$uri->path(join('/', 'dist', $VERSION, $file));
get_and_save($uri, $file, $checksum);
}
}