easycwmp解读(1.2.2)-easycwmp脚本模块分析-common

文件路径:

源码:ext/openwrt/scripts/functions/common/common
设备: /usr/share/easycwmp/functions/

主要功能

common函数是整个模块的核心,它负责整个模块的处理方法,主要功能如下:

  1. 操作方法的调用
  2. Json个数数据输出
  3. 通用函数实现

源码解析

分析的函数:GET方法,SET方法,Inoform相关的函数

[line:060]common_set_parameter_notification

common_set_parameter_notification() {
	local _parm="$1"
	local _val="$2"
	local tmp=`$UCI_GET easycwmp.@notifications[0] 2>/dev/null`
	if [ "$tmp" = "" ]; then
		$UCI_ADD easycwmp notifications 2>&1 >/dev/null
	else
		common_remove_parameter_notification $_parm
	fi
	local notif
	common_get_parameter_notification notif $_parm
	[ "$notif" = "$_val" ] && return
	if [ "$_val" -eq "1" ]; then
		$UCI_ADD_LIST easycwmp.@notifications[0].passive="$_parm" 2>&1 >/dev/null
	elif [ "$_val" -eq "2" ]; then
		$UCI_ADD_LIST easycwmp.@notifications[0].active="$_parm" 2>&1 >/dev/null
	elif [ "$_val" -eq "0" ]; then
		local list_prm="`$UCI_GET easycwmp.@notifications[0].active` `$UCI_GET easycwmp.@notifications[0].passive`"
		for prm in $list_prm; do
			case $prm in
				*.)
				case $_parm in
					$prm*)
					$UCI_ADD_LIST easycwmp.@notifications[0].none="$_parm" 2>&1 >/dev/null
					break
					;;
				esac
				;;
			esac
		done
	fi
}

[line:215] common_entry_get_value

easycwmp get value ***执行之后的处理入口

##### common entries called by easycwmp.sh #####
common_entry_get_value() {
	local param="$1" #要查询的节点
	g_fault_code=$E_INVALID_PARAMETER_NAME
	local entry method=""
	local tmp=" $prefix_list "
	#解析入参param
	#1.获取某个节点 eg:easycwmp get value  InternetGatewayDevice.DeviceInfo.SpecVersion
	if [ -z "$param" -o "${tmp/ $param /}" != "$tmp" ]; then method="common_get_value"; g_fault_code=0
	#2.获取一类数据 eg:eg:easycwmp get value  InternetGatewayDevice.
	elif [ "${param%.}" != "$param" ]; then method="common_get_value_inparam_isobj_check"
	#3.其他类型的节点 先查询再获取
	else method="common_get_value_inparam_isparam_check"
	fi
	#相关信息存入全局变量
	g_entry_param="$param"
	g_entry_arg=""
	g_entry_method="$method"	
	#遍历整个数据模型,执行g_entry_method操作
	for entry in $entry_execute_method_list; do
		$entry "$g_entry_param" 
	done
	return $g_fault_code
}

[line:234] common_entry_get_name

执行easycwmp get value ****之后的函数入口

# 入参说明
# $1 定义的节点名称 eg: InternetGatewayDevice.DeviceInfo.DeviceLog. 必须是.结尾
# $2 nextlevel 查询方法 [0:遍历查询  1: 只查询当前节点
common_entry_get_name() {
	local param="$1"
	local nextlevel="$2"
	g_fault_code=$E_INVALID_PARAMETER_NAME
	local entry method=""
	local tmp=" $prefix_list "
	
	if [ -z "$param" -a "$nextlevel" = "1" ]; then
		g_entry_param="$param"
		g_entry_arg="$nextlevel"
		g_entry_method="common_get_name_emptyin_nl1"
		$entry_method_root "$g_entry_param"  
		return 0
	fi
	if [ -z "$param" -o "${tmp/ $param /}" != "$tmp" ]; then 
		if [ "$nextlevel" = "0" ]; then
			g_fault_code=0
			method="common_get_name"
		else 
			method="common_get_name_inparam_isobj_check"
		fi
	elif [ "${param%.}" != "$param" ]; then method="common_get_name_inparam_isobj_check"
	else method="common_get_name_inparam_isparam_check"
	fi
	
	g_entry_param="$param"
	g_entry_arg="$nextlevel"
	g_entry_method="$method"
	for entry in $entry_execute_method_list; do
		$entry "$g_entry_param" 
	done
	return $g_fault_code
}

[line:268]common_entry_get_notification

类似get value 不在赘述

[line:268]common_entry_set_value

设置参数值
检查入参节点的合法性,然后调用common_set_value_check函数 进行设置


common_entry_set_value() {
	local param="$1"
	local val="$2"
	local entry method="common_set_value_check"

	[ -z "$param" -o "${param%.}" != "$param" ] && return $E_INVALID_PARAMETER_NAME
	
	g_entry_param="$param"
	g_entry_arg="$val"
	g_entry_method="$method"
	for entry in $entry_execute_method_list; do
		$entry "$g_entry_param"
	done
	return $E_INVALID_PARAMETER_NAME
}

[line:301]common_entry_set_notification

设置要监控的节点
检查入参节点的合法性,然后调用common_set_notification_check->common_set_parameter_notification 函数 进行设置

common_entry_set_notification() {
	local param="$1"
	local notification="$2"
	local entry method="common_set_notification_check"

	[ -z "$param" ] && return $E_NOTIFICATION_REJECTED
	g_entry_param="$param"
	g_entry_arg="$notification"
	g_entry_method="$method"
	for entry in $entry_execute_method_list; do
		$entry "$g_entry_param" 
	done
	return $E_INVALID_PARAMETER_NAME
}

[line:318]common_entry_inform

检查入参节点的合法性,然后调用common_inform_check_param函数读取inform节点
含有inform节点的表定义在entry_execute_method_list_forcedinform中

common_entry_inform() {
	local entry method="common_inform_check"
	local forced_list=${entry_execute_method_list_forcedinform:-$entry_execute_method_list}
	
	g_entry_param=""
	g_entry_arg=""
	g_entry_method="$method"
	for entry in $forced_list; do
		$entry "$g_entry_param"
	done
	return 0
}

[line:402] common_execute_method_param

此函数,在数据模型的定义脚本中调用,主要功能是,整合模块的入参和参数节点的属性,执行相应的操作,如果模块出现问题,可以在此函数中添加打印来分析。

# 入参说明
# g_entry_method 全局变量 操作方法: eg: common_get_value_inparam_isparam_check  在handle_action-->common_entry_get_value等函数中设置
# g_entry_arg	全局变量 入参 eg:Set操作的值
# g_entry_param	全局变量 入参节点名称 eg:InternetGatewayDevice.DeviceInfo.Devic
# $1 定义的节点名称 eg: InternetGatewayDevice.DeviceInfo.DeviceLog
# $2 permission 权限 [0:只读R   1: 读写RW][]
# $3 GET方法 命令或者函数 "dmesg | tail -n1"
# $4 SET方法 命令或者函数 UCI_SET
# $5 数据类型 xsd:unsignedInt 默认String
common_execute_method_param() {
	local refparam="$1"
	local permission="$2"
	local getcmd="$3"
	local setcmd="$4"
	local type="$5"
	local forcedinform="$6"
	
	"$g_entry_method""_param" "$g_entry_arg" "$g_entry_param" "$refparam" "$permission" "$getcmd" "$setcmd" "$type" "$forcedinform"
}

[line:673]common_set_value_check_param

原始文件中有bug,这里已经修复

# 入参说明
# $1 要设置的参数值
# $2 入参的 节点名称
# $3 定义的节点名
# $4 设置的方法,可以是函数,也可以是命令
# $6 权限 : 0:不支持设置  1:支持设置
##### set value #####
common_set_value_check_param() {
	local arg="$1"
	local inparam="$2"
	local refparam="$3"
	local permission="$4"
	local getcmd="$5"
	local setcmd="$6"
	local type="$7"
	local forcedinform="$8"
	
	local val="$arg"
	[ "$inparam" != "$refparam" ] && return $E_INVALID_PARAMETER_NAME
	#没有权限 或者 setcmd执行结果失败 返回错误码 
	[ "$permission" != "1" -o -z`$setcmd $val` ] && exit $E_NON_WRITABLE_PARAMETER
	echo "$refparam<delim>$setcmd \"$val\"<delim>$getcmd" >> $set_command_tmp_file
	exit 0
}

[line:695]common_set_notification_check_param

##### set notification #####
common_set_notification_check_param() {
	local arg="$1"
	local inparam="$2"
	local refparam="$3"
	local permission="$4"
	local getcmd="$5"
	local setcmd="$6"
	local type="$7"
	local forcedinform="$8"
	
	[ "$inparam" != "$refparam" ] && return $E_INVALID_PARAMETER_NAME
	local notification="$arg"
	common_set_parameter_notification "$refparam" "$notification"
	exit 0
}

[line:768]common_inform_check_param

# $8 forcedinform 当前节点是否支持inform上报
##### inform #####
common_inform_check_param() {
	local arg="$1"
	local inparam="$2"
	local refparam="$3"
	local permission="$4"
	local getcmd="$5"
	local setcmd="$6"
	local type="$7"
	local forcedinform="$8"
	
	[ -z "$forcedinform" ] && return $E_INVALID_PARAMETER_NAME
	local val=`$getcmd`
	common_json_output_get_value "$refparam" "$val" "$type"
	return 0
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章