spiegel_podman/pkg/registries/registries.go
Valentin Rothberg 660208cea3 search: allow wildcards
Allow wildcards in the search term.  Note that not all registries
support wildcards and it may only work with v1 registries.

Note that searching implies figuring out if the specified search term
includes a registry.  If there's not registry detected, the search term
will be used against all configured "unqualified-serach-registries" in
the registries.conf.  The parsing logic considers a registry to be the
substring before the first slash `/`.

With these changes we now not only support wildcards but arbitrary
input; ultimately it's up to the registries to decide whether they
support given input or not.

Fixes: bugzilla.redhat.com/show_bug.cgi?id=1846629
Cherry-pick-of: commit b05888a97d
Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
2020-07-15 11:42:04 +02:00

77 lines
2.5 KiB
Go

package registries
import (
"os"
"path/filepath"
"github.com/containers/image/v5/pkg/sysregistriesv2"
"github.com/containers/image/v5/types"
"github.com/containers/libpod/v2/pkg/rootless"
"github.com/pkg/errors"
)
// userRegistriesFile is the path to the per user registry configuration file.
var userRegistriesFile = filepath.Join(os.Getenv("HOME"), ".config/containers/registries.conf")
// SystemRegistriesConfPath returns an appropriate value for types.SystemContext.SystemRegistriesConfPath
// (possibly "", which is not an error), taking into account rootless mode and environment variable overrides.
//
// FIXME: This should be centralized in a global SystemContext initializer inherited throughout the code,
// not haphazardly called throughout the way it is being called now.
func SystemRegistriesConfPath() string {
if envOverride := os.Getenv("REGISTRIES_CONFIG_PATH"); len(envOverride) > 0 {
return envOverride
}
if rootless.IsRootless() {
if _, err := os.Stat(userRegistriesFile); err == nil {
return userRegistriesFile
}
}
return ""
}
// GetRegistriesData obtains the list of registries
func GetRegistriesData() ([]sysregistriesv2.Registry, error) {
registries, err := sysregistriesv2.GetRegistries(&types.SystemContext{SystemRegistriesConfPath: SystemRegistriesConfPath()})
if err != nil {
return nil, errors.Wrapf(err, "unable to parse the registries.conf file")
}
return registries, nil
}
// GetRegistries obtains the list of search registries defined in the global registries file.
func GetRegistries() ([]string, error) {
return sysregistriesv2.UnqualifiedSearchRegistries(&types.SystemContext{SystemRegistriesConfPath: SystemRegistriesConfPath()})
}
// GetBlockedRegistries obtains the list of blocked registries defined in the global registries file.
func GetBlockedRegistries() ([]string, error) {
var blockedRegistries []string
registries, err := GetRegistriesData()
if err != nil {
return nil, err
}
for _, reg := range registries {
if reg.Blocked {
blockedRegistries = append(blockedRegistries, reg.Prefix)
}
}
return blockedRegistries, nil
}
// GetInsecureRegistries obtains the list of insecure registries from the global registration file.
func GetInsecureRegistries() ([]string, error) {
var insecureRegistries []string
registries, err := GetRegistriesData()
if err != nil {
return nil, err
}
for _, reg := range registries {
if reg.Insecure {
insecureRegistries = append(insecureRegistries, reg.Prefix)
}
}
return insecureRegistries, nil
}