mirror of
https://github.com/tailscale/tailscale.git
synced 2025-05-05 07:01:01 +00:00
cmd/derper: add --home flag to control home page behavior
Updates #12897 Change-Id: I7e9c8de0d2daf92cc32e9f6121bc0874c6672540 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
parent
fa374fa852
commit
cae5b97626
@ -63,6 +63,7 @@ var (
|
|||||||
hostname = flag.String("hostname", "derp.tailscale.com", "LetsEncrypt host name, if addr's port is :443. When --certmode=manual, this can be an IP address to avoid SNI checks")
|
hostname = flag.String("hostname", "derp.tailscale.com", "LetsEncrypt host name, if addr's port is :443. When --certmode=manual, this can be an IP address to avoid SNI checks")
|
||||||
runSTUN = flag.Bool("stun", true, "whether to run a STUN server. It will bind to the same IP (if any) as the --addr flag value.")
|
runSTUN = flag.Bool("stun", true, "whether to run a STUN server. It will bind to the same IP (if any) as the --addr flag value.")
|
||||||
runDERP = flag.Bool("derp", true, "whether to run a DERP server. The only reason to set this false is if you're decommissioning a server but want to keep its bootstrap DNS functionality still running.")
|
runDERP = flag.Bool("derp", true, "whether to run a DERP server. The only reason to set this false is if you're decommissioning a server but want to keep its bootstrap DNS functionality still running.")
|
||||||
|
flagHome = flag.String("home", "", "what to serve at the root path. It may be left empty (the default, for a default homepage), \"blank\" for a blank page, or a URL to redirect to")
|
||||||
|
|
||||||
meshPSKFile = flag.String("mesh-psk-file", defaultMeshPSKFile(), "if non-empty, path to file containing the mesh pre-shared key file. It should contain some hex string; whitespace is trimmed.")
|
meshPSKFile = flag.String("mesh-psk-file", defaultMeshPSKFile(), "if non-empty, path to file containing the mesh pre-shared key file. It should contain some hex string; whitespace is trimmed.")
|
||||||
meshWith = flag.String("mesh-with", "", "optional comma-separated list of hostnames to mesh with; the server's own hostname can be in the list. If an entry contains a slash, the second part names a hostname to be used when dialing the target.")
|
meshWith = flag.String("mesh-with", "", "optional comma-separated list of hostnames to mesh with; the server's own hostname can be in the list. If an entry contains a slash, the second part names a hostname to be used when dialing the target.")
|
||||||
@ -254,6 +255,11 @@ func main() {
|
|||||||
}
|
}
|
||||||
expvar.Publish("derp", s.ExpVar())
|
expvar.Publish("derp", s.ExpVar())
|
||||||
|
|
||||||
|
handleHome, ok := getHomeHandler(*flagHome)
|
||||||
|
if !ok {
|
||||||
|
log.Fatalf("unknown --home value %q", *flagHome)
|
||||||
|
}
|
||||||
|
|
||||||
mux := http.NewServeMux()
|
mux := http.NewServeMux()
|
||||||
if *runDERP {
|
if *runDERP {
|
||||||
derpHandler := derphttp.Handler(s)
|
derpHandler := derphttp.Handler(s)
|
||||||
@ -274,19 +280,7 @@ func main() {
|
|||||||
mux.HandleFunc("/bootstrap-dns", tsweb.BrowserHeaderHandlerFunc(handleBootstrapDNS))
|
mux.HandleFunc("/bootstrap-dns", tsweb.BrowserHeaderHandlerFunc(handleBootstrapDNS))
|
||||||
mux.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
mux.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
tsweb.AddBrowserHeaders(w)
|
tsweb.AddBrowserHeaders(w)
|
||||||
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
handleHome.ServeHTTP(w, r)
|
||||||
w.WriteHeader(200)
|
|
||||||
err := homePageTemplate.Execute(w, templateData{
|
|
||||||
ShowAbuseInfo: validProdHostname.MatchString(*hostname),
|
|
||||||
Disabled: !*runDERP,
|
|
||||||
AllowDebug: tsweb.AllowDebugAccess(r),
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
if r.Context().Err() == nil {
|
|
||||||
log.Printf("homePageTemplate.Execute: %v", err)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}))
|
}))
|
||||||
mux.Handle("/robots.txt", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
mux.Handle("/robots.txt", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
tsweb.AddBrowserHeaders(w)
|
tsweb.AddBrowserHeaders(w)
|
||||||
@ -579,3 +573,35 @@ var homePageTemplate = template.Must(template.New("home").Parse(`<html><body>
|
|||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
`))
|
`))
|
||||||
|
|
||||||
|
// getHomeHandler returns a handler for the home page based on a flag string
|
||||||
|
// as documented on the --home flag.
|
||||||
|
func getHomeHandler(val string) (_ http.Handler, ok bool) {
|
||||||
|
if val == "" {
|
||||||
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||||||
|
w.WriteHeader(200)
|
||||||
|
err := homePageTemplate.Execute(w, templateData{
|
||||||
|
ShowAbuseInfo: validProdHostname.MatchString(*hostname),
|
||||||
|
Disabled: !*runDERP,
|
||||||
|
AllowDebug: tsweb.AllowDebugAccess(r),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
if r.Context().Err() == nil {
|
||||||
|
log.Printf("homePageTemplate.Execute: %v", err)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}), true
|
||||||
|
}
|
||||||
|
if val == "blank" {
|
||||||
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||||||
|
w.WriteHeader(200)
|
||||||
|
}), true
|
||||||
|
}
|
||||||
|
if strings.HasPrefix(val, "http://") || strings.HasPrefix(val, "https://") {
|
||||||
|
return http.RedirectHandler(val, http.StatusFound), true
|
||||||
|
}
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user