Files
hjem/main.go
2026-06-24 08:17:35 -04:00

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))
}