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 }