1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
# check for non-parametric options
# returns number of params
function _oscap_noarg {
case "$1" in
--definitions|--syschar|--results|--schematron|-f|--force|-q|--quiet|--oval-results) return 0 ;;
--version|--help|-V|-h) return 256 ;; # stop cmdline processing
*) return 1 ;;
esac
}
function _oscap {
# commands for individual modules
local -A cmds=()
cmds[oscap]="info oval xccdf ds cpe cvss cve"
cmds[oscap:oval]="collect eval analyse validate generate"
cmds[oscap:oval:generate]="report"
cmds[oscap:cvss]="score describe"
cmds[oscap:xccdf]="eval remediate resolve validate export-oval-variables generate"
cmds[oscap:xccdf:generate]="report guide fix custom"
cmds[oscap:ds]="sds-add sds-compose sds-split sds-validate rds-create rds-validate"
cmds[oscap:cpe]="check match validate"
cmds[oscap:cve]="validate find"
# command options
local -A opts=()
opts[oscap]="--version --quiet --help -V -q -h"
opts[oscap:oval:validate]="--version --definitions --variables --syschar --results --directives --schematron"
opts[oscap:oval:eval]="--datastream-id --oval-id --id --variables --directives --results --report --skip-valid"
opts[oscap:oval:analyse]="--variables --directives"
opts[oscap:oval:collect]="--variables"
opts[oscap:oval:generate:report]="-o --output"
opts[oscap:xccdf:eval]="--skip-valid --datastream-id --xccdf-id --profile --results --results-arf --report --oval-results --export-variables --fetch-remote-resources --remediate --cpe"
opts[oscap:xccdf:validate]="--schematron"
opts[oscap:xccdf:export-oval-variables]="--datastream-id --xccdf-id --profile --skip-valid --fetch-remote-resources --cpe"
opts[oscap:xccdf:remediate]="--result-id --skip-valid --fetch-remote-resources --results --results-arf --report --oval-results --export-variables --cpe"
opts[oscap:xccdf:resolve]="-o --output -f --force"
opts[oscap:xccdf:generate]="--profile --format"
opts[oscap:xccdf:generate:report]="-o --output -i --result-id --show --profile --format --oval-template"
opts[oscap:xccdf:generate:guide]="-o --output --hide-profile-info --profile --format"
opts[oscap:xccdf:generate:fix]="-o --output --template --profile --result-id --profile"
opts[oscap:xccdf:generate:custom]="-o --output --stylesheet"
opts[oscap:ds:sds-add]="--datastream-id"
opts[oscap:ds:sds-split]="--datastream-id --xccdf-id"
opts[oscap:cvss:score]=""
opts[oscap:cvss:describe]=""
# local variables
local std cmd i prev
local c=1
local cur="`_get_cword`"
local prog="${COMP_WORDS[0]}"
local modpath='oscap'
_split_longopt || prev="${COMP_WORDS[$COMP_CWORD-1]}"
# get module path
while [ $c -lt $COMP_CWORD ]; do
i="${COMP_WORDS[c]}"
case "$i" in
# TODO handle generic switches
-*) _oscap_noarg "$i"; c=$((c + $?)) ;;
*) modpath="$modpath:$i" ;;
esac
c=$((c + 1))
done
if [ "x${prev:0:1}" == "x-" ] && ! _oscap_noarg "$prev"; then
# an option argument
local cmd=${modpath##*:}
case "$prev" in
--AV|--AC|--AU|--CI|--II|--AI|--EX|--RL|--RC|--CD|--TD|--CR|--IR|--AR)
COMPREPLY=( $(compgen -W "`$prog cvss $cmd -h | sed -r -n -e "s:^\s+$prev=\[(.+)\].+$:\1:gp" | tr '|' ' '`" -- ${cur}) ) ;;
--results|-o|--output|--template|--oval-template) _filedir 'xml' ;;
--report) _filedir 'html' ;;
--format) COMPREPLY=( $(compgen -W "docbook html" -- ${cur}) ) ;;
esac
elif [ "x${cur:0:1}" == "x-" ] || [ "${modpath:0:11}" == 'oscap:cvss:' ]; then
# an option
COMPREPLY=( $(compgen -W "${opts[$modpath]}" -- ${cur}) )
elif [ "x${cmds[$modpath]}" != 'x' ]; then
# a submodule
COMPREPLY=( $(compgen -W "${cmds[$modpath]}" -- ${cur}) )
else
# a positional argument
case "$modpath" in
oscap:cvss:*) ;; # no positional args for cvss
*) _filedir 'xml' ;;
esac
fi
}
[ "${BASH_VERSINFO[0]}" -ge '4' ] && complete -F _oscap -o filenames oscap
|