From 0f54f2cf59951fc1d11dc676aeb19a88e4008387 Mon Sep 17 00:00:00 2001 From: Roman Rakus Date: Thu, 8 Nov 2012 11:39:01 +0100 Subject: Improved mof2wiki.sh Now it can create list of defined classes, newly created properties and created references. Signed-off-by: Roman Rakus --- tools/mof2wiki.sh | 242 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 222 insertions(+), 20 deletions(-) (limited to 'tools') diff --git a/tools/mof2wiki.sh b/tools/mof2wiki.sh index bbd9b0f..4ddb48b 100755 --- a/tools/mof2wiki.sh +++ b/tools/mof2wiki.sh @@ -1,41 +1,243 @@ #!/bin/bash -schemasurl='http://schemas.dmtf.org/wbem/cim-html/2.31.0/' +schemasurl='http://schemas.dmtf.org/wbem/cim-html/2.34.0/' + +re_anyclass="^class[[:blank:]]*([[:alnum:]_]*):[[:blank:]]*([[:alnum:]_]*)" +re_property="^[[:blank:]]*([[:alnum:]_]*)[[:blank:]]*([[:alnum:]_]*)[[:blank:]]*;" +re_reference="^[[:blank:]]*([[:alnum:]_]*)[[:blank:]]*REF[[:blank:]]*([[:alnum:]_]*)[[:blank:]]*;" +re_endclass="^[[:blank:]]*}[[:blank:]]*;[[:blank:]]*" usage() { - printf "$0 usage:\n" - printf "$0 file\n" - printf "$0 will read file and show which classes are defined in mof file " - printf "and print in pretty format usable easy in wiki\n" + printf "$0 usage: " + printf "COMMAND [PARAMETER] FILE [SUBDIR]\n" + printf "Converts mof FILE to wiki type documentation\n" + printf "Optionaly you can specify wiki SUBDIR" + printf "Possible COMMANDs:\n" + printf "all: creates list, properties and methods for all classes\n" + printf "list: convert only all class names to pretty wiki table\n" + printf "properties: need PARAMETER class name; converts specified class properties\n" + printf "methods: need PARAMETER class name; converts specified class methods\n" + printf "Example: $0 list LMI_Account.mof account\n" + printf "Example: $0 properties LMI_Account LMI_Account.mof account\n" } +die_usage() +{ + printf "%s\n" "$@" + usage; + exit 1 +} >&2 + die() { printf "%s\n" "$@" exit 1 } >&2 -(( $# > 0 )) || die "Invalid number of parameters" -if [[ "$1" == "-h" || "$1" == "--help" ]]; then - usage - exit 0 -fi +all() +{ + moffile="$1" + if [[ $2 && $2 =~ [^/]$ ]]; then + subdir="$2"/ + else + subdir=$2 + fi + classes=() + printf "||= Defined class name =||= Inherited from =||\n" + while IFS= read line; do + if [[ $line =~ $re_anyclass ]]; then + classes+=(${BASH_REMATCH[1]}) + newclass=${BASH_REMATCH[1]} + derived=${BASH_REMATCH[2]} + printf "|| [wiki:$subdir%s %s] || [$schemasurl%s.html %s] ||\n" "$newclass" "$newclass" "$derived" "$derived" + fi + done < "$moffile" + echo + for i in "${classes[@]}"; do + props "$i" "$moffile" $subdir + echo + done +} + +list() +{ + moffile="$1" + if [[ $2 && $2 =~ [^/]$ ]]; then + subdir="$2"/ + else + subdir=$2 + fi + printf "||= Defined class name =||= Inherited from =||\n" + while IFS= read line; do + if [[ $line =~ $re_anyclass ]]; then + newclass=${BASH_REMATCH[1]} + derived=${BASH_REMATCH[2]} + printf "|| [wiki:$subdir%s %s] || [$schemasurl%s.html %s] ||\n" "$newclass" "$newclass" "$derived" "$derived" + fi + done < "$moffile" +} -moffile="$1" +props() +{ + classname="$1" + moffile="$2" + if [[ $3 && $3 =~ [^/]$ ]]; then + subdir="$3"/ + else + subdir=$3 + fi -[[ -r "$moffile" ]] || die "$moffile is not readable" + unset properties references + declare -A properties + declare -A references + declare -i found=0 -export LC_ALL=C + while IFS= read line; do + if (( ! $found )); then + if [[ $line =~ ^class[[:blank:]]*($classname)":"[[:blank:]]*([[:alnum:]_]*) ]]; then + newclass=${BASH_REMATCH[1]} + derived=${BASH_REMATCH[2]} + found=1 + fi + else + # we have found the class, now show new defined properties + if [[ $line =~ $re_property ]]; then + ptype=${BASH_REMATCH[1]} + pname=${BASH_REMATCH[2]} + properties["$pname"]="$ptype" + elif [[ $line =~ $re_reference ]]; then + ptype=${BASH_REMATCH[1]} + pname=${BASH_REMATCH[2]} + references["$pname"]="$ptype" + elif [[ $line =~ $re_endclass ]]; then + break; + fi + fi + done < "$moffile" -printf "||= Defined class name =||= Inherited from =||\n" + if (( $found )); then + printf "= %s =\n" "$classname" + printf "Along with inherited properties from [$schemasurl%s.html %s], %s defines also following properties\n" "$derived" "$derived" "$classname" + printf "||= Property type =||= Property name =||\n" + for prop in "${!properties[@]}"; do + printf "|| {{{%s}}} || {{{%s}}}\n" "${properties[$prop]}" "$prop" + done + printf "Following references\n" + printf "||= Class name =||= Reference name =||\n" + for ref in "${!references[@]}"; do + cname="${references[$ref]}" + if [[ "$cname" =~ ^CIM ]]; then + printf "|| [$schemasurl%s.html %s] || {{{%s}}}\n" "$cname" "$cname" "$ref" + else + printf "|| [wiki:$subdir%s %s] || {{{%s}}}\n" "$cname" "$cname" "$ref" + fi + done + else + printf "Class %s not found in the file %s\n" >&2 "$classname" "$moffile" + exit 1 + fi +} + +methods() +{ + die "Not implemented yet!" + classname="$1" + moffile="$2" + if [[ $3 && $3 =~ [^/]$ ]]; then + subdir="$3"/ + else + subdir=$3 + fi -while IFS= read line; do - if [[ $line =~ ^class[[:blank:]]*([[:alnum:]_]*)":"[[:blank:]]*([[:alnum:]_]*) ]]; then - newclass=${BASH_REMATCH[1]} - derived=${BASH_REMATCH[2]} - printf "|| [wiki:%s %s] || [$schemasurl%s.html %s] ||\n" "$newclass" "$newclass" "$derived" "$derived" + unset methods + methods=() + + while IFS= read line; do + if (( ! $found )); then + if [[ $line =~ ^class[[:blank:]]*($classname)":"[[:blank:]]*([[:alnum:]_]*) ]]; then + newclass=${BASH_REMATCH[1]} + derived=${BASH_REMATCH[2]} + found=1 + fi + else + # we have found the class, now show new defined methods + if [[ $line =~ $re_property ]]; then + ptype=${BASH_REMATCH[1]} + pname=${BASH_REMATCH[2]} + properties["$pname"]="$ptype" + elif [[ $line =~ $re_reference ]]; then + ptype=${BASH_REMATCH[1]} + pname=${BASH_REMATCH[2]} + references["$pname"]="$ptype" + elif [[ $line =~ $re_endclass ]]; then + break; + fi + fi + done < "$moffile" + + if (( $found )); then + printf "= %s =\n" "$classname" + printf "Along with inherited properties from [$schemasurl%s.html %s], %s defines also following properties\n" "$derived" "$derived" "$classname" + printf "||= Property type =||= Property name =||\n" + for prop in "${!properties[@]}"; do + printf "|| {{{%s}}} || {{{%s}}}\n" "${properties[$prop]}" "$prop" + done + printf "Following references\n" + printf "||= Class name =||= Reference name =||\n" + for ref in "${!references[@]}"; do + cname="${references[$ref]}" + if [[ "$cname" =~ ^CIM ]]; then + printf "|| [$schemasurl%s.html %s] || {{{%s}}}\n" "$cname" "$cname" "$ref" + else + printf "|| [wiki:$subdir%s %s] || {{{%s}}}\n" "$cname" "$cname" "$ref" + fi + done + else + printf "Class %s not found in the file %s\n" >&2 "$classname" "$moffile" + exit 1 fi -done < "$moffile" + +} + +export LC_ALL=C +case "$1" in + all) + if [[ ! -r "$2" ]]; then + die "File $2 is not readable" + fi + all "$2" $3;; + + list) + if [[ ! -r "$2" ]]; then + die "File $2 is not readable" + fi + list "$2" $3;; + + properties) + if [[ ! "$2" ]]; then + die "You must specify class name" + fi + if [[ ! -r "$3" ]]; then + die "File $3 is not readable" + fi + props "$2" "$3" $4;; + + methods) + if [[ ! "$2" ]]; then + die "You must specify class name" + fi + if [[ ! -r "$3" ]]; then + die "File $3 is not readable" + fi + methods "$2" "$3" $4;; + + *) die_usage "Invalid command $1";; +esac + +if [[ "$1" == "-h" || "$1" == "--help" ]]; then + usage + exit 0 +fi -- cgit