server/admin/main.go

93 lines
3.2 KiB
Go
Raw Normal View History

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"
"path"
2016-01-20 21:44:34 +00:00
"path/filepath"
"text/template"
2016-01-13 19:25:25 +00:00
"srs.epita.fr/fic-server/admin/api"
2016-01-13 19:25:25 +00:00
"srs.epita.fr/fic-server/libfic"
2016-01-07 17:27:53 +00:00
)
var PKIDir string
2016-01-07 17:27:53 +00:00
var SubmissionDir string
var StaticDir string
2016-01-07 17:27:53 +00:00
func main() {
2016-11-19 15:17:53 +00:00
var bind = flag.String("bind", "127.0.0.1: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")
var baseURL = flag.String("baseurl", "/", "URL prepended to each URL")
2016-01-07 17:27:53 +00:00
flag.StringVar(&SubmissionDir, "submission", "./submissions/", "Base directory where save submissions")
flag.StringVar(&PKIDir, "pki", "./pki/", "Base directory where found PKI scripts")
flag.StringVar(&StaticDir, "static", "./htdocs-admin/", "Directory containing static files")
2017-01-15 01:37:59 +00:00
flag.StringVar(&api.TeamsDir, "teams", "./TEAMS", "Base directory where save teams JSON files")
2016-01-20 21:44:34 +00:00
flag.StringVar(&fic.FilesDir, "files", "./FILES/", "Base directory where found challenges files, local part")
flag.StringVar(&api.CloudDAVBase, "clouddav", "https://srs.epita.fr/owncloud/remote.php/webdav/FIC 2016",
2016-01-20 21:44:34 +00:00
"Base directory where found challenges files, cloud part")
flag.StringVar(&api.CloudUsername, "clouduser", "fic", "Username used to sync")
flag.StringVar(&api.CloudPassword, "cloudpass", "", "Password used to sync")
flag.BoolVar(&api.RapidImport, "rapidimport", false, "Don't try to reimport an existing file")
2017-01-04 00:30:24 +00:00
flag.BoolVar(&fic.OptionalDigest, "optionaldigest", false, "Is the digest required when importing files?")
2016-01-07 17:27:53 +00:00
flag.Parse()
2016-10-13 17:02:41 +00:00
log.SetPrefix("[admin] ")
2016-01-20 21:44:34 +00:00
var err error
log.Println("Checking paths...")
if StaticDir, err = filepath.Abs(StaticDir); err != nil {
2016-01-22 16:34:34 +00:00
log.Fatal(err)
}
2016-01-20 21:44:34 +00:00
if fic.FilesDir, err = filepath.Abs(fic.FilesDir); err != nil {
log.Fatal(err)
}
if PKIDir, err = filepath.Abs(PKIDir); err != nil {
log.Fatal(err)
}
if SubmissionDir, err = filepath.Abs(SubmissionDir); err != nil {
log.Fatal(err)
}
2016-01-22 16:34:34 +00:00
if fic.FilesDir, err = filepath.Abs(fic.FilesDir); err != nil {
log.Fatal(err)
}
if *baseURL != "/" {
tmp := path.Clean(*baseURL)
baseURL = &tmp
} else {
tmp := ""
baseURL = &tmp
}
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)
}
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)
}
log.Println("Changing base URL to", *baseURL,"...")
if file, err := os.OpenFile(path.Join(StaticDir, "index.html"), os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.FileMode(0644)); err != nil {
log.Println("Unable to open index.html: ", err)
} else if indexTmpl, err := template.New("index").Parse(indextpl); err != nil {
log.Println("Cannot create template: ", err)
} else if err := indexTmpl.Execute(file, map[string]string{"urlbase": path.Clean(path.Join(*baseURL + "/", "nuke"))[:len(path.Clean(path.Join(*baseURL + "/", "nuke"))) - 4]}); err != nil {
log.Println("An error occurs during template execution: ", err)
}
os.Chdir(PKIDir)
2016-01-07 17:27:53 +00:00
log.Println(fmt.Sprintf("Ready, listening on %s", *bind))
if err := http.ListenAndServe(*bind, http.StripPrefix(*baseURL, api.Router())); err != nil {
2016-01-07 17:27:53 +00:00
log.Fatal("Unable to listen and serve: ", err)
}
}