package main import ( "flag" "log" "math/rand" "net/http" "os" "os/signal" "time" ) func main() { // Set up flags log.Println("Setting up components") registerHTTPFlags() registerSessionFlags() registerCredentialsFlags() registerSeedFlags() registerAccessFlags() flag.Parse() // Read challenges from file log.Println("Reading seed file") readChallengesError := getChallengesFromSeedFile() if readChallengesError != nil { log.Fatalln(readChallengesError.Error()) } // Seed the random number generator log.Println("Seed random number generator") rand.Seed(time.Now().UTC().UnixNano()) // Start our VPN container and network log.Printf("Starting VPN container ('%s')", vpnContainerName) startVPNError := startVPN() if startVPNError != nil { log.Fatalln(startVPNError.Error()) } // Set up HTTP server log.Printf("Running HTTP server on port %d", *port) httpServer := setupHTTPServer() // React to system signals signalChannel := make(chan os.Signal, 1) signal.Notify(signalChannel) go cleanup(signalChannel, httpServer) // Start our HTTP server log.Fatalln(httpServer.ListenAndServe()) } func cleanup(signalChannel chan os.Signal, server http.Server) { // Block until we receive a signal <- signalChannel log.Println("Requested shutdown") // Stop everything log.Println("Stopping HTTP server") server.Close() log.Println("Stopping VPN container") stopVPN() log.Println("Stopping challenge containers") stopAllChallengeContainers() log.Println("Deleting Docker networks") deleteNetwork(getVPNNetworkName()) deleteNetwork(getChallengeNetworkName()) os.Exit(0) }