#!/usr/bin/perl # # Author: Daniel Stenberg # Version: 0.1 # Date: October 10, 2000 # # This is public domain. Feel free to do whatever you please with this script. # There are no warranties whatsoever! It might work, it might ruin your hard # disk. Use this on your own risk. # # PURPOSE # # This script uses a local directory to maintain a "mirror" of the curl # packages listed in the remote curl web sites package list. Files present in # the local directory that aren't present in the remote list will be removed. # Files that are present in the remote list but not in the local directory # will be downloaded and put there. Files present at both places will not # be touched. # # WARNING: don't put other files in the mirror directory, they will be removed # when this script runs if they don't exist in the remote package list! # # this is the directory to keep all the mirrored curl files in: $some_dir = $ARGV[0]; if( ! -d $some_dir ) { print "$some_dir is not a dir!\n"; exit; } # path to the curl binary $curl = "/home/danste/bin/curl"; # this is the remote file list $filelist = "http://curl.haxx.se/download/curldist.txt"; # prepend URL: $prepend = "http://curl.haxx.se/download"; opendir(DIR, $some_dir) || die "can't opendir $some_dir: $!"; @existing = grep { /^[^\.]/ } readdir(DIR); closedir DIR; $LOCAL_FILE = 1; $REMOTE_FILE = 2; # create a hash array for(@existing) { $allfiles{$_} |= $LOCAL_FILE; } # get remote file list print "Getting file list from $filelist\n"; @remotefiles=`$curl -s $filelist`; # fill in the hash array for(@remotefiles) { chomp; $allfiles{$_} |= $REMOTE_FILE; $remote++; } if($remote < 10) { print "There's something wrong. The remote file list seems too smallish!\n"; exit; } @sfiles = sort { $a cmp $b } keys %allfiles; $leftalone = $downloaded = $removed = 0; for(@sfiles) { $file = $_; $info = $allfiles{$file}; if($info == ($REMOTE_FILE|$LOCAL_FILE)) { print "$file is LOCAL and REMOTE, left alone\n"; $leftalone++; } elsif($info == $REMOTE_FILE) { print "$file is only REMOTE, getting it...\n"; system("$curl $prepend/$file -o $some_dir/$file"); $downloaded++; } elsif($info == $LOCAL_FILE) { print "$file is only LOCAL, removing it...\n"; system("rm $some_dir/$file"); $removed++; } else { print "Problem, file $file was marked $info\n"; } $loops++; } if(!$loops) { print "No remote or local files were found!\n"; exit; } print "$leftalone files were already present\n", "$downloaded files were added\n", "$removed files were removed\n";