源码:ext/openwrt/scripts/functions/common/common
设备: /usr/share/easycwmp/functions/
common函数是整个模块的核心,它负责整个模块的处理方法,主要功能如下:
分析的函数:GET方法,SET方法,Inoform相关的函数
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
}
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
}
执行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
}
类似get 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
}
设置要监控的节点
检查入参节点的合法性,然后调用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
}
检查入参节点的合法性,然后调用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
}
此函数,在数据模型的定义脚本中调用,主要功能是,整合模块的入参和参数节点的属性,执行相应的操作,如果模块出现问题,可以在此函数中添加打印来分析。
# 入参说明
# 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"
}
原始文件中有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$setcmd \"$val\"$getcmd" >> $set_command_tmp_file
exit 0
}
##### 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
}
# $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
}