MFTP - a mail ftp client written in Perl

Clay Luther cluther at supernet.dallas.haus.com
Fri Mar 15 14:12:01 AEST 1991


Here is MFTP, a simple program written in Perl that provides a nice interface
to the bitftp server (or any mail server with a little modification) to sites
that do not have full-ip access.

Enjoy.


#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	README
#	mftp
# This archive created: Thu Mar 14 22:08:37 1991
export PATH; PATH=/bin:$PATH
if test -f 'README'
then
	echo shar: will not over-write existing file "'README'"
else
cat << \SHAR_EOF > 'README'
MFTP - Mail FTP Client
by Clay Luther
Copyright 1991, Clay Luther

This is Freeware.

Send comments to cluther at supernet.haus.com.

After unsharing the file, edit it and change the values indicated by the
keywords NOTE and EDIT.

Have fun.
SHAR_EOF
chmod +x 'README'
fi # end of overwriting check
if test -f 'mftp'
then
	echo shar: will not over-write existing file "'mftp'"
else
cat << \SHAR_EOF > 'mftp'
#! /usr/local/bin/perl
eval '(exit $?0)' && eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}' & eval 'exec /usr/local/bin/perl -S $0 $argv:q'
if 0;
#end of perlstart
# NOTE ON PERLSTART:  ENSURE YOUR PERLPATH (/usr/.../perl) IS CORRECT FOR YOUR
# SYSTEM.
# SEE "EDIT THESE VALUES" BELOW.

# Perl Program mftp Clay Luther January 1991
# Send comments to cluther at supernet.haus.com

# ABSTRACT:
# Provide a simple interface to the mail ftp servers.
#
# DESCRIPTION:
# mftp is a user interface to internet mail ftp services.  Mail ftp services
# work by having the user submit a file containing standard FTP commands to
# a mail ftp server.  The mail server performs the inet ftp connection to
# the machine the user wants to ftp to and mails ftp output back to the
# user.
#
# Mftp provides the user with a simple interface to a mail ftp server.  From
# unix, the user enters the command "mftp [site] [user] [passwd]".  If he
# does not enter "site", the mftp prompts him for one.  "User" and "passwd"
# default to "anonymous".
#
# Mftp then presents the user with a simple menu of commands.  The user
# enters a command by typing a letter followed by a carriage return.  If
# the command takes a parameter, the user may enter it on the same line as
# the command letter; otherwise, mftp will prompt the user for the parameter.
#
# Mftp builds a file containing the user's ftp requests.  Once the user is
# finished entering commands, mftp mails the request file to the defined
# mftp server (see variable $bitftp).
#
# If mftp encounters and error during execution, it dies with an appropriate
# message.


# mftp: a batched ftp program
# USAGE: mftp [site] [user] [passwd]

#####################
# EDIT THESE VALUES #
$tmp = "/tmp/mftp$$";
$version = "mftp version 1.0";
$mail = "/usr/lib/sendmail";
$edit = "/usr/bin/vi";
$more = "/usr/local/bin/less";
$bitftp = "bitftp at pucc.princeton.edu";
######################################


($site,$user,$passwd) = @ARGV;

if (!$site) {
  print "open: ";
  chop($site=<STDIN>);
}

$user = "anonymous" unless $user;
$passwd = "anonymous" unless $passwd;


print "\n\nWelcome to $version.\nConnect to ftp server $site.\nUser $user, password $passwd.\n";

print "Batching commands to $tmp...\n";
open(F,">$tmp") || die "Cannot open $tmp: $!\n";
print F "FTP $site UUENCODE\n";
print F "USER $user $passwd\n";
close(F);

$dir = "";
$mode = "ASCII";
$atleastone = 0;
$help = 0;

while (&quest) {
  if ($atleastone >= 5) {	# Time to ship this baby...too many
                                # output commands
    local($a);
    print "You have entered $atleastone output requests.\n";
    $atleastone = 0;
    print "Send the current requests and continue [y]? ";
    chop($a=<STDIN>);
    $a = "y" unless $a;
    if ($a =~ /y.*/i) {
      # append QUIT
      &frint("QUIT\n");
      # send request
      print "Mailing requests...\n";
      system("$mail $bitftp < $tmp");
      # reopen request batch
      system("rm -f $tmp");
      &frint("FTP $site UUENCODE\n");
      &frint("USER $user $passwd\n"); 
    }
    else {
      print "Quit mftp? ";
      chop($a=<STDIN>);
      if ($a =~ /y.*/i) {
        goto quitmftp;
      }
    }
  }
} ;

quitmftp:

if ($atleastone) {
  local($req);
  if ($atleastone>1) { $req="s"; } else { $req=""; }
  print "$atleastone output request$req.\n";
  print "Sending the request to $bitftp...";
  system("$mail $bitftp < $tmp");
  print "\nYou should get a reply back within a day.\n";
} else {
  print "Hmm...no commands entered.  Not sending the request.\n";
}
system("rm -f $tmp");

exit 0;

############## END OF MAIN ###############

sub quest
{
  local($c,$d);
  print "\nMode: $mode";
  if (length($dir)>0) {
    print "\tLast Chdir: $dir";
  }
  print "\n";
  if ($help) {
    print "A)scii B)inary C)hdir D)ir E)dit F)orget G)et H)elp Q)uit V)iew Z)ap\n";
    $help=0;
  }
  print "[abcdeghqvz?]: ";
  chop($c = <STDIN>);
  if ($c =~ /^ *a.*/i) {
    $mode = "ASCII";
    &frint("$mode\n");
    return 1;
  }
  elsif ($c =~ /^ *b.*/i) {
    $mode = "BINARY";
    &frint("$mode\n");
    return 1;
  }
  elsif ($c =~ /^ *c.*/i) {
    local(@P) = split(' ',$c);
    shift(@P);
    $c = join(' ', at P);
    if ($c) {
      $d = $c;
    } else {
      print "Chdir to: ";
      chop($d = <STDIN>);
    }
    $dir = $d;
    &frint("CD $d\n"); 
    return 1;
  }
  elsif ($c =~ /^ *d.*/i) {
    local(@P) = split(' ',$c);
    shift(@P);
    $c = join(' ', at P);
    if ($c) {
      $d = $c;
    } else {
      print "Dir of: ";
      chop($d = <STDIN>);
    }
    &frint("DIR $d\n");
    $atleastone++;
    return 1;
  }
  elsif ($c =~ /^ *e.*/i) {
    system("$edit $tmp");
    return 1;
  }
  elsif ($c =~ /^ *f.*/i) {
    $atleastone = 0;
    return 0;
  }
  elsif ($c =~ /^ *g.*/i) {
    local(@P) = split(' ',$c);
    shift(@P);
    $c = join(' ', at P);
    if ($c) {
      $d = $c;
    } else {
      print "Get file: ";
      chop($d = <STDIN>);
    }
    &frint("GET $d\n");
    $atleastone++;
    return 1;
  }
  elsif ($c =~ /^ *q.*/i) {
    &frint("QUIT\n");
    return 0;
  }
  elsif ($c =~ /^ *v.*/i) {
    system("$more $tmp");
    return 1;
  }
  elsif ($c =~ /^ *z.*/i) {
    system("rm -f $tmp");
    &frint("FTP $site UUENCODE\n");
    &frint("USER $user $passwd\n");
    $atleastone = 0;
    $mode = "ASCII";
    $dir = "";
    return 1;
  }
  elsif ($c =~ /^ *\?.*/) {
    $help = 1;
    return 1;
  } 
  elsif ($c =~ /^ *h.*/i) {	# print some screen help
    print "\n";
    print "A)scii    Switch to ASCII file transfer mode.\n";
    print "B)inary   Switch to BINARY file transfer mode.\n";
    print "C)hdir    Change current directory.\n";
    print "D)ir      List specified directory.\n";
    print "E)dit     Edit current batch with $edit.\n";
    print "F)orget   Abort this session.\n";
    print "G)et      Get the specified file.\n";
    print "H)elp     Show this.\n";
    print "Q)uit     Stop batching and send the requests.\n";
    print "V)iew     Show current batch with $more.\n";
    print "Z)ap      Erase and restart current batch.\n";
    print "?         Quick help.\n\n";
    return 1;
  }
  else {
    print "Unknown command: $c\n";
    return 1;
  } 
}


sub frint
{
  local($s) = @_;
  open(F,">>$tmp") || die "Cannot open $tmp: $!\n";
  print F $s;
  print " > " . $s;
  close(F);
}
SHAR_EOF
chmod +x 'mftp'
fi # end of overwriting check
#	End of shell archive
exit 0
-- 
Clay Luther, Postmaster          cluther at supernet.dallas.haus.com 
  Harris Adacom Corporation      cluther at enigma.dallas.haus.com
  Voice:  214/386-2356           MS 23, PO Box 809022, Dallas, Tx 75380-9022
  Fax:    214/386-2159           Your mileage may vary.  Void where prohibited.



More information about the Alt.sources mailing list