go-webring/main.go

94 lines
2.1 KiB
Go
Raw Permalink Normal View History

2021-12-31 17:49:26 +00:00
// SPDX-FileCopyrightText: 2021 Amolith <amolith@secluded.site>
//
// SPDX-License-Identifier: BSD-2-Clause
2021-12-20 05:49:52 +00:00
package main
import (
2022-09-02 16:26:11 +00:00
"fmt"
"html/template"
"log"
2022-09-02 16:26:11 +00:00
"net"
2021-12-26 19:03:27 +00:00
"net/http"
2022-09-02 16:26:11 +00:00
"strings"
2021-12-25 13:12:17 +00:00
flag "github.com/spf13/pflag"
2021-12-20 05:49:52 +00:00
)
type RingMember struct {
2023-12-04 13:33:10 +00:00
id string
url string
2021-12-20 05:49:52 +00:00
}
type Ring struct {
ring []RingMember
index *template.Template
ringModTime int64
indexModTime int64
}
2021-12-25 13:12:17 +00:00
// Pre-define all of our flags
var (
2022-09-02 16:26:11 +00:00
flagListen *string = flag.StringP("listen", "l", "127.0.0.1:2857", "host:port or /unix/socket/path go-webring will listen on")
2021-12-26 19:03:27 +00:00
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")
2021-12-27 01:30:09 +00:00
// These are not (and might never be) implemented, we'll see
2021-12-26 19:03:27 +00:00
// flagCert *string = flag.StringP("cert", "c", "cert.crt", "Path to certificate")
// flagKey *string = flag.StringP("key", "k", "cert.key", "Path to private certificate key")
2021-12-25 13:12:17 +00:00
)
2022-09-02 16:26:11 +00:00
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() {
2022-09-02 16:26:11 +00:00
if *flagListen == "" {
panic("socket addr is empty; please specify -l")
}
m := Ring{}
2021-12-31 03:05:05 +00:00
m.init()
2021-12-26 19:03:27 +00:00
mux := http.NewServeMux()
2021-12-31 03:05:05 +00:00
httpServer := &http.Server{
2021-12-26 19:03:27 +00:00
Addr: *flagListen,
Handler: mux,
}
2021-12-31 03:05:05 +00:00
mux.HandleFunc("/", m.root)
mux.HandleFunc("/next", m.next)
mux.HandleFunc("/previous", m.previous)
mux.HandleFunc("/random", m.random)
2023-12-04 13:33:10 +00:00
2022-09-02 16:26:11 +00:00
var err error
if strings.Contains(httpServer.Addr, ":") {
err = httpServer.ListenAndServe()
} else {
err = ListenAndServeUnix(httpServer)
}
if err == http.ErrServerClosed {
2021-12-31 03:05:05 +00:00
log.Println("Web server closed")
} else {
log.Fatalln(err)
}
2021-12-20 05:49:52 +00:00
}
func (m *Ring) init() {
flag.Parse()
log.Println("Listening on", *flagListen)
log.Println("Looking for members in", *flagMembers)
2021-12-31 03:05:05 +00:00
m.parseList()
log.Println("Found", len(m.ring), "members")
log.Println("Building homepage with", *flagIndex)
2021-12-31 03:05:05 +00:00
m.parseIndex()
}