import shutil
import sys
import os
import time
import threading
import subprocess
from enum import Enum
from containers.status import throw_exception
from exceptions.ohos_exception import OHOSException
from services.interface.build_file_generator_interface import BuildFileGeneratorInterface
from containers.arg import Arg, ModuleType
from util.system_util import SystemUtil
from util.io_util import IoUtil
from util.log_util import LogUtil
from util.component_util import ComponentUtil
class CMDTYPE(Enum):
PUSH = 1
LIST_TARGETS = 2
class Hdc(BuildFileGeneratorInterface):
def __init__(self):
super().__init__()
self._regist_hdc_path()
self._regist_hpm_cache()
def run(self):
self.execute_hdc_cmd(CMDTYPE.PUSH)
@throw_exception
def execute_hdc_cmd(self, cmd_type: int, **kwargs):
if cmd_type == CMDTYPE.PUSH:
return self._execute_hdc_push_cmd()
elif cmd_type == CMDTYPE.LIST_TARGETS:
return self._execute_hdc_list_targets_cmd()
else:
raise OHOSException(
'You are tring to use an unsupported hdc cmd type "{}"'.format(cmd_type), '3001')
@throw_exception
def _regist_hdc_path(self):
hdc_path = shutil.which("hdc")
if os.path.exists(hdc_path):
self.exec = hdc_path
else:
raise OHOSException(
'There is no hdc executable file at {}'.format(hdc_path), '0001')
@throw_exception
def _regist_hpm_cache(self):
self.hpm_config_path = "~/.hpm"
hpm_path = shutil.which("hpm")
if os.path.exists(hpm_path):
command = [hpm_path, "config", "get", "modelRepository"]
output = subprocess.check_output(command)
if output:
self.hpm_config_path = output.decode('utf-8').rstrip("\n")
def get_send_file(self, part_name):
srcs = []
target = ""
bundle_file = os.path.join(self.hpm_config_path, '.hpmcache/binarys/subsystem', part_name, "bundle.json")
if not os.path.exists(bundle_file):
return srcs, target
bundle_info = IoUtil.read_json_file(bundle_file)
deployment = bundle_info.get("deployment")
if deployment:
src = deployment.get("src", "")
target = deployment.get("target", "")
if not src.startswith("/"):
src = os.path.join(os.path.dirname(bundle_file), src)
srcs = get_files_by_path(src)
return srcs, target
@throw_exception
def _execute_hdc_push_cmd(self, **kwargs):
connect_key = self.flags_dict.get("target")
hdc_mount_cmd = [self.exec, '-t', connect_key, 'shell', 'mount', '-o', 'rw,remount', '/']
SystemUtil.exec_command(hdc_mount_cmd)
part_name = self.flags_dict.get("part_name")
send_files, target = self.get_send_file(part_name)
send_src = self.flags_dict.get("src")
if send_src:
send_files = get_files_by_path(send_src)
for send_file in send_files:
hdc_push_cmd = [self.exec, "-t", connect_key, "file", "send", send_file,
os.path.join(target, os.path.basename(send_file))]
SystemUtil.exec_command(hdc_push_cmd)
hdc_push_chown_cmd = [self.exec, "-t", connect_key, "shell", "chown", "root:root",
os.path.join(target, os.path.basename(send_file))]
SystemUtil.exec_command(hdc_push_chown_cmd)
if self.flags_dict.get("reboot"):
hdc_reboot_cmd = [self.exec, '-t', connect_key, 'shell', 'reboot']
SystemUtil.exec_command(hdc_reboot_cmd)
@throw_exception
def _execute_hdc_list_targets_cmd(self, **kwargs):
hdc_list_targets_cmd = [self.exec, "list", "targets"]
SystemUtil.exec_command(hdc_list_targets_cmd)
def get_files_by_path(path):
output = []
if os.path.isdir(path):
for root, dirnames, filenames in os.walk(path):
for filename in filenames:
output.append(os.path.join(root, filename))
else:
output.append(path)
return output