110 lines
3.0 KiB
Python
110 lines
3.0 KiB
Python
#!/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)
|