mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-23 08:08:45 +05:00
Added filter implementation for sentrypeer
This commit is contained in:
committed by
Dan Christian Bogos
parent
13506235ae
commit
ba20dbe831
@@ -19,6 +19,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
package engine
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"github.com/cgrates/cgrates/config"
|
||||
"github.com/cgrates/cgrates/guardian"
|
||||
"github.com/cgrates/cgrates/utils"
|
||||
@@ -117,3 +120,52 @@ func WeightFromDynamics(dWs []*utils.DynamicWeight,
|
||||
}
|
||||
return 0.0, nil
|
||||
}
|
||||
|
||||
func GetSentryPeer(val, addr, token, path string, cacheRead, cacheWrite bool) (found bool, err error) {
|
||||
valpath := utils.ConcatenatedKey(path, val)
|
||||
if cacheRead {
|
||||
if x, ok := Cache.Get(utils.MetaSentryPeer, valpath); ok && x != nil { // Attempt to find in cache first
|
||||
return x.(bool), nil
|
||||
}
|
||||
}
|
||||
var req *http.Request
|
||||
if req, err = http.NewRequest("GET", addr+path+"/"+val, nil); err != nil {
|
||||
return
|
||||
}
|
||||
req.Header = http.Header{
|
||||
"Authorization": {fmt.Sprintf("Bearer %s", token)},
|
||||
}
|
||||
var resp *http.Response
|
||||
resp, err = http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
if resp.StatusCode >= 200 && resp.StatusCode < 300 {
|
||||
if cacheWrite {
|
||||
if err = Cache.Set(utils.MetaSentryPeer, valpath, true, nil, true, utils.NonTransactional); err != nil {
|
||||
return false, err
|
||||
}
|
||||
}
|
||||
return true, nil
|
||||
} else {
|
||||
switch {
|
||||
case resp.StatusCode == http.StatusNotFound:
|
||||
if cacheWrite {
|
||||
if err = Cache.Set(utils.MetaSentryPeer, valpath, false, nil, true, utils.NonTransactional); err != nil {
|
||||
return false, err
|
||||
}
|
||||
}
|
||||
return
|
||||
case resp.StatusCode >= 400 && resp.StatusCode < 500:
|
||||
err = fmt.Errorf("client error<%s>", resp.Status)
|
||||
return
|
||||
case resp.StatusCode >= 500:
|
||||
err = fmt.Errorf("server error<%s>", resp.Status)
|
||||
return
|
||||
default:
|
||||
err = fmt.Errorf("unexpected status code<%s>", resp.Status)
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
@@ -351,6 +351,8 @@ func (fltr *FilterRule) Pass(dDP utils.DataProvider) (result bool, err error) {
|
||||
result, err = fltr.passIPNet(dDP)
|
||||
case utils.MetaAPIBan, utils.MetaNotAPIBan:
|
||||
result, err = fltr.passAPIBan(dDP)
|
||||
case utils.MetaSentryPeer, utils.MetaNotSentryPeer:
|
||||
result, err = fltr.passSentryPeer(dDP)
|
||||
case utils.MetaActivationInterval, utils.MetaNotActivationInterval:
|
||||
result, err = fltr.passActivationInterval(dDP)
|
||||
case utils.MetaRegex, utils.MetaNotRegex:
|
||||
@@ -646,6 +648,20 @@ func (fltr *FilterRule) passAPIBan(dDP utils.DataProvider) (bool, error) {
|
||||
return dm.GetAPIBan(strVal, config.CgrConfig().APIBanCfg().Keys, fltr.Values[0] != utils.MetaAll, true, true)
|
||||
}
|
||||
|
||||
func (fltr *FilterRule) passSentryPeer(dDP utils.DataProvider) (bool, error) {
|
||||
strVal, err := fltr.rsrElement.ParseDataProvider(dDP)
|
||||
if err != nil {
|
||||
if err == utils.ErrNotFound {
|
||||
return false, nil
|
||||
}
|
||||
return false, err
|
||||
}
|
||||
if fltr.Values[0] != "phone-numbers" && fltr.Values[0] != "ip-addresses" {
|
||||
return false, fmt.Errorf("invalid value for sentrypeer filter: <%s>", fltr.Values[0])
|
||||
}
|
||||
return GetSentryPeer(strVal, config.CgrConfig().SentryPeerCfg().Addr, config.CgrConfig().SentryPeerCfg().Token, fltr.Values[0], true, true)
|
||||
}
|
||||
|
||||
func parseTime(rsr *config.RSRParser, dDp utils.DataProvider) (_ time.Time, err error) {
|
||||
var str string
|
||||
if str, err = rsr.ParseDataProvider(dDp); err != nil {
|
||||
|
||||
Reference in New Issue
Block a user