94 lines
2.1 KiB
Go
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()
|
|
}
|