Files
opds-proxy/main.go
Evan Buss 3d4af0bd61 refactor: cleanup
naming and other things
2024-07-13 19:37:57 +00:00

103 lines
2.4 KiB
Go

package main
import (
"encoding/hex"
"flag"
"fmt"
"log"
"net/http"
"os"
"github.com/gorilla/securecookie"
"github.com/knadh/koanf/parsers/yaml"
"github.com/knadh/koanf/providers/confmap"
"github.com/knadh/koanf/providers/file"
"github.com/knadh/koanf/v2"
)
type ProxyConfig struct {
Port string `koanf:"port"`
Auth AuthConfig `koanf:"auth"`
Feeds []FeedConfig `koanf:"feeds" `
}
type AuthConfig struct {
HashKey string `koanf:"hash_key"`
BlockKey string `koanf:"block_key"`
}
type FeedConfig struct {
Name string `koanf:"name"`
Url string `koanf:"url"`
Username string `koanf:"username"`
Password string `koanf:"password"`
}
func main() {
fs := flag.NewFlagSet("", flag.ContinueOnError)
// These aren't mapped to the config file.
configPath := fs.String("config", "config.yml", "config file to load")
generateKeys := fs.Bool("generate-keys", false, "generate cookie signing keys and exit")
port := fs.String("port", "8080", "port to listen on")
if err := fs.Parse(os.Args[1:]); err != nil {
log.Fatal(err)
}
if *generateKeys {
displayKeys()
os.Exit(0)
}
var k = koanf.New(".")
// Load config file from disk.
// Feed options must be defined here.
if err := k.Load(file.Provider(*configPath), yaml.Parser()); err != nil && !os.IsNotExist(err) {
log.Fatal(err)
}
// Selectively add command line options to the config. Overriding the config file.
if err := k.Load(confmap.Provider(map[string]interface{}{
"port": *port,
}, "."), nil); err != nil {
log.Fatal(err)
}
config := ProxyConfig{}
k.Unmarshal("", &config)
if len(config.Feeds) == 0 {
log.Fatal("No feeds defined in config")
}
if config.Auth.HashKey == "" || config.Auth.BlockKey == "" {
log.Println("Generating new cookie signing credentials")
hashKey, blockKey := displayKeys()
config.Auth.HashKey = hashKey
config.Auth.BlockKey = blockKey
}
server, err := NewServer(&config)
if err != nil {
log.Fatal(err)
}
if err = server.Serve(); err != nil && err != http.ErrServerClosed {
log.Fatal(err)
}
}
func displayKeys() (string, string) {
hashKey := hex.EncodeToString(securecookie.GenerateRandomKey(32))
blockKey := hex.EncodeToString(securecookie.GenerateRandomKey(32))
log.Println("Set these values in your config file to persist authentication between server restarts.")
fmt.Println("auth:")
fmt.Printf(" hash_key: %s\n", hashKey)
fmt.Printf(" block_key: %s\n", blockKey)
return hashKey, blockKey
}