#!/usr/bin/env python # Minimal mIRC dccserver implementation, by Adam Sampson . # To use: "onenetd 0 59 python dccserver.py". import sys, re, time DOWNLOADDIR = "/home/azz/Incoming" NICK = "msyv" BLOCKSIZE = 1024*50 line = sys.stdin.readline().strip() print >>sys.stderr, "Read command: " + line (cmd, tail) = line.split(" ", 1) def mangle(x): return re.sub(r'[^a-zA-Z0-9 _\[\]\.-]', '', x.lower()) def hms(s): s = int(s) h = int(s / 3600) s -= (h * 3600) m = int(s / 60) s -= (m * 60) return "%02d:%02d:%02d" % (h, m, s) if cmd == "120": # dcc send # receive: 120 # send: 121 (nick, size, name) = tail.split(" ", 2) size = int(size) if name == "": raise "bad filename" name = mangle(name) destname = DOWNLOADDIR + "/" + name try: out = open(destname, "rb+") except IOError: out = open(destname, "wb") out.seek(0, 2) skip = out.tell() print "121 " + NICK + " " + str(skip) sys.stdout.flush() print >>sys.stderr, "Receiving file '" + name + "' from " + nick + ", size " + str(size) + ", resuming from " + str(skip) count = skip start = time.time() while 1: data = sys.stdin.read(BLOCKSIZE) datasize = len(data) out.write(data) out.flush() if datasize < BLOCKSIZE: break count += datasize now = time.time() elapsed = (now - start) + 0.01 rate = (count - skip) / elapsed total = (size - skip) / (rate + 0.01) eta = total - elapsed print >>sys.stderr, name + ": read " + str(count) + " of " + str(size) + ", elapsed " + hms(elapsed) + ", eta " + hms(eta), " rate " + ("%.2fKiB/s" % (rate / 1024)) out.close() else: print "150 unavailable" sys.stdout.flush() print >>sys.stderr, "Unsupported method: " + line