blob: 3c699fd4990cd0623abcb18bcf93055d6183b6eb [file] [log] [blame]
Philipp Schrader5562df72022-02-16 20:56:51 -08001package main
2
3import (
4 "flag"
5 "fmt"
Philipp Schrader4953cc32022-02-25 18:09:02 -08006 "io/ioutil"
Philipp Schrader8747f1b2022-02-23 23:56:22 -08007 "log"
Philipp Schrader5562df72022-02-16 20:56:51 -08008 "os"
9 "os/signal"
Philipp Schrader4953cc32022-02-25 18:09:02 -080010 "path/filepath"
Philipp Schrader5562df72022-02-16 20:56:51 -080011 "syscall"
12
Philipp Schrader8747f1b2022-02-23 23:56:22 -080013 "github.com/frc971/971-Robot-Code/scouting/db"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080014 "github.com/frc971/971-Robot-Code/scouting/webserver/requests"
Philipp Schrader5562df72022-02-16 20:56:51 -080015 "github.com/frc971/971-Robot-Code/scouting/webserver/server"
16 "github.com/frc971/971-Robot-Code/scouting/webserver/static"
17)
18
Philipp Schrader4953cc32022-02-25 18:09:02 -080019func getDefaultDatabasePath() string {
20 // If using `bazel run`, let's create the database in the root of the
21 // workspace.
22 workspaceDir := os.Getenv("BUILD_WORKSPACE_DIRECTORY")
23 if workspaceDir != "" {
24 return filepath.Join(workspaceDir, "scouting.db")
25 }
26 // If we're inside a `bazel test`, then we will create the database in
27 // a temporary directory.
28 testTempDir := os.Getenv("TEST_TMPDIR")
29 if testTempDir != "" {
30 tempDir, err := ioutil.TempDir(testTempDir, "db")
31 if err != nil {
32 log.Fatal("Failed to create temporary directory in TEST_TMPDIR: ", err)
33 }
34 return filepath.Join(tempDir, "scouting.db")
35 }
36 return filepath.Join(".", "scouting.db")
37}
38
Philipp Schrader5562df72022-02-16 20:56:51 -080039func main() {
40 portPtr := flag.Int("port", 8080, "The port number to bind to.")
41 dirPtr := flag.String("directory", ".", "The directory to serve at /.")
Philipp Schrader4953cc32022-02-25 18:09:02 -080042 dbPathPtr := flag.String("database", getDefaultDatabasePath(), "The path to the database.")
Philipp Schrader5562df72022-02-16 20:56:51 -080043 flag.Parse()
44
Philipp Schrader4953cc32022-02-25 18:09:02 -080045 database, err := db.NewDatabase(*dbPathPtr)
Philipp Schrader8747f1b2022-02-23 23:56:22 -080046 if err != nil {
47 log.Fatal("Failed to connect to database: ", err)
48 }
49
Philipp Schrader5562df72022-02-16 20:56:51 -080050 scoutingServer := server.NewScoutingServer()
51 static.ServePages(scoutingServer, *dirPtr)
Philipp Schrader8747f1b2022-02-23 23:56:22 -080052 requests.HandleRequests(database, scoutingServer)
Philipp Schrader5562df72022-02-16 20:56:51 -080053 scoutingServer.Start(*portPtr)
54 fmt.Println("Serving", *dirPtr, "on port", *portPtr)
55
56 // Block until the user hits Ctrl-C.
57 sigint := make(chan os.Signal, 1)
58 signal.Notify(sigint, syscall.SIGINT)
59 fmt.Println("Waiting for CTRL-C or SIGINT.")
60 <-sigint
61
62 fmt.Println("Shutting down.")
63 scoutingServer.Stop()
64 fmt.Println("Successfully shut down.")
65}