301 lines
7.4 KiB
Bash
Executable File
301 lines
7.4 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
#draw_indent <tab_cnt>
|
|
draw_indent() {
|
|
local cnt
|
|
for cnt in `seq $1`
|
|
do
|
|
echo -n " "
|
|
done
|
|
}
|
|
|
|
# check_config_existed <lower-config-path>
|
|
# example: /demo/demo-c/enable
|
|
check_config_existed()
|
|
{
|
|
[ -n "$(get_value "$1")" ] && return 0 || return 1
|
|
}
|
|
|
|
get_valid_testcases()
|
|
{
|
|
local one all
|
|
all="$(find ${top}/testcase -name "private.conf" \
|
|
| sed "s#^${top}/testcase\(.*\)/private.conf#\1#g")"
|
|
for one in ${all}
|
|
do
|
|
check_config_existed "${one}/enable" && echo ${one}
|
|
done
|
|
}
|
|
|
|
get_valid_system_config()
|
|
{
|
|
local config_list mod_list
|
|
mod_list=(
|
|
${top}/tools/convert-json/collectd.ls
|
|
${top}/tools/convert-json/outlog.ls
|
|
${top}/tools/convert-json/global.ls
|
|
${top}/tools/convert-json/info.ls
|
|
${top}/tools/convert-json/limit.ls
|
|
)
|
|
|
|
local module base config type
|
|
for module in ${mod_list[@]}
|
|
do
|
|
base=$(grep "# *BASE *=.*$" ${module} \
|
|
| awk -F "[= ]" '{print $NF}')
|
|
|
|
for config in $(grep -v "^#" ${module})
|
|
do
|
|
type=$(get_type ${config})
|
|
config=${config%:*}
|
|
check_config_existed "${base}/${config}" \
|
|
&& echo ${base}/${config}:${type}
|
|
done
|
|
done
|
|
}
|
|
|
|
get_valid_testcases_config()
|
|
{
|
|
local gconf_list=$(grep -hv "^#" \
|
|
${top}/tools/convert-json/task.ls \
|
|
${top}/tools/convert-json/info.ls \
|
|
${top}/tools/convert-json/limit.ls
|
|
)
|
|
|
|
for testcase in $(get_valid_testcases)
|
|
do
|
|
# pconf: path of private.conf
|
|
local pconf="${top}/testcase${testcase}/private.conf"
|
|
[ ! -f "${pconf}" ] && echo "No Found ${pconf}" && continue
|
|
local pconf_list=$(egrep "^.*:.*=.*$" ${pconf} | awk -F ' ' '{print $1}')
|
|
local config_list="${gconf_list} ${pconf_list}"
|
|
|
|
# check all configs
|
|
local config type
|
|
for config in ${config_list}
|
|
do
|
|
type=$(get_type ${config})
|
|
config=$(get_config ${config})
|
|
check_config_existed "${testcase}/${config}" \
|
|
&& echo "${testcase}/${config}:${type}"
|
|
done
|
|
done
|
|
}
|
|
|
|
get_treelist()
|
|
{
|
|
get_valid_system_config
|
|
get_valid_testcases_config
|
|
}
|
|
|
|
get_top()
|
|
{
|
|
local path
|
|
path=`pwd`
|
|
while [ ! "${path}" = "/" ]
|
|
do
|
|
[ -f "${path}/Makefile" ] \
|
|
&& grep "^PKG_NAME *:= *tinatest$" ${path}/Makefile >/dev/null \
|
|
&& break
|
|
path=$(dirname ${path})
|
|
done
|
|
[ "${path}" = "/" ] && echo "Get top failed" && exit 1
|
|
echo ${path}
|
|
}
|
|
|
|
# get_next <config-path:config-type>
|
|
# note:
|
|
# get word follow @
|
|
# example:
|
|
# /demo@demo-c/enable:bool
|
|
# @: means recursive call working at
|
|
# out:
|
|
# demo-c
|
|
get_next()
|
|
{
|
|
sed 's#.*@\([^/:]*\).*#\1#' <<< $1
|
|
}
|
|
|
|
# get_next <config-path:config-type>
|
|
# note:
|
|
# get word before @
|
|
# example:
|
|
# /class@demo-c/enable:bool
|
|
# @: means recursive call working at
|
|
# out:
|
|
# class
|
|
get_pre()
|
|
{
|
|
sed 's#.*/\([^/:]*\)@.*#\1#' <<< $1
|
|
}
|
|
|
|
# get_type <config-path:config-type>
|
|
# example:
|
|
# /class/demo-c/enable:bool
|
|
# out:
|
|
# bool
|
|
get_type()
|
|
{
|
|
echo ${1##*:}
|
|
}
|
|
|
|
# get_config <config-path:config-type>
|
|
# example:
|
|
# /class/demo-c/enable:bool
|
|
# out:
|
|
# /class/demo-c/enable
|
|
get_config()
|
|
{
|
|
echo ${1%:*}
|
|
}
|
|
|
|
# get_value <lower-config-path>
|
|
# example: /demo/demo-c/enable
|
|
get_value()
|
|
{
|
|
local upper=$(sed '{s/[a-z]/\u&/g; s/[^ [:alnum:]]/_/g}' <<< ${1})
|
|
eval "echo \${CONFIG_TINATEST${upper}}"
|
|
}
|
|
|
|
# check_end <config-path:config-type>
|
|
# note:
|
|
# check whether the last part of config
|
|
# example:
|
|
# @demo/demo-c/enable:bool => return 1
|
|
# /demo@demo-c/enable:bool => return 1
|
|
# /demo/demo-c@enable:bool => return 0
|
|
# @: means recursive call working at
|
|
check_end()
|
|
{
|
|
egrep "@[^/]+:" &>/dev/null <<< $1 \
|
|
&& return 0 \
|
|
|| return 1
|
|
}
|
|
|
|
# move_next <config-path:config-type>
|
|
# note:
|
|
# move @ to next /, call it must with check_end
|
|
# example:
|
|
# /demo@demo-c/enable:bool
|
|
# @: means recursive call working at
|
|
# out:
|
|
# /demo/demo-c@enable:bool
|
|
move_next()
|
|
{
|
|
check_end $1 && return 1
|
|
sed 's#\(.*\)@\([^/]*\)/\(.*\)#\1/\2@\3#' <<< $1
|
|
}
|
|
|
|
# convert_items <flag> <depth> <config1-path:config1-type> <config2-path:config2-type> ...
|
|
# flag decide whether draw comma in the last item
|
|
# c: there are items in clist, so draw comma
|
|
# e: there are no items in clist, so don't draw comma
|
|
convert_items()
|
|
{
|
|
local flag=$1 && shift
|
|
local depth=$1 && shift
|
|
|
|
local branch type cnt val conf
|
|
for branch in $@
|
|
do
|
|
cnt=$(( ${cnt} + 1 ))
|
|
val=$(get_value $(sed 's#@#/#g; s/:.*//g' <<< ${branch}))
|
|
conf=$(get_next ${branch})
|
|
type=$(get_type ${branch})
|
|
|
|
draw_indent ${depth} && echo -n "\"${conf}\" : "
|
|
case "${type}" in
|
|
"bool")
|
|
[ "${val}" = "y" ] && echo -n "true" || echo -n "false"
|
|
;;
|
|
"int")
|
|
echo -n "${val}"
|
|
;;
|
|
"array")
|
|
local tmp num
|
|
echo -n "["
|
|
tmp=(${val})
|
|
for num in $(seq 0 $(( ${#tmp[@]} - 1 )))
|
|
do
|
|
echo -n " \"${tmp[${num}]}\""
|
|
[ "${num}" -ne $(( ${#tmp[@]} - 1 )) ] && echo -n ","
|
|
done
|
|
echo -n " ]"
|
|
;;
|
|
"string")
|
|
echo -n "\"$(sed 's#"#\\"#g' <<< ${val})\""
|
|
;;
|
|
esac
|
|
[ "${cnt}" -ge "$#" -a "${flag}" = "e" ] && echo || echo ","
|
|
done
|
|
local type=$(get_type)
|
|
}
|
|
|
|
# convert_json <config1-path:config1-type> <config2-path:config2-type> ...
|
|
# example:
|
|
# /demo@demo-c/enable:bool
|
|
# @: means recursive call working at
|
|
convert_json() {
|
|
local depth=$1 && shift
|
|
[ "${depth}" -eq "0" ] && depth=1 && echo "\"/\" : {"
|
|
|
|
# classify
|
|
local trunks trunks_cnt trunk branch
|
|
for branch in $@
|
|
do
|
|
trunk=$(get_next ${branch})
|
|
! grep -w "${trunk}" <<< ${trunks} &>/dev/null \
|
|
&& trunks="${trunks} ${trunk}" && trunks_cnt=$(( ${trunks_cnt} + 1 ))
|
|
trunk="$(sed 's/[^ [:alnum:]]/_/g' <<< ${trunk})"
|
|
eval "local ${trunk}=\"\${${trunk}} ${branch}\""
|
|
done
|
|
|
|
# draw json
|
|
# elist means end list
|
|
# clist means continue list,continue recursive call
|
|
local elist clist cnt next
|
|
for trunk in ${trunks}
|
|
do
|
|
draw_indent ${depth} && echo "\"${trunk}\" : {"
|
|
|
|
trunk="$(sed 's/[^ [:alnum:]]/_/g' <<< ${trunk})"
|
|
for branch in $(eval "echo \${${trunk}}")
|
|
do
|
|
next="$(move_next ${branch})"
|
|
if check_end ${next}; then
|
|
elist="${elist} ${next}"
|
|
else
|
|
clist="${clist} ${next}"
|
|
fi
|
|
done
|
|
[ -n "${elist}" ] && convert_items \
|
|
$([ -n "${clist}" ] && echo c || echo e) \
|
|
$(( ${depth} + 1 )) ${elist}
|
|
[ -n "${clist}" ] && convert_json $(( ${depth} + 1 )) ${clist}
|
|
|
|
cnt=$(( ${cnt} + 1 ))
|
|
if [ "${cnt}" -lt "${trunks_cnt}" ]; then
|
|
draw_indent ${depth} && echo "},"
|
|
else
|
|
draw_indent ${depth} && echo "}"
|
|
fi
|
|
unset clist elist
|
|
done
|
|
|
|
[ "$(( ${depth} - 1 ))" -eq "0" ] && echo "}"
|
|
}
|
|
|
|
main()
|
|
{
|
|
# check usage
|
|
[ "$#" -ne 1 ] && echo "I Need Only One Argumemt" && exit 1
|
|
[ ! -f "$1" ] && echo "Not Found $1" && exit 1
|
|
eval $(grep -vi '="default"' $1)
|
|
|
|
top="$(get_top)"
|
|
treelist=($(get_treelist))
|
|
convert_json 0 ${treelist[@]/#\//@}
|
|
}
|
|
|
|
main $@
|