#!/usr/bin/env python3
# encoding: utf-8

import paramiko
import platform
import os
import datetime
import time
import sys
import hashlib
import multiprocessing

start = int(time.time())
now = datetime.datetime.now()
dest = "/home/frs/project/bfw-travis-upload/"

# upload a single file
def upload_file(src, dest):
    with paramiko.Transport(("frs.sourceforge.net", 22)) as transport:
        try:
            transport.connect(None, "bfw-uploader", os.environ["SFTP_PASSWORD"])
        except:
            print("SFTP_PASSWORD not present, exiting...")
            sys.exit(1)

        with paramiko.SFTPClient.from_transport(transport) as sftp:
            sftp.put(src, dest)

# delete a single file
def delete_file(dest):
    with paramiko.Transport(("frs.sourceforge.net", 22)) as transport:
        try:
            transport.connect(None, "bfw-uploader", os.environ["SFTP_PASSWORD"])
        except:
            print("SFTP_PASSWORD not present, exiting...")
            sys.exit(1)

        with paramiko.SFTPClient.from_transport(transport) as sftp:
            sftp.remove(dest)

# make remote directories if they don't already exist
with paramiko.Transport(("frs.sourceforge.net", 22)) as transport:
    try:
        transport.connect(None, "bfw-uploader", os.environ["SFTP_PASSWORD"])
    except:
        print("SFTP_PASSWORD not present, exiting...")
        sys.exit(1)

    with paramiko.SFTPClient.from_transport(transport) as sftp:
        dest = dest+os.environ["BRANCH"]+"/"
        try:
            sftp.mkdir(dest)
        except:
            pass

        dest = dest+str(now.year)+"-"+str(now.month).zfill(2)+"-"+str(now.day).zfill(2)+"/"
        try:
            sftp.mkdir(dest)
        except:
            pass

        dest = dest+os.environ["TRAVIS_COMMIT"]+"/"
        try:
            sftp.mkdir(dest)
        except:
            pass

        dest = dest+os.environ["UPLOAD_ID"]+"/"
        try:
            sftp.mkdir(dest)
        except:
            pass

for arg in sys.argv[1:]:
    if __name__ == '__main__':
        proc = multiprocessing.Process(name="Upload", target=upload_file, args=(arg, dest+arg.split("/")[-1]))
        proc.start()
        proc.join(300)
        if proc.is_alive():
            proc.terminate()
            delete_file(dest+arg.split("/")[-1])
            print("Killed upload for "+dest+arg.split("/")[-1]+" due to taking too long.")
            continue

        sha256 = hashlib.sha256()
        with open(arg, "rb") as f:
            while True:
                data = f.read(100000)
                if not data:
                    break
                sha256.update(data)
        print("sha256 of "+arg+": "+sha256.hexdigest())

print("SFTP duration: "+str(int(time.time())-start)+" seconds")
