#! /usr/bin/python
#
# Query for IPMI FRU devices and print their output.
#

import os
import sys

import isi.hw.hal as hal
import isi.app.lib.procs as procs

known_devs = [
    { 'addr' : '0xA1', 'bus' : '0x82' },
    { 'addr' : '0xA3', 'bus' : '0x82' },
    { 'addr' : '0xA9', 'bus' : '0x82' },
    { 'addr' : '0xAB', 'bus' : '0x82' },
    { 'addr' : '0xA9', 'bus' : '0x00' },
    { 'addr' : '0xAB', 'bus' : '0x00' },
    { 'addr' : '0xAD', 'bus' : '0x00' },
    { 'addr' : '0xAF', 'bus' : '0x00' },
    ]

IPMI_FRU_CMD = '/usr/bin/isi_hwtools/isi_ipmifru'

IPMI_CMC_CMD = '/usr/bin/isi_hwtools/isi_ipmicmc'

def main(argv = None):
    if argv is None:
        argv = sys.argv[1:]

    for fru_dev in known_devs:
        busn = fru_dev['bus']
        addr = fru_dev['addr']
    
        cmd = ('%s -a %s -b %s -B -C -P -M' % (IPMI_FRU_CMD, addr,
            busn))

        (error, output) = procs.get_cmd_output(cmd)
        if error:
            continue

        print ('Found IPMI FRU Device (addr %s bus %s):' % 
            (fru_dev['addr'], fru_dev['bus']))

        for line in output:
            print '%s' % line

    if 'cmc' in argv:
        # CMC is always 0
        idx = 1
        while 1:
            cmd = ('%s -F -V -p D -a cmc -i %d' % (IPMI_CMC_CMD, idx))

            (error, output) = procs.get_cmd_output(cmd)
            if error:
                # We should at least have a CMC and two power supplies, so don't
                # give up too early
                if idx <= 2:
                    idx += 1
                    continue
                else:
                    break

            print ('Found IPMI FRU Device via CMC (idx %s):' % idx)

            for line in output:
                print '%s' % line

            idx += 1

if __name__ == "__main__":
    sys.exit(main())
