86
package main
import (
"bytes"
_ "embed"
"fmt"
"log"
"net/http"
"os"
"os/exec"
"strings"
)
//go:embed index.html
var index []byte
//go:embed font.css
var font []byte
//go:embed dark_theme.css
var css []byte
var CFG struct {
Hostname string
ListenAddr string
ListenPort string
MANPATH []string
}
func init() {
CFG.Hostname, _ = os.Hostname()
if CFG.Hostname == "" {
os.Getenv("HOSTNAME")
}
CFG.ListenAddr = os.Getenv("ListenAddr")
CFG.ListenPort = os.Getenv("ListenPort")
if CFG.ListenAddr == "" || CFG.ListenPort == "" || CFG.Hostname == "" {
log.Fatal("ListenAddr, ListenPort and Hostname must be set")
}
b, err := exec.Command("/usr/bin/manpath", "-g").Output()
if err != nil {
log.Fatal("Fatal: unable to get manpath")
}
CFG.MANPATH = strings.Split(string(b), ":")
css = append(css, font...)
index = bytes.ReplaceAll(index, []byte("{{ hostname }}"), []byte(CFG.Hostname))
index = bytes.ReplaceAll(index, []byte("{{ port }}"), []byte(CFG.ListenPort))
}
func main() {
http.HandleFunc("/style.css", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/css; charset=utf-8")
w.Header().Set("Content-Length", fmt.Sprint(len(css)))
w.WriteHeader(http.StatusOK)
w.Write(css)
})
http.Handle("/favicon.ico", http.NotFoundHandler())
http.HandleFunc("/", handler)
http.ListenAndServe(CFG.ListenAddr+":"+CFG.ListenPort, nil)
}
func handler(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/" {
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return
}
_ = r.ParseForm()
man := r.Form.Get("man")
if man == "" {
w.Header().Set("Content-Type", "text/html; charset=utf-8")
w.WriteHeader(http.StatusOK)
w.Write(index)
return
}
// cmd := exec.Command(man)
// b, _ := cmd.CombinedOutput()
w.Header().Set("Content-Type", "text/html; charset=utf-8")
w.WriteHeader(http.StatusOK)
}