Article 9830 of comp.lang.perl:
Xref: feenix.metronet.com comp.lang.perl:9830
Path: feenix.metronet.com!news.ecn.bgu.edu!usenet.ins.cwru.edu!eff!news.umbc.edu!haven.umd.edu!cs.umd.edu!mojo.eng.umd.edu!rensin
From: rensin@eng.umd.edu (David Rensin)
Newsgroups: comp.lang.perl
Subject: Archie/ftp Perl interface
Date: 16 Jan 1994 23:45:41 GMT
Organization: Project GLUE, University of Maryland, College Park
Lines: 282
Distribution: world
Message-ID: <2hcjj5$mnh@mojo.eng.umd.edu>
NNTP-Posting-Host: avalon.eng.umd.edu



The following is an archie/ftp interface I wrote in Perl.. It's still pretty
bare, but I use it a lot... Enjoy..

		-dave :-)


ps: The docs are in the source...


-----------------BEGIN----------------------

#! /usr/local/bin/perl

##########################################################
#                                                        #
#     artp - by Dave Rensin                              #
#                                                        #
#   Syntax: artp <text> <max hits for archie> [-l] [-u]  #
#   eg: artp SLIP 50 -l -u                               #
#                                                        # 
# Options:                                               #
#        -l   - Will log all transfered files to the     #
#               file .artplog in your home root.         #
#                                                        #    
#        -u   - Will cause artp to use .artplog instead  #
#               of querying an archie server. This is    #
#               for those of us who go to the same place #
#               often.                                   #
#                                                        #
# Commands:                                              #
#   <number>  - will either recurse into a dir           #
#               or get a file in BIN mode.               #
#                                                        #
#   <..>      - will go up one directory.                #
#                                                        #
#   <blank line> - will exit artp                        #
#                                                        #
# Hints:                                                 #
#    This script assumes 1) that you have                #
#    archie compiled and running and 2) you              #
#    have a PAGER environment variable set to            #
#    whatever you want your pager to be.                 #
#    (ie. more, less, etc...)                            #
#                                                        #
#               - good luck,                             #
#               - Dave Rensin :)                         #
#               - rensin@eng.umd.edu                     #
#                                                        #
##########################################################




require "open2.pl";
$| = 1;

($rest,$0) = split(/\//,$0,2) while ($0 =~ /\//o);
die "\nSyntax: $0 <text to search for> <max hits for archie> [-l] [-u]\n\n" if ($#ARGV < 1);
$SIG{'PIPE'} = 'IGNORE';

require "ftplib.pl" || die "NO FTBLIB!";

$log_out = "";
$use_log_for_input = "";
$log_out = grep(/-l(\s|$)/o,@ARGV);
$use_log_for_input = grep(/-u(\s|$)/o,@ARGV);


if ($use_log_for_input) {

	open (log_file,"$ENV{'HOME'}/.artplog") || die "\nCan't find file .artplog in your home directory.\n\n";
	
	while (<log_file>) {
		push(@archie_lines_temp,$_) if ($#archie_lines_temp+1 < $ARGV[1] && /$ARGV[0]/io);
	}
	
}else{
	print "\n\tUnfortunately, there is no reliable way to predict the\n";
	print "amount of time this is going to take. It depends on net traffic,\n";
	print "the load of the archie server, the number of max hits, and other\n";
	print "various things. Your patience is appreciated.\n\n";
	print "\t\tThe Managment\n";

	$ctr =0;

	@archie_servers = ("archie.rutgers.edu","archie.sura.net","archie.funet.fi");
	print "\nChecking the loads of some archie servers...\n\n";
	print "#   Server:                    Load:\n";
	print "--  ---------                  -----\n";
	print "\n";

	$ctr =1;


	foreach $archie_server (@archie_servers) {
		$load_line = `rup $archie_server`;

		if ($load_line !~ /RPC: Program not registered/og){
			$load_line =~ /load average: \d+.\d+, (\d+.\d+)/o;
			$load = $1;
			print "                               $load\r";
			print "$ctr) $archie_server\n";
			$ctr++;
		}
	}


	print "\nEnter Number of Desired Server: ";
	$server_no = <STDIN>;
	$server_no =~ s/\n//og;
	die "Bye..Bye...\n\n" if ($server_no !~ /^\d+$/o || $server_no > $#archie_servers+1);
	$server_no--;
	$archie_server = $archie_servers[$server_no];
	print "\nUsing archie server $archie_server...\n";
	print "Searching for \"$ARGV[0]\" with max hits $ARGV[1]...\n";
	
	@archie_lines_temp = `archie -V -l -m $ARGV[1] -s $ARGV[0] -h $archie_server`;
}

foreach $line_temp (@archie_lines_temp) {
        $year = substr($line_temp,0,4);
        $month = substr($line_temp,4,2);
        $day = substr($line_temp,6,2);
        $line = substr($line_temp,23);
        ($server,$file) = split(/ /,$line);

	if (!$server ) {
		$server = $file;
		$file = "";
	}

        chop $file;
	$archie_lines[$ctr] = $server.",".$file.",".$month."/".$day."/".$year;
        $ctr++;
}

@archie_lines = sort @archie_lines;
$ctr =0;
open (out,"| $ENV{'PAGER'}") || die "shit.";

print out "     Server:                       Modified:   File Path:\n\n";

foreach $line (@archie_lines) {
	$ctr++;
	($server,$file,$date) = split(/,/,$line);
	$ctr_line = $ctr.")";
	write out;
}

close (out);


print "\nEnter line #: ";
$line_no = <STDIN>;
die "Bye..Bye...\n\n" if ($line_no eq "\n");
chop $line_no;
$line_no--;

($server,$file,$date) = split(/,/,$archie_lines[$line_no]);

print "\nConnecting to server $server...\n";
&ftp'open($server);
print "Connected to server $server...\n";

while ($file =~ /\//o) {
	($rest,$file) = split(/\//,$file,2);
       	$path.="$rest\/";
}
$file = "/";

while ($line_no ne "\n") {

	while ($file =~ /\//o || $goto eq "..") {

		$path .= "$file";	
		$path =~ s/\/\//\//;
		print "\nRetrieving directory for $path...\n";
		&ftp'cwd($path);
		@tempx_lines = &ftp'dir($path);
		undef(@temp_lines);

		foreach $line (@tempx_lines) {
			push(@temp_lines,$line) if ($line !~ /total \d+/o);
		}

       		$ctr=0;

		foreach $temp_line (@temp_lines) {
			$temp_lines[$ctr].="/" if ($temp_line =~ /^dr/o);
			$ctr++
		}

       		$ctr = 1;
		$toast = 0;

       		open (out,"| $ENV{'PAGER'}") || die "shit.";

       		foreach $temp_line (@temp_lines) {

			print out "$ctr) $temp_line\n";
			$ctr++;
       		} 

       		close (out);

       		print "\nEnter line #: ";
       		$line_no = <STDIN>;
		die "Bye..Bye...\n\n" if ($line_no eq "\n");
		$goto = "";
		$goto = ".." if ($line_no eq "..\n");
       		chop $line_no;
		$line_no--;

       		$file = $temp_lines[$line_no];

		if ($file =~ / -> /o) {
			($file,$junk) = split(/ -> /,$file,2);
			$file.="/";
		}
	
       		($junk,$file) = split(/ /,$file,2) while ($file =~ / /o);

	        if ($goto eq "..") {
			$path =~ s/\/[^\/]+\/$//o;
	                $file = "/";
        	}
	}

	print "\nRecursing into $path...\n";
	&ftp'cwd($path);
	print "And getting file $file...\n...";
	&ftp'type("I");
	&ftp'get ($file);
	print "Done.\n";

	if ($log_out) {

		($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);		
		$this_year = 1900+$year;
		$this_month = $mon+1;
		
		open (log_file,"$ENV{'HOME'}/.artplog");
		@log_lines = <log_file>;
		close (log_file);
                open (log_file,">$ENV{'HOME'}/.artplog");
		print log_file @log_lines;
		$mday="0".$mday if (length($mday) == 1);
		print log_file $this_year.$this_month.$mday."000000Z    000 ".$server." $path"."$file\n";
	close (log_file);
	}
	
	$file = "/";	

}
&ftp'close;



################## Report Format ##########################

format out=
@<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<  ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<...
$ctr_line,$server,$date,$file
.
----------------------------END------------------------------



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Dave Rensin                     College Of Engineering
rensin@Glue.umd.edu   ^^^^^^    University of Maryland
                    @  0 0  @
                        ^ 
                       ()  
                      \__/ 
                      -<>-
                       /\
 
        (will hack Perl code for food) :)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


