# bash completion for ipmitool                             -*- shell-script -*-

_ipmitool_singleline_help()
{
    COMPREPLY=($(compgen -W "$($1 $2 2>&1 |
        command sed -ne 's/[,\r]//g' -e 's/^.*[Cc]ommands://p')" -- "$cur"))
}

_ipmitool()
{
    local cur prev words cword
    _init_completion || return

    case $prev in
        -*[hVpUekyPmbtBTl])
            return
            ;;
        -*d)
            COMPREPLY=($(compgen -W "$(
                command ls -d /dev/ipmi* /dev/ipmi/* /dev/ipmidev/* \
                    2>/dev/null | command sed -ne 's/^[^0-9]*\([0-9]\{1,\}\)/\1/p'
            )" \
                -- "$cur"))
            return
            ;;
        -*I)
            COMPREPLY=($(compgen -W "$($1 -h 2>&1 |
                command sed -e '/^Interfaces:/,/^[[:space:]]*$/!d' \
                    -ne 's/^[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*/\1/p')" \
                -- "$cur"))
            return
            ;;
        -*H)
            _known_hosts_real -- "$cur"
            return
            ;;
        -*[fSO])
            _filedir
            return
            ;;
        -*C)
            COMPREPLY=($(compgen -W '{0..14}' -- "$cur"))
            return
            ;;
        -*L)
            COMPREPLY=($(compgen -W 'CALLBACK USER OPERATOR ADMINISTRATOR' \
                -- "$cur"))
            return
            ;;
        -*A)
            COMPREPLY=($(compgen -W 'NONE PASSWORD MD2 MD5 OEM' -- "$cur"))
            return
            ;;
        -*o)
            COMPREPLY=($(compgen -W "$($1 -o list 2>&1 |
                awk '/^[ \t]+/ { print $1 }') list" -- "$cur"))
            return
            ;;
    esac

    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur"))
        return
    fi

    # Find out command and subcommand

    local cmds=(raw i2c spd lan chassis power event mc sdr sensor fru gendev
        sel pef sol tsol isol user channel session sunoem kontronoem picmg fwum
        firewall shell exec set hpm ekanalyzer)
    local i c cmd subcmd
    for ((i = 1; i < ${#words[@]} - 1; i++)); do
        [[ -v cmd ]] && subcmd=${words[i]} && break
        for c in "${cmds[@]}"; do
            [[ ${words[i]} == "$c" ]] && cmd=$c && break
        done
    done

    if [[ ! -v cmd ]]; then
        COMPREPLY=($(compgen -W '${cmds[@]}' -- "$cur"))
        return
    fi

    # Command/subcommand completions

    case $cmd in

        shell) ;;

        \
            exec)
            _filedir
            ;;

        chassis | power | kontronoem | fwum)
            _ipmitool_singleline_help $1 $cmd
            ;;

        lan)
            case $subcmd in
                print | set) ;;

                alert)
                    [[ $prev == alert ]] &&
                        COMPREPLY=($(compgen -W 'print set' -- "$cur"))
                    ;;
                stats)
                    [[ $prev == stats ]] &&
                        COMPREPLY=($(compgen -W 'print set' -- "$cur"))
                    ;;
                *)
                    COMPREPLY=($(compgen -W 'print set alert stats' \
                        -- "$cur"))
                    ;;
            esac
            ;;

        sdr)
            case $subcmd in
                get | info | type | list | entity) ;;

                elist)
                    COMPREPLY=($(compgen -W 'all full compact event mclog fru
                        generic' -- "$cur"))
                    ;;
                dump)
                    _filedir
                    ;;
                fill)
                    case $prev in
                        fill)
                            COMPREPLY=($(compgen -W 'sensors file' -- "$cur"))
                            ;;
                        file)
                            _filedir
                            ;;
                    esac
                    ;;
                *)
                    COMPREPLY=($(compgen -W 'get info type list elist entity
                        dump fill' -- "$cur"))
                    ;;
            esac
            ;;

        sensor)
            case $subcmd in
                list | get | thresh) ;;

                *)
                    COMPREPLY=($(compgen -W 'list get thresh' -- "$cur"))
                    ;;
            esac
            ;;

        sel)
            case $subcmd in
                info | clear | list | elist | delete) ;;

                add | save | writeraw | readraw)
                    _filedir
                    ;;
                time)
                    [[ $prev == time ]] &&
                        COMPREPLY=($(compgen -W 'get set' -- "$cur"))
                    ;;
                *)
                    COMPREPLY=($(compgen -W 'info clear list elist delete add
                        get save writeraw readraw time' -- "$cur"))
                    ;;
            esac
            ;;

        user)
            case $subcmd in
                summary | list | disable | enable | priv | test) ;;

                set)
                    [[ $prev == set ]] &&
                        COMPREPLY=($(compgen -W 'name password' -- "$cur"))
                    ;;
                *)
                    COMPREPLY=($(compgen -W 'summary list set disable enable
                        priv test' -- "$cur"))
                    ;;
            esac
            ;;

        set)
            [[ $prev == set ]] &&
                COMPREPLY=($(compgen -W 'hostname username password privlvl
                    authtype localaddr targetaddr port csv verbose' -- "$cur"))
            ;;

    esac
} &&
    complete -F _ipmitool ipmitool

# ex: filetype=sh
