コード例 #1
0
def main(argv):
    hostname = "127.0.0.1"
    port = 8000
    program = argv[0]
    logger.info(program)
    mockDirPath = None
    sslMode = False
    sslCert = None
    sslKey = None
    mockDir = None
    testEtagFlag = False
    responseTime = 0
    timefromJson = False
    headers = False
    shortForm = False
    ssdpStart = False
    logger.info("Redfish Mockup Server, version {}".format(tool_version))
    try:
        opts, args = getopt.getopt(argv[1:], "hTSPsEH:p:D:t:X", [
            "help", "shortForm", "ssdp", "ssl", "TestEtag", "headers", "Host=",
            "Port=", "Dir=", "time=", "cert=", "key="
        ])
    except getopt.GetoptError:
        # usage()
        logger.info("Error parsing options")
        sys.stderr.flush()
        usage(program)
        sys.exit(2)

    for opt, arg in opts:
        if opt in ("-h", "--help"):
            usage(program)
            sys.exit(0)
        elif opt in ("-H", "--Host"):
            hostname = arg
        elif opt in ("-X", "--headers"):
            headers = True
        elif opt in ("-p", "--port"):
            port = int(arg)
        elif opt in ("-D", "--Dir"):
            mockDirPath = arg
        elif opt in ("-E", "--TestEtag"):
            testEtagFlag = True
        elif opt in ("-t", "--time"):
            responseTime = arg
        elif opt in ("-T"):
            timefromJson = True
        elif opt in ("-s", "--ssl"):
            sslMode = True
        elif opt in ("--cert", ):
            sslCert = arg
        elif opt in ("--key", ):
            sslKey = arg
        elif opt in ("-S", "--shortForm"):
            shortForm = True
        elif opt in ("-P", "--ssdp"):
            ssdpStart = True
        else:
            logger.info('unhandled option')
            sys.exit(2)

    logger.info('program: {}'.format(program))
    logger.info('Hostname: {}'.format(hostname))
    logger.info('Port: {}'.format(port))
    logger.info("dir path specified by user:{}".format(mockDirPath))
    logger.info("response time: {} seconds".format(responseTime))

    # check if mockup path was specified.  If not, use current working directory
    if mockDirPath is None:
        mockDirPath = os.getcwd()

    # create the full path to the top directory holding the Mockup
    mockDir = os.path.realpath(
        mockDirPath
    )  # creates real full path including path for CWD to the -D<mockDir> dir path
    logger.info("Serving Mockup in abs real directory path:{}".format(mockDir))

    # check that we have a valid tall mockup--with /redfish in mockDir before proceeding
    if not shortForm:
        slashRedfishDir = os.path.join(mockDir, "redfish")
        if os.path.isdir(slashRedfishDir) is not True:
            logger.info(
                "ERROR: Invalid Mockup Directory--no /redfish directory at top. Aborting"
            )
            sys.stderr.flush()
            sys.exit(1)

    if shortForm:
        if os.path.isdir(mockDir) is not True or os.path.isfile(
                os.path.join(mockDir, "index.json")) is not True:
            logger.info(
                "ERROR: Invalid Mockup Directory--dir or index.json does not exist"
            )
            sys.stderr.flush()
            sys.exit(1)

    myServer = HTTPServer((hostname, port), RfMockupServer)

    if sslMode:
        logger.info("Using SSL with certfile: {}".format(sslCert))
        myServer.socket = ssl.wrap_socket(myServer.socket,
                                          certfile=sslCert,
                                          keyfile=sslKey,
                                          server_side=True)

    # save the test flag, and real path to the mockup dir for the handler to use
    myServer.mockDir = mockDir
    myServer.testEtagFlag = testEtagFlag
    myServer.headers = headers
    myServer.timefromJson = timefromJson
    myServer.shortForm = shortForm
    try:
        myServer.responseTime = float(responseTime)
    except ValueError as e:
        logger.info("Enter a integer or float value")
        sys.exit(2)
    # myServer.me="HELLO"

    mySDDP = None
    if ssdpStart:
        # construct path "mockdir/path/to/resource/<filename>"
        fpath = myServer.construct_path('/redfish/v1', 'index.json')
        success, item = myServer.get_cached_link(fpath)
        protocol = '{}://'.format('https' if sslMode else 'http')
        mySDDP = RfSDDPServer(
            item, '{}{}:{}{}'.format(protocol, hostname, port, '/redfish/v1'),
            hostname)

    logger.info("Serving Redfish mockup on port: {}".format(port))
    try:
        if mySDDP is not None:
            t2 = threading.Thread(target=mySDDP.start)
            t2.daemon = True
            t2.start()
        logger.info('running Server...')
        myServer.serve_forever()

    except KeyboardInterrupt:
        pass

    myServer.server_close()
    logger.info("Shutting down http server")