summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xtools/mof2wiki.sh242
1 files changed, 222 insertions, 20 deletions
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