go-webring/main.go
2023-12-04 13:33:10 +00:00

94 lines
2.1 KiB
Go

// SPDX-FileCopyrightText: 2021 Amolith <amolith@secluded.site>
//
// SPDX-License-Identifier: BSD-2-Clause
package main
import (
"fmt"
"html/template"
"log"
"net"
"net/http"
"strings"
flag "github.com/spf13/pflag"
)
type RingMember struct {
id string
url string
}
type Ring struct {
ring []RingMember
index *template.Template
ringModTime int64
indexModTime int64
}
// Pre-define all of our flags
var (
flagListen *string = flag.StringP("listen", "l", "127.0.0.1:2857", "host:port or /unix/socket/path go-webring will listen on")
flagMembers *string = flag.StringP("members", "m", "list.txt", "Path to list of webring members")
flagIndex *string = flag.StringP("index", "i", "index.html", "Path to home page template")
// These are not (and might never be) implemented, we'll see
// flagCert *string = flag.StringP("cert", "c", "cert.crt", "Path to certificate")
// flagKey *string = flag.StringP("key", "k", "cert.key", "Path to private certificate key")
)
func ListenAndServeUnix(srv *http.Server) error {
addr := srv.Addr
if strings.Index(addr, "/") != 0 {
return fmt.Errorf("unix address wrong: %v", addr)
}
ln, err := net.Listen("unix", addr)
if err != nil {
return err
}
return srv.Serve(ln)
}
func main() {
if *flagListen == "" {
panic("socket addr is empty; please specify -l")
}
m := Ring{}
m.init()
mux := http.NewServeMux()
httpServer := &http.Server{
Addr: *flagListen,
Handler: mux,
}
mux.HandleFunc("/", m.root)
mux.HandleFunc("/next", m.next)
mux.HandleFunc("/previous", m.previous)
mux.HandleFunc("/random", m.random)
var err error
if strings.Contains(httpServer.Addr, ":") {
err = httpServer.ListenAndServe()
} else {
err = ListenAndServeUnix(httpServer)
}
if err == http.ErrServerClosed {
log.Println("Web server closed")
} else {
log.Fatalln(err)
}
}
func (m *Ring) init() {
flag.Parse()
log.Println("Listening on", *flagListen)
log.Println("Looking for members in", *flagMembers)
m.parseList()
log.Println("Found", len(m.ring), "members")
log.Println("Building homepage with", *flagIndex)
m.parseIndex()
}