def test_root_welcome_msg_no_vars(root, welcome_file_no_vars): from pypiserver import app app = app(root=root.strpath, welcome_file=welcome_file_no_vars.strpath) testapp = webtest.TestApp(app) resp = testapp.get("/") from pypiserver import __version__ as pver resp.mustcontain(welcome_file_no_vars.read(), no=pver)
def get_app(): AppConfiguration.describe_configuration() plugin = AppConfiguration.build_plugin() pypiserver_app = app(root=[GlobalSettings.LOCAL_DIRECTORY]) pypiserver_app.add_hook("before_request", plugin.sync_data_before_change) pypiserver_app.add_hook("after_request", plugin.sync_data_after_change) return pypiserver_app
def test_cache_control_set(root): from pypiserver import app AGE = 86400 app_with_cache = webtest.TestApp(app(root=root.strpath, cache_control=AGE)) root.join("foo_bar-1.0.tar.gz").write("") resp = app_with_cache.get("/packages/foo_bar-1.0.tar.gz") assert "Cache-Control" in resp.headers assert resp.headers["Cache-Control"] == 'public, max-age=%s' % AGE
def app(tmpdir): from pypiserver import app return app( roots=[pathlib.Path(tmpdir.strpath)], authenticate=[], password_file=".", )
def test_create_environment_with_local_https_pypi(tmpdir): """Create virtual environment using local PyPI listening https with certificate signed with custom certificate authority """ test_dir = Path(__file__).parent ssl_dir = test_dir / "ssl" proj_dir = test_dir.parent support_dir = proj_dir / "virtualenv_support" local_pypi_app = pypiserver.app(root=str(support_dir)) local_pypi = pytest_localserver.http.WSGIServer( host="localhost", port=0, application=local_pypi_app, ssl_context=(str(ssl_dir / "server.crt"), str(ssl_dir / "server.key")), ) local_pypi.start() local_pypi_url = "https://localhost:{}/".format( local_pypi.server_address[1]) venvdir = tmpdir / "venv" pip_log = tmpdir / "pip.log" env_addition = { "PIP_CERT": str(ssl_dir / "rootCA.pem"), "PIP_INDEX_URL": local_pypi_url, "PIP_LOG": str(pip_log), "PIP_RETRIES": "0", } if six.PY2: env_addition = { key.encode("utf-8"): value.encode("utf-8") for key, value in env_addition.items() } env_backup = {} for key, value in env_addition.items(): if key in os.environ: env_backup[key] = os.environ[key] os.environ[key] = value try: virtualenv.create_environment(str(venvdir), download=True) with pip_log.open("rb") as f: assert b"SSLError" not in f.read() finally: local_pypi.stop() for key in env_addition.keys(): os.environ.pop(key) if key in env_backup: os.environ[key] = env_backup[key]
def pytest_funcarg__env(request): tmpdir = request.getfuncargvalue("tmpdir") from pypiserver import app a = app(root=tmpdir.strpath) if loadapp: pini = tmpdir.join(".paste.ini") pini.write(""" [composite:main] use = egg:Paste#urlmap /priv/ = private [app:private] paste.app_factory = pypiserver:paste_app_factory root = %s [server:main] use = egg:gunicorn#main host = 0.0.0.0 port = 8001 workers = 5 accesslog = - """ % tmpdir) twill.add_wsgi_intercept("nonroot", 80, lambda: loadapp("config:%s" % pini)) twill.add_wsgi_intercept("localhost", 8080, lambda: a) twill.add_wsgi_intercept("systemexit.de", 80, lambda: a) twill.add_wsgi_intercept("pypi.python.org", 80, lambda: fallback_app) def cleanup(): twill.remove_wsgi_intercept("localhost", 8080) twill.remove_wsgi_intercept("systemexit.de", 80) twill.remove_wsgi_intercept("pypi.python.org", 80) if loadapp: twill.remove_wsgi_intercept("nonroot", 80) request.addfinalizer(cleanup) go("http://localhost:8080/") return dict(root=tmpdir, app=a, _app=a.module)
def test_create_environment_with_local_https_pypi(tmpdir): """Create virtual environment using local PyPI listening https with certificate signed with custom certificate authority """ test_dir = Path(__file__).parent ssl_dir = test_dir / "ssl" proj_dir = test_dir.parent support_dir = proj_dir / "virtualenv_support" local_pypi_app = pypiserver.app(root=str(support_dir)) local_pypi = pytest_localserver.http.WSGIServer( host="localhost", port=0, application=local_pypi_app, ssl_context=(str(ssl_dir / "server.crt"), str(ssl_dir / "server.key")), ) local_pypi.start() local_pypi_url = "https://localhost:{}/".format(local_pypi.server_address[1]) venvdir = tmpdir / "venv" pip_log = tmpdir / "pip.log" env_addition = { "PIP_CERT": str(ssl_dir / "rootCA.pem"), "PIP_INDEX_URL": local_pypi_url, "PIP_LOG": str(pip_log), "PIP_RETRIES": "0", } if six.PY2: env_addition = {key.encode("utf-8"): value.encode("utf-8") for key, value in env_addition.items()} env_backup = {} for key, value in env_addition.items(): if key in os.environ: env_backup[key] = os.environ[key] os.environ[key] = value try: virtualenv.create_environment(str(venvdir), download=True) with pip_log.open("rb") as f: assert b"SSLError" not in f.read() finally: local_pypi.stop() for key in env_addition.keys(): os.environ.pop(key) if key in env_backup: os.environ[key] = env_backup[key]
#!/usr/bin/env python # -*- coding: utf-8 -*- # ************************************************************************** # Copyright © 2016 jianglin # File Name: runserver.py # Author: jianglin # Email: [email protected] # Created: 2016-09-29 16:10:33 (CST) # Last Update:THURSDAY 2016-9-29 16:25:24 (CST) # By: # Description: # ************************************************************************** import pypiserver from os.path import join base_path = '/home/arch/pypiserver' conf = pypiserver.default_config(root=join(base_path, 'packages'), host='127.0.0.1', port=8080, password_file=join(base_path, 'password'), log_file=join(base_path, 'logs/info.log'), welcome_file=None) application = pypiserver.app(**conf)
#!/usr/bin/env python # -*- coding: utf-8 -*- """Pypi Server WSGI App.""" from __future__ import print_function, unicode_literals import pypiserver application = pypiserver.app('<%= pypi_root %>/packages', redirect_to_fallback=False, password_file='<%= pypi_root %>/.htaccess')
import errno import os import os.path as path import pypiserver CWD = os.getcwd() PACKAGES = path.expanduser('~/data') HTPASSWD = path.join(CWD, 'htpasswd') try: os.makedirs(PACKAGES) except OSError as e: if e.errno != errno.EEXIST: raise application = pypiserver.app(root=PACKAGES, password_file=HTPASSWD)
def app(tmpdir): from pypiserver import app return app(root=tmpdir.strpath)
def main(argv=None): if argv is None: argv = sys.argv global packages command = "serve" host = "0.0.0.0" port = 8080 server = DEFAULT_SERVER redirect_to_fallback = True fallback_url = "http://pypi.python.org/simple" password_file = None update_dry_run = True update_directory = None update_stable_only = True try: opts, roots = getopt.getopt(argv[1:], "i:p:r:d:P:Uuxh", [ "interface=", "passwords=", "port=", "root=", "server=", "fallback-url=", "disable-fallback", "version", "help" ]) except getopt.GetoptError: err = sys.exc_info()[1] sys.exit("usage error: %s" % (err,)) for k, v in opts: if k in ("-p", "--port"): port = int(v) elif k in ("-i", "--interface"): host = v elif k in ("-r", "--root"): roots.append(v) elif k == "--disable-fallback": redirect_to_fallback = False elif k == "--fallback-url": fallback_url = v elif k == "--server": if v not in server_names: sys.exit("unknown server %r. choose one of %s" % ( v, ", ".join(server_names.keys()))) server = v elif k == "--version": sys.stdout.write("pypiserver %s\n" % __version__) sys.exit(0) elif k == "-U": command = "update" elif k == "-x": update_dry_run = False elif k == "-u": update_stable_only = False elif k == "-d": update_directory = v elif k in ("-P", "--passwords"): password_file = v elif k in ("-h", "--help"): usage() sys.exit(0) if len(roots) == 0: roots.append(os.path.expanduser("~/packages")) roots = [os.path.abspath(x) for x in roots] if command == "update": packages = frozenset(itertools.chain(*[listdir(r) for r in roots])) from pypiserver import manage manage.update(packages, update_directory, update_dry_run, stable_only=update_stable_only) return a = app( root=roots, redirect_to_fallback=redirect_to_fallback, password_file=password_file, fallback_url=fallback_url ) server = server or "auto" sys.stdout.write("This is pypiserver %s serving %r on http://%s:%s\n\n" % (__version__, ", ".join(roots), host, port)) sys.stdout.flush() run(app=a, host=host, port=port, server=server)
def app(tmpdir): from pypiserver import app return app(root=tmpdir.strpath, authenticated=[])
def test_app_factory(monkeypatch): monkeypatch.setattr('pypiserver.core.configure', lambda **x: (x, [x.keys()])) assert pypiserver.app() is not pypiserver.app()
def main(argv=None): import pypiserver if argv is None: argv = sys.argv command = "serve" c = pypiserver.Configuration(**pypiserver.default_config()) update_dry_run = True update_directory = None update_stable_only = True try: opts, roots = getopt.getopt(argv[1:], "i:p:a:r:d:P:Uuvxoh", [ "interface=", "passwords=", "authenticate=", "port=", "root=", "server=", "fallback-url=", "disable-fallback", "overwrite", "hash-algo=", "log-file=", "log-frmt=", "log-req-frmt=", "log-res-frmt=", "log-err-frmt=", "welcome=", "cache-control=", "version", "help" ]) except getopt.GetoptError: err = sys.exc_info()[1] sys.exit("usage error: %s" % (err,)) for k, v in opts: if k in ("-p", "--port"): try: c.port = int(v) except Exception: err = sys.exc_info()[1] sys.exit("Invalid port(%r) due to: %s" % (v, err)) elif k in ("-a", "--authenticate"): if '{' in v: try: v = ast.literal_eval(v) except SyntaxError: message = 'Could not parse auth string %s! Please ensure string is correctly formatted.' % v print(message) sys.exit(message) if (not isinstance(v, dict) or not all([isinstance(i, list) for i in v.values()])): message = 'Matrix auth string must be a dict of lists. Please see the README for details.' print(message) sys.exit(message) if isinstance(v, dict): c.authenticated = {} for user in v: c.authenticated[user] = [a.lower() for a in v[user] if a] if c.authenticated[user] == ['.']: c.authenticated[user] = [] else: actions = ("list", "download", "update") for a in c.authenticated[user]: if a not in actions: errmsg = "Action '%s' for option `%s` not one of %s!" sys.exit(errmsg % (a, k, actions)) else: c.authenticated = [a.lower() for a in re.split("[, ]+", v.strip(" ,")) if a] if c.authenticated == ['.']: c.authenticated = [] else: actions = ("list", "download", "update") for a in c.authenticated: if a not in actions: errmsg = "Action '%s' for option `%s` not one of %s!" sys.exit(errmsg % (a, k, actions)) elif k in ("-i", "--interface"): c.host = v elif k in ("-r", "--root"): roots.append(v) elif k == "--disable-fallback": c.redirect_to_fallback = False elif k == "--fallback-url": c.fallback_url = v elif k == "--server": c.server = v elif k == "--welcome": c.welcome_file = v elif k == "--version": print("pypiserver %s\n" % pypiserver.__version__) return elif k == "-U": command = "update" elif k == "-x": update_dry_run = False elif k == "-u": update_stable_only = False elif k == "-d": update_directory = v elif k in ("-P", "--passwords"): c.password_file = v elif k in ("-o", "--overwrite"): c.overwrite = True elif k in ("--hash-algo"): c.hash_algo = None if not pypiserver.str2bool(v, c.hash_algo) else v elif k == "--log-file": c.log_file = v elif k == "--log-frmt": c.log_frmt = v elif k == "--log-req-frmt": c.log_req_frmt = v elif k == "--log-res-frmt": c.log_res_frmt = v elif k == "--log-err-frmt": c.log_err_frmt = v elif k == "--cache-control": c.cache_control = v elif k == "-v": c.verbosity += 1 elif k in ("-h", "--help"): print(usage()) sys.exit(0) if (not c.authenticated and c.password_file != '.' or c.authenticated and c.password_file == '.'): auth_err = "When auth-ops-list is empty (-a=.), password-file (-P=%r) must also be empty ('.')!" sys.exit(auth_err % c.password_file) if len(roots) == 0: roots.append(os.path.expanduser("~/packages")) roots=[os.path.abspath(x) for x in roots] c.root = roots verbose_levels=[ logging.WARNING, logging.INFO, logging.DEBUG, logging.NOTSET] log_level=list(zip(verbose_levels, range(c.verbosity)))[-1][0] init_logging(level=log_level, filename=c.log_file, frmt=c.log_frmt) if command == "update": from pypiserver.manage import update_all_packages update_all_packages(roots, update_directory, dry_run=update_dry_run, stable_only=update_stable_only) return # Fixes #49: # The gevent server adapter needs to patch some # modules BEFORE importing bottle! if c.server and c.server.startswith('gevent'): import gevent.monkey # @UnresolvedImport gevent.monkey.patch_all() from pypiserver import bottle if c.server not in bottle.server_names: sys.exit("unknown server %r. choose one of %s" % ( c.server, ", ".join(bottle.server_names.keys()))) bottle.debug(c.verbosity > 1) bottle._stderr = ft.partial(pypiserver._logwrite, logging.getLogger(bottle.__name__), logging.INFO) app = pypiserver.app(**vars(c)) bottle.run(app=app, host=c.host, port=c.port, server=c.server)
def main(argv=None): if argv is None: argv = sys.argv global packages command = "serve" host = "0.0.0.0" port = 8080 server = DEFAULT_SERVER redirect_to_fallback = True fallback_url = "http://pypi.python.org/simple" password_file = None overwrite = False update_dry_run = True update_directory = None update_stable_only = True try: opts, roots = getopt.getopt(argv[1:], "i:p:r:d:P:Uuxoh", [ "interface=", "passwords=", "port=", "root=", "server=", "fallback-url=", "disable-fallback", "overwrite", "version", "help" ]) except getopt.GetoptError: err = sys.exc_info()[1] sys.exit("usage error: %s" % (err,)) for k, v in opts: if k in ("-p", "--port"): port = int(v) elif k in ("-i", "--interface"): host = v elif k in ("-r", "--root"): roots.append(v) elif k == "--disable-fallback": redirect_to_fallback = False elif k == "--fallback-url": fallback_url = v elif k == "--server": if v not in server_names: sys.exit("unknown server %r. choose one of %s" % ( v, ", ".join(server_names.keys()))) server = v elif k == "--version": sys.stdout.write("pypiserver %s\n" % __version__) sys.exit(0) elif k == "-U": command = "update" elif k == "-x": update_dry_run = False elif k == "-u": update_stable_only = False elif k == "-d": update_directory = v elif k in ("-P", "--passwords"): password_file = v elif k in ("-o", "--overwrite"): overwrite = True elif k in ("-h", "--help"): usage() sys.exit(0) if len(roots) == 0: roots.append(os.path.expanduser("~/packages")) roots = [os.path.abspath(x) for x in roots] if command == "update": packages = frozenset(itertools.chain(*[listdir(r) for r in roots])) from pypiserver import manage manage.update(packages, update_directory, update_dry_run, stable_only=update_stable_only) return a = app( root=roots, redirect_to_fallback=redirect_to_fallback, password_file=password_file, fallback_url=fallback_url, overwrite=overwrite, ) server = server or "auto" sys.stdout.write("This is pypiserver %s serving %r on http://%s:%s\n\n" % (__version__, ", ".join(roots), host, port)) sys.stdout.flush() run(app=a, host=host, port=port, server=server)
def main(argv=None): if argv is None: argv = sys.argv global packages command = "serve" host = "0.0.0.0" port = 8080 server = DEFAULT_SERVER redirect_to_fallback = True fallback_url = "http://pypi.python.org/simple" authenticated = ['update'] password_file = None overwrite = False verbosity = 1 log_file = None log_frmt = None log_req_frmt = None log_res_frmt = None log_err_frmt = None welcome_file = None cache_control = None update_dry_run = True update_directory = None update_stable_only = True try: opts, roots = getopt.getopt(argv[1:], "i:p:a:r:d:P:Uuvxoh", [ "interface=", "passwords=", "authenticate=", "port=", "root=", "server=", "fallback-url=", "disable-fallback", "overwrite", "log-file=", "log-frmt=", "log-req-frmt=", "log-res-frmt=", "log-err-frmt=", "welcome=", "cache-control=", "version", "help" ]) except getopt.GetoptError: err = sys.exc_info()[1] sys.exit("usage error: %s" % (err,)) for k, v in opts: if k in ("-p", "--port"): port = int(v) elif k in ("-a", "--authenticate"): authenticated = [a.lower() for a in re.split("[, ]+", v.strip(" ,"))] actions = ("list", "download", "update") for a in authenticated: if a not in actions: errmsg = "Action '%s' for option `%s` not one of %s!" % (a, k, actions) sys.exit(errmsg) elif k in ("-i", "--interface"): host = v elif k in ("-r", "--root"): roots.append(v) elif k == "--disable-fallback": redirect_to_fallback = False elif k == "--fallback-url": fallback_url = v elif k == "--server": if v not in server_names: sys.exit("unknown server %r. choose one of %s" % ( v, ", ".join(server_names.keys()))) server = v elif k == "--welcome": welcome_file = v elif k == "--version": sys.stdout.write("pypiserver %s\n" % __version__) sys.exit(0) elif k == "-U": command = "update" elif k == "-x": update_dry_run = False elif k == "-u": update_stable_only = False elif k == "-d": update_directory = v elif k in ("-P", "--passwords"): password_file = v elif k in ("-o", "--overwrite"): overwrite = True elif k == "--log-file": log_file = v elif k == "--log-frmt": log_frmt = v elif k == "--log-req-frmt": log_req_frmt = v elif k == "--log-res-frmt": log_res_frmt = v elif k == "--log-err-frmt": log_err_frmt = v elif k == "--cache-control": cache_control = v elif k == "-v": verbosity += 1 elif k in ("-h", "--help"): usage() sys.exit(0) if password_file and not (password_file and authenticated): sys.exit("Must give both password file (-P) and actions to authenticate (-a).") if len(roots) == 0: roots.append(os.path.expanduser("~/packages")) roots = [os.path.abspath(x) for x in roots] verbose_levels = [logging.WARNING, logging.INFO, logging.DEBUG, logging.NOTSET] log_level = list(zip(verbose_levels, range(verbosity)))[-1][0] init_logging(level=log_level, filename=log_file, format=log_frmt) if command == "update": packages = frozenset(itertools.chain(*[listdir(r) for r in roots])) from pypiserver import manage manage.update(packages, update_directory, update_dry_run, stable_only=update_stable_only) return a = app( root=roots, redirect_to_fallback=redirect_to_fallback, authenticated=authenticated, password_file=password_file, fallback_url=fallback_url, overwrite=overwrite, log_req_frmt=log_req_frmt, log_res_frmt=log_res_frmt, log_err_frmt=log_err_frmt, welcome_file=welcome_file, cache_control=cache_control, ) server = server or "auto" log.info("This is pypiserver %s serving %r on http://%s:%s\n\n", __version__, ", ".join(roots), host, port) run(app=a, host=host, port=port, server=server)
def main(argv=None): if argv is None: argv = sys.argv global packages command = "serve" host = "0.0.0.0" port = 8080 server = None redirect_to_fallback = True fallback_url = "http://pypi.python.org/simple" password_file = None update_dry_run = True update_directory = None update_stable_only = True try: opts, roots = getopt.getopt(argv[1:], "i:p:r:d:P:Uuxh", [ "interface=", "passwords=", "port=", "root=", "server=", "fallback-url=", "disable-fallback", "version", "help" ]) except getopt.GetoptError: err = sys.exc_info()[1] sys.exit("usage error: %s" % (err, )) for k, v in opts: if k in ("-p", "--port"): port = int(v) elif k in ("-i", "--interface"): host = v elif k in ("-r", "--root"): roots.append(v) elif k == "--disable-fallback": redirect_to_fallback = False elif k == "--fallback-url": fallback_url = v elif k == "--server": if v not in server_names: sys.exit("unknown server %r. choose one of %s" % (v, ", ".join(server_names.keys()))) server = v elif k == "--version": sys.stdout.write("pypiserver %s\n" % __version__) sys.exit(0) elif k == "-U": command = "update" elif k == "-x": update_dry_run = False elif k == "-u": update_stable_only = False elif k == "-d": update_directory = v elif k in ("-P", "--passwords"): password_file = v elif k in ("-h", "--help"): usage() sys.exit(0) if len(roots) == 0: roots.append(os.path.expanduser("~/packages")) elif len(roots) > 1: sys.exit("Error: more than one root directory specified: %r" % (roots, )) root = os.path.abspath(roots[0]) try: os.listdir(root) except Exception: err = sys.exc_info()[1] sys.exit("Error: while trying to list %r: %s" % (root, err)) if command == "update": packages = pkgset(root) from pypiserver import manage manage.update(packages, update_directory, update_dry_run, stable_only=update_stable_only) return a = app(root=root, redirect_to_fallback=redirect_to_fallback, password_file=password_file, fallback_url=fallback_url) server = server or "auto" sys.stdout.write("This is pypiserver %s serving %r on %s:%s\n\n" % (__version__, root, host, port)) run(app=a, host=host, port=port, server=server)
def _make_index_server(packages_dir: str): # noinspection PyTypeChecker return pypiserver.app(root=[packages_dir], )
def main(argv=None): if argv is None: argv = sys.argv global packages command = "serve" host = "0.0.0.0" port = 8080 server = DEFAULT_SERVER redirect_to_fallback = True fallback_url = "http://pypi.python.org/simple" authed_ops_list = ['update'] password_file = None overwrite = False verbosity = 1 log_file = None log_frmt = "g%(asctime)s|%(levelname)s|%(thread)d|%(message)s" log_req_frmt = "%(bottle.request)s" log_res_frmt = "%(status)s" log_err_frmt = "%(body)s: %(exception)s \n%(traceback)s" add_template = "" cache_control = None update_dry_run = True update_directory = None update_stable_only = True try: opts, roots = getopt.getopt(argv[1:], "i:p:a:r:d:P:Uuvxoh", [ "interface=", "passwords=", "authenticate=", "port=", "root=", "server=", "fallback-url=", "disable-fallback", "overwrite", "log-file=", "log-frmt=", "log-req-frmt=", "log-res-frmt=", "log-err-frmt=", "cache-control=", "version", "help", "add-template=" ]) except getopt.GetoptError: err = sys.exc_info()[1] sys.exit("usage error: %s" % (err,)) for k, v in opts: if k in ("-p", "--port"): try: port = int(v) except Exception as ex: sys.exit("Invalid port(%r)!" % v) elif k in ("-a", "--authenticate"): authed_ops_list = [a.lower() for a in re.split("[, ]+", v.strip(" ,")) if a] if authed_ops_list == ['.']: authed_ops_list = [] else: actions = ("list", "download", "update") for a in authed_ops_list: if a not in actions: errmsg = "Action '%s' for option `%s` not one of %s!" sys.exit(errmsg % (a, k, actions)) elif k in ("-i", "--interface"): host = v elif k in ("-r", "--root"): roots.append(v) elif k == "--disable-fallback": redirect_to_fallback = False elif k == "--fallback-url": fallback_url = v elif k == "--server": server = v elif k == "--version": from pypiserver import __version__ print("pypiserver %s\n" % __version__) return elif k == "-U": command = "update" elif k == "-x": update_dry_run = False elif k == "-u": update_stable_only = False elif k == "-d": update_directory = v elif k in ("-P", "--passwords"): password_file = v elif k in ("-o", "--overwrite"): overwrite = True elif k == "--log-file": log_file = v elif k == "--log-frmt": log_frmt = v elif k == "--log-req-frmt": log_req_frmt = v elif k == "--log-res-frmt": log_res_frmt = v elif k == "--log-err-frmt": log_err_frmt = v elif k == "--cache-control": cache_control = v elif k == "-v": verbosity += 1 elif k == "--add-template": add_template = v elif k in ("-h", "--help"): print(usage()) sys.exit(0) if (not authed_ops_list and password_file != '.' or authed_ops_list and password_file == '.'): auth_err = "When auth-ops-list is empty (-a=.), password-file (-P=%r) must also be empty ('.')!" sys.exit(auth_err % password_file) if len(roots) == 0: roots.append(os.path.expanduser("~/packages")) roots=[os.path.abspath(x) for x in roots] verbose_levels=[ logging.WARNING, logging.INFO, logging.DEBUG, logging.NOTSET] log_level=list(zip(verbose_levels, range(verbosity)))[-1][0] init_logging(level=log_level, filename=log_file, frmt=log_frmt) if command == "update": from pypiserver.manage import update_all_packages update_all_packages( roots, update_directory, update_dry_run, stable_only=update_stable_only) return # Fixes #49: # The gevent server adapter needs to patch some # modules BEFORE importing bottle! if server and server.startswith('gevent'): import gevent.monkey # @UnresolvedImport gevent.monkey.patch_all() from pypiserver.bottle import server_names, run if server not in server_names: sys.exit("unknown server %r. choose one of %s" % ( server, ", ".join(server_names.keys()))) from pypiserver import __version__, app a=app( root=roots, redirect_to_fallback=redirect_to_fallback, authenticated=authed_ops_list, password_file=password_file, fallback_url=fallback_url, overwrite=overwrite, log_req_frmt=log_req_frmt, log_res_frmt=log_res_frmt, log_err_frmt=log_err_frmt, cache_control=cache_control, add_template=add_template, ) log.info("This is pypiserver %s serving %r on http://%s:%s\n\n", __version__, ", ".join(roots), host, port) run(app=a, host=host, port=port, server=server)
def main(argv=None): if argv is None: argv = sys.argv global packages command = "serve" host = "0.0.0.0" port = 8080 server = None redirect_to_fallback = True password_file = None update_dry_run = True update_directory = None update_stable_only = True try: opts, roots = getopt.getopt(argv[1:], "i:p:r:d:P:Uuxh", ["interface=", "passwords=", "port=", "root=", "server=", "disable-fallback", "version", "help"]) except getopt.GetoptError: err = sys.exc_info()[1] sys.exit("usage error: %s" % (err,)) for k, v in opts: if k in ("-p", "--port"): port = int(v) elif k in ("-i", "--interface"): host = v elif k in ("-r", "--root"): roots.append(v) elif k == "--disable-fallback": redirect_to_fallback = False elif k == "--server": if v not in server_names: sys.exit("unknown server %r. choose one of %s" % (v, ", ".join(server_names.keys()))) server = v elif k == "--version": sys.stdout.write("pypiserver %s\n" % __version__) sys.exit(0) elif k == "-U": command = "update" elif k == "-x": update_dry_run = False elif k == "-u": update_stable_only = False elif k == "-d": update_directory = v elif k in ("-P", "--passwords"): password_file = v elif k in ("-h", "--help"): usage() sys.exit(0) if len(roots) == 0: roots.append(os.path.expanduser("~/packages")) elif len(roots) > 1: sys.exit("Error: more than one root directory specified: %r" % (roots,)) root = os.path.abspath(roots[0]) try: os.listdir(root) except Exception: err = sys.exc_info()[1] sys.exit("Error: while trying to list %r: %s" % (root, err)) if command == "update": packages = pkgset(root) from pypiserver import manage manage.update(packages, update_directory, update_dry_run, stable_only=update_stable_only) return a = app(root=root, redirect_to_fallback=redirect_to_fallback, password_file=password_file) server = server or "auto" sys.stdout.write("This is pypiserver %s serving %r on %s:%s\n\n" % (__version__, root, host, port)) run(app=a, host=host, port=port, server=server)
def main(argv=None): import pypiserver if argv is None: argv = sys.argv command = "serve" c = pypiserver.Configuration(**pypiserver.default_config()) update_dry_run = True update_directory = None update_stable_only = True try: opts, roots = getopt.getopt(argv[1:], "i:p:a:r:d:P:Uuvxoh", [ "interface=", "passwords=", "authenticate=", "port=", "root=", "server=", "fallback-url=", "disable-fallback", "overwrite", "hash-algo=", "log-file=", "log-frmt=", "log-req-frmt=", "log-res-frmt=", "log-err-frmt=", "welcome=", "cache-control=", "version", "help" ]) except getopt.GetoptError: err = sys.exc_info()[1] sys.exit("usage error: %s" % (err, )) for k, v in opts: if k in ("-p", "--port"): try: c.port = int(v) except Exception: err = sys.exc_info()[1] sys.exit("Invalid port(%r) due to: %s" % (v, err)) elif k in ("-a", "--authenticate"): c.authenticated = [ a.lower() for a in re.split("[, ]+", v.strip(" ,")) if a ] if c.authenticated == ['.']: c.authenticated = [] else: actions = ("list", "download", "update") for a in c.authenticated: if a not in actions: errmsg = "Action '%s' for option `%s` not one of %s!" sys.exit(errmsg % (a, k, actions)) elif k in ("-i", "--interface"): c.host = v elif k in ("-r", "--root"): roots.append(v) elif k == "--disable-fallback": c.redirect_to_fallback = False elif k == "--fallback-url": c.fallback_url = v elif k == "--server": c.server = v elif k == "--welcome": c.welcome_file = v elif k == "--version": print("pypiserver %s\n" % pypiserver.__version__) return elif k == "-U": command = "update" elif k == "-x": update_dry_run = False elif k == "-u": update_stable_only = False elif k == "-d": update_directory = v elif k in ("-P", "--passwords"): c.password_file = v elif k in ("-o", "--overwrite"): c.overwrite = True elif k in ("--hash-algo"): c.hash_algo = None if not pypiserver.str2bool(v, c.hash_algo) else v elif k == "--log-file": c.log_file = v elif k == "--log-frmt": c.log_frmt = v elif k == "--log-req-frmt": c.log_req_frmt = v elif k == "--log-res-frmt": c.log_res_frmt = v elif k == "--log-err-frmt": c.log_err_frmt = v elif k == "--cache-control": c.cache_control = v elif k == "-v": c.verbosity += 1 elif k in ("-h", "--help"): print(usage()) sys.exit(0) if (not c.authenticated and c.password_file != '.' or c.authenticated and c.password_file == '.'): auth_err = "When auth-ops-list is empty (-a=.), password-file (-P=%r) must also be empty ('.')!" sys.exit(auth_err % c.password_file) if len(roots) == 0: roots.append(os.path.expanduser("~/packages")) roots = [os.path.abspath(x) for x in roots] c.root = roots verbose_levels = [ logging.WARNING, logging.INFO, logging.DEBUG, logging.NOTSET ] log_level = list(zip(verbose_levels, range(c.verbosity)))[-1][0] init_logging(level=log_level, filename=c.log_file, frmt=c.log_frmt) if command == "update": from pypiserver.manage import update_all_packages update_all_packages(roots, update_directory, dry_run=update_dry_run, stable_only=update_stable_only) return # Fixes #49: # The gevent server adapter needs to patch some # modules BEFORE importing bottle! if c.server and c.server.startswith('gevent'): import gevent.monkey # @UnresolvedImport gevent.monkey.patch_all() from pypiserver import bottle if c.server not in bottle.server_names: sys.exit("unknown server %r. choose one of %s" % (c.server, ", ".join(bottle.server_names.keys()))) bottle.debug(c.verbosity > 1) bottle._stderr = ft.partial(pypiserver._logwrite, logging.getLogger(bottle.__name__), logging.INFO) app = pypiserver.app(**vars(c)) bottle.run(app=app, host=c.host, port=c.port, server=c.server)
def test_app_factory() -> None: assert pypiserver.app() is not pypiserver.app()