文件路徑:
源碼:ext/openwrt/scripts/functions/common/common
設備: /usr/share/easycwmp/functions/
主要功能
common函數是整個模塊的核心,它負責整個模塊的處理方法,主要功能如下:
- 操作方法的調用
- Json個數數據輸出
- 通用函數實現
源碼解析
分析的函數: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
}