summaryrefslogtreecommitdiffstats
path: root/module/network/FTPBase.py
diff options
context:
space:
mode:
Diffstat (limited to 'module/network/FTPBase.py')
-rw-r--r--module/network/FTPBase.py208
1 files changed, 0 insertions, 208 deletions
diff --git a/module/network/FTPBase.py b/module/network/FTPBase.py
deleted file mode 100644
index d8fc5a20d..000000000
--- a/module/network/FTPBase.py
+++ /dev/null
@@ -1,208 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-"""
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License,
- or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-
- @author: mkaay
-"""
-
-from ftplib import FTP
-
-import socket
-import socks
-
-from os.path import getsize
-from urlparse import urlparse
-from urllib2 import _parse_proxy
-
-from helper import *
-
-class FTPBase(FTP):
- sourceAddress = ('', 0)
-
- def setSourceAddress(self, host):
- self.sourceAddress = (host, 0)
-
- def connect(self, host='', port=0, timeout=30, proxies={}):
- if host != '':
- self.host = host
- if port > 0:
- self.port = port
- self.timeout = timeout
-
- proxytype = None
- proxy = None
- if "socks5" in proxies:
- proxytype = socks.PROXY_TYPE_SOCKS5
- proxy = proxies["socks5"]
- elif "socks4" in proxies:
- proxytype = socks.PROXY_TYPE_SOCKS4
- proxy = proxies["socks4"]
- if proxytype:
- self.sock = socks.socksocket()
- t = _parse_proxy(proxy)
- self.sock.setproxy(proxytype, addr=t[3].split(":")[0], port=int(t[3].split(":")[1]), username=t[1], password=t[2])
- else:
- self.sock = socket.socket()
- self.sock.settimeout(self.timeout)
- self.sock.bind(self.sourceAddress)
- self.sock.connect((self.host, self.port))
- self.af = self.sock.family
- self.file = self.sock.makefile('rb')
- self.welcome = self.getresp()
- return self.welcome
-
-class WrappedFTPDeferred(WrappedDeferred):
- pass
-
-class FTPDownload():
- def __init__(self, url, filename, interface=None, bucket=None, proxies={}):
- self.url = url
- self.filename = filename
-
- self.bucket = bucket
- self.interface = interface
- self.proxies = proxies
-
- self.deferred = Deferred()
-
- self.finished = False
- self.size = None
-
- self.speed = 0
-
- self.abort = False
-
- self.arrived = 0
-
- self.startTime = None
- self.endTime = None
-
- self.speed = 0 #byte/sec
- self.speedCalcTime = None
- self.speedCalcLen = 0
-
- self.bufferSize = 16*1024 #tune if performance is poor
-
- self.ftp = FTPBase()
- self.fh = None
-
- @threaded
- def _download(self, offset):
- remotename = self.url.split("/")[-1]
- cmd = "RETR %s" % remotename
-
- self.startTime = inttime()
- self.arrived = offset
- conn, size = self.ftp.ntransfercmd(cmd, None if offset == 0 else offset) #explicit None
- if size:
- self.size = size + offset
- while True:
- if self.abort:
- self.ftp.abort()
- break
- count = self.bufferSize
- if self.bucket:
- count = self.bucket.add(count)
- if count == 0:
- sleep(0.01)
- continue
-
- try:
- data = conn.recv(count)
- except:
- self.deferred.error("timeout")
-
- if self.speedCalcTime < inttime():
- self.speed = self.speedCalcLen
- self.speedCalcTime = inttime()
- self.speedCalcLen = 0
- try:
- self.deferred.progress("percent", 100-int((self.size - self.arrived)/float(self.size)*100))
- except:
- pass
- size = len(data)
- self.speedCalcLen += size
- self.arrived += size
-
- if not data:
- break
-
- self.fh.write(data)
- self.fh.close()
- conn.close()
- self.endTime = inttime()
- if not self.abort:
- print self.ftp.voidresp() #debug
-
- self.ftp.quit()
- if self.abort:
- self.deferred.error("abort")
- elif self.size is None or self.size == self.arrived:
- self.deferred.callback()
- else:
- self.deferred.error("wrong content lenght")
-
- def download(self, resume=False):
- self.fh = open("%s.part" % self.filename, "ab" if resume else "wb")
- offset = 0
- if resume:
- offset = getsize("%s.part" % self.filename)
-
- up = urlparse(self.url)
-
- self.ftp.connect(up.hostname, up.port if up.port else 21, proxies=self.proxies)
- self.ftp.login(up.username, up.password)
- self.ftp.cwd("/".join(up.path.split("/")[:-1]))
- self.ftp.voidcmd('TYPE I')
- self.size = self.ftp.size(self.url.split("/")[-1])
-
- self._download(offset)
- return WrappedFTPDeferred(self, self.deferred)
-
-if __name__ == "__main__":
- import sys
- from Bucket import Bucket
- bucket = Bucket()
- bucket.setRate(200*1000)
- #bucket = None
-
- url = "ftp://mirror.sov.uk.goscomb.net/ubuntu-releases/maverick/ubuntu-10.10-desktop-i386.iso"
-
- finished = False
- def err(*a, **b):
- print a, b
- def callb(*a, **b):
- global finished
- finished = True
- print a, b
-
- print "starting"
-
- dwnld = FTPDownload(url, "ubuntu_ftp.iso")
- d = dwnld.download(resume=True)
- d.addCallback(callb)
- d.addErrback(err)
-
- try:
- while True:
- if not dwnld.finished:
- print dwnld.speed/1024, "kb/s", "size", dwnld.arrived, "/", dwnld.size#, int(float(dwnld.arrived)/dwnld.size*100), "%"
- if finished:
- print "- finished"
- break
- sleep(1)
- except KeyboardInterrupt:
- dwnld.abort = True
- sys.exit()