149 lines
3.5 KiB
Go
149 lines
3.5 KiB
Go
package config
|
|
|
|
import (
|
|
"github.com/spf13/viper"
|
|
"io"
|
|
"os"
|
|
)
|
|
|
|
var (
|
|
defaultPath string
|
|
defaults = map[string]interface{}{
|
|
"IPTable": "/etc/p2p-rendering/ip_table.json",
|
|
"DockerContainers": "/home/akilan/Documents/p2prendering/p2p-redering-computation/server/docker/containers/",
|
|
"DefaultDockerFile": "/home/akilan/Documents/p2prendering/p2p-redering-computation/server/docker/containers/docker-ubuntu-sshd/",
|
|
"SpeedTestFile":"/etc/p2p-rendering/50.bin",
|
|
}
|
|
configName = "config"
|
|
configType = "json"
|
|
configFile = "config.json"
|
|
configPaths []string
|
|
)
|
|
|
|
type Config struct {
|
|
IPTable string
|
|
DockerContainers string
|
|
DefaultDockerFile string
|
|
SpeedTestFile string
|
|
IPV6Address string
|
|
PluginPath string
|
|
//NetworkInterface string
|
|
//NetworkInterfaceIPV6Index int
|
|
}
|
|
|
|
// Exists reports whether the named file or directory exists.
|
|
func fileExists(name string) bool {
|
|
if _, err := os.Stat(name); err != nil {
|
|
if os.IsNotExist(err) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
// Copy the src file to dst. Any existing file will be overwritten and will not
|
|
// copy file attributes.
|
|
// Source: https://stackoverflow.com/questions/21060945/simple-way-to-copy-a-file
|
|
func Copy(src, dst string) error {
|
|
in, err := os.Open(src)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer in.Close()
|
|
|
|
out, err := os.Create(dst)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer out.Close()
|
|
|
|
_, err = io.Copy(out, in)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return out.Close()
|
|
}
|
|
|
|
|
|
// SetDefaults This function to be called only during a
|
|
// make install
|
|
func SetDefaults() error {
|
|
//Getting Current Directory from environment variable
|
|
curDir := os.Getenv("P2PRC")
|
|
|
|
//Setting current directory to default path
|
|
defaultPath = curDir + "/"
|
|
|
|
//Create ip_table.json in the json directory
|
|
err := Copy("p2p/ip_table.json","p2p/iptable/ip_table.json")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
|
|
//Setting default paths for the config file
|
|
defaults["IPTable"] = defaultPath + "p2p/iptable/ip_table.json"
|
|
defaults["DefaultDockerFile"] = defaultPath + "server/docker/containers/docker-ubuntu-sshd/"
|
|
defaults["DockerContainers"] = defaultPath + "server/docker/containers/"
|
|
defaults["SpeedTestFile"] = defaultPath + "p2p/50.bin"
|
|
defaults["IPV6Address"] = ""
|
|
defaults["PluginPath"] = defaultPath + "plugin/deploy"
|
|
//defaults["NetworkInterface"] = "wlp0s20f3"
|
|
//defaults["NetworkInterfaceIPV6Index"] = "2"
|
|
|
|
//Paths to search for config file
|
|
configPaths = append(configPaths, defaultPath)
|
|
|
|
if fileExists(defaultPath + "config.json") {
|
|
err := os.Remove(defaultPath + "config.json")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
//Calling configuration file
|
|
_, err = ConfigInit()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func ConfigInit()(*Config,error) {
|
|
|
|
curDir := os.Getenv("P2PRC")
|
|
//Setting current directory to default path
|
|
defaultPath = curDir + "/"
|
|
//Paths to search for config file
|
|
configPaths = append(configPaths, defaultPath)
|
|
|
|
//Add all possible configurations paths
|
|
for _,v := range configPaths {
|
|
viper.AddConfigPath(v)
|
|
}
|
|
|
|
//Read config file
|
|
if err := viper.ReadInConfig(); err != nil {
|
|
// If the error thrown is config file not found
|
|
//Sets default configuration to viper
|
|
for k,v := range defaults {
|
|
viper.SetDefault(k,v)
|
|
}
|
|
viper.SetConfigName(configName)
|
|
viper.SetConfigFile(configFile)
|
|
viper.SetConfigType(configType)
|
|
|
|
if err = viper.WriteConfig(); err != nil {
|
|
return nil,err
|
|
}
|
|
}
|
|
|
|
// Adds configuration to the struct
|
|
var config Config
|
|
if err := viper.Unmarshal(&config); err != nil {
|
|
return nil,err
|
|
}
|
|
|
|
return &config,nil
|
|
}
|