blob: bcc339a8e3d12602c85ebd3db5de49a908137d0d [file] [log] [blame]
package crconfig
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import (
"database/sql"
"errors"
"strconv"
"strings"
)
func makeCRConfigConfig(cdn string, tx *sql.Tx, dnssecEnabled bool, domain string) (map[string]interface{}, error) {
configParams, err := getConfigParams(cdn, tx)
if err != nil {
return nil, errors.New("Error getting router params: " + err.Error())
}
soa := map[string]string{}
ttl := map[string]string{}
maxmindDefaultOverrides := []CRConfigConfigMaxmindDefaultOverride{}
const soaPrefix = "tld.soa."
const ttlPrefix = "tld.ttls."
const maxmindDefaultOverrideParameterName = "maxmind.default.override"
const logRequestHeadersParameterName = "LogRequestHeaders"
crConfigConfig := map[string]interface{}{}
for _, param := range configParams {
k := param.Name
v := param.Value
if strings.HasPrefix(k, soaPrefix) {
soa[k[len(soaPrefix):]] = v
} else if strings.HasPrefix(k, ttlPrefix) {
ttl[k[len(ttlPrefix):]] = v
} else if k == logRequestHeadersParameterName {
hdrs := []string{}
for _, hdr := range strings.Split(param.Value, `__RETURN__`) {
hdrs = append(hdrs, strings.TrimSpace(hdr))
}
crConfigConfig["requestHeaders"] = hdrs
} else if k == maxmindDefaultOverrideParameterName {
overrideObj, err := createMaxmindDefaultOverrideObj(v)
if err != nil {
return nil, errors.New("Error parsing " + maxmindDefaultOverrideParameterName + " parameter: " + err.Error())
}
maxmindDefaultOverrides = append(maxmindDefaultOverrides, overrideObj)
} else {
crConfigConfig[k] = v
}
}
crConfigConfig["domain_name"] = domain
if len(soa) > 0 {
crConfigConfig["soa"] = soa
}
if len(ttl) > 0 {
crConfigConfig["ttls"] = ttl
}
if len(maxmindDefaultOverrides) > 0 {
crConfigConfig["maxmindDefaultOverride"] = maxmindDefaultOverrides
}
dnssecStr := "false"
if dnssecEnabled {
dnssecStr = "true"
}
crConfigConfig["dnssec.enabled"] = dnssecStr
return crConfigConfig, nil
}
type CRConfigConfigParameter struct {
Name string
Value string
}
func getConfigParams(cdn string, tx *sql.Tx) ([]CRConfigConfigParameter, error) {
// TODO change to []struct{string,string} ? Speed might matter.
q := `
select name, value from parameter where id in (
select parameter from profile_parameter where profile in (
select distinct profile from server where cdn_id = (
select id from cdn where name = $1
)
)
)
and config_file = 'CRConfig.json'
`
rows, err := tx.Query(q, cdn)
if err != nil {
return nil, errors.New("Error querying router params: " + err.Error())
}
defer rows.Close()
params := []CRConfigConfigParameter{}
for rows.Next() {
name := ""
val := ""
if err := rows.Scan(&name, &val); err != nil {
return nil, errors.New("Error scanning router param: " + err.Error())
}
params = append(params, CRConfigConfigParameter{Name: name, Value: val})
}
if err := rows.Err(); err != nil {
return nil, errors.New("Error iterating router param rows: " + err.Error())
}
return params, nil
}
type CRConfigConfigMaxmindDefaultOverride struct {
CountryCode string `json:"countryCode"`
Lat float64 `json:"lat"`
Lon float64 `json:"long"`
}
func createMaxmindDefaultOverrideObj(maxmindDefaultOverrideParamVal string) (CRConfigConfigMaxmindDefaultOverride, error) {
countryCodeCoords := strings.Split(maxmindDefaultOverrideParamVal, ";")
if len(countryCodeCoords) < 2 {
return CRConfigConfigMaxmindDefaultOverride{}, errors.New("malformed maxmind.default.override parameter: '" + maxmindDefaultOverrideParamVal + "'")
}
countryCode := countryCodeCoords[0]
coords := countryCodeCoords[1]
latLon := strings.Split(coords, ",")
if len(latLon) < 2 {
return CRConfigConfigMaxmindDefaultOverride{}, errors.New("malformed maxmind.default.override parameter coordinates '" + maxmindDefaultOverrideParamVal + "'")
}
latStr := latLon[0]
lonStr := latLon[1]
lat, err := strconv.ParseFloat(latStr, 64)
if err != nil {
return CRConfigConfigMaxmindDefaultOverride{}, errors.New("malformed maxmind.default.override parameter coordinates, latitude not a number: '" + maxmindDefaultOverrideParamVal + "'")
}
lon, err := strconv.ParseFloat(lonStr, 64)
if err != nil {
return CRConfigConfigMaxmindDefaultOverride{}, errors.New("malformed maxmind.default.override parameter coordinates, longitude not an number: '" + maxmindDefaultOverrideParamVal + "'")
}
return CRConfigConfigMaxmindDefaultOverride{
CountryCode: countryCode,
Lat: lat,
Lon: lon,
}, nil
}