#! /usr/bin/env python """ Upload socializer to the ftp server. This script has been created to be executed from a continuous integrations system. Important note: for this script to work, the following conditions should be met: * There must be ftp server data, via environment variables (FTP_SERVER, FTP_USERNAME and FTP_PASSWORD) or via arguments to the script call (in the prior order). Connection to this server is done via default ftp port via TLS. * this code assumes it's going to connect to an FTP via TLS. * If the version to upload is alpha, there's not need of an extra variable. Otherwise, CI_COMMIT_TAG should point to a version as vx.x, where v is a literal and x are numbers, example may be v0.18, v0.25, v0.3. This variable should be set in the environment. * Inside the ftp server, the following directory structure will be expected: socializer.su/static/files/. The script will create the folder or alpha if needed. * The script will upload all .exe, .zip and .json files located in the root directory from where it was called. The json files are uploaded to socializer.su/static/files/update and other files are going to socializer.su/static/files/. """ import sys import os import glob import ftplib transferred=0 class MyFTP_TLS(ftplib.FTP_TLS): """Explicit FTPS, with shared TLS session""" def ntransfercmd(self, cmd, rest=None): conn, size = ftplib.FTP.ntransfercmd(self, cmd, rest) if self._prot_p: conn = self.context.wrap_socket(conn, server_hostname=self.host, session=self.sock.session) # this is the fix return conn, size def convert_bytes(n): K, M, G, T, P = 1 << 10, 1 << 20, 1 << 30, 1 << 40, 1 << 50 if n >= P: return '%.2fPb' % (float(n) / T) elif n >= T: return '%.2fTb' % (float(n) / T) elif n >= G: return '%.2fGb' % (float(n) / G) elif n >= M: return '%.2fMb' % (float(n) / M) elif n >= K: return '%.2fKb' % (float(n) / K) else: return '%d' % n def callback(progress): global transferred transferred = transferred+len(progress) print("Uploaded {}".format(convert_bytes(transferred),)) ftp_server = os.environ.get("FTP_SERVER") or sys.argv[1] ftp_username = os.environ.get("FTP_USERNAME") or sys.argv[2] ftp_password = os.environ.get("FTP_PASSWORD") or sys.argv[3] version = os.environ.get("CI_COMMIT_TAG") or "alpha" version = version.replace("v", "") print("Uploading files to the Socializer server...") print("Connecting to %s" % (ftp_server,)) connection = MyFTP_TLS(ftp_server) print("Connected to FTP server {}".format(ftp_server,)) connection.login(user=ftp_username, passwd=ftp_password) connection.prot_p() print("Logged in successfully") connection.cwd("socializer.su/static/files/") if version not in connection.nlst(): print("Creating version directory {} because does not exists...".format(version,)) connection.mkd(version) if "update" not in connection.nlst(): print("Creating update info directory because does not exists...") connection.mkd("update") connection.cwd(version) print("Moved into version directory") files = glob.glob("*.zip")+glob.glob("*.exe")+glob.glob("*.json") print("These files will be uploaded into the version folder: {}".format(files,)) for file in files: transferred = 0 print("Uploading {}".format(file,)) with open(file, "rb") as f: if file.endswith("json"): connection.storbinary('STOR ../update/%s' % file, f, callback=callback, blocksize=1024*1024) else: connection.storbinary('STOR %s' % file, f, callback=callback, blocksize=1024*1024) print("Upload completed. exiting...") connection.quit()