Esempio n. 1
0
def dxf_obj(request):
    # pylint: disable=redefined-outer-name
    regver, from_base, auth, do_token, tlsverify = _setup_fixture(request)

    if from_base:
        base = dxf.DXFBase('localhost:5000', auth, (auth is None)
                           or (do_token is None), None, tlsverify)
        r = dxf.DXF.from_base(base, pytest.repo)
    else:
        r = dxf.DXF('localhost:5000', pytest.repo, auth, (auth is None)
                    or (do_token is None), None, tlsverify)

    r.test_do_auth = auth
    r.test_do_token = do_token
    r.regver = regver
    r.reg_digest = _get_registry_digest(regver)

    lex = Exception('should never be thrown')
    for _ in range(5):
        try:
            if do_token is None:
                with pytest.raises(dxf.exceptions.DXFAuthInsecureError):
                    r.authenticate(pytest.username, pytest.password)
                return pytest.skip()

            assert not r.list_repos()

            return r
        except requests.exceptions.ConnectionError as ex:
            lex = ex
            time.sleep(1)
    raise lex
Esempio n. 2
0
def doit(args, environ):
    dxf_progress = environ.get('DXF_PROGRESS')
    if dxf_progress == '1' or (dxf_progress != '0' and sys.stderr.isatty()):
        bars = {}

        def progress(dgst, chunk, size):
            if dgst not in bars:
                bars[dgst] = tqdm.tqdm(desc=dgst[0:8], total=size, leave=True)
            if chunk:
                bars[dgst].update(len(chunk))
            if bars[dgst].n >= bars[dgst].total:
                bars[dgst].close()
                del bars[dgst]
    else:
        progress = None

    def auth(dxf_obj, response):
        # pylint: disable=redefined-outer-name
        username = environ.get('DXF_USERNAME')
        password = environ.get('DXF_PASSWORD')
        authorization = environ.get('DXF_AUTHORIZATION')
        dxf_obj.authenticate(username,
                             password,
                             response=response,
                             authorization=authorization)

    args = _parser.parse_args(args)
    if args.op != 'list-repos':
        dxf_obj = dxf.DXF(environ['DXF_HOST'], args.repo, auth,
                          environ.get('DXF_INSECURE') == '1',
                          environ.get('DXF_AUTH_HOST'))
    else:
        dxf_obj = dxf.DXFBase(environ['DXF_HOST'], auth,
                              environ.get('DXF_INSECURE') == '1',
                              environ.get('DXF_AUTH_HOST'))

    def _doit():
        # pylint: disable=too-many-branches
        if args.op == "auth":
            username = environ.get('DXF_USERNAME')
            password = environ.get('DXF_PASSWORD')
            authorization = environ.get('DXF_AUTHORIZATION')
            token = dxf_obj.authenticate(username,
                                         password,
                                         actions=args.args,
                                         authorization=authorization)
            if token:
                print(token)
            return

        token = environ.get('DXF_TOKEN')
        if token:
            dxf_obj.token = token

        if args.op == "push-blob":
            if len(args.args) < 1:
                _parser.error('too few arguments')
            if len(args.args) > 2:
                _parser.error('too many arguments')
            if len(args.args) == 2 and not args.args[1].startswith('@'):
                _parser.error('invalid alias')
            dgst = dxf_obj.push_blob(args.args[0], progress)
            if len(args.args) == 2:
                dxf_obj.set_alias(args.args[1][1:], dgst)
            print(dgst)

        elif args.op == "pull-blob":
            _stdout = getattr(sys.stdout, 'buffer', sys.stdout)
            if args.args:
                dgsts = _flatten([
                    dxf_obj.get_alias(name[1:])
                    if name.startswith('@') else [name] for name in args.args
                ])
            else:
                dgsts = dxf_obj.get_alias(manifest=sys.stdin.read())
            for dgst in dgsts:
                it, size = dxf_obj.pull_blob(
                    dgst, size=True, chunk_size=environ.get('DXF_CHUNK_SIZE'))
                if environ.get('DXF_BLOB_INFO') == '1':
                    print(dgst + ' ' + str(size))
                if progress:
                    progress(dgst, b'', size)
                for chunk in it:
                    if progress:
                        progress(dgst, chunk, size)
                    _stdout.write(chunk)

        elif args.op == 'blob-size':
            if args.args:
                sizes = [
                    dxf_obj.get_alias(name[1:], sizes=True) if
                    name.startswith('@') else [(name, dxf_obj.blob_size(name))]
                    for name in args.args
                ]
            else:
                sizes = [
                    dxf_obj.get_alias(manifest=sys.stdin.read(), sizes=True)
                ]
            for tuples in sizes:
                print(sum([size for _, size in tuples]))

        elif args.op == 'del-blob':
            if args.args:
                dgsts = _flatten([
                    dxf_obj.del_alias(name[1:])
                    if name.startswith('@') else [name] for name in args.args
                ])
            else:
                dgsts = dxf_obj.get_alias(manifest=sys.stdin.read())
            for dgst in dgsts:
                dxf_obj.del_blob(dgst)

        elif args.op == "set-alias":
            if len(args.args) < 2:
                _parser.error('too few arguments')
            dgsts = [
                dxf.hash_file(dgst) if os.sep in dgst else dgst
                for dgst in args.args[1:]
            ]
            sys.stdout.write(dxf_obj.set_alias(args.args[0], *dgsts))

        elif args.op == "get-alias":
            if args.args:
                dgsts = _flatten(
                    [dxf_obj.get_alias(name) for name in args.args])
            else:
                dgsts = dxf_obj.get_alias(manifest=sys.stdin.read())
            for dgst in dgsts:
                print(dgst)

        elif args.op == "del-alias":
            for name in args.args:
                for dgst in dxf_obj.del_alias(name):
                    print(dgst)

        elif args.op == 'list-aliases':
            if args.args:
                _parser.error('too many arguments')
            for name in dxf_obj.list_aliases():
                print(name)

        elif args.op == 'list-repos':
            for name in dxf_obj.list_repos():
                print(name)

    try:
        _doit()
        return 0
    except dxf.exceptions.DXFUnauthorizedError:
        traceback.print_exc()
        return errno.EACCES
    except requests.exceptions.HTTPError as ex:
        # pylint: disable=no-member
        if ex.response.status_code == requests.codes.not_found:
            traceback.print_exc()
            return errno.ENOENT
        raise