Files
2020-09-04 03:16:25 -07:00

508 lines
19 KiB
Python
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#
# =======================================================================
#
# Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1 Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# 2 Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# 3 Neither the names of the copyright holders nor the names of the
# contributors may be used to endorse or promote products derived from this
# software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
# =======================================================================
#
import os
import platform
import signal
import subprocess
import time
import yaml
import sys
NETWORK_CARD_DEFAULT_IP="192.168.0.2"
USB_CARD_DEFAULT_IP="192.168.1.2"
VERSION_INFO_URL = "https://raw.githubusercontent.com/Ascend/tools/master/versioninfo.yaml"
CURRENT_PATH = os.path.dirname(
os.path.realpath(__file__))
SD_CARD_MAKING_PATH = os.path.join(CURRENT_PATH, "sd_card_making")
MIN_DISK_SIZE = 7 * 1024 * 1024 * 1024
MAKING_SD_CARD_COMMAND = "bash {path}/make_ubuntu_sd.sh " + " {dev_name}" + \
" {pkg_path} {ubuntu_file_name}" + \
" " + NETWORK_CARD_DEFAULT_IP + " " + USB_CARD_DEFAULT_IP + \
" > {log_path}/make_ubuntu_sd.log "
def execute(cmd, timeout=3600, cwd=None):
'''execute os command'''
# print(cmd)
is_linux = platform.system() == 'Linux'
if not cwd:
cwd = os.getcwd()
process = subprocess.Popen(cmd, cwd=cwd, bufsize=32768, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, shell=True,
preexec_fn=os.setsid if is_linux else None)
t_beginning = time.time()
# cycle times
time_gap = 0.01
str_std_output = ""
while True:
str_out = str(process.stdout.read().decode())
str_std_output = str_std_output + str_out
if process.poll() is not None:
break
seconds_passed = time.time() - t_beginning
if timeout and seconds_passed > timeout:
if is_linux:
os.kill(process.pid, signal.SIGTERM)
else:
process.terminate()
return False, process.stdout.readlines()
time.sleep(time_gap)
str_std_output = str_std_output.strip()
# print(str_std_output)
std_output_lines_last = []
std_output_lines = str_std_output.split("\n")
for i in std_output_lines:
std_output_lines_last.append(i)
if process.returncode != 0 or "Traceback" in str_std_output:
return False, std_output_lines_last
return True, std_output_lines_last
def print_process(string, is_finished=False):
if string == "" or string is None or is_finished:
print(".......... .......... .......... .......... 100%", end='\r')
print("")
else:
string = string.split(".......... ", 1)[1]
string = string.split("%")[0] + "%"
print(string, end='\r')
def execute_wget(cmd, timeout=86400, cwd=None):
'''execute os command'''
# print(cmd)
is_linux = platform.system() == 'Linux'
if not cwd:
cwd = os.getcwd()
process = subprocess.Popen(cmd, cwd=cwd, bufsize=1, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, shell=True,
preexec_fn=os.setsid if is_linux else None)
t_beginning = time.time()
# cycle times
time_gap = 0.01
str_std_output = ""
process_str = ""
while True:
str_out = str(process.stdout.readline())
if "......" in str_out:
process_str = str_out
print_process(process_str)
str_std_output = str_std_output + str_out
if process.poll() is not None:
break
seconds_passed = time.time() - t_beginning
if timeout and seconds_passed > timeout:
if is_linux:
os.kill(process.pid, signal.SIGTERM)
else:
process.terminate()
print("")
return False
time.sleep(time_gap)
if process.returncode != 0 or "Traceback" in str_std_output:
print("")
return False
print_process(process_str, True)
return True
def C_trans_to_E(string):
E_PUN = u',.!?:[]()<>"\''
C_PUN = u',。!?:【】()《》“‘'
table= {ord(f):ord(t) for f,t in zip(C_PUN,E_PUN)}
return string.translate(table)
def remove_chn_and_charactor(str1):
C_PUN = u',。!?:【】()《》“‘'
stren = ''
if not isinstance(str1,str):
print("The input is not string")
return stren
for i in range(len(str1)):
if str1[i] >= u'\u4e00' and str1[i] <= u'\u9fa5' \
or str1[i] >= u'\u3300' and str1[i] <= u'\u33FF' \
or str1[i] >= u'\u3200' and str1[i] <= u'\u32FF' \
or str1[i] >= u'\u2700' and str1[i] <= u'\u27BF' \
or str1[i] >= u'\u2600' and str1[i] <= u'\u26FF' \
or str1[i] >= u'\uFE10' and str1[i] <= u'\uFE1F' \
or str1[i] >= u'\u2E80' and str1[i] <= u'\u2EFF' \
or str1[i] >= u'\u3000' and str1[i] <= u'\u303F' \
or str1[i] >= u'\u31C0' and str1[i] <= u'\u31EF' \
or str1[i] >= u'\u2FF0' and str1[i] <= u'\u2FFF' \
or str1[i] >= u'\u3100' and str1[i] <= u'\u312F' \
or str1[i] >= u'\u21A0' and str1[i] <= u'\u31BF' \
:
pass
else:
if str1[i] in C_PUN:
st = C_trans_to_E(str1[i])
else:
st = str1[i]
stren += st
return stren
def check_sd(dev_name):
ret, disk = execute(
"fdisk -l 2>/dev/null | grep \"Disk {dev_name}[:]\"".format(dev_name=dev_name))
disk[0] = remove_chn_and_charactor(disk[0])
if not ret or len(disk) > 1:
print(
"[ERROR] Can not get disk, please use fdisk -l to check available disk name!")
return False
ret, mounted_list = execute("df -h")
if not ret:
print("[ERROR] Can not get mounted disk list!")
return False
unchanged_disk_list = []
for each_mounted_disk in mounted_list:
disk_name = each_mounted_disk.split()[0]
disk_type = each_mounted_disk.split()[5]
if disk_type == "/boot" or disk_type == "/":
unchanged_disk_list.append(disk_name)
unchanged_disk = " ".join(unchanged_disk_list)
disk_size_str = disk[0].split(",")[1]
disk_size_str = disk_size_str.split()[0]
disk_size = int(disk_size_str)
print("disk %s size %d"%(dev_name, disk_size))
if dev_name not in unchanged_disk and disk_size >= MIN_DISK_SIZE:
return True
print("[ERROR] Invalid SD card or size is less then 8G, please check SD Card.")
return False
def parse_download_info(ascend_version):
version_info_file_name = os.path.basename(VERSION_INFO_URL)
version_info_path = os.path.join(
CURRENT_PATH, version_info_file_name)
ret = execute_wget("wget -O {name} {url} --no-check-certificate".format(
name=version_info_path, url=VERSION_INFO_URL))
if not ret or not os.path.exists(version_info_path):
print(
"[ERROR] Can not download versioninfo.yaml, please check your network connection.")
execute("rm -rf {path}".format(path=version_info_path))
return False, "", "", ""
version_info_file = open(
version_info_path, 'r', encoding='utf-8')
version_info_dict = yaml.load(
version_info_file)
ascend_version_dict = version_info_dict.get("mini_developerkit")
if ascend_version == "" or ascend_version == ascend_version_dict.get("latest_version"):
ascend_developerkit_url = ascend_version_dict.get("url")
ascend_sd_making_url = ascend_version_dict.get("sd_making_url")
ubuntu_version = ascend_version_dict.get(
"compatibility").get("ubuntu")[0]
else:
version_list = ascend_version_dict.get("archived_versions")
for each_version in version_list:
if ascend_version == each_version.get("version"):
ascend_developerkit_url = each_version.get("url")
ascend_sd_making_url = each_version.get("sd_making_url")
ubuntu_version = each_version.get(
"compatibility").get("ubuntu")[0]
break
ubuntu_version_dict = version_info_dict.get("ubuntu")
for each_version in ubuntu_version_dict:
if ubuntu_version == each_version.get("version"):
ubuntu_url = each_version.get("url")
break
version_info_file.close()
if ascend_developerkit_url == "" or ascend_sd_making_url == "" or ubuntu_url == "":
return False, "", "", ""
return True, ascend_developerkit_url, ascend_sd_making_url, ubuntu_url
def check_minirc_run_package():
#check driver package
ret, paths = execute(
"find {path} -name \"Ascend310-driver-*.tar.gz\"".format(path=CURRENT_PATH))
if not ret:
print("[ERROR]Can not find driver run package in current path")
return False
if len(paths) > 1:
print("[ERROR]Too many driver packages, please delete redundant packages.")
return False
#check aicpu_kernel package
ret, paths = execute(
"find {path} -name \"Ascend310-aicpu_kernels-*.tar.gz\"".format(path=CURRENT_PATH))
if not ret:
print("[ERROR]Can not find aicpu_kernels package in current path")
return False
if len(paths) > 1:
print("[ERROR]Too many aicpu_kernels packages, please delete redundant packages.")
return False
#check acl package
ret, paths = execute(
"find {path} -name \"Ascend310-acllib-*.run\"".format(path=CURRENT_PATH))
if not ret:
print("[ERROR]Can not find acllib run package in current path")
return False
if len(paths) > 1:
print("[ERROR]Too many acllib run packages, please delete redundant packages.")
return False
def process_local_installation(dev_name):
ret = check_minirc_run_package
if not ret:
return False
confirm_tips = "Please make sure you have installed dependency packages:" + \
"\n\t apt-get install -y qemu-user-static binfmt-support gcc-aarch64-linux-gnu g++-aarch64-linux-gnu\n" + \
"Please input Y: continue, other to install them:"
confirm = input(confirm_tips)
confirm = confirm.strip()
if confirm != "Y" and confirm != "y":
return False
execute("rm -rf {path}_log/*".format(path=SD_CARD_MAKING_PATH))
execute("mkdir -p {path}_log".format(path=SD_CARD_MAKING_PATH))
log_path = "{path}_log".format(path=SD_CARD_MAKING_PATH)
ret, paths = execute(
"find {path} -name \"Ascend310-driver-*.tar\"".format(path=CURRENT_PATH))
if not ret:
print("[ERROR] Can not fine driver run package in current path")
return False
if len(paths) > 1:
print(
"[ERROR] Too many mini driver run packages, please delete redundant packages.")
return False
ascend_driver_path = paths[0]
ascend_driver_file_name = os.path.basename(ascend_driver_path)
ret, paths = execute(
"find {path} -name \"make-ubuntu-sd.sh\"".format(path=CURRENT_PATH))
if not ret:
print("[ERROR] Can not fine make_ubuntu_sd.sh in current path")
return False
ret, paths = execute(
"find {path} -name \"ubuntu*server*arm*.iso\"".format(path=CURRENT_PATH))
if not ret:
print("[ERROR] Can not fine ubuntu\ package in current path")
return False
if len(paths) > 1:
print("[ERROR] Too many ubuntu packages, please delete redundant packages.")
return False
ubuntu_path = paths[0]
ubuntu_file_name = os.path.basename(ubuntu_path)
print("Step: Start to make SD Card. It need some time, please wait...")
print("Command:")
print(MAKING_SD_CARD_COMMAND.format(path=CURRENT_PATH, dev_name=dev_name, pkg_path=CURRENT_PATH,
ubuntu_file_name=ubuntu_file_name, log_path=log_path))
execute(MAKING_SD_CARD_COMMAND.format(path=CURRENT_PATH, dev_name=dev_name, pkg_path=CURRENT_PATH,
ubuntu_file_name=ubuntu_file_name, log_path=log_path))
ret = execute("grep Success {log_path}/make_ubuntu_sd.result".format(log_path=log_path))
if not ret[0]:
print("[ERROR] Making SD Card failed, please check %s/make_ubuntu_sd.log for details!" % log_path)
return False
return True
def process_internet_installation(dev_name, ascend_version):
print("Step: Downloading version information...")
ret = parse_download_info(ascend_version)
if not ret[0]:
print("Can not find valid versions, please try to get valid version: python3 sd_card_making.py list")
return False
ascend_developerkit_url = ret[1]
ascend_sd_making_url = ret[2]
ubuntu_url = ret[3]
execute("rm -rf {path}_log/*".format(path=SD_CARD_MAKING_PATH))
execute("mkdir -p {path}_log".format(path=SD_CARD_MAKING_PATH))
log_path = "{path}_log".format(path=SD_CARD_MAKING_PATH)
print("Step: Downloading developerkit package...")
ascend_developerkit_file_name = os.path.basename(ascend_developerkit_url)
ascend_developerkit_path = os.path.join(
CURRENT_PATH, ascend_developerkit_file_name)
if os.path.exists(ascend_developerkit_path):
print("%s is already downloaded, skip to download it." %
ascend_developerkit_path)
else:
ret = execute_wget("wget -O {name} {url} --no-check-certificate".format(
name=ascend_developerkit_path, url=ascend_developerkit_url))
if not ret or not os.path.exists(ascend_developerkit_path):
print("[ERROR] Download develperkit package failed, Please check %s connection." %
ascend_developerkit_url)
execute("rm -rf {path}".format(path=ascend_developerkit_path))
return False
print("Step: Downloading SD Card making scripts...")
ascend_sd_making_file_name = os.path.basename(ascend_sd_making_url)
ascend_sd_making_path = os.path.join(
CURRENT_PATH, ascend_sd_making_file_name)
ret = execute_wget("wget -O {name} {url} --no-check-certificate".format(
name=ascend_sd_making_path, url=ascend_sd_making_url))
if not ret or not os.path.exists(ascend_developerkit_path):
print("[ERROR] Download SD Card making scripts failed, Please check %s connection." %
ascend_sd_making_url)
execute("rm -rf {path}".format(path=ascend_sd_making_path))
return False
print("Step: Downloading Ubuntu iso...")
ubuntu_file_name = os.path.basename(ubuntu_url)
ubuntu_path = os.path.join(CURRENT_PATH, ubuntu_file_name)
if os.path.exists(ubuntu_path):
print("%s is already downloaded, skip to download it." % ubuntu_path)
else:
ret = execute_wget(
"wget -O {name} {url} --no-check-certificate".format(name=ubuntu_path, url=ubuntu_url))
if not ret or not os.path.exists(ascend_developerkit_path):
print(
"[ERROR] Download Ubuntu iso failed, Please check %s connection." % ubuntu_url)
execute("rm -rf {path}".format(path=ubuntu_path))
return False
print("Step: Installing system dependency...")
ret = execute(
"apt-get install -y qemu-user-static binfmt-support gcc-aarch64-linux-gnu g++-aarch64-linux-gnu")
if not ret[0]:
print("[ERROR] Install system dependency failed, please check:" +
"\n\tapt-get install -y qemu-user-static binfmt-support gcc-aarch64-linux-gnu g++-aarch64-linux-gnu\n\tapt-get install -y qemu-user-static binfmt-support gcc-aarch64-linux-gnu g++-aarch64-linux-gnu")
print("Step: Start to make SD Card. It need some time, please wait...")
execute(MAKING_SD_CARD_COMMAND.format(path=CURRENT_PATH, dev_name=dev_name,
pkg_path=CURRENT_PATH, ubuntu_file_name=ubuntu_file_name,
ascend_developerkit_file_name=ascend_developerkit_file_name,
log_path=log_path))
ret = execute("grep Success {log_path}/make_ubuntu_sd.result".format(log_path=log_path))
if not ret[0]:
print("[ERROR] Making SD Card failed, please check %s/make_ubuntu_sd.log for details!" % log_path)
return False
return True
def print_usage():
print("Usage: ")
print("\t[internet]: python3 make_sd_card.py internet [SD Name]")
print("\t Use latest version to make SD card.")
print("\t[internet]: python3 make_sd_card.py internet [SD Name] [Version]")
print("\t Use given version to make SD card.")
print("\t[local ]: python3 make_sd_card.py local [SD Name]")
print("\t Use local given packages to make SD card.")
def main():
'''sd card making'''
command = ""
dev_name = ""
version = ""
if (len(sys.argv) >= 3):
command = sys.argv[1]
dev_name = sys.argv[2]
if (len(sys.argv) >= 4):
version = sys.argv[3]
if command == "internet" and (len(sys.argv) == 3 or len(sys.argv) == 4):
print("Begin to make SD Card...")
elif command == "local" and len(sys.argv) == 3:
print("Begin to make SD Card...")
else:
print("Invalid Command!")
print_usage()
exit(-1)
ret = check_sd(dev_name)
if not ret:
exit(-1)
if command == "internet":
result = process_internet_installation(dev_name, version)
else:
result = process_local_installation(dev_name)
if result:
print("Make SD Card successfully!")
exit(0)
else:
exit(-1)
if __name__ == '__main__':
main()