diff --git a/changelog b/changelog index b0e8210be..48416562f 100644 --- a/changelog +++ b/changelog @@ -10,6 +10,8 @@ cgrates (0.11) UNRELEASED; urgency=medium * [ConnManager] Added ApierSv2 as internal connection channel instead of ApierSv1 * [DiameterAgent] Using String function from diam.Message instead of ToJSON for request String method + * [DiameterAgent] Updated 3gp_vendor dictionary + * [Templates] Added new dataconvertor: *ip2hex [ Voivozeanu Teofil ] * [AgentRequest] Add support for *group type and correctly overwrite diff --git a/data/diameter/dict/base/3gpp_vendor.xml b/data/diameter/dict/base/3gpp_vendor.xml index aed4d457a..8f8c370fc 100644 --- a/data/diameter/dict/base/3gpp_vendor.xml +++ b/data/diameter/dict/base/3gpp_vendor.xml @@ -2061,7 +2061,7 @@ - + diff --git a/utils/consts.go b/utils/consts.go index 5b3f8bd1f..04fd88c06 100755 --- a/utils/consts.go +++ b/utils/consts.go @@ -587,6 +587,7 @@ const ( ResourceUsage = "ResourceUsage" MetaDuration = "*duration" MetaLibPhoneNumber = "*libphonenumber" + MetaIP2Hex = "*ip2hex" MetaReload = "*reload" MetaLoad = "*load" MetaRemove = "*remove" diff --git a/utils/dataconverter.go b/utils/dataconverter.go index 5dcac41a3..5543d181b 100644 --- a/utils/dataconverter.go +++ b/utils/dataconverter.go @@ -19,7 +19,9 @@ along with this program. If not, see package utils import ( + "encoding/hex" "fmt" + "net" "strconv" "strings" "time" @@ -71,6 +73,8 @@ func NewDataConverter(params string) (conv DataConverter, err error) { return NewDivideConverter(params[len(MetaDivide)+1:]) case params == MetaDuration: return NewDurationConverter("") + case params == MetaIP2Hex: + return &IP2HexConvertor{}, nil case strings.HasPrefix(params, MetaLibPhoneNumber): if len(params) == len(MetaLibPhoneNumber) { return NewPhoneNumberConverter("") @@ -273,3 +277,25 @@ func (lc *PhoneNumberConverter) Convert(in interface{}) (out interface{}, err er } return phonenumbers.Format(num, lc.Format), nil } + +// HexConvertor will round floats +type IP2HexConvertor struct{} + +func (_ *IP2HexConvertor) Convert(in interface{}) (out interface{}, err error) { + var ip net.IP + switch val := in.(type) { + case string: + ip = net.ParseIP(val) + case net.IP: + ip = val + default: + src := IfaceAsString(in) + ip = net.ParseIP(src) + } + + hx := hex.EncodeToString([]byte(ip)) + if len(hx) < 8 { + return hx, nil + } + return "0x" + string([]byte(hx)[len(hx)-8:]), nil +} diff --git a/utils/dataconverter_test.go b/utils/dataconverter_test.go index f0a8206b9..3ae1542e9 100644 --- a/utils/dataconverter_test.go +++ b/utils/dataconverter_test.go @@ -19,6 +19,7 @@ package utils import ( "math" + "net" "reflect" "testing" "time" @@ -611,3 +612,20 @@ func TestPhoneNumberConverter(t *testing.T) { t.Errorf("expecting: %+v, received: %+v", "+496502530000", phoneNumberConverted) } } + +func TestHexConvertor(t *testing.T) { + hx := IP2HexConvertor{} + val := "127.0.0.1" + expected := "0x7f000001" + if rpl, err := hx.Convert(val); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(expected, rpl) { + t.Errorf("expecting: %+v, received: %+v", expected, rpl) + } + val2 := net.ParseIP("127.0.0.1") + if rpl, err := hx.Convert(val2); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(expected, rpl) { + t.Errorf("expecting: %+v, received: %+v", expected, rpl) + } +}