diff --git a/changelog b/changelog index abcfba703..7b2ce7d44 100644 --- a/changelog +++ b/changelog @@ -6,6 +6,8 @@ cgrates (0.10) UNRELEASED; urgency=medium * [SessionS] Added check for missing CGRevent * [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 3ad1ee348..1568fce0b 100755 --- a/utils/consts.go +++ b/utils/consts.go @@ -586,6 +586,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) + } +}