2020-04-24 19:38:21 +02:00
|
|
|
// Copyright (c) 2020 by Juliusz Chroboczek.
|
|
|
|
|
|
|
|
// This is not open source software. Copy it, and I'll break into your
|
|
|
|
// house and tell your three year-old that Santa doesn't exist.
|
|
|
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"flag"
|
|
|
|
"log"
|
|
|
|
"os"
|
|
|
|
"os/signal"
|
|
|
|
"path/filepath"
|
2020-05-20 23:04:31 +02:00
|
|
|
"runtime"
|
|
|
|
"runtime/pprof"
|
2020-04-24 19:38:21 +02:00
|
|
|
"syscall"
|
2020-09-13 11:56:35 +02:00
|
|
|
|
2020-09-13 14:12:00 +02:00
|
|
|
"sfu/disk"
|
2020-09-13 11:56:35 +02:00
|
|
|
"sfu/group"
|
2020-09-18 13:11:21 +02:00
|
|
|
"sfu/webserver"
|
2020-04-24 19:38:21 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
2020-09-18 13:11:21 +02:00
|
|
|
var cpuprofile, memprofile, mutexprofile, httpAddr, dataDir string
|
2020-05-20 23:04:31 +02:00
|
|
|
|
2020-04-24 19:38:21 +02:00
|
|
|
flag.StringVar(&httpAddr, "http", ":8443", "web server `address`")
|
2020-09-18 13:11:21 +02:00
|
|
|
flag.StringVar(&webserver.StaticRoot, "static", "./static/",
|
2020-04-24 19:38:21 +02:00
|
|
|
"web server root `directory`")
|
|
|
|
flag.StringVar(&dataDir, "data", "./data/",
|
|
|
|
"data `directory`")
|
2020-09-13 11:56:35 +02:00
|
|
|
flag.StringVar(&group.Directory, "groups", "./groups/",
|
2020-04-25 02:25:51 +02:00
|
|
|
"group description `directory`")
|
2020-09-13 14:12:00 +02:00
|
|
|
flag.StringVar(&disk.Directory, "recordings", "./recordings/",
|
2020-05-23 01:48:36 +02:00
|
|
|
"recordings `directory`")
|
2020-05-20 23:04:31 +02:00
|
|
|
flag.StringVar(&cpuprofile, "cpuprofile", "",
|
|
|
|
"store CPU profile in `file`")
|
|
|
|
flag.StringVar(&memprofile, "memprofile", "",
|
|
|
|
"store memory profile in `file`")
|
|
|
|
flag.StringVar(&mutexprofile, "mutexprofile", "",
|
|
|
|
"store mutex profile in `file`")
|
2020-04-24 19:38:21 +02:00
|
|
|
flag.Parse()
|
2020-05-20 23:04:31 +02:00
|
|
|
|
|
|
|
if cpuprofile != "" {
|
|
|
|
f, err := os.Create(cpuprofile)
|
|
|
|
if err != nil {
|
|
|
|
log.Printf("Create(cpuprofile): %v", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
pprof.StartCPUProfile(f)
|
|
|
|
defer func() {
|
|
|
|
pprof.StopCPUProfile()
|
|
|
|
f.Close()
|
|
|
|
}()
|
|
|
|
}
|
|
|
|
|
|
|
|
if memprofile != "" {
|
|
|
|
defer func() {
|
|
|
|
f, err := os.Create(memprofile)
|
|
|
|
if err != nil {
|
|
|
|
log.Printf("Create(memprofile): %v", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
pprof.WriteHeapProfile(f)
|
|
|
|
f.Close()
|
|
|
|
}()
|
|
|
|
}
|
|
|
|
|
|
|
|
if mutexprofile != "" {
|
|
|
|
runtime.SetMutexProfileFraction(1)
|
|
|
|
defer func() {
|
|
|
|
f, err := os.Create(mutexprofile)
|
|
|
|
if err != nil {
|
|
|
|
log.Printf("Create(mutexprofile): %v", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
pprof.Lookup("mutex").WriteTo(f, 0)
|
|
|
|
f.Close()
|
|
|
|
}()
|
|
|
|
}
|
|
|
|
|
2020-09-13 11:56:35 +02:00
|
|
|
group.IceFilename = filepath.Join(dataDir, "ice-servers.json")
|
2020-04-24 19:38:21 +02:00
|
|
|
|
2020-09-13 11:56:35 +02:00
|
|
|
go group.ReadPublicGroups()
|
2020-09-18 14:14:26 +02:00
|
|
|
|
|
|
|
serverDone := make(chan struct{})
|
|
|
|
go func() {
|
|
|
|
err := webserver.Serve(httpAddr, dataDir)
|
|
|
|
if err != nil {
|
|
|
|
log.Printf("Server: %v", err)
|
|
|
|
}
|
|
|
|
close(serverDone)
|
|
|
|
}()
|
2020-04-24 19:38:21 +02:00
|
|
|
|
|
|
|
terminate := make(chan os.Signal, 1)
|
2020-09-12 12:42:48 +02:00
|
|
|
signal.Notify(terminate, syscall.SIGINT, syscall.SIGTERM)
|
2020-09-18 14:14:26 +02:00
|
|
|
select {
|
|
|
|
case <-terminate:
|
|
|
|
webserver.Shutdown()
|
|
|
|
case <-serverDone:
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
2020-04-24 19:38:21 +02:00
|
|
|
}
|