Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Dade, dade

Parola la lock screen

Deparazitare externa pisici fara ...

Seriale turcesti/coreene online H...
 Merita un Termostat Smart pentru ...

Sfat achizitie MTB Devron Riddle

Problema mare cu parintii= nervi ...

switch microtik
 Permis categoria B la 17 ani

Sfaturi pentru pregatirea de eval...

Crapaturi placa

cum imi accesez dosarul electroni...
 Momentul Aprilie 1964

Sursa noua - zgomot ?

A fost lansat Ubuntu 24.04 LTS

Pareri apartament in zona Berceni?
 

FTP Server in Python

- - - - -
  • Please log in to reply
No replies to this topic

#1
nikushoru

nikushoru

    Junior Member

  • Grup: Members
  • Posts: 219
  • Înscris: 17.03.2010
Salut, am un server ftp si trebuie sa modific functia de stor ca sa pot incarca un director intreg. Nu prea cunosc pythonul. Vrea cineva sa ma ajute ?

import os, socket, threading, time
from ftplib import FTP
import sys
import chilkat
import ftplib
#import ftptools
#import traceback

allow_delete = True
local_ip = socket.gethostbyname(socket.gethostname())
#local_ip = "192.168.43.59"
#local_port = 21
local_port = 9859
currdir=os.path.abspath('./ftp')

class FTPserverThread(threading.Thread):
def __init__(self,(conn,addr)):
self.conn=conn
self.addr=addr
self.basewd=currdir
self.cwd=self.basewd
self.rest=False
self.mode = None
self.pasv_mode=False
threading.Thread.__init__(self)

def run(self):
self.conn.send('220 Welcome!\r\n')
while True:
cmd=self.conn.recv(256)
if not cmd: break
else:
print 'Recieved:',cmd
try:
	 func=getattr(self,cmd[:4].strip().upper())
	 func(cmd)
except Exception,e:
	 print 'ERROR:',e
	 #traceback.print_exc()
	 self.conn.send('500 Sorry.\r\n')

def SYST(self,cmd):
self.conn.send('215 UNIX Type\r\n')
def OPTS(self,cmd):
if cmd[5:-2].upper()=='UTF8 ON':
self.conn.send('200 OK.\r\n')
else:
self.conn.send('451 Sorry.\r\n')
def USER(self,cmd):
self.conn.send('331 OK.\r\n')
def PASS(self,cmd):
self.conn.send('230 OK.\r\n')
#self.conn.send('530 Incorrect.\r\n')
def QUIT(self,cmd):
self.conn.send('221 Goodbye.\r\n')
def TYPE(self,cmd):
self.mode=cmd[5]
self.conn.send('200 Binary mode.\r\n')


def PWD(self,cmd):
cwd=os.path.relpath(self.cwd,self.basewd)
if cwd=='.':
cwd='/'
else:
cwd='/'+cwd
self.conn.send('257 \"%s\"\r\n' % cwd)
def CWD(self,cmd):
chwd=cmd[4:-2]
if chwd=='/':
self.cwd=self.basewd
elif chwd[0]=='/':
self.cwd=os.path.join(self.basewd,chwd[1:])
else:
self.cwd=os.path.join(self.cwd,chwd)
self.conn.send('250 OK.\r\n')

def PORT(self,cmd):
if self.pasv_mode:
self.servsock.close()
self.pasv_mode = False
l=cmd[5:].split(',')
self.dataAddr='.'.join(l[:4])
self.dataPort=(int(l[4])<<8)+int(l[5])
self.conn.send('200 Get port.\r\n')

def PASV(self,cmd): # from http://goo.gl/3if2U
self.pasv_mode = True
self.servsock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.servsock.bind((local_ip,0))
self.servsock.listen(1)
ip, port = self.servsock.getsockname()
print 'open', ip, port
self.conn.send('227 Entering Passive Mode (%s,%u,%u).\r\n' %
(','.join(ip.split('.')), port>>8&0xFF, port&0xFF))

def start_datasock(self):
if self.pasv_mode:
self.datasock, addr = self.servsock.accept()
print 'connect:', addr
else:
self.datasock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.datasock.connect((self.dataAddr,self.dataPort))

def stop_datasock(self):
self.datasock.close()
if self.pasv_mode:
self.servsock.close()


def LIST(self,cmd):
self.conn.send('150 Here comes the directory listing.\r\n')
print 'list:', self.cwd
self.start_datasock()
for t in os.listdir(self.cwd):
k=self.toListItem(os.path.join(self.cwd,t))
self.datasock.send(k+'\r\n')
self.stop_datasock()
self.conn.send('226 Directory send OK.\r\n')

def toListItem(self,fn):
st=os.stat(fn)
fullmode='rwxrwxrwx'
mode=''
for i in range(9):
mode+=((st.st_mode>>(8-i))&1) and fullmode[i] or '-'
d=(os.path.isdir(fn)) and 'd' or '-'
ftime=time.strftime(' %b %d %H:%M ', time.gmtime(st.st_mtime))
return d+mode+' 1 user group '+str(st.st_size)+ftime+os.path.basename(fn)

def MKD(self,cmd):
dn=os.path.join(self.cwd,cmd[4:-2])
os.mkdir(dn)
self.conn.send('257 Directory created.\r\n')

def RMD(self,cmd):
dn=os.path.join(self.cwd,cmd[4:-2])
if allow_delete:
os.rmdir(dn)
self.conn.send('250 Directory deleted.\r\n')
else:
self.conn.send('450 Not allowed.\r\n')

def DELE(self,cmd):
fn=os.path.join(self.cwd,cmd[5:-2])
if allow_delete:
os.remove(fn)
self.conn.send('250 File deleted.\r\n')
else:
self.conn.send('450 Not allowed.\r\n')

def RETR(self,cmd):
fn=os.path.join(self.cwd,cmd[5:-2])
#print 'Downloading:',fn
#if self.mode=='I':
# fi=open(fn,'rb')
#else:
# fi=open(fn,'r')
#self.conn.send('150 Opening data connection.\r\n')
#if self.rest:
# fi.seek(self.pos)
# self.rest=False
#data= fi.read(1024)
#self.start_datasock()
#while data:
# self.datasock.send(data)
# data=fi.read(1024)
#fi.close()
#self.stop_datasock()
#self.conn.send('226 Transfer complete.\r\n')
#ftp = chilkat.CkFtp2()
#success = ftp.UnlockComponent("Anything for 30-day trial")
#ftp.put_Hostname("127.0.1.1")
#ftp.put_Username("test")
#ftp.put_Password("test")
#success = ftp.Connect()

#success = ftp.DownloadTree(fn)
#if (success != True):
	 #print(ftp.lastErrorText())
	 #sys.exit()

@staticmethod
def uploadThis(self,path):
	 files = os.listdir(path)
	 os.chdir(path)
	 for f in files:
if os.path.isfile(path + r'\{}'.format(f)):
	 fh = open(f, 'rb')
	 self.storbinary('STOR %s' % f, fh)
	 fh.close()
elif os.path.isdir(path + r'\{}'.format(f)):
	 self.mkd(f)
	 self.cwd(f)
	 uploadThis(path + r'\{}'.format(f))
	 self.cwd('..')
	 os.chdir('..')

def STOR(self,cmd):
fn=os.path.join(self.cwd,cmd[5:-2])
print 'Uplaoding:',fn
"""
if self.mode and self.mode=='I':
fo=open(fn,'wb')
else:
fo=open(fn,'w')
self.conn.send('150 Opening data connection.\r\n')
self.start_datasock()
while True:
data=self.datasock.recv(1024)
if not data: break
fo.write(data)
fo.close()
self.stop_datasock()
self.conn.send('226 Transfer complete.\r\n')
"""

self.uploadThis(sefl, fn)

class FTPserver(threading.Thread):
def __init__(self):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.bind((local_ip,local_port))
threading.Thread.__init__(self)

def run(self):
self.sock.listen(5)
while True:
th=FTPserverThread(self.sock.accept())
th.daemon=True
th.start()

def stop(self):
self.sock.close()

if __name__=='__main__':
ftp=FTPserver()
ftp.daemon=True
ftp.start()
print 'On', local_ip, ':', local_port
raw_input('Enter to end...\n')
ftp.stop()


Primesc eroarea data :
Uplaoding: /home/nicolae/Documents/ftp/transfer
ERROR: 'str' object is not callable

Edited by nikushoru, 25 November 2015 - 19:21.


Anunturi

Bun venit pe Forumul Softpedia!

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate