1 package main // import "vimagination.zapto.org/minewebgen" 2 3 import ( 4 "flag" 5 "fmt" 6 "log" 7 "net" 8 "net/http" 9 "net/rpc" 10 "net/rpc/jsonrpc" 11 "os" 12 "os/signal" 13 14 "golang.org/x/net/websocket" 15 "vimagination.zapto.org/httpdir" 16 "vimagination.zapto.org/httpgzip" 17 ) 18 19 var dir http.FileSystem = httpdir.Default 20 21 func main() { 22 configFile := flag.String("c", "config.json", "config file") 23 flag.Parse() 24 c, err := LoadConfig(*configFile) 25 if err != nil { 26 fmt.Fprintln(os.Stderr, err) 27 os.Exit(1) 28 } 29 30 controller := NewController(c) 31 rpc.RegisterName("RPC", RPC{controller}) 32 33 t := Transfer{c} 34 con := Console{controller} 35 http.Handle("/download/generator/", http.HandlerFunc(c.Generators.Download)) 36 http.Handle("/download/server/", http.HandlerFunc(c.Servers.Download)) 37 http.Handle("/download/maps/", http.HandlerFunc(c.Maps.Download)) 38 http.Handle("/transfer", websocket.Handler(t.Websocket)) 39 http.Handle("/console", websocket.Handler(con.Websocket)) 40 http.Handle("/rpc", websocket.Handler(func(conn *websocket.Conn) { jsonrpc.ServeConn(conn) })) 41 http.Handle("/", httpgzip.FileServer(dir)) 42 l, err := net.Listen("tcp", c.ServerSettings.ListenAddr) 43 if err != nil { 44 fmt.Println(os.Stderr, err) 45 os.Exit(3) 46 } 47 48 cc := make(chan struct{}) 49 go func() { 50 log.Println("Server Started") 51 sc := make(chan os.Signal, 1) 52 signal.Notify(sc, os.Interrupt) 53 select { 54 case <-sc: 55 log.Println("Closing") 56 case <-cc: 57 } 58 signal.Stop(sc) 59 close(sc) 60 close(cc) 61 l.Close() 62 }() 63 64 err = http.Serve(l, nil) 65 select { 66 case <-cc: 67 default: 68 log.Println(err) 69 close(cc) 70 } 71 <-cc 72 // Close all running minecraft servers before closing 73 if len(controller.running) > 0 { 74 log.Println("Stopping all servers...") 75 controller.stopAll() 76 log.Println("...servers stopped") 77 } 78 if len(gp.cmds) > 0 { 79 log.Println("Stopping all generators...") 80 gp.StopAll() 81 log.Println("...generators stopped") 82 } 83 }