publish-scripts/shared/helper.py (86 lines of code) (raw):
#! /usr/bin/env python3
import os
import sys
import hashlib
import subprocess
from . import constants
def restoreDirectory(f):
def inner(*args, **kwargs):
currentDir = os.getcwd()
returnV = f(*args, **kwargs)
os.chdir(currentDir)
return returnV
return inner
# for some commands, returnCode means success
# for others you need to verify the output string yourself
def printReturnOutput(args, shell=False, confirm=False):
begin = '=' * 38 + "Running Subprocess" + "=" * 38
print(begin)
print(' '.join(args))
if (confirm):
input("This seems to be a non reversable behavior, do you still want to proceed? (Ctrl-C if you are not sure)\n")
output = '-' * 40 + "Console Output" + "-" * 40
print(output)
try:
binary = subprocess.check_output(args, shell=shell)
if len(binary) < 1:
string = None
else:
string = binary.decode('ascii')
print(string)
footer = "=" * 94
print(footer)
return string
except subprocess.CalledProcessError:
# rerun the command, direct output to stdout
subprocess.call(args)
raise
BUFFERSIZE = 1024
def produceHashForfile(filePath, hashType, Upper = True):
# hashType is string name iof
hashobj = hashlib.new(hashType)
with open(filePath,'rb') as f:
buf = f.read(BUFFERSIZE)
while len(buf) > 0:
hashobj.update(buf)
buf = f.read(BUFFERSIZE)
if Upper:
return hashobj.hexdigest().upper()
else:
return hashobj.hexdigest().lower()
@restoreDirectory
def linuxOutput(buildFolder):
os.chdir(constants.DRIVERROOTDIR)
# ubuntu dropped 64, fedora supports both
fileName = f"Azure.Functions.Cli.linux-x64.{constants.VERSION}.zip"
url = f'https://cdn.functions.azure.com/public/4.0.{constants.CONSOLIDATED_BUILD_ID}/{fileName}'
# download the zip
# output to local folder
import wget
if not os.path.exists(fileName):
print(f"downloading from {url}")
wget.download(url)
usr = os.path.join(buildFolder, "usr")
usrlib = os.path.join(usr, "lib")
usrlibFunc = os.path.join(usrlib, constants.PACKAGENAME)
os.makedirs(usrlibFunc)
# unzip here
import zipfile
with zipfile.ZipFile(fileName) as f:
print(f"extracting to {usrlibFunc}")
f.extractall(usrlibFunc)
# create relative symbolic link under bin directory, change mode to executable
usrbin = os.path.join(usr, "bin")
os.makedirs(usrbin)
# cd into usr/bin, create relative symlink
os.chdir(usrbin)
print("create symlink for func")
os.symlink(f"../lib/{constants.PACKAGENAME}/func", "func")
# executable to be returned
exeFullPath = os.path.abspath("func")
os.chdir(buildFolder)
# strip sharedobjects
import glob
sharedObjects = glob.glob("**/*.so", recursive=True)
# obj files inside the workers should not be removed as workers like "python"
# come with objects necessary for the worker to work.
sharedObjects = [obj for obj in sharedObjects if "workers" not in obj]
printReturnOutput(["strip", "--strip-unneeded"] + sharedObjects)
chmodFolderAndFiles(os.path.join(buildFolder, "usr"))
print(f"change bin/func permission to 755")
# octal
os.chmod(exeFullPath, 0o755)
print(f"change {usrlibFunc}/gozip permission to 755")
os.chmod(f"{usrlibFunc}/gozip", 0o755)
def chmodFolderAndFiles(folder):
print(f"change permission of files in {folder}")
os.chmod(folder, 0o755)
for r, ds, fs in os.walk(folder):
for d in ds:
# folder permission to 755
os.chmod(os.path.join(r, d), 0o755)
for f in fs:
# file permission to 644
os.chmod(os.path.join(r, f), 0o644)