Exemple #1
0
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
Exemple #3
0
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)
Exemple #4
0
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
Exemple #5
0
def app(tmpdir):
    from pypiserver import app

    return app(
        roots=[pathlib.Path(tmpdir.strpath)],
        authenticate=[],
        password_file=".",
    )
Exemple #6
0
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
Exemple #7
0
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]
Exemple #10
0
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)
Exemple #11
0
#!/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)
Exemple #12
0
#!/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)
Exemple #14
0
def app(tmpdir):
    from pypiserver import app
    return app(root=tmpdir.strpath)
Exemple #15
0
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)
Exemple #16
0
def app(tmpdir):
    from pypiserver import app
    return app(root=tmpdir.strpath, authenticated=[])
Exemple #17
0
def test_app_factory(monkeypatch):
    monkeypatch.setattr('pypiserver.core.configure', lambda **x:
                        (x, [x.keys()]))
    assert pypiserver.app() is not pypiserver.app()
Exemple #18
0
def app(tmpdir):
    from pypiserver import app
    return app(root=tmpdir.strpath)
Exemple #19
0
def test_app_factory(monkeypatch):
    monkeypatch.setattr('pypiserver.core.configure',
                        lambda **x: (x, [x.keys()]))
    assert pypiserver.app() is not pypiserver.app()
Exemple #20
0
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)
Exemple #21
0
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)
Exemple #22
0
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)
Exemple #23
0
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)
Exemple #24
0
def _make_index_server(packages_dir: str):
    # noinspection PyTypeChecker
    return pypiserver.app(root=[packages_dir], )
Exemple #25
0
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)
Exemple #26
0
def app(tmpdir):
    from pypiserver import app
    return app(root=tmpdir.strpath, authenticated=[])
Exemple #27
0
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)
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)
#!/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')
Exemple #30
0
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)
Exemple #31
0
def test_app_factory() -> None:
    assert pypiserver.app() is not pypiserver.app()