func (sh *StatusHandler) serveStatusHTML(rw http.ResponseWriter, req *http.Request) { st := sh.currentStatus() f := func(p string, a ...interface{}) { if len(a) == 0 { io.WriteString(rw, p) } else { fmt.Fprintf(rw, p, a...) } } f("<html><head><title>camlistored status</title></head>") f("<body>") f("<h1>camlistored status</h1>") f("<h2>Versions</h2><ul>") var envStr string if env.OnGCE() { envStr = " (on GCE)" } f("<li><b>Camlistore</b>: %s%s</li>", html.EscapeString(buildinfo.Version()), envStr) f("<li><b>Go</b>: %s/%s %s, cgo=%v</li>", runtime.GOOS, runtime.GOARCH, runtime.Version(), cgoEnabled) f("<li><b>djpeg</b>: %s", html.EscapeString(buildinfo.DjpegStatus())) f("</ul>") f("<h2>Logs</h2><ul>") f(" <li><a href='/debug/config'>/debug/config</a> - server config</li>\n") if env.OnGCE() { f(" <li><a href='/debug/logs/camlistored'>camlistored logs on Google Cloud Logging</a></li>\n") f(" <li><a href='/debug/logs/system'>system logs from Google Compute Engine</a></li>\n") } f("</ul>") f("<h2>Admin</h2>") f("<form method='post' action='restart' onsubmit='return confirm(\"Really restart now?\")'><button>restart server</button></form>") f("<h2>Handlers</h2>") f("<p>As JSON: <a href='status.json'>status.json</a>; and the <a href='%s?camli.mode=config'>discovery JSON</a>.</p>", st.rootPrefix) f("<p>Not yet pretty HTML UI:</p>") js, err := json.MarshalIndent(st, "", " ") if err != nil { log.Printf("JSON marshal error: %v", err) } jsh := html.EscapeString(string(js)) jsh = quotedPrefix.ReplaceAllStringFunc(jsh, func(in string) string { pfx := in[1 : len(in)-1] if st.isHandler(pfx) { return fmt.Sprintf("%s<a href='%s'>%s</a>%s", in[:1], pfx, pfx, in[len(in)-1:]) } return in }) f("<pre>%s</pre>", jsh) }
func (sh *StatusHandler) serveStatusHTML(rw http.ResponseWriter, req *http.Request) { st := sh.currentStatus() f := func(p string, a ...interface{}) { if len(a) == 0 { io.WriteString(rw, p) } else { fmt.Fprintf(rw, p, a...) } } f("<html><head><title>camlistored status</title></head>") f("<body>") f("<h1>camlistored status</h1>") f("<h2>Versions</h2><ul>") var envStr string if env.OnGCE() { envStr = " (on GCE)" } f("<li><b>Camlistore</b>: %s%s</li>", html.EscapeString(buildinfo.Version()), envStr) f("<li><b>Go</b>: %s/%s %s, cgo=%v</li>", runtime.GOOS, runtime.GOARCH, runtime.Version(), cgoEnabled) f("<li><b>djpeg</b>: %s", html.EscapeString(buildinfo.DjpegStatus())) f("</ul>") f("<h2>Logs</h2><ul>") f(" <li><a href='/debug/config'>/debug/config</a> - server config</li>\n") if env.OnGCE() { f(" <li><a href='/debug/logs/camlistored'>camlistored logs on Google Cloud Logging</a></li>\n") f(" <li><a href='/debug/logs/system'>system logs from Google Compute Engine</a></li>\n") } f("</ul>") f("<h2>Admin</h2>") f("<ul>") f(" <li><form method='post' action='restart' onsubmit='return confirm(\"Really restart now?\")'><button>restart server</button>") f("<input type='checkbox' name='reindex'> reindex</form></li>") if env.OnGCE() { console, err := sh.googleCloudConsole() if err != nil { log.Printf("error getting Google Cloud Console URL: %v", err) } else { f(" <li><b>Updating:</b> When a new image for Camlistore on GCE is available, you can update by hitting \"Reset\" (or \"Stop\", then \"Start\") for your instance on your <a href='%s'>Google Cloud Console</a>.<br>Alternatively, you can ssh to your instance and restart the Camlistore service with: <b>sudo systemctl restart camlistored</b>.</li>", console) } } f("</ul>") f("<h2>Handlers</h2>") f("<p>As JSON: <a href='status.json'>status.json</a>; and the <a href='%s?camli.mode=config'>discovery JSON</a>.</p>", st.rootPrefix) f("<p>Not yet pretty HTML UI:</p>") js, err := json.MarshalIndent(st, "", " ") if err != nil { log.Printf("JSON marshal error: %v", err) } jsh := html.EscapeString(string(js)) jsh = quotedPrefix.ReplaceAllStringFunc(jsh, func(in string) string { pfx := in[1 : len(in)-1] if st.isHandler(pfx) { return fmt.Sprintf("%s<a href='%s'>%s</a>%s", in[:1], pfx, pfx, in[len(in)-1:]) } return in }) f("<pre>%s</pre>", jsh) }