105 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| #!/usr/bin/perl
 | |
| 
 | |
| #
 | |
| # Author:  Daniel Stenberg <daniel@haxx.se>
 | |
| # 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";
 | 
