1
0
forked from MTSR/mapserver
mapserver/app/setup.go
2022-02-05 16:02:47 +01:00

190 lines
4.1 KiB
Go

package app
import (
"mapserver/blockaccessor"
"mapserver/colormapping"
"mapserver/db/postgres"
"mapserver/db/sqlite"
"mapserver/eventbus"
"mapserver/mapblockaccessor"
"mapserver/mapblockrenderer"
postgresobjdb "mapserver/mapobjectdb/postgres"
sqliteobjdb "mapserver/mapobjectdb/sqlite"
"mapserver/media"
"mapserver/params"
"mapserver/settings"
"mapserver/tiledb"
"mapserver/tilerenderer"
"mapserver/worldconfig"
"time"
"io/ioutil"
"os"
"github.com/sirupsen/logrus"
"errors"
)
func Setup(p params.ParamsType, cfg *Config) *App {
a := App{}
a.Params = p
a.Config = cfg
a.WebEventbus = eventbus.New()
//Parse world config
a.Worldconfig = worldconfig.Parse("world.mt")
logrus.WithFields(logrus.Fields{"version": Version}).Info("Starting mapserver")
var err error
switch a.Worldconfig[worldconfig.CONFIG_BACKEND] {
case worldconfig.BACKEND_SQLITE3:
map_path := "map.sqlite"
// check if the database exists, otherwise abort (nothing to render/display)
_, err := os.Stat(map_path)
if os.IsNotExist(err) {
panic("world-map does not exist, aborting")
}
// create a new sqlite-based blockdb instance
a.Blockdb, err = sqlite.New(map_path)
if err != nil {
panic(err)
}
case worldconfig.BACKEND_POSTGRES:
// create a new postgres based blockdb
a.Blockdb, err = postgres.New(a.Worldconfig[worldconfig.CONFIG_PSQL_CONNECTION])
if err != nil {
panic(err)
}
default:
panic(errors.New("map-backend not supported: " + a.Worldconfig[worldconfig.CONFIG_BACKEND]))
}
//migrate block db
err = a.Blockdb.Migrate()
if err != nil {
panic(err)
}
//mapblock accessor
expireDuration, err := time.ParseDuration(cfg.MapBlockAccessorCfg.Expiretime)
if err != nil {
panic(err)
}
purgeDuration, err := time.ParseDuration(cfg.MapBlockAccessorCfg.Purgetime)
if err != nil {
panic(err)
}
// mapblock accessor
a.MapBlockAccessor = mapblockaccessor.NewMapBlockAccessor(
a.Blockdb,
expireDuration, purgeDuration,
cfg.MapBlockAccessorCfg.MaxItems)
// block accessor
a.BlockAccessor = blockaccessor.New(a.MapBlockAccessor)
//color mapping
a.Colormapping = colormapping.NewColorMapping()
colorfiles := []string{
//https://daconcepts.com/vanessa/hobbies/minetest/colors.txt
"colors/vanessa.txt",
"colors/advtrains.txt",
"colors/scifi_nodes.txt",
"colors/mc2.txt",
"colors/mtg.txt",
"colors/miles.txt",
"colors/custom.txt",
"colors/nodecore.txt",
}
for _, colorfile := range colorfiles {
_, err := a.Colormapping.LoadVFSColors(colorfile)
if err != nil {
panic(err.Error() + " file:" + colorfile)
}
}
//load provided colors, if available
info, err := os.Stat("colors.txt")
if info != nil && err == nil {
logrus.WithFields(logrus.Fields{"filename": "colors.txt"}).Info("Loading colors from filesystem")
data, err := ioutil.ReadFile("colors.txt")
if err != nil {
panic(err)
}
count, err := a.Colormapping.LoadBytes(data)
if err != nil {
panic(err)
}
logrus.WithFields(logrus.Fields{"count": count}).Info("Loaded custom colors")
}
//mapblock renderer
a.Mapblockrenderer = mapblockrenderer.NewMapBlockRenderer(a.MapBlockAccessor, a.Colormapping)
//mapserver database
if a.Worldconfig[worldconfig.CONFIG_PSQL_MAPSERVER] != "" {
a.Objectdb, err = postgresobjdb.New(a.Worldconfig[worldconfig.CONFIG_PSQL_MAPSERVER])
} else {
a.Objectdb, err = sqliteobjdb.New("mapserver.sqlite")
}
if err != nil {
panic(err)
}
//migrate object database
err = a.Objectdb.Migrate()
if err != nil {
panic(err)
}
//create tiledb
a.TileDB, err = tiledb.New("./mapserver.tiles")
if err != nil {
panic(err)
}
//settings
a.Settings = settings.New(a.Objectdb)
//setup tile renderer
a.Tilerenderer = tilerenderer.NewTileRenderer(
a.Mapblockrenderer,
a.TileDB,
a.Blockdb,
a.Config.Layers,
)
//create media repo
repo := make(map[string][]byte)
if a.Config.EnableMediaRepository {
mediasize, _ := media.ScanDir(repo, ".", []string{"mapserver.tiles", ".git"})
fields := logrus.Fields{
"count": len(repo),
"bytes": mediasize,
}
logrus.WithFields(fields).Info("Created media repository")
}
a.MediaRepo = repo
return &a
}