1
0
Fork 0
mirror of https://github.com/FrankerFaceZ/FrankerFaceZ.git synced 2025-06-28 15:27:43 +00:00
FrankerFaceZ/socketserver/cmd/ffzsocketserver/socketserver.go

146 lines
3.3 KiB
Go
Raw Permalink Normal View History

package main // import "github.com/FrankerFaceZ/FrankerFaceZ/socketserver/cmd/ffzsocketserver"
2015-10-24 19:59:34 -07:00
2017-09-26 13:04:39 -07:00
import _ "net/http/pprof"
2015-10-24 19:59:34 -07:00
import (
"context"
2017-09-26 13:04:39 -07:00
"crypto/tls"
"encoding/json"
2015-10-24 19:59:34 -07:00
"flag"
"fmt"
"io/ioutil"
2015-10-24 19:59:34 -07:00
"log"
"net/http"
"os"
"os/signal"
"sync"
"syscall"
"time"
2016-04-28 14:36:59 -07:00
2017-09-26 13:04:39 -07:00
"github.com/FrankerFaceZ/FrankerFaceZ/socketserver/certreloader"
"github.com/FrankerFaceZ/FrankerFaceZ/socketserver/server"
2015-10-24 19:59:34 -07:00
)
2015-11-15 18:43:34 -08:00
var configFilename = flag.String("config", "config.json", "Configuration file, including the keypairs for the NaCl crypto library, for communicating with the backend.")
var flagGenerateKeys = flag.Bool("genkeys", false, "Generate NaCl keys instead of serving requests.\nArguments: [int serverId] [base64 backendPublic]\nThe backend public key can either be specified in base64 on the command line, or put in the json file later.")
2015-10-24 19:59:34 -07:00
2015-11-16 22:56:40 -08:00
var BuildTime string = "build not stamped"
var BuildHash string = "build not stamped"
2015-10-24 19:59:34 -07:00
func main() {
flag.Parse()
2015-11-15 18:43:34 -08:00
if *flagGenerateKeys {
generateKeys(*configFilename)
2015-10-25 12:40:07 -07:00
return
}
confFile, err := os.Open(*configFilename)
if os.IsNotExist(err) {
fmt.Println("Error: No config file. Run with -genkeys and edit config.json")
os.Exit(3)
2015-10-24 19:59:34 -07:00
}
if err != nil {
log.Fatal(err)
2015-10-24 19:59:34 -07:00
}
conf := &server.ConfigFile{}
confBytes, err := ioutil.ReadAll(confFile)
if err != nil {
log.Fatal(err)
2015-10-24 19:59:34 -07:00
}
err = json.Unmarshal(confBytes, &conf)
if err != nil {
log.Fatal(err)
2015-10-24 19:59:34 -07:00
}
// logFile, err := os.OpenFile("output.log", os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
// if err != nil {
// log.Fatal("Could not create logfile: ", err)
// }
2015-10-28 17:31:44 -07:00
server.SetupServerAndHandle(conf, http.DefaultServeMux)
2015-11-16 22:56:40 -08:00
server.SetBuildStamp(BuildTime, BuildHash)
2015-10-24 19:59:34 -07:00
2015-10-27 21:21:06 -07:00
go commandLineConsole()
var server1, server2 *http.Server
stopSig := make(chan os.Signal, 3)
signal.Notify(stopSig, os.Interrupt)
signal.Notify(stopSig, syscall.SIGUSR1)
signal.Notify(stopSig, syscall.SIGTERM)
2015-10-24 19:59:34 -07:00
if conf.UseSSL {
2017-09-26 13:04:39 -07:00
reloader, err := certreloader.New(conf.SSLCertificateFile, conf.SSLKeyFile)
if err != nil {
log.Fatalln("Could not load TLS certificate:", err)
}
reloader.AutoCheck(syscall.SIGHUP)
server1 = &http.Server{
Addr: conf.SSLListenAddr,
Handler: http.DefaultServeMux,
2017-09-26 13:04:39 -07:00
TLSConfig: &tls.Config{
GetCertificate: reloader.GetCertificateFunc(),
2017-09-26 13:04:39 -07:00
},
}
go func() {
2017-09-26 13:04:39 -07:00
if err := server1.ListenAndServeTLS("", ""); err != nil {
log.Println("ListenAndServeTLS:", err)
stopSig <- os.Interrupt
}
}()
2015-10-24 19:59:34 -07:00
}
if true {
server2 = &http.Server{
Addr: conf.ListenAddr,
Handler: http.DefaultServeMux,
}
go func() {
if err := server2.ListenAndServe(); err != nil {
log.Println("ListenAndServe: ", err)
stopSig <- os.Interrupt
}
}()
2015-10-24 19:59:34 -07:00
}
<-stopSig
log.Println("Shutting down...")
var wg sync.WaitGroup
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
wg.Add(1)
go func() {
defer wg.Done()
if conf.UseSSL {
server1.Shutdown(ctx)
}
}()
wg.Add(1)
go func() {
defer wg.Done()
server2.Shutdown(ctx)
}()
server.Shutdown(&wg)
time.Sleep(1 * time.Second)
wg.Wait()
2015-10-24 19:59:34 -07:00
}
2015-10-25 12:40:07 -07:00
2015-11-15 18:43:34 -08:00
func generateKeys(outputFile string) {
2015-10-25 12:40:07 -07:00
if flag.NArg() < 1 {
fmt.Println("Specify a numeric server ID after -genkeys")
os.Exit(2)
2015-10-25 12:40:07 -07:00
}
if flag.NArg() >= 2 {
server.GenerateKeys(outputFile, flag.Arg(0), flag.Arg(1))
} else {
server.GenerateKeys(outputFile, flag.Arg(0), "")
}
fmt.Println("Keys generated. Now edit config.json")
}