github.com/apremalal/vamps-core@v1.0.1-0.20161221121535-d430b56ec174/commons/configs.go (about)

     1  package commons
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  	"strconv"
     7  	"text/template"
     8  
     9  	"fmt"
    10  
    11  	"errors"
    12  
    13  	"log"
    14  
    15  	"net/http"
    16  
    17  	"github.com/spf13/viper"
    18  	"gopkg.in/gorp.v1"
    19  )
    20  
    21  type serverConfigs struct {
    22  	Home               string
    23  	Prefix             string
    24  	IsMaster           bool
    25  	PortOffset         int
    26  	Hostname           string
    27  	HttpPort           int
    28  	HttpsPort          int
    29  	CaddyPort          int
    30  	ReadTimeOut        int
    31  	WriteTimeOut       int
    32  	CaddyPath          string
    33  	CaddyFile          string
    34  	SSLCertificateFile string
    35  	SSLKeyFile         string
    36  	JWTPrivateKeyFile  string
    37  	JWTPublicKeyFile   string
    38  	JWTExpirationDelta int
    39  	TraceLogFile       string
    40  	EnableTrace        bool
    41  	EnableAccessLogs   bool
    42  	LogsDirectory      string
    43  	LogLevel           string
    44  	DBConfigMap        map[string]DBConfigs
    45  	ConfigMap          map[string]interface{}
    46  	RedisConfigs       RedisConfigs
    47  }
    48  
    49  type DBConfigs struct {
    50  	Username   string
    51  	Password   string
    52  	Dialect    string
    53  	DBName     string
    54  	Address    string
    55  	Parameters string
    56  }
    57  
    58  type RedisConfigs struct {
    59  	Address  string
    60  	Password string
    61  }
    62  
    63  var ServerConfigurations serverConfigs
    64  
    65  func init() {
    66  	InitConfigurations(os.Getenv(CONFIG_FILE))
    67  }
    68  
    69  func GetDBConnection(dbIdentifier string) *gorp.DbMap {
    70  	return dbConnections[dbIdentifier].dbMap
    71  }
    72  
    73  func (config *serverConfigs) GetString(identifier string) string {
    74  	return (*config).ConfigMap[identifier].(string)
    75  }
    76  
    77  func FetchFromVenues(request *http.Request, database string, table string, totalRecordCountQuery string,
    78  	columns []string, columnsMap map[string]string, result interface{}, tenantID int,
    79  	venueIDs []int) (int64, int64, error) {
    80  	dbMap := GetDBConnection(database)
    81  	var err error
    82  	query := "SELECT "
    83  
    84  	for index, element := range columns {
    85  		query += element
    86  		if index+1 != len(columns) {
    87  			query += ","
    88  		}
    89  	}
    90  	constructedFilterQuery := ""
    91  	constructedFilterQuery += " FROM " + table
    92  	filter := filter(request, columns, columnsMap)
    93  
    94  	if tenantID > 0 {
    95  		if len(filter) > 0 {
    96  			filter += " AND tenantid=" + strconv.Itoa(tenantID)
    97  		} else {
    98  			filter += " WHERE tenantid=" + strconv.Itoa(tenantID)
    99  		}
   100  	}
   101  
   102  	if len(venueIDs) > 0 && venueIDs[0] != -1 {
   103  		filter += " AND venueid IN ("
   104  		for k, v := range venueIDs {
   105  			filter += strconv.Itoa(v)
   106  			if k < len(venueIDs)-1 {
   107  				filter += ","
   108  			} else if k == len(venueIDs)-1 {
   109  				filter += ")"
   110  			}
   111  		}
   112  	}
   113  
   114  	constructedFilterQuery += filter
   115  	query += constructedFilterQuery
   116  	query += order(request, columns)
   117  	query += limit(request)
   118  
   119  	_, err = dbMap.Select(result, query)
   120  
   121  	filteredRecordCount, _ := getRecordCount(dbMap, "SELECT COUNT(*) "+constructedFilterQuery)
   122  	totalRecordsCount, _ := getRecordCount(dbMap, totalRecordCountQuery)
   123  	return filteredRecordCount, totalRecordsCount, err
   124  }
   125  
   126  func InitConfigurations(configFileUrl string) serverConfigs {
   127  	ServerConfigurations.Home = GetServerHome()
   128  	//read the configurations from the file url instead of searching through the paths
   129  	if len(configFileUrl) <= 0 {
   130  		if _, err := os.Stat(ServerConfigurations.Home + FILE_PATH_SEPARATOR + SERVER_CONFIGS_DIRECTORY + FILE_PATH_SEPARATOR + CONFIG_FILE_NAME); os.IsNotExist(err) {
   131  			configFileUrl = ServerConfigurations.Home + FILE_PATH_SEPARATOR + "configs" + FILE_PATH_SEPARATOR + DEFAULT_CONFIG_FILE_NAME
   132  		} else {
   133  			configFileUrl = ServerConfigurations.Home + FILE_PATH_SEPARATOR + "configs" + FILE_PATH_SEPARATOR + CONFIG_FILE_NAME
   134  		}
   135  	}
   136  	viper.New()
   137  	configUrl, err := parseConfigTemplate(configFileUrl, ServerConfigurations.Home)
   138  	if err != nil {
   139  		log.Fatalf("unable to initialize configurations stac trace: %s", err.Error())
   140  	}
   141  	viper.SetConfigFile(configUrl)
   142  	err = viper.ReadInConfig() // Find and read the config file
   143  	if err != nil {
   144  		log.Fatalf("error while reading server configuration file: %s err: %s \n", configFileUrl, err)
   145  	}
   146  
   147  	configsMap := viper.GetStringMap("serverConfigs")
   148  	ServerConfigurations.ConfigMap = configsMap
   149  	ServerConfigurations.Prefix = configsMap["prefix"].(string)
   150  	SERVER_PREFIX := ServerConfigurations.Prefix
   151  	ServerConfigurations.IsMaster = configsMap["isMaster"].(bool)
   152  	ServerConfigurations.PortOffset = configsMap["portOffset"].(int)
   153  	ServerConfigurations.HttpPort = configsMap["httpPort"].(int)
   154  	ServerConfigurations.HttpsPort = configsMap["httpsPort"].(int)
   155  	ServerConfigurations.CaddyPort = configsMap["caddyPort"].(int)
   156  	ServerConfigurations.ReadTimeOut = configsMap["readTimeOut"].(int)
   157  	ServerConfigurations.WriteTimeOut = configsMap["writeTimeOut"].(int)
   158  	ServerConfigurations.LogsDirectory = configsMap["logsDirectory"].(string)
   159  	ServerConfigurations.LogLevel = configsMap["logLevel"].(string)
   160  	ServerConfigurations.EnableAccessLogs = configsMap["enableAccessLogs"].(bool)
   161  	ServerConfigurations.CaddyPath = configsMap["caddyPath"].(string)
   162  	ServerConfigurations.CaddyFile = configsMap["caddyFile"].(string)
   163  	ServerConfigurations.JWTPrivateKeyFile = configsMap["JWTPrivateKeyFile"].(string)
   164  	ServerConfigurations.JWTPublicKeyFile = configsMap["JWTPublicKeyFile"].(string)
   165  	ServerConfigurations.JWTExpirationDelta = configsMap["JWTExpirationDelta"].(int)
   166  	ServerConfigurations.SSLCertificateFile = configsMap["certificateFile"].(string)
   167  	ServerConfigurations.SSLKeyFile = configsMap["keyFile"].(string)
   168  
   169  	//Exporting variables for other services (Caddy)
   170  	os.Setenv("PATH", os.Getenv("PATH")+":"+ServerConfigurations.Home+"/bin")
   171  	os.Setenv("CADDYPATH", ServerConfigurations.CaddyPath)
   172  	os.Setenv(SERVER_PREFIX+"_CADDY_PORT", strconv.Itoa(ServerConfigurations.CaddyPort+ServerConfigurations.PortOffset))
   173  	os.Setenv(SERVER_PREFIX+"_HTTPS_PORT", strconv.Itoa(ServerConfigurations.HttpsPort+ServerConfigurations.PortOffset))
   174  	os.Setenv(SERVER_PREFIX+"_CERTIFICATE_FILE", ServerConfigurations.SSLCertificateFile)
   175  	os.Setenv(SERVER_PREFIX+"_KEY_FILE", ServerConfigurations.SSLKeyFile)
   176  	os.Setenv(SERVER_PREFIX+"_"+JWT_PRIVATE_KEY_FILE, ServerConfigurations.JWTPrivateKeyFile)
   177  	os.Setenv(SERVER_PREFIX+"_"+JWT_PUBLIC_KEY_FILE, ServerConfigurations.JWTPublicKeyFile)
   178  	os.Setenv(SERVER_PREFIX+"_"+JWT_EXPIRATION_DELTA, strconv.Itoa(ServerConfigurations.JWTExpirationDelta))
   179  
   180  	ServerConfigurations.DBConfigMap = make(map[string]DBConfigs)
   181  	databases := viper.Get("dbConfigs").([]interface{})
   182  	for i, _ := range databases {
   183  		database := databases[i].(map[interface{}]interface{})
   184  		ServerConfigurations.DBConfigMap[database["name"].(string)] = DBConfigs{
   185  			Dialect:    database["dialect"].(string),
   186  			DBName:     database["dbname"].(string),
   187  			Address:    database["address"].(string),
   188  			Parameters: database["parameters"].(string),
   189  			Username:   database["username"].(string),
   190  			Password:   database["password"].(string),
   191  		}
   192  	}
   193  
   194  	redisConfigsMap := viper.GetStringMap("redisConfigs")
   195  	ServerConfigurations.RedisConfigs.Address = redisConfigsMap["address"].(string)
   196  	ServerConfigurations.RedisConfigs.Password = redisConfigsMap["password"].(string)
   197  	return ServerConfigurations
   198  }
   199  
   200  //fill the configuration file template with the the template parameters
   201  func parseConfigTemplate(configFileUrl, serverHome string) (string, error) {
   202  	parsedConfigFolder := filepath.FromSlash(ServerConfigurations.Home + FILE_PATH_SEPARATOR + "configs" +
   203  		FILE_PATH_SEPARATOR + ".tmp")
   204  	parsedConfigFile := filepath.FromSlash(parsedConfigFolder + FILE_PATH_SEPARATOR + CONFIG_FILE_NAME)
   205  
   206  	if _, err := os.Stat(parsedConfigFolder); os.IsNotExist(err) {
   207  		err = os.Mkdir(parsedConfigFolder, os.ModePerm)
   208  		if err != nil {
   209  			errMsg := fmt.Sprintf("unable to create the configuration folder in path %s stack trace %s",
   210  				parsedConfigFolder, err.Error())
   211  			return parsedConfigFile, errors.New(errMsg)
   212  		}
   213  	}
   214  	parsedFile, err := os.Create(parsedConfigFile)
   215  	if err != nil {
   216  		errMsg := fmt.Sprintf("unable to create the configuration file in path %s stack trace %s", parsedConfigFile,
   217  			err.Error())
   218  		return parsedConfigFile, errors.New(errMsg)
   219  	}
   220  	template, err := template.ParseFiles(filepath.FromSlash(configFileUrl))
   221  	if err != nil {
   222  		errMsg := fmt.Sprintf("unable to parse the config file template %s stack trace %s", configFileUrl,
   223  			err.Error())
   224  		return parsedConfigFile, errors.New(errMsg)
   225  	}
   226  	data := struct {
   227  		ServerHome string
   228  	}{serverHome}
   229  	err = template.Execute(parsedFile, data)
   230  
   231  	if err != nil {
   232  		errMsg := fmt.Sprintf("unable to execute the template stack trace %s", err.Error())
   233  		return parsedConfigFile, errors.New(errMsg)
   234  	}
   235  	parsedFile.Close()
   236  	return parsedConfigFile, nil
   237  }
   238  
   239  func GetServerHome() string {
   240  	var home string
   241  	home = os.Getenv(SERVER_HOME)
   242  	if len(home) <= 0 {
   243  		home, err := filepath.Abs(filepath.Dir(os.Args[0]))
   244  		if err != nil {
   245  			log.Fatal("error while determining the server home. Please set the SERVER_HOME varaible and restart.")
   246  		}
   247  		os.Setenv(SERVER_HOME, home)
   248  	}
   249  	return home
   250  }