# A simple FTP client.
#
# The information to write this program was gathered from RFC 959,
# but this is not a complete implementation!  Yet it shows how a simple
# FTP client can be built, and you are welcome to extend it to suit
# it to your needs...
#
# How it works (assuming you've read the RFC):
#
# User commands are passed uninterpreted to the server.  However, the
# user never needs to send a PORT command.  Rather, the client opens a
# port right away and sends the appropriate PORT command to the server.
# When a response code 150 is received, this port is used to receive
# the data (which is written to stdout in this version), and when the
# data is exhausted, a new port is opened and a corresponding PORT
# command sent.  In order to avoid errors when reusing ports quickly
# (and because there is no s.getsockname() method in Python yet) we
# cycle through a number of ports in the 50000 range.


import sys, posix, string
from socket import *


BUFSIZE = 1024

# Default port numbers used by the FTP protocol.
#
FTP_PORT = 21
FTP_DATA_PORT = FTP_PORT - 1

# Change the data port to something not needing root permissions.
#
FTP_DATA_PORT = FTP_DATA_PORT + 50000


# Main program (called at the end of this file).
#
def main():
	hostname = sys.argv[1]
	control(hostname)


# Control process (user interface and user protocol interpreter).
#
def control(hostname):
	#
	# Create control connection
	#
	s = socket(AF_INET, SOCK_STREAM)
	s.connect(hostname, FTP_PORT)
	f = s.makefile('r') # Reading the replies is easier from a file...
	#
	# Control loop
	#
	r = None
	while 1:
		code = getreply(f)
		if code in ('221', 'EOF'): break
		if code == '150':
			getdata(r)
			code = getreply(f)
			r = None
		if not r:
			r = newdataport(s, f)
		cmd = getcommand()
		if not cmd: break
		s.send(cmd + '\r\n')


# Create a new data port and send a PORT command to the server for it.
# (Cycle through a number of ports to avoid problems with reusing
# a port within a short time.)
#
nextport = 0
#
def newdataport(s, f):
	global nextport
	port = nextport + FTP_DATA_PORT
	nextport = (nextport+1) % 16
	r = socket(AF_INET, SOCK_STREAM)
	r.bind(gethostbyname(gethostname()), port)
	r.listen(1)
	sendportcmd(s, f, port)
	return r


# Send an appropriate port command.
#
def sendportcmd(s, f, port):
	hostname = gethostname()
	hostaddr = gethostbyname(hostname)
	hbytes = string.splitfields(hostaddr, '.')
	pbytes = [`port/256`, `port%256`]
	bytes = hbytes + pbytes
	cmd = 'PORT ' + string.joinfields(bytes, ',')
	s.send(cmd + '\r\n')
	code = getreply(f)


# Process an ftp reply and return the 3-digit reply code (as a string).
# The reply should be a line of text starting with a 3-digit number.
# If the 4th char is '-', it is a multi-line reply and is
# terminate by a line starting with the same 3-digit number.
# Any text while receiving the reply is echoed to the file.
#
def getreply(f):
	line = f.readline()
	if not line: return 'EOF'
	print line,
	code = line[:3]
	if line[3:4] == '-':
		while 1:
			line = f.readline()
			if not line: break # Really an error
			print line,
			if line[:3] == code and line[3:4] != '-': break
	return code


# Get the data from the data connection.
#
def getdata(r):
	print '(accepting data connection)'
	conn, host = r.accept()
	print '(data connection accepted)'
	while 1:
		data = conn.recv(BUFSIZE)
		if not data: break
		sys.stdout.write(data)
	print '(end of data connection)'

# Get a command from the user.
#
def getcommand():
	try:
		while 1:
			line = raw_input('ftp.py> ')
			if line: return line
	except EOFError:
		return ''


# Call the main program.
#
main()
