From ef6b597155ae7414e07adafeb80897d003bc3650 Mon Sep 17 00:00:00 2001 From: Daniele Rondina Date: Thu, 5 Nov 2020 19:05:44 +0100 Subject: [PATCH 1/2] server: Add support for --prefix-path option Permit to expose docker-registry UI under reverse proxy to a specific path. Signed-off-by: Daniele Rondina --- handlers.go | 4 ++++ server.go | 23 ++++++++++++++--------- server/templates/repositories.html | 12 ++++++------ server/templates/tags.html | 16 ++++++++-------- server/templates/vulns.html | 5 ++--- 5 files changed, 34 insertions(+), 26 deletions(-) diff --git a/handlers.go b/handlers.go index 362041685..bff08a453 100644 --- a/handlers.go +++ b/handlers.go @@ -28,6 +28,7 @@ type registryController struct { l sync.Mutex tmpl *template.Template generateOnly bool + PathPrefix string } type v1Compatibility struct { @@ -51,6 +52,7 @@ type AnalysisResult struct { Name string `json:"name"` LastUpdated string `json:"lastUpdated"` HasVulns bool `json:"hasVulns"` + PathPrefix string `json:"pathPrefix"` UpdateInterval time.Duration } @@ -64,6 +66,7 @@ func (rc *registryController) repositories(ctx context.Context, staticDir string RegistryDomain: rc.reg.Domain, LastUpdated: time.Now().Local().Format(time.RFC1123), UpdateInterval: rc.interval, + PathPrefix: rc.PathPrefix, } repoList, err := rc.reg.Catalog(ctx, "") @@ -192,6 +195,7 @@ func (rc *registryController) generateTagsTemplate(ctx context.Context, repo str LastUpdated: time.Now().Local().Format(time.RFC1123), UpdateInterval: rc.interval, Name: repo, + PathPrefix: rc.PathPrefix, HasVulns: hasVulns, // if we have a clair client we can return vulns } diff --git a/server.go b/server.go index fcd4cd71e..9a9842b5c 100644 --- a/server.go +++ b/server.go @@ -41,6 +41,7 @@ func (cmd *serverCommand) Register(fs *flag.FlagSet) { fs.StringVar(&cmd.listenAddress, "listen-address", "", "address to listen on") fs.StringVar(&cmd.port, "port", "8080", "port for server to run on") fs.StringVar(&cmd.assetPath, "asset-path", "", "Path to assets and templates") + fs.StringVar(&cmd.prefixPath, "prefix-path", "", "Prefix path of gui. Default /.") fs.BoolVar(&cmd.generateAndExit, "once", false, "generate the templates once and then exit") } @@ -57,6 +58,7 @@ type serverCommand struct { listenAddress string port string assetPath string + prefixPath string } func (cmd *serverCommand) Run(ctx context.Context, args []string) error { @@ -70,6 +72,7 @@ func (cmd *serverCommand) Run(ctx context.Context, args []string) error { rc := registryController{ reg: r, generateOnly: cmd.generateAndExit, + PathPrefix: cmd.prefixPath, } // Create a clair client if the user passed in a server address. @@ -150,27 +153,29 @@ func (cmd *serverCommand) Run(ctx context.Context, args []string) error { // Create mux server. mux := mux.NewRouter() + mux.StrictSlash(true) mux.UseEncodedPath() + s := mux.PathPrefix(cmd.prefixPath).Subrouter() // Static files handler. - mux.HandleFunc("/repo/{repo}/tags", rc.tagsHandler) - mux.HandleFunc("/repo/{repo}/tags/", rc.tagsHandler) - mux.HandleFunc("/repo/{repo}/tag/{tag}", rc.vulnerabilitiesHandler) - mux.HandleFunc("/repo/{repo}/tag/{tag}/", rc.vulnerabilitiesHandler) + s.HandleFunc("/repo/{repo}/tags", rc.tagsHandler) + s.HandleFunc("/repo/{repo}/tags/", rc.tagsHandler) + s.HandleFunc("/repo/{repo}/tag/{tag}", rc.vulnerabilitiesHandler) + s.HandleFunc("/repo/{repo}/tag/{tag}/", rc.vulnerabilitiesHandler) // Add the vulns endpoints if we have a client for a clair server. if rc.cl != nil { logrus.Infof("adding clair handlers...") - mux.HandleFunc("/repo/{repo}/tag/{tag}/vulns", rc.vulnerabilitiesHandler) - mux.HandleFunc("/repo/{repo}/tag/{tag}/vulns/", rc.vulnerabilitiesHandler) - mux.HandleFunc("/repo/{repo}/tag/{tag}/vulns.json", rc.vulnerabilitiesHandler) + s.HandleFunc("/repo/{repo}/tag/{tag}/vulns", rc.vulnerabilitiesHandler) + s.HandleFunc("/repo/{repo}/tag/{tag}/vulns/", rc.vulnerabilitiesHandler) + s.HandleFunc("/repo/{repo}/tag/{tag}/vulns.json", rc.vulnerabilitiesHandler) } // Serve the static assets. staticAssetsHandler := http.FileServer(static.Assets) - mux.PathPrefix("/static/").Handler(http.StripPrefix("/static/", staticAssetsHandler)) staticHandler := http.FileServer(http.Dir(staticDir)) - mux.Handle("/", staticHandler) + s.PathPrefix("/static/").Handler(http.StripPrefix(cmd.prefixPath+"/static/", staticAssetsHandler)) + s.PathPrefix("/").Handler(http.StripPrefix(cmd.prefixPath, staticHandler)) // Set up the server. server := &http.Server{ diff --git a/server/templates/repositories.html b/server/templates/repositories.html index ce6316f44..343f494ce 100644 --- a/server/templates/repositories.html +++ b/server/templates/repositories.html @@ -6,11 +6,10 @@ - {{ .RegistryDomain }} - - + +

{{ .RegistryDomain }}

@@ -24,16 +23,17 @@

{{ .RegistryDomain }}

Repository Name Pull Command + {{ $pathprefix := .PathPrefix }} {{ range $key, $value := .Repositories }} - + {{ $value.Name }} - + docker pull {{ $value.URI }} @@ -48,7 +48,7 @@

{{ .RegistryDomain }}

Last Updated: {{ .LastUpdated }}

Update Interval: {{ .UpdateInterval }}

- + {{end}} diff --git a/server/templates/tags.html b/server/templates/tags.html index be5ea5f92..a9e6dbc6b 100644 --- a/server/templates/tags.html +++ b/server/templates/tags.html @@ -6,11 +6,10 @@ - {{ .RegistryDomain }}/{{ .Name }} - - + +

{{ .RegistryDomain }}/{{ .Name }}

@@ -22,15 +21,16 @@

{{ .RegistryDomain }}/{{ .Name }}

Created {{if .HasVulns}}Vulnerabilities{{end}} + {{ $pathprefix := .PathPrefix }} {{ range $key, $value := .Repositories }} - {{if $.HasVulns}}{{end}} + {{if $.HasVulns}}{{end}} {{ $value.Name }} {{if $.HasVulns}}{{end}} - {{if $.HasVulns}}{{end}} + {{if $.HasVulns}}{{end}} {{ $value.Tag }} {{if $.HasVulns}}{{end}} @@ -39,7 +39,7 @@

{{ .RegistryDomain }}/{{ .Name }}

{{if $.HasVulns}} - +
@@ -54,12 +54,12 @@

{{ .RegistryDomain }}/{{ .Name }}

Checkout the source code at: github.com/genuinetools/reg

Last Updated: {{ .LastUpdated }}

- + {{if .HasVulns}}