Files
cgrates/config/httpcfg.go
2021-09-20 10:45:14 +02:00

176 lines
5.4 KiB
Go

/*
Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments
Copyright (C) ITsysCOM GmbH
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package config
import (
"github.com/cgrates/birpc/context"
"github.com/cgrates/cgrates/utils"
)
// HTTPCfg is the HTTP config section
type HTTPCfg struct {
JsonRPCURL string // JSON RPC relative URL ("" to disable)
RegistrarSURL string // registrar service relative URL
WSURL string // WebSocket relative URL ("" to disable)
FreeswitchCDRsURL string // Freeswitch CDRS relative URL ("" to disable)
CDRsURL string // CDRS relative URL ("" to disable)
UseBasicAuth bool // Use basic auth for HTTP API
AuthUsers map[string]string // Basic auth user:password map (base64 passwords)
ClientOpts map[string]interface{}
}
// loadHTTPCfg loads the Http section of the configuration
func (httpcfg *HTTPCfg) Load(ctx *context.Context, jsnCfg ConfigDB, _ *CGRConfig) (err error) {
jsnHTTPCfg := new(HTTPJsonCfg)
if err = jsnCfg.GetSection(ctx, HTTPJSON, jsnHTTPCfg); err != nil {
return
}
return httpcfg.loadFromJSONCfg(jsnHTTPCfg)
}
// loadFromJSONCfg loads Database config from JsonCfg
func (httpcfg *HTTPCfg) loadFromJSONCfg(jsnHTTPCfg *HTTPJsonCfg) (err error) {
if jsnHTTPCfg == nil {
return nil
}
if jsnHTTPCfg.Json_rpc_url != nil {
httpcfg.JsonRPCURL = *jsnHTTPCfg.Json_rpc_url
}
if jsnHTTPCfg.Registrars_url != nil {
httpcfg.RegistrarSURL = *jsnHTTPCfg.Registrars_url
}
if jsnHTTPCfg.Ws_url != nil {
httpcfg.WSURL = *jsnHTTPCfg.Ws_url
}
if jsnHTTPCfg.Freeswitch_cdrs_url != nil {
httpcfg.FreeswitchCDRsURL = *jsnHTTPCfg.Freeswitch_cdrs_url
}
if jsnHTTPCfg.Http_Cdrs != nil {
httpcfg.CDRsURL = *jsnHTTPCfg.Http_Cdrs
}
if jsnHTTPCfg.Use_basic_auth != nil {
httpcfg.UseBasicAuth = *jsnHTTPCfg.Use_basic_auth
}
if jsnHTTPCfg.Auth_users != nil {
httpcfg.AuthUsers = *jsnHTTPCfg.Auth_users
}
if jsnHTTPCfg.Client_opts != nil {
for k, v := range jsnHTTPCfg.Client_opts {
httpcfg.ClientOpts[k] = v
}
}
return nil
}
// AsMapInterface returns the config as a map[string]interface{}
func (httpcfg HTTPCfg) AsMapInterface(string) interface{} {
clientOpts := make(map[string]interface{})
for k, v := range httpcfg.ClientOpts {
clientOpts[k] = v
}
return map[string]interface{}{
utils.HTTPJsonRPCURLCfg: httpcfg.JsonRPCURL,
utils.RegistrarSURLCfg: httpcfg.RegistrarSURL,
utils.HTTPWSURLCfg: httpcfg.WSURL,
utils.HTTPFreeswitchCDRsURLCfg: httpcfg.FreeswitchCDRsURL,
utils.HTTPCDRsURLCfg: httpcfg.CDRsURL,
utils.HTTPUseBasicAuthCfg: httpcfg.UseBasicAuth,
utils.HTTPAuthUsersCfg: httpcfg.AuthUsers,
utils.HTTPClientOptsCfg: clientOpts,
}
}
func (HTTPCfg) SName() string { return HTTPJSON }
func (httpcfg HTTPCfg) CloneSection() Section { return httpcfg.Clone() }
// Clone returns a deep copy of HTTPCfg
func (httpcfg HTTPCfg) Clone() (cln *HTTPCfg) {
cln = &HTTPCfg{
JsonRPCURL: httpcfg.JsonRPCURL,
RegistrarSURL: httpcfg.RegistrarSURL,
WSURL: httpcfg.WSURL,
FreeswitchCDRsURL: httpcfg.FreeswitchCDRsURL,
CDRsURL: httpcfg.CDRsURL,
UseBasicAuth: httpcfg.UseBasicAuth,
AuthUsers: make(map[string]string),
ClientOpts: make(map[string]interface{}),
}
for u, a := range httpcfg.AuthUsers {
cln.AuthUsers[u] = a
}
for o, val := range httpcfg.ClientOpts {
cln.ClientOpts[o] = val
}
return
}
// HTTP config section
type HTTPJsonCfg struct {
Json_rpc_url *string
Registrars_url *string
Ws_url *string
Freeswitch_cdrs_url *string
Http_Cdrs *string
Use_basic_auth *bool
Auth_users *map[string]string
Client_opts map[string]interface{}
}
func diffHTTPJsonCfg(d *HTTPJsonCfg, v1, v2 *HTTPCfg) *HTTPJsonCfg {
if d == nil {
d = new(HTTPJsonCfg)
}
if v1.JsonRPCURL != v2.JsonRPCURL {
d.Json_rpc_url = utils.StringPointer(v2.JsonRPCURL)
}
if v1.RegistrarSURL != v2.RegistrarSURL {
d.Registrars_url = utils.StringPointer(v2.RegistrarSURL)
}
if v1.WSURL != v2.WSURL {
d.Ws_url = utils.StringPointer(v2.WSURL)
}
if v1.FreeswitchCDRsURL != v2.FreeswitchCDRsURL {
d.Freeswitch_cdrs_url = utils.StringPointer(v2.FreeswitchCDRsURL)
}
if v1.CDRsURL != v2.CDRsURL {
d.Http_Cdrs = utils.StringPointer(v2.CDRsURL)
}
if v1.UseBasicAuth != v2.UseBasicAuth {
d.Use_basic_auth = utils.BoolPointer(v2.UseBasicAuth)
}
if !utils.MapStringStringEqual(v1.AuthUsers, v2.AuthUsers) {
d.Auth_users = &v2.AuthUsers
}
d.Client_opts = diffMap(d.Client_opts, v1.ClientOpts, v2.ClientOpts)
return d
}
func diffMap(d, v1, v2 map[string]interface{}) map[string]interface{} {
if d == nil {
d = make(map[string]interface{})
}
for k, v := range v2 {
if val, has := v1[k]; !has || val != v {
d[k] = v
}
}
return d
}