chdir $maindir or die "error chdir main"; -O "." or die "error own main dir"; BSD::Resource::setrlimit(BSD::Resource::RLIMIT_AS(), 128*1024*1024, BSD::Resource::RLIM_INFINITY()); BSD::Resource::setrlimit(BSD::Resource::RLIMIT_DATA(), 48*1024*1024, BSD::Resource::RLIM_INFINITY()); BSD::Resource::setpriority(BSD::Resource::PRIO_PROCESS(), 0, 3) or die "error setpriority"; open our $LOCKH, "<", $vardir . "/mirrorhnwfb.lock" or die "error open lockfile"; flock $LOCKH, (Fcntl::LOCK_EX()|Fcntl::LOCK_NB()) or die "error locking lockfile: $!"; sub time_monotonic { Time::HiRes::clock_gettime(Time::HiRes::CLOCK_MONOTONIC()); } open our $LOG, ">>", $vardir . "/mirrorhnwfb.log" or die "open logfile"; autoflush $LOG; sub wrlog { chomp(my $t = join("", @_)); $t .= "\n"; print STDERR $t; print $LOG $t; } my $DATE = Date::Manip::Date->new; $DATE->config(setdate => "zone,UTC"); wrlog "Starting mirrorhnwfb on " . Sys::Hostname::hostname() . " at " . $DATE->new_date("now")->printf("%O %Z") . "."; eval { sub escape { my($t) = @_; $t =~ s/([^\!\$\'-\*\,-9A-Za-z])/sprintf"%%%02X",ord($1)/ge; $t; } sub unescape { my($t) = @_; $t =~ s/%(\w\w)/chr(hex($1))/ge; $t; } our $LWP = LWP::UserAgent->new( max_redirect => 7, agent => q"mirrorhnwfb (1.0, jfhep@igluxz.example.com)", timeout => 300, ); our $http_pass; { open my $HTTP_PASS, "<", $http_passfile or die "error opening passfile"; chomp($http_pass = <$HTTP_PASS>); } $LWP->credentials($http_netloc, $http_realm, $http_user, $http_pass); { wrlog "getting allowmirror"; my $resp = $LWP->head($baseurl . "/.allowmirror"); if (!$resp->is_success) { die "allowmirror http error: " . $resp->status_line; } wrlog "allowmirror ok."; } our @dir = ("/"); our %keepd = ("/" => 1); our %keepf; our $count_dir = 0; our @file; our @mkdir; our $count_file = 0; sub getdir { my($dir) = @_; my $edir = escape($dir); $dir =~ m"\0" and die "invalid dir pathname 0 " . $edir; $dir =~ m"\A\/" or die "invalid dir pathname 1 " . $edir; $dir =~ m"\/\z" or die "invalid dir pathname 2 " . $edir; $dir =~ m"/\." and die "invalid dir pathname 3 " . $edir; if (1024 < length($dir)) { wrlog "skipping directory with too long pathname " . $edir; return; } my $dirs = $dir; $dirs =~ s"\/+\z""; $keepd{$dirs} = 1; push @mkdir, $dir;