#!/bin/bash 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: " 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 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" } props() { classname="$1" moffile="$2" if [[ $3 && $3 =~ [^/]$ ]]; then subdir="$3"/ else subdir=$3 fi unset properties references declare -A properties declare -A references declare -i found=0 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" 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 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 } 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