Skip to content
Snippets Groups Projects
controller.go 2.48 KiB
Newer Older
  • Learn to ignore specific revisions
  • package nucleus
    
    import (
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	"code.fbi.h-da.de/cocsn/gosdn/database"
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	"code.fbi.h-da.de/cocsn/gosdn/log"
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	"code.fbi.h-da.de/cocsn/gosdn/nucleus/interfaces"
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	"code.fbi.h-da.de/cocsn/gosdn/restconf/client/ciena"
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	"github.com/BurntSushi/toml"
    	"os"
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    type controllerConfig struct {
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	CliSocket        string
    	DatabaseSocket   string
    	DatabaseUser     string
    	DatabasePassword string
    	DatabaseCrypto   bool
    	ConfigPath       string
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    }
    
    type clientConfig struct{
    	identifier string
    	endpoint string
    	username string
    	password string
    }
    
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    type Core struct {
    
    	//Assert type with clients[key].(*MCPClient)
    	clients  map[string]interfaces.Client
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	database database.Database
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	config   controllerConfig
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    }
    
    func (c *Core) Init(socket, configFileController, configFileClient string, IsRunningChannel chan bool) {
    	if err := c.readControllerConfig(configFileController); err != nil {
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		log.Fatal(err)
    	}
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	if socket != "localhost:55055" {
    		c.config.CliSocket = socket
    
    Martin Stiemerling's avatar
    Martin Stiemerling committed
    	}
    
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	c.AttachDatabase()
    
    
    	if err := c.readClientConfig(configFileClient); err != nil {
    		log.Fatal(err)
    	}
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    }
    
    func (c *Core) AttachDatabase() {
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	c.database = database.NewDatabaseClient(c.config.DatabaseSocket, c.config.DatabaseUser, c.config.DatabasePassword, c.config.DatabaseCrypto)
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    }
    
    
    func (c *Core) Shutdown() {
    
    	<- c.IsRunning
    	log.Info("Received shutdown signal. Shutting down")
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	f, err := os.Create(c.config.ConfigPath)
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	if err != nil {
    		log.Fatal(err)
    	}
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	enc := toml.NewEncoder(f)
    	if err := enc.Encode(c.config); err != nil {
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		log.Fatal(err)
    	}
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    }
    
    
    func (c *Core)readControllerConfig(configFileController string) error {
    	if configFileController == "" {
    		configFileController = "gosdn.toml"
    	}
    	if _, err := os.Stat(configFileController); err != nil {
    		return err
    	}
    
    	c.config = controllerConfig{}
    	if _, err := toml.DecodeFile(configFileController, &c.config); err != nil {
    		return err
    	}
    
    	if c.config.ConfigPath == "" {
    		c.config.ConfigPath = configFileController
    	}
    	return nil
    }
    
    func (c *Core)readClientConfig(configFileClient string) error {
    	if configFileClient == "" {
    		configFileClient = "clients.toml"
    	}
    	if _,err := os.Stat(configFileClient); err != nil {
    		return err
    	}
    	clients := make([]clientConfig, 0)
    	if _,err := toml.DecodeFile(configFileClient, &clients); err != nil {
    		return err
    	}
    	for _,client := range clients {
    		c.clients[client.identifier] = ciena.NewMCPClient(client.endpoint, client.username, client.password, &c.database)
    	}
    	return nil
    }