1 package main // import "vimagination.zapto.org/academy-chauffeurs" 2 3 import ( 4 "fmt" 5 "log" 6 "net" 7 "net/http" 8 "net/rpc/jsonrpc" 9 "os" 10 "os/signal" 11 12 "vimagination.zapto.org/httpdir" 13 "vimagination.zapto.org/httpgzip" 14 15 "golang.org/x/net/websocket" 16 ) 17 18 func rpcHandler(conn *websocket.Conn) { 19 jsonrpc.ServeConn(conn) 20 } 21 22 var dir http.FileSystem = httpdir.Default 23 24 func main() { 25 const dbFName = "ac.db" 26 err := backupDatabase(dbFName) 27 if err != nil { 28 log.Println(err) 29 return 30 } 31 32 nc, err := newCalls(dbFName) 33 34 if err != nil { 35 log.Println(err) 36 return 37 } 38 39 port, err := nc.getPort() 40 if err != nil { 41 log.Println(err) 42 return 43 } 44 45 srv := new(authServeMux) 46 srv.Handle("/rpc", &userConn{websocket.Handler(rpcHandler)}) 47 srv.Handle("/export", http.HandlerFunc(nc.export)) 48 srv.Handle("/ics", http.HandlerFunc(nc.calendar)) 49 srv.Handle("/db", http.HandlerFunc(getDatabase)) 50 srv.Handle("/files/", http.FileServer(http.Dir(""))) 51 srv.Handle("/", noCache{httpgzip.FileServer(dir)}) 52 53 l, err := net.Listen("tcp", fmt.Sprintf(":%d", port)) 54 if err != nil { 55 log.Println(err) 56 return 57 } 58 59 c := make(chan os.Signal, 1) 60 go func() { 61 log.Println("Server Started") 62 63 signal.Notify(c, os.Interrupt) 64 65 <-c 66 close(c) 67 log.Println("Closing") 68 signal.Stop(c) 69 l.Close() 70 }() 71 72 err = http.Serve(l, srv) 73 74 select { 75 case <-c: 76 default: 77 close(c) 78 log.Println(err) 79 } 80 nc.close() 81 }