// SPDX-FileCopyrightText: 2021 Amolith // // 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() }