下载
中文
注册

开发示例

本章节将指导用户进行动态加载组件的功能开发,操作步骤如下。

操作步骤

  1. 打开动态加载组件功能开关。

    将配置文件project.conf的“_NeedCustomizedWebNav”字段改为“yes”。project.conf文件路径为“{project_dir}/config/project_cfg/project.conf”。

  2. 准备动态加载组件配置文件routesConfig.json,并将其存放在“{project_dir}/src/app/set_customized_web_nav”路径下。
  3. 在“{project_dir}/src/app/set_customized_web_nav”目录下,实现配置脚本build_customized_web_nav.sh参考示例如下
    #!/bin/bash
    CONFIG_FILENAME="routesConfig.json"
    CHECKER_FILENAME="routes_config_checker.py"
    WEB_MANAGER_PATH=""
    OS_NAME=$(< "/etc/os-release" grep "^NAME=" | awk -F "=" '{print $2}' | tr -d '"')
    CURR_PATH=""
    function check_config_file() {
      python3 -u "${CURR_PATH}/${CHECKER_FILENAME}" "${CURR_PATH}"
      local ret=$?
      if [[ "${ret}" -ne 0 ]]; then
          echo "Check ${CONFIG_FILENAME} failed."
          return 1
      fi
      return 0
    }
    
    function copy_config_file() {
      if [[ ! -d "${WEB_MANAGER_PATH}/config" ]]; then
        mkdir -p "${WEB_MANAGER_PATH}/config"
      fi
    
      if ! cp "${CURR_PATH}/${CONFIG_FILENAME}" "${WEB_MANAGER_PATH}/config/${CONFIG_FILENAME}"; then
          echo "Copy ${CONFIG_FILENAME} failed, please check"
          return 1
      fi
    
      if [[ "${OS_NAME}" = "Ubuntu" ]]; then
        chown -R nobody:nogroup "${WEB_MANAGER_PATH}"
      else
        chown -R nobody:nobody "${WEB_MANAGER_PATH}"
      fi
    
      return 0
    }
    
    function main() {
      WEB_MANAGER_PATH="$1/platform/omsdk/software/nginx/html/manager"
      CURR_PATH="$1/src/app/set_customized_web_nav"
      if ! check_config_file; then
        echo "Check ${CONFIG_FILENAME} failed."
        return 1
      fi
    
      if ! copy_config_file; then
        echo "Copy ${CONFIG_FILENAME} failed."
        return 1
      fi
      return 0
    }
    
    echo  -e "\n####################### begin to build customized web nav #####################################\n"
    main "$@"
    RESULT=$?
    exit "${RESULT}"
  4. 在“{project_dir}/src/app/set_customized_web_nav”目录下,实现配置脚本build_customized_web_nav.sh里用到的校验代码routes_config_checker.py,参考示例如下。
    import json
    import os.path
    import sys
    
    JSON_FILE = "routesConfig.json"
    def check_json(curr_path):
        with open(os.path.join(curr_path, JSON_FILE), 'r') as fr:
            routes_config = json.loads(fr.read())
            config_fields = {
                "manager": ("network", "time", "registration", "disk", "alarm", "journal", "update", "reload", "information", "extendModule"),
                "setting": ("safety",)
            }
    
            for key in config_fields.keys():
                if key not in routes_config.keys():
                    print("Check %s failed, because [%s] not in %s" % (JSON_FILE, key, JSON_FILE))
                    return False
    
                for sub_key in config_fields[key]:
                    if sub_key not in routes_config[key]:
                        print("Check %s failed, because [%s] not in %s" % (JSON_FILE, sub_key, key))
                        return False
    
                    if not isinstance(routes_config[key][sub_key], bool):
                        print("Check %s failed, because the type of [%s] is invalid" % (JSON_FILE, sub_key))
                        return False
    
            return True
    
    
    if __name__ == "__main__":
        curr_path = sys.argv[1]
        if check_json(curr_path):
            sys.exit(0)
        else:
            sys.exit(1)
  5. 在“{project_dir}/build/build.sh”中,实现调用扩展_NeedCustomizedWebNav开关的编译脚本。
    # TOP_DIR={project_dir}
    # 动态加载组件
    # build_customized_web_nav.sh具体实现可参考对应章节实现
    if [ "${_NeedCustomizedWebNav}" == "yes" ];then
        bash "${TOP_DIR}/src/app/set_customized_web_nav/build_customized_web_nav.sh" "${TOP_DIR}"
        ret=$?
        if [ "$ret" != "0" ];then
            return 1
        fi
    fi