Files
darkstorm-server/main.go
T
Caleb Gardner 2afbd64dc2 Added CallbackApp to better access backend.Backend from with in an App
Fixed issues with CORS not being able to do an OPTIONS request
Fixed folders not being processed properly.
Fixed some other issues.
2024-08-07 02:24:54 -05:00

116 lines
3.4 KiB
Go

package main
import (
"context"
"crypto/tls"
"flag"
"log"
"net/http"
"net/http/httputil"
"net/url"
"os"
"path"
"path/filepath"
"strings"
"github.com/CalebQ42/darkstorm-server/internal/backend"
"github.com/CalebQ42/darkstorm-server/internal/backend/db"
"github.com/CalebQ42/darkstorm-server/internal/blog"
"github.com/CalebQ42/darkstorm-server/internal/cdr"
"github.com/CalebQ42/darkstorm-server/internal/swassistant"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
var (
mongoClient *mongo.Client
back *backend.Backend
blogApp *blog.BlogApp
webRoot *string
)
func main() {
mongoURL := flag.String("mongo", "", "Enables MongoDB usage for Darkstorm backend.")
webRoot = flag.String("web-root", "", "Sets root directory of web server.")
addr := flag.String("addr", ":443", "Set listen address. Defaults to \":443\"")
flag.Parse()
if flag.NArg() != 1 {
log.Fatal("You must specify key directory. ex: darkstorm-server /etc/web-keys")
}
if *mongoURL == "" || *webRoot == "" {
log.Fatal("SPECIFY MONGO AND WEB-ROOT OR I WILL DIE, OH NO, THEY'RE COMING FOR ME.... **DEATH NOISES**")
}
go func() {
log.Println("error redirecting http traffice:",
http.ListenAndServe(":80", http.RedirectHandler("https://darkstorm.tech", http.StatusPermanentRedirect)))
}()
mux := http.NewServeMux()
setupMongo(*mongoURL)
setupBackend(mux)
setupWebsite(mux)
serv := &http.Server{
Addr: *addr,
Handler: mux,
}
err := serv.ListenAndServeTLS(filepath.Join(flag.Arg(0), "fullchain.pem"), filepath.Join(flag.Arg(0), "key.pem"))
log.Println("webserver closed:", err)
}
func setupMongo(uri string) {
mongoCert, err := tls.LoadX509KeyPair(filepath.Join(flag.Arg(0), "mongo.pem"), filepath.Join(flag.Arg(0), "key.pem"))
if err != nil {
log.Fatal("error loading mongo keys:", err)
}
mongoClient, err = mongo.Connect(context.Background(), options.Client().ApplyURI(uri).SetTLSConfig(&tls.Config{
Certificates: []tls.Certificate{mongoCert},
}))
if err != nil {
log.Fatal("error connecting to mongo:", err)
}
}
func setupBackend(mux *http.ServeMux) {
blogApp = blog.NewBlogApp(mongoClient.Database("blog"))
var err error
back, err = backend.NewBackend(db.NewMongoTable[backend.ApiKey](
mongoClient.Database("darkstorm").Collection("keys")),
blogApp,
swassistant.NewSWBackend(mongoClient.Database("swassistant")),
cdr.NewBackend(mongoClient.Database("cdr")),
)
back.AddCorsAddress("https://darkstorm.tech")
if err != nil {
log.Fatal("error setting up backend:", err)
}
mux.Handle("api.darkstorm.tech/", back)
}
func setupWebsite(mux *http.ServeMux) {
url, _ := url.Parse("https://localhost:30000")
mux.Handle("rpg.darkstorm.tech/", httputil.NewSingleHostReverseProxy(url))
mux.HandleFunc("GET /files", filesRequest)
mux.HandleFunc("GET /portfolio", portfolioRequest)
mux.HandleFunc("/", mainHandle)
}
func mainHandle(w http.ResponseWriter, r *http.Request) {
path := strings.TrimPrefix(path.Clean(r.URL.Path), "/")
if path == "/" || path == "" {
latestBlogsHandle(w, r)
return
}
stat, err := os.Stat(filepath.Join(*webRoot, path))
if err == nil && !stat.IsDir() {
http.ServeFile(w, r, filepath.Join(*webRoot, path))
return
} else if stat.IsDir() {
ind := filepath.Join(*webRoot, path, "index.html")
stat, err = os.Stat(ind)
if err == nil {
http.ServeFile(w, r, ind)
return
}
}
blogHandle(w, r, path)
}