#!/usr/bin/env python3
#
# Copyright (c) 2020, Hyve Design Solutions Corporation.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are 
# met:
#
# 1. Redistributions of source code must retain the above copyright 
#    notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright 
#    notice, this list of conditions and the following disclaimer in the 
#    documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of Hyve Design Solutions Corporation nor the names 
#    of its contributors may be used to endorse or promote products 
#    derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY HYVE DESIGN SOLUTIONS CORPORATION AND 
# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 
# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 
# HYVE DESIGN SOLUTIONS CORPORATION OR CONTRIBUTORS BE LIABLE FOR ANY 
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
# POSSIBILITY OF SUCH DAMAGE.
#
import sys
from os.path import dirname, join

mylib = join(dirname(__file__), './src')
if not mylib in sys.path:
    sys.path.insert(0, mylib)

from pyipmi.util import PyTest
from pyipmi.util.config import PyOpts

def str2int(s):
    if s[:2] == '0x' or s[:2] == '0X':
        ret = int(s, base=16)
    else:
        ret = int(s)

    return ret

if __name__ == '__main__':
    pyopts = PyOpts()
    pyopts.add_options()
    pyopts.add_more_options()
    options, args = pyopts.parser.parse_args()

    if len(args) < 2:
        print('Missing NetFn or CMD.  Stopped.')
        sys.exit(1)

    req = []        
    for i in args:  # Drop the program name
        try:
            req.append(str2int(i))
        except:
            print('Invalid input argument: {0}.'.format(i))
            sys.exit(1)

    try:
        test = PyTest(options)
        lun = str2int(options.lun) if options.lun else 0
        dest = str2int(options.dest_chnl) if options.dest_chnl else None
        target = str2int(options.target_addr) if options.target_addr else None

        if dest and target:
            # issue bridging command
            rsp = test.intf.issue_bridging_cmd(dest, target, req, lun)
        else:
            # issue the IPMI command
            rsp = test.intf.issue_raw_cmd(req, lun)  
        
        # print response
        test.print_rsp(rsp)                      

    except BaseException as e:
        print(e)
        sys.exit(1)
        
