package main import ( "context" "fmt" "oc-catalog/conf" "oc-catalog/infrastructure" _ "oc-catalog/routers" oclib "cloud.o-forge.io/core/oc-lib" "cloud.o-forge.io/core/oc-lib/models/resources" "cloud.o-forge.io/core/oc-lib/tools" beego "github.com/beego/beego/v2/server/web" "github.com/beego/beego/v2/server/web/filter/cors" "github.com/libp2p/go-libp2p" pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/libp2p/go-libp2p/core/peer" ) const appname = "oc-catalog" func main() { // Init the oc-lib oclib.Init(appname) // Load the right config file o := oclib.GetConfLoader() // feed the library with the loaded config oclib.SetConfig( o.GetStringDefault("MONGO_URL", "mongodb://127.0.0.1:27017"), o.GetStringDefault("MONGO_DATABASE", "DC_myDC"), o.GetStringDefault("NATS_URL", "nats://localhost:4222"), o.GetStringDefault("LOKI_URL", ""), o.GetStringDefault("LOG_LEVEL", "info"), ) conf.GetConfig().PSKPath = o.GetStringDefault("PSK_PATH", "./psk/psk") conf.GetConfig().DHTEndpointPort = o.GetInt64Default("DHT_ENDPOINT_PORT", 4002) conf.GetConfig().PublicKeyPath = o.GetStringDefault("CATALOG_PUBLIC_KEY_PATH", "./pem/public.pem") conf.GetConfig().PrivateKeyPath = o.GetStringDefault("CATALOG_PRIVATE_KEY_PATH", "./pem/private.pem") conf.GetConfig().BootstrapAddress = o.GetStringDefault("BOOTSTRAP_ADDRESS", "") // Beego initialization beego.BConfig.AppName = appname beego.BConfig.Listen.HTTPPort = o.GetIntDefault("port", 8080) beego.BConfig.WebConfig.DirectoryIndex = true beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger" api := &tools.API{} api.Discovered(beego.BeeApp.Handlers.GetAllControllerInfo()) beego.InsertFilter("*", beego.BeforeRouter, cors.Allow(&cors.Options{ AllowAllOrigins: true, AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, AllowHeaders: []string{"Origin", "Authorization", "Content-Type"}, ExposeHeaders: []string{"Content-Length", "Content-Type"}, AllowCredentials: true, })) InitDTH() beego.Run() } func InitDTH() error { priv, err := infrastructure.LoadKeyFromFile(false) if err != nil { return err } psk, err := infrastructure.LoadPSKFromFile() if err != nil { return err } h, err := libp2p.New( libp2p.PrivateNetwork(psk), libp2p.Identity(priv), libp2p.ListenAddrStrings( fmt.Sprintf("/ip4/0.0.0.0/tcp/%d", conf.GetConfig().DHTEndpointPort), ), ) if err != nil { return err } pi, err := peer.AddrInfoFromString(conf.GetConfig().BootstrapAddress) if err != nil { return err } logger := oclib.GetLogger() if err := h.Connect(context.Background(), *pi); err != nil { logger.Err(fmt.Errorf("Failed to connect to MAIN bootstrap peer %s: %s", pi.ID, err)) } else { logger.Info().Msg(fmt.Sprintf("Connected to MAIN bootstrap peer %s", pi.ID)) } ps, err := pubsub.NewGossipSub(context.Background(), h, pubsub.WithMessageSigning(true), pubsub.WithStrictSignatureVerification(true), ) if err != nil { return err } infrastructure.Singleton = &infrastructure.PubSubService{ PS: ps, Subscription: []string{}, SearchStream: make(map[string]chan resources.ResourceInterface), // mutex field is ready without explicit literal } return nil }