2017-07-22 15:31:12 -07:00
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 (
2017-09-21 14:33:06 -07:00
"context"
2017-09-26 13:04:39 -07:00
"crypto/tls"
2015-10-26 22:16:03 -07:00
"encoding/json"
2015-10-24 19:59:34 -07:00
"flag"
2015-10-26 22:16:03 -07:00
"fmt"
"io/ioutil"
2015-10-24 19:59:34 -07:00
"log"
"net/http"
2015-10-26 22:16:03 -07:00
"os"
2017-09-21 14:33:06 -07:00
"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"
2017-07-22 15:31:12 -07:00
"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
}
2015-10-26 22:16:03 -07:00
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
}
2015-10-26 22:16:03 -07:00
if err != nil {
log . Fatal ( err )
2015-10-24 19:59:34 -07:00
}
2015-10-26 22:16:03 -07:00
conf := & server . ConfigFile { }
confBytes , err := ioutil . ReadAll ( confFile )
if err != nil {
log . Fatal ( err )
2015-10-24 19:59:34 -07:00
}
2015-10-26 22:16:03 -07:00
err = json . Unmarshal ( confBytes , & conf )
if err != nil {
log . Fatal ( err )
2015-10-24 19:59:34 -07:00
}
2015-11-17 13:36:34 -08: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
2015-11-23 16:08:22 -08: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 ( )
2017-09-21 14:33:06 -07:00
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 )
2017-09-21 14:33:06 -07:00
server1 = & http . Server {
Addr : conf . SSLListenAddr ,
Handler : http . DefaultServeMux ,
2017-09-26 13:04:39 -07:00
TLSConfig : & tls . Config {
2017-11-13 15:57:20 -08:00
GetCertificate : reloader . GetCertificateFunc ( ) ,
2017-09-26 13:04:39 -07:00
} ,
2017-09-21 14:33:06 -07:00
}
2015-11-17 13:36:34 -08:00
go func ( ) {
2017-09-26 13:04:39 -07:00
if err := server1 . ListenAndServeTLS ( "" , "" ) ; err != nil {
2017-09-21 14:33:06 -07:00
log . Println ( "ListenAndServeTLS:" , err )
stopSig <- os . Interrupt
2015-11-17 13:36:34 -08:00
}
} ( )
2015-10-24 19:59:34 -07:00
}
2017-09-21 14:33:06 -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
}
2017-09-21 14:33:06 -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 {
2015-10-26 22:16:03 -07:00
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 ) , "" )
}
2015-10-26 22:16:03 -07:00
fmt . Println ( "Keys generated. Now edit config.json" )
2015-10-26 10:06:45 -07:00
}