2016-01-07 17:27:53 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"flag"
|
|
|
|
"fmt"
|
|
|
|
"log"
|
|
|
|
"net/http"
|
2016-01-07 17:28:16 +00:00
|
|
|
"os"
|
2016-01-20 21:44:34 +00:00
|
|
|
"path/filepath"
|
2016-01-13 19:25:25 +00:00
|
|
|
|
|
|
|
"srs.epita.fr/fic-server/libfic"
|
2016-01-07 17:27:53 +00:00
|
|
|
)
|
|
|
|
|
2016-01-20 18:56:08 +00:00
|
|
|
var PKIDir string
|
2016-01-07 17:27:53 +00:00
|
|
|
var SubmissionDir string
|
|
|
|
var BaseURL string
|
2016-01-20 21:44:34 +00:00
|
|
|
var CloudDAVBase string
|
|
|
|
var CloudUsername string
|
|
|
|
var CloudPassword string
|
2016-01-07 17:27:53 +00:00
|
|
|
|
|
|
|
func main() {
|
|
|
|
var bind = flag.String("bind", "0.0.0.0:8081", "Bind port/socket")
|
2016-01-23 12:16:31 +00:00
|
|
|
var dsn = flag.String("dsn", "fic:fic@/fic", "DSN to connect to the MySQL server")
|
2016-01-07 17:27:53 +00:00
|
|
|
flag.StringVar(&BaseURL, "baseurl", "http://fic.srs.epita.fr/", "URL prepended to each URL")
|
|
|
|
flag.StringVar(&SubmissionDir, "submission", "./submissions/", "Base directory where save submissions")
|
2016-01-20 18:56:08 +00:00
|
|
|
flag.StringVar(&PKIDir, "pki", "./pki/", "Base directory where found PKI scripts")
|
2016-01-20 21:44:34 +00:00
|
|
|
flag.StringVar(&fic.FilesDir, "files", "./FILES/", "Base directory where found challenges files, local part")
|
|
|
|
flag.StringVar(&CloudDAVBase, "clouddav", "https://srs.epita.fr/owncloud/remote.php/webdav/FIC 2016",
|
|
|
|
"Base directory where found challenges files, cloud part")
|
|
|
|
flag.StringVar(&CloudUsername, "clouduser", "fic", "Username used to sync")
|
|
|
|
flag.StringVar(&CloudPassword, "cloudpass", "", "Password used to sync")
|
2016-01-07 17:27:53 +00:00
|
|
|
flag.Parse()
|
|
|
|
|
2016-01-22 16:34:34 +00:00
|
|
|
var staticDir string
|
2016-01-20 21:44:34 +00:00
|
|
|
var err error
|
|
|
|
log.Println("Checking paths...")
|
2016-01-22 16:34:34 +00:00
|
|
|
if staticDir, err = filepath.Abs("./static/"); err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
2016-01-20 21:44:34 +00:00
|
|
|
if fic.FilesDir, err = filepath.Abs(fic.FilesDir); err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
if PKIDir, err = filepath.Abs(PKIDir); err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
if SubmissionDir, err = filepath.Abs(SubmissionDir); err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
2016-01-22 16:34:34 +00:00
|
|
|
if fic.FilesDir, err = filepath.Abs(fic.FilesDir); err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
2016-01-20 21:44:34 +00:00
|
|
|
|
2016-01-07 17:28:16 +00:00
|
|
|
log.Println("Opening database...")
|
2016-01-23 12:16:31 +00:00
|
|
|
if err := fic.DBInit(fmt.Sprintf("%s?parseTime=true", *dsn)); err != nil {
|
2016-01-07 17:28:16 +00:00
|
|
|
log.Fatal("Cannot open the database: ", err)
|
|
|
|
os.Exit(1)
|
|
|
|
|
|
|
|
}
|
2016-01-13 19:25:25 +00:00
|
|
|
defer fic.DBClose()
|
2016-01-07 17:28:16 +00:00
|
|
|
|
|
|
|
log.Println("Creating database...")
|
2016-01-13 19:25:25 +00:00
|
|
|
if err := fic.DBCreate(); err != nil {
|
2016-01-07 17:28:16 +00:00
|
|
|
log.Fatal("Cannot create database: ", err)
|
|
|
|
os.Exit(1)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2016-01-20 18:56:08 +00:00
|
|
|
os.Chdir(PKIDir)
|
|
|
|
|
2016-01-07 17:27:53 +00:00
|
|
|
log.Println("Registering handlers...")
|
2016-01-13 00:22:01 +00:00
|
|
|
mux := http.NewServeMux()
|
|
|
|
mux.Handle("/api/", http.StripPrefix("/api", ApiHandler()))
|
2016-01-22 16:34:34 +00:00
|
|
|
mux.Handle("/teams/", StaticHandler(staticDir))
|
|
|
|
mux.Handle("/themes/", StaticHandler(staticDir))
|
|
|
|
mux.Handle("/", http.FileServer(http.Dir(staticDir)))
|
2016-01-13 00:22:01 +00:00
|
|
|
http.HandleFunc("/", mux.ServeHTTP)
|
2016-01-07 17:27:53 +00:00
|
|
|
|
|
|
|
log.Println(fmt.Sprintf("Ready, listening on %s", *bind))
|
|
|
|
if err := http.ListenAndServe(*bind, nil); err != nil {
|
|
|
|
log.Fatal("Unable to listen and serve: ", err)
|
|
|
|
}
|
|
|
|
}
|