#!/usr/bin/env python
# Auther : Kong Hyeog Jun <sanzio2001@hanmail.net>
# Copyright (c) 2002, Kong Hyeog Jun. 
# 
# Version : 0.10a
# Last Modified  August 19, 2002

from ftplib import FTP
import ftplib
import sys, cmd, string, os,socket,time

class Simple_FTP_Client(cmd.Cmd):
	
	def __init__(self):
		cmd.Cmd.__init__(self)
		self.prompt = "kFTP>"
		self.ftp = FTP()
		self.wdir =""
		self.file_size = 0
		print "Welcome, kFTP 0.10a!"
		while 1:
			try :
				ServerName = raw_input("Enter Server Name:")
				print "connecting..."
				self.ftp.connect(ServerName)
			except socket.gaierror:
				print "Error : No address associated with Server Name"
				print "Again!"
			except:
				pass
			else:
				break
		print "Connected to %s" % ServerName

		UserID = raw_input("Login Name:")
		if UserID == "": UserID = "anonymous"
		UserPW = raw_input("Password:")
		if UserPW == "": UserPW = "realuser@host"
		flag = 0
		
		while 1:
			if flag:
				UserID = raw_input("Enter User ID:")
				UserPW = raw_input("Enter User PW:")
				flag = 0
			if not flag:
				try:
					self.ftp.login(UserID,UserPW)
				except ftplib.error_perm:
					print "Error : User anonymous login failed."
					print "Again!"
					flag = 1
				else:
					break
				
		print "Login successful. Have fun!"

	#	<<< Don,t use this command yet >>>
	#def do_literal(self,FSCmd):
	#	if FSCmd == "": FSCmd = raw_input("Enter FTP SERVICE COMMAND:")
	#	FSCmd = string.split(FSCmd," ")
	#	if FSCmd[0][1] == "v":
	#		self.ftp.voidcmd(FSCmd[1])
	#	elif FSCmd[0][1] == "s":
	#		while 1:
	#			tmp = self.ftp.sendcmd(FSCmd[1])
	#			if not tmp:
	#				break
	#			print tmp
	#		tmp = self.ftp.getresp()
	#		print tmp
	def help_size(self):
		print "DESCRIPTION requests the size of the file named 'filename' on the server"
		print "SYNOPSIS    size [filename]"
	def do_size(self, tar):
		if tar: 
			resp = self.ftp.sendcmd("TYPE A")
			conn = self.ftp.transfercmd("LIST")
			fd = conn.makefile('rb')
			while 1:
				line = fd.readline()
				if len(line) == 0:
					print "Error : %s is NOT exist" % (tar)
					break
				if line[-2:] == "\r\n":
					tmp = line[:-2]
				elif line[-1:] == "\n":
					tmp = line[:-1]
				tmp2 = string.split(tmp, " ")
				for x in tmp2:
					if x == tar: 
						self.file_size = int(tmp2[-5])
						break
				if self.file_size != 0: break
			fd.close()
			conn.close()
			self.ftp.voidresp()
		else:
			self.help_size()

	def ShowDir(self,strarg = None):
		try:
			tmp = self.ftp.sendcmd('PWD')
			tmp = string.split(tmp," ")
			print "Remote Current Directory is "+tmp[1]
		except:
			pass
	def help_get(self):
		print "DESCRIPTION stores a file in binary transfer mode."
		print "SYNOPSIS    get [filename]"
	def do_get(self, tar):
		if tar:
			self.do_size(tar)
			self.ftp.voidcmd("TYPE I")
			conn = self.ftp.transfercmd("RETR "+tar) 
			f = file(tar,"w")
			flen = 0
			while 1:
				block = conn.recv(8192)
				if len(block) == 0:
					break
				flen = flen + len(block)
				f.write(block)
				print "\r Transferring:%10dKB/%sKB %d%%" % (flen , self.file_size,int((flen/float(self.file_size))*100)),
			print "\r Transferred :%10dKB/%sKB" % (flen, self.file_size)
			conn.close()
			self.ftp.voidresp()
			self.file_size = 0
		else:
			self.help_get()

	def help_put(self):
		print "DESCRIPTION retrieve a file in binary mode."
		print "SYNOPSIS    put [filename]"
	def do_put(self,tar):
		if tar:
			self.ftp.voidcmd("TYPE I")
			conn = self.ftp.transfercmd("STOR "+tar) 
			flen = 0
			f = file(tar,"r")
			while 1:
				block = f.read(8192)
			
				if len(block) == 0:
					break
				print "\r\r Transferring: %dKB" % (flen),
				flen = flen + len(block)
				conn.sendall(block)
			print "\r Transferred : %dKB" %(flen)
			conn.close()
			self.ftp.voidresp()
		else:
			self.help_put()
		
	def help_ls(self):
		print "DESCRIPTION show a list of files of the currrent directory on the server "
		print "SYNOPSIS    ls"
	def do_ls(self,strarg = None):
		self.ftp.retrlines('LIST')
		self.ShowDir(self)
	
	def help_cd(self):
		print "DESCRIPTION set the current directory on the server."
		print "SYNOPSIS    cd [pathname]"		
	def do_cd(self,tdir):
		if tdir:
			self.ftp.cwd(tdir)
			self.ShowDir(self)
		else:
			self.help_cd()

	def help_bye(self):
		print "DESCRIPTION terminates kFTP."
		print "SYNOPSIS    bye"			
	def do_bye(self,strarg = None):
		self.ftp.quit()
		print "See ya again!"
		sys.exit()

	def help_mkdir(self):
		print "DESCRIPTION creates a new directory named dirname on the server."
		print "SYNOPSIS    mkdir [dirname]"		
	def do_mkdir(self, dirname):
		if dirname:
			self.ftp.mkd(dirname)
			print "MKDIR success!"
			self.ShowDir(self)
		else:
			self.help_mkdir()

	def help_rmdir(self):
		print "DESCRIPTION removes the directory named dirname on the server."
		print "SYNOPSIS    rmdir [dirname]"	
	def do_rmdir(self, dirname):
		if dirname:
			self.ftp.rmd(dirname)
			print "RMDIR success!"
			self.ShowDir(self)
		else:
			self.help_rmdir()
	
	def help_rm(self):
		print "DESCRIPTION removes the file named filename from the server."
		print "SYNOPSIS    rm [filename]"			
	def do_rm(self, filename):
		if filename:
			self.ftp.delete(filename)
			print "RM sucess!"
			self.ShowDir(self)
		else:
			self.help_rm()
	
	def help_mv(self):
		print "DESCRIPTION Rename file fromname on the server to toname"
		print "SYNOPSIS    mv [fromname] [toname]"
	def do_mv(self,file):
		if file:
			files = string.split(file," ")
			self.ftp.rename(files[0],files[1])
			print "REN sucess!"
			self.ShowDir(self)
		else:
			self.help_mv()
	
	def help_nlst(self):
		pass
	def do_nlst(self,strang= None):
		self.ftp.nlst()

	def help_lcd(self):
		print "DESCRIPTION show the current directory on local host."
		print "SYNOPSIS    lcd"
	def do_lcd(self, strarg = None):
		print "Locol Current Directory is "+ os.getcwd()

	def do_about(self, strang = None):
		print "###############################################################"
		print "##                Simple FTP Client Program                  ##"
		print "###############################################################"
		print "##  Program Name  : kFTP                                     ##"
		print "##  Version       : 0.10a                                    ##" 
		print "##  Auther        : Kong Hyeog Jun  <sanzio2001@hanmail.net> ##"
		print "##  If any bug, please send mail me bug report.              ##"
		print "##  Enjoy python!                                            ##" 
		print "###############################################################"

if __name__ == "__main__":
	start = Simple_FTP_Client()
	start.cmdloop()
	