package main import ( "flag" "fmt" "justcaptcha/internal/handlers" "justcaptcha/internal/server" "log" "net/netip" "os" "os/signal" "strings" "syscall" "time" ) var version string var listenAddress *string = flag.String("listen", "/var/run/justcaptcha/sock", "listen address (ip:port|unix_path)") var captchaExpiry *time.Duration = flag.Duration("expiry", 10*time.Minute, "CAPTCHA expiry in format XX{s,m,h}, e.g. 5m, 300s") var showVersion *bool = flag.Bool("v", false, "show version") func main() { flag.Parse() log.SetFlags(0) if *showVersion { fmt.Println("justcaptchad ver.", version, "\nCopyright (c) 2022 Alexander \"Arav\" Andreev ") return } hand := handlers.New(*captchaExpiry) srv := server.NewHttpServer() srv.POST("/", hand.New) srv.POST("/:captcha", hand.Solve) srv.GET("/:captcha", hand.IsSolved) srv.GET("/:captcha/image", hand.Image) var network string if !strings.ContainsRune(*listenAddress, ':') { network = "unix" defer os.Remove(*listenAddress) } else { ap, err := netip.ParseAddrPort(*listenAddress) if err != nil { log.Fatalln(err) } if ap.Addr().Is4() { network = "tcp4" } else if ap.Addr().Is6() { network = "tcp6" } } if err := srv.Start(network, *listenAddress); err != nil { log.Fatalln("failed to start a server:", err) } doneSignal := make(chan os.Signal, 1) signal.Notify(doneSignal, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) <-doneSignal if err := srv.Stop(); err != nil { log.Fatalln("failed to properly shutdown a server:", err) } }