Last active
June 16, 2016 20:10
-
-
Save adamscott/53c785af36b91d5ad12983f35f1a3020 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python3 | |
import os | |
import os.path | |
import time | |
import math | |
import subprocess | |
import sys | |
filename = None | |
try: | |
filename_index = sys.argv.index("--filename") | |
filename = sys.argv[filename_index + 1] | |
except ValueError as err: | |
print("filename not found") | |
sys.exit(1) | |
finally: | |
if filename is None: | |
filename = "" | |
try: | |
splitsize_index = sys.argv.index("--bytes") | |
splitsize = sys.argv[splitsize_index + 1] | |
except ValueError as err: | |
splitsize = None | |
finally: | |
if splitsize is None: | |
#splitsize = 1000 * 1000 * 1000 * 4.71 - 1024 | |
splitsize = 1024 * 1024 * 5 | |
chunksize = 1024 * 1024 | |
letters_width = 2 | |
letters = ["a", "b", "c", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", | |
"o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"] | |
def get_suffix(index): | |
suffix_array = [] | |
while True: | |
quotient = math.floor(index/26) | |
letter_index = index % 26 | |
suffix_array.append(letters[letter_index]) | |
if quotient > 0: | |
index = quotient | |
else: | |
break | |
if letters_width - len(suffix_array) > 0: | |
for i in range(0, letters_width - len(suffix_array)): | |
suffix_array.append("a") | |
suffix_str = "" | |
for i in range(0, letters_width): | |
suffix_str += suffix_array.pop() | |
return suffix_str | |
_data_leftover = None | |
def read_stdin(size, chunksize): | |
global _data_leftover | |
bytes_read = 0 | |
while True: | |
if bytes_read > size: | |
break | |
if _data_leftover is not None: | |
data = _data_leftover | |
_data_leftover = None | |
data += sys.stdin.buffer.read(chunksize - len(data)) | |
else: | |
data = sys.stdin.buffer.read(chunksize) | |
bytes_read += len(data) | |
if bytes_read > size: | |
excedent = bytes_read - size | |
excedent_index = len(data) - excedent | |
_data_leftover = data[excedent_index:len(data) - 1] | |
data = data[0:excedent_index - 1] | |
if data: | |
yield data | |
else: | |
break | |
def run(): | |
global _data_leftover | |
i = 0 | |
directory = 'backup' | |
os.makedirs(directory, exist_ok=True) | |
while True: | |
if not _data_leftover: | |
_data_leftover = sys.stdin.buffer.read(1024) | |
if not _data_leftover: | |
break | |
# Create a file | |
suffix = get_suffix(i) | |
split_filename = "{}/{}.{}".format(directory, filename, suffix) | |
print("==> Creating {}...".format(split_filename)) | |
with open(split_filename, 'w+b') as w: | |
for chunk in read_stdin(splitsize, 1024 * 1024): | |
w.write(chunk) | |
w.close() | |
print("Done.") | |
print("Creating sha256 file.") | |
shasum = subprocess.getoutput("sha256sum {}".format(split_filename)) | |
with open("{}.sha256".format(split_filename), 'w') as w: | |
w.write(shasum) | |
print("Waiting {} to be deleted...".format(split_filename)) | |
while True: | |
time.sleep(1) | |
if not os.path.isfile(split_filename): | |
break | |
i += 1 | |
run() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment