#!/usr/bin/env python import argparse,sys,os, subprocess from subprocess import Popen, PIPE, STDOUT from io import BytesIO ROOTURL="{{ rooturl }}" SHARE="{{ name }}" TOKEN="{{ token }}" def split_upload(path, opts): if os.path.isdir(path): tar = Popen( [ 'tar','c',path ], stdout = PIPE ) reader = tar.stdout basename = os.path.basename(path.rstrip("/")) + ".tar" elif os.path.isfile(path): reader = open(path, 'rb') basename = os.path.basename(path) else: print("Path %s doesnt exist"%( path, )) return try: chunk = reader.read(opts.split * 1024 * 1024) part = 0 while chunk != "": chunk_name = ".%s.part.%03d"%( basename, part ) print("%s part %d"%( basename, part )) if not is_chunk_sent(chunk_name, opts): p = Popen( [ 'curl','-f', '-F','file=@-;filename=%s'%(chunk_name,), '%supload/%s/%s'%(opts.rooturl, opts.share, opts.token) ], stdout=PIPE, stdin=PIPE, stderr=PIPE ) stdout_data, stderr_data = p.communicate(input=chunk) print(stdout_data) chunk = reader.read(opts.split * 1024 * 1024) part += 1 finally: reader.close() join_chunks(basename,opts) return def is_chunk_sent(name, opts): p = Popen( [ 'curl','-s', '%sfile/size/%s/%s/%s'%(opts.rooturl, opts.share, opts.token, name) ], stdout=PIPE, stderr=PIPE ) stdout_data, stderr_data = p.communicate() return stdout_data == str(opts.split * 1024 * 1024) def join_chunks(name,opts): p = Popen( [ 'curl', '-F','filename=%s'%(name,), '%supload_join/%s/%s'%(opts.rooturl, opts.share, opts.token) ], stdout=PIPE, stderr=PIPE ) stdout_data, stderr_data = p.communicate() print(stdout_data) def parse_options(): parser = argparse.ArgumentParser(description='Flees uploader') parser.add_argument('-s', action="store", type=int, dest="split", default = 64, help = "Split size in megabytes [%(default)s]" ) parser.add_argument('--rooturl', action="store", dest="rooturl", default = ROOTURL, help = "Address of Flees server [%(default)s]" ) parser.add_argument('--share', action="store", dest="share", default = SHARE, help = "Name of Flees share [%(default)s]" ) parser.add_argument('--token', action="store", dest="token", default = TOKEN, help = "API token for the share [%(default)s]" ) parser.add_argument('path', nargs='+') return parser.parse_args() if __name__ == "__main__": opts = parse_options() for path in opts.path: split_upload(path,opts)