102 lines
2.0 KiB
Go
102 lines
2.0 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
_ "embed"
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"text/template"
|
|
)
|
|
|
|
//go:embed hjem.html
|
|
var hjemTemplate string
|
|
|
|
var port = flag.Int("p", 1437, "set the port for hjem to use")
|
|
|
|
type HjemData struct {
|
|
OS string
|
|
Email string
|
|
Timezone string
|
|
}
|
|
|
|
func main() {
|
|
flag.Parse()
|
|
|
|
t, err := template.New("hjem").Parse(hjemTemplate)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
user_os := "Unknown"
|
|
|
|
file, err := os.Open("/etc/os-release")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer file.Close()
|
|
|
|
scanner := bufio.NewScanner(file)
|
|
if scanner.Scan() {
|
|
user_os = strings.TrimRight(strings.TrimLeft(scanner.Text(), "NAME='"), "'")
|
|
}
|
|
|
|
user_email := "unknown@example.com"
|
|
|
|
file, err = os.Open(filepath.Join(func() string {
|
|
hostname, err := os.UserHomeDir()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return hostname
|
|
}(), ".gitconfig"))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer file.Close()
|
|
|
|
scanner = bufio.NewScanner(file)
|
|
for scanner.Scan() {
|
|
text := scanner.Text()
|
|
if strings.Contains(text, "email = ") {
|
|
user_email = strings.TrimLeft(strings.TrimSpace(text), "email = ")
|
|
break
|
|
}
|
|
}
|
|
|
|
user_tz := "UTC"
|
|
if tz := os.Getenv("TZ"); tz != "" {
|
|
user_tz = tz
|
|
} else if data, err := os.ReadFile("/etc/timezone"); err == nil {
|
|
if tz := strings.TrimSpace(string(data)); tz != "" {
|
|
user_tz = tz
|
|
}
|
|
} else if path, err := os.Readlink("/etc/localtime"); err == nil {
|
|
user_tz = filepath.Join(
|
|
filepath.Base(filepath.Dir(path)),
|
|
filepath.Base(path))
|
|
}
|
|
|
|
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
|
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
|
|
|
err := t.ExecuteTemplate(w, "hjem", HjemData{
|
|
OS: user_os,
|
|
Email: user_email,
|
|
Timezone: user_tz,
|
|
})
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
}
|
|
})
|
|
|
|
fmt.Printf("Web server is available at http://0.0.0.0:%d\n", *port)
|
|
fmt.Println("Press Ctrl+C to stop")
|
|
|
|
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", *port), nil))
|
|
}
|