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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章