Example #1
0
def main():
    try:
        browser_help = ('browser to use (options: "%s")' % 
                        '", "'.join(webbrowser._tryorder))
    except (AttributeError, TypeError):
        # just in case the undocumented webbrowser._tryorder changes
        browser_help='browser to use (e.g. chrome, firefox)'

    parser = argparse.ArgumentParser()
    parser.add_argument(
        '-p', '--password', dest='password', metavar='PASS',
        nargs='?', default=False, const=True, type=str,
        help='password for remote access')
    parser.add_argument(
        '-l', '--listen', nargs=1, default=['localhost'], type=str,
        help="Network interface to listen on for incoming connections. Set to "
        "'*' to allow connections on all network interfaces.")
    parser.add_argument(
        '--cert', nargs=1, default=[None], type=str,
        help="SSL certificate file")
    parser.add_argument(
        '--key', nargs=1, default=[None], type=str, help="SSL key file")
    parser.add_argument(
        '--unsecure', action='store_true', help='do not use SSL security')
    parser.add_argument(
        '-P', '--port', dest='port', metavar='PORT',
        type=int, help='port to run server on')
    parser.add_argument(
        'filename', nargs='?', type=str, help='initial file to load')
    parser.add_argument(
        '--debug', action='store_true', help='turn on debug logging')
    parser.add_argument(
        '-b', '--backend', metavar='BACKEND',
        default='nengo', type=str, help='default backend to use')
    parser.add_argument('--browser', dest='browser', type=str,
        metavar='BROWSER', default=True,
        help=browser_help)
    parser.add_argument('--no-browser', dest='browser', action='store_false')
    parser.add_argument(
        '--auto-shutdown', nargs=1, type=float,
        help="Time limit before automatic shutdown. Set to 0 to deactivate.",
        default=[2])
    parser.set_defaults(browser=True)
    args = parser.parse_args()

    if args.debug:
        logging.basicConfig(level=logging.DEBUG)
    else:
        logging.basicConfig()

    if args.port is None:
        port = 8080
    else:
        port = args.port

    if args.password:
        if args.password is True:
            password_hash = hashpw(prompt_pw(), gensalt())
        else:
            password_hash = hashpw(args.password, gensalt())
    else:
        password_hash = None

    host = args.listen[0]
    if host == '*':
        host = ''
    server_settings = GuiServerSettings(
        (host, port), args.auto_shutdown[0], password_hash=password_hash,
        ssl_cert=args.cert[0], ssl_key=args.key[0])
    if (host != 'localhost' and not server_settings.use_ssl and
            not args.unsecure):
        raise ValueError(
            "Listening on external network interfaces only allowed with SSL.")

    try:
        if args.filename is None:
            filename = os.path.join(
                nengo_gui.__path__[0], 'examples', 'default.py')
        else:
            filename = args.filename
        page_settings = nengo_gui.page.PageSettings(backend=args.backend)
        s = None
        while s is None:
            try:
                s = nengo_gui.gui.InteractiveGUI(
                    ModelContext(filename=filename), server_settings,
                    page_settings=page_settings)
            except EnvironmentError as err:
                if args.port is None and err.errno == errno.EADDRINUSE:
                    port += 1
                    if port > 0xFFFF:
                        raise
                    server_settings.listen_addr = (host, port)
                else:
                    raise

        s.server.auto_shutdown = args.auto_shutdown[0]

        if args.browser:
            protocol = 'https:' if server_settings.use_ssl else 'http:'
            host = 'localhost'
            port = s.server.server_port
            if args.browser is True:
                wb = webbrowser.get()
            else:
                try:
                    wb = webbrowser.get(args.browser)
                except webbrowser.Error:
                    try:
                        print('Known browsers: \n  %s' % 
                              '\n  '.join(webbrowser._tryorder))
                    except (AttributeError, TypeError):
                        # just in case the undocumented webbrowser._tryorder
                        #  changes
                        print('Could not determine the list of known browsers.')
                    raise
            t = threading.Thread(
                target=wb.open,
                args=('%s//%s:%d/?token=%s' % (
                    protocol, host, port, s.server.gen_one_time_token()),))
            t.start()

        s.start()
    finally:
        logging.shutdown()
Example #2
0
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-p',
                        '--password',
                        dest='password',
                        metavar='PASS',
                        nargs='?',
                        default=False,
                        const=True,
                        type=str,
                        help='password for remote access')
    parser.add_argument('--cert',
                        nargs=1,
                        default=[None],
                        type=str,
                        help="SSL certificate file")
    parser.add_argument('--key',
                        nargs=1,
                        default=[None],
                        type=str,
                        help="SSL key file")
    parser.add_argument('-P',
                        '--port',
                        dest='port',
                        metavar='PORT',
                        default=8080,
                        type=int,
                        help='port to run server on')
    parser.add_argument('filename',
                        nargs='?',
                        type=str,
                        help='initial file to load')
    parser.add_argument('--debug',
                        action='store_true',
                        help='turn on debug logging')
    parser.add_argument('-b',
                        '--backend',
                        metavar='BACKEND',
                        default='nengo',
                        type=str,
                        help='default backend to use')
    parser.add_argument('--browser', dest='browser', action='store_true')
    parser.add_argument('--no-browser', dest='browser', action='store_false')
    parser.add_argument(
        '--auto-shutdown',
        nargs=1,
        type=float,
        help="Time limit before automatic shutdown. Set to 0 to deactivate.",
        default=[2])
    parser.set_defaults(browser=True)
    args = parser.parse_args()

    if args.debug:
        logging.basicConfig(level=logging.DEBUG)
    else:
        logging.basicConfig()

    if args.password:
        if args.password is True:
            password = hashpw(prompt_pw(), gensalt())
        else:
            password = hashpw(args.password, gensalt())
        server_settings = GuiServerSettings(('', 8080),
                                            args.auto_shutdown[0],
                                            password_hash=password,
                                            ssl_cert=args.cert[0],
                                            ssl_key=args.key[0])
        if not server_settings.use_ssl:
            raise ValueError("Password protection only allowed with SSL.")
    else:
        server_settings = GuiServerSettings(('localhost', 8080),
                                            args.auto_shutdown[0],
                                            ssl_cert=args.cert[0],
                                            ssl_key=args.key[0])

    try:
        if args.filename is None:
            filename = os.path.join(nengo_gui.__path__[0], 'examples',
                                    'default.py')
        else:
            filename = args.filename
        page_settings = nengo_gui.page.PageSettings(backend=args.backend)
        s = nengo_gui.gui.InteractiveGUI(ModelContext(filename=filename),
                                         server_settings,
                                         page_settings=page_settings)
        s.server.auto_shutdown = args.auto_shutdown[0]

        if args.browser:
            protocol = 'https:' if server_settings.use_ssl else 'http:'
            host = 'localhost'
            port = s.server.server_port
            t = threading.Thread(target=webbrowser.open,
                                 args=('%s//%s:%d' % (protocol, host, port), ))
            t.start()

        s.start()
    finally:
        logging.shutdown()