Added filter implementation for sentrypeer

This commit is contained in:
gezimbll
2023-07-12 10:25:42 -04:00
committed by Dan Christian Bogos
parent 13506235ae
commit ba20dbe831
8 changed files with 146 additions and 3 deletions

View File

@@ -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
}

View File

@@ -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 {