diff --git a/agents/diam_it_test.go b/agents/diam_it_test.go index 05a4411a7..892c0b3b1 100644 --- a/agents/diam_it_test.go +++ b/agents/diam_it_test.go @@ -116,7 +116,7 @@ func testDiamItResetStorDb(t *testing.T) { // Start CGR Engine func testDiamItStartEngine(t *testing.T) { - if _, err := engine.StopStartEngine(daCfgPath, 4000); err != nil { + if _, err := engine.StopStartEngine(daCfgPath, 200); err != nil { t.Fatal(err) } } @@ -646,7 +646,7 @@ func testDiamItCCRTerminate(t *testing.T) { if cdrs[0].Usage != 550*time.Second { t.Errorf("Unexpected Usage CDR: %+v", cdrs[0]) } - + // in case of sctp we get OriginHost ip1/ip2/ip3/... if !strings.Contains(cdrs[0].OriginHost, "127.0.0.1") { t.Errorf("Unexpected OriginHost CDR: %+v", cdrs[0]) } diff --git a/agents/httpagent_it_test.go b/agents/httpagent_it_test.go index 2fe0d2d82..2e105f401 100644 --- a/agents/httpagent_it_test.go +++ b/agents/httpagent_it_test.go @@ -250,6 +250,9 @@ func testHAitCDRmtcall(t *testing.T) { if cdrs[0].Cost != 0.2188 { t.Errorf("Unexpected CDR Cost received, cdr: %+v ", cdrs[0].Cost) } + if cdrs[0].OriginHost != "127.0.0.1" { + t.Errorf("Unexpected CDR OriginHost received, cdr: %+v ", cdrs[0].OriginHost) + } } } diff --git a/agents/libdiam.go b/agents/libdiam.go index 8f5f0528e..75043872b 100644 --- a/agents/libdiam.go +++ b/agents/libdiam.go @@ -311,7 +311,7 @@ func (dP *diameterDP) FieldAsString(fldPath []string) (data string, err error) { // RemoteHost is part of engine.DataProvider interface func (dP *diameterDP) RemoteHost() net.Addr { - return dP.c.RemoteAddr() + return utils.NewNetAddr(dP.c.RemoteAddr().Network(), dP.c.RemoteAddr().String()) } // FieldAsInterface is part of engine.DataProvider interface diff --git a/agents/libhttpagent.go b/agents/libhttpagent.go index 1a5bd549c..11d9077bc 100644 --- a/agents/libhttpagent.go +++ b/agents/libhttpagent.go @@ -103,7 +103,7 @@ func (hU *httpUrlDP) AsNavigableMap([]*config.FCTemplate) ( // RemoteHost is part of engine.DataProvider interface func (hU *httpUrlDP) RemoteHost() net.Addr { - return newHttpRemoteAddr(hU.req.RemoteAddr) + return utils.NewNetAddr("TCP", hU.req.RemoteAddr) } func newHTTPXmlDP(req *http.Request) (dP config.DataProvider, err error) { @@ -198,7 +198,7 @@ func (hU *httpXmlDP) AsNavigableMap([]*config.FCTemplate) ( // RemoteHost is part of engine.DataProvider interface func (hU *httpXmlDP) RemoteHost() net.Addr { - return newHttpRemoteAddr(hU.addr) + return utils.NewNetAddr("TCP", hU.addr) } // httpAgentReplyEncoder will encode []*engine.NMElement @@ -245,20 +245,3 @@ func (xE *haXMLEncoder) Encode(nM *config.NavigableMap) (err error) { _, err = xE.w.Write(xmlOut) return } - -func newHttpRemoteAddr(ip string) *httpRemoteAddr { - return &httpRemoteAddr{ip: ip} - -} - -type httpRemoteAddr struct { - ip string -} - -func (http *httpRemoteAddr) Network() string { - return utils.TCP -} - -func (http *httpRemoteAddr) String() string { - return http.ip -} diff --git a/agents/librad.go b/agents/librad.go index d72f0dc7e..e7ef2e304 100644 --- a/agents/librad.go +++ b/agents/librad.go @@ -193,5 +193,5 @@ func (pk *radiusDP) AsNavigableMap([]*config.FCTemplate) ( // RemoteHost is part of engine.DataProvider interface func (pk *radiusDP) RemoteHost() net.Addr { - return pk.req.RemoteAddr() + return utils.NewNetAddr(pk.req.RemoteAddr().Network(), pk.req.RemoteAddr().String()) } diff --git a/agents/radagent_it_test.go b/agents/radagent_it_test.go index d5b404be9..087c07670 100644 --- a/agents/radagent_it_test.go +++ b/agents/radagent_it_test.go @@ -282,6 +282,9 @@ func TestRAitAcctStop(t *testing.T) { if cdrs[0].Cost != 0.01 { t.Errorf("Unexpected CDR Cost received for CDR: %v", cdrs[0].Cost) } + if cdrs[0].ExtraFields["RemoteAddr"] != "127.0.0.1" { + t.Errorf("Unexpected CDR RemoteAddr received for CDR: %+v", utils.ToJSON(cdrs[0])) + } } } diff --git a/cdrc/csv.go b/cdrc/csv.go index f6e314e99..78fde3964 100644 --- a/cdrc/csv.go +++ b/cdrc/csv.go @@ -276,5 +276,5 @@ func (cP *csvProvider) AsNavigableMap([]*config.FCTemplate) ( // RemoteHost is part of engine.DataProvider interface func (cP *csvProvider) RemoteHost() net.Addr { - return new(utils.LocalAddr) + return utils.LocalAddr() } diff --git a/cdrc/fwv.go b/cdrc/fwv.go index 0036fcde3..5e5114f37 100644 --- a/cdrc/fwv.go +++ b/cdrc/fwv.go @@ -325,5 +325,5 @@ func (fP *fwvProvider) AsNavigableMap([]*config.FCTemplate) ( // RemoteHost is part of engine.DataProvider interface func (fP *fwvProvider) RemoteHost() net.Addr { - return new(utils.LocalAddr) + return utils.LocalAddr() } diff --git a/cdrc/xml.go b/cdrc/xml.go index 3c67129ba..d46d70872 100644 --- a/cdrc/xml.go +++ b/cdrc/xml.go @@ -279,5 +279,5 @@ func (xP *xmlProvider) AsNavigableMap([]*config.FCTemplate) ( // RemoteHost is part of engine.DataProvider interface func (xP *xmlProvider) RemoteHost() net.Addr { - return new(utils.LocalAddr) + return utils.LocalAddr() } diff --git a/config/navigablemap.go b/config/navigablemap.go index e00b0d200..20a647a9f 100644 --- a/config/navigablemap.go +++ b/config/navigablemap.go @@ -170,7 +170,7 @@ func (nM *NavigableMap) String() string { // RemoteHost is part of engine.DataProvider interface func (nM *NavigableMap) RemoteHost() net.Addr { - return new(utils.LocalAddr) + return utils.LocalAddr() } // indexMapElements will recursively go through map and index the element paths into elmns diff --git a/data/conf/samples/httpagent/httpagent.json b/data/conf/samples/httpagent/httpagent.json index 7ce1e5b82..f25071683 100644 --- a/data/conf/samples/httpagent/httpagent.json +++ b/data/conf/samples/httpagent/httpagent.json @@ -65,6 +65,8 @@ "value": "*pseudoprepaid", "mandatory": true}, {"tag": "OriginID", "field_id": "OriginID", "type": "*composed", "value": "~*req.CDR_ID", "mandatory": true}, + {"tag": "OriginHost", "field_id": "OriginHost", "type": "*remote_host", + "mandatory": true}, {"tag": "Account", "field_id": "Account", "type": "*composed", "value": "~*req.msisdn", "mandatory": true}, {"tag": "Destination", "field_id": "Destination", "type": "*composed", diff --git a/data/conf/samples/httpagenttls/httpagent.json b/data/conf/samples/httpagenttls/httpagent.json index 1c0012b45..e37484d6a 100755 --- a/data/conf/samples/httpagenttls/httpagent.json +++ b/data/conf/samples/httpagenttls/httpagent.json @@ -65,6 +65,8 @@ "value": "*pseudoprepaid", "mandatory": true}, {"tag": "OriginID", "field_id": "OriginID", "type": "*composed", "value": "~*req.CDR_ID", "mandatory": true}, + {"tag": "OriginHost", "field_id": "OriginHost", "type": "*remote_host", + "mandatory": true}, {"tag": "Account", "field_id": "Account", "type": "*composed", "value": "~*req.msisdn", "mandatory": true}, {"tag": "Destination", "field_id": "Destination", "type": "*composed", diff --git a/data/conf/samples/radagent/cgrates.json b/data/conf/samples/radagent/cgrates.json index 99899a587..6e58f3e9b 100644 --- a/data/conf/samples/radagent/cgrates.json +++ b/data/conf/samples/radagent/cgrates.json @@ -146,6 +146,7 @@ "value": "~*req.Ascend-User-Acct-Time", "mandatory": true}, {"tag": "Usage", "field_id": "Usage", "type": "*usage_difference", "value": "~*req.Event-Timestamp;~*req.Ascend-User-Acct-Time", "mandatory": true}, + {"tag": "RemoteAddr" , "field_id": "RemoteAddr", "type": "*remote_host"}, ], "reply_fields":[], }, diff --git a/engine/action.go b/engine/action.go index 0bf6a8008..9a0784a9a 100644 --- a/engine/action.go +++ b/engine/action.go @@ -906,5 +906,5 @@ func (cdrP *cdrLogProvider) AsNavigableMap([]*config.FCTemplate) ( // RemoteHost is part of engine.DataProvider interface func (cdrP *cdrLogProvider) RemoteHost() net.Addr { - return new(utils.LocalAddr) + return utils.LocalAddr() } diff --git a/engine/calldesc.go b/engine/calldesc.go index 3ad9c35e4..12c503229 100644 --- a/engine/calldesc.go +++ b/engine/calldesc.go @@ -1095,5 +1095,5 @@ func (cd *CallDescriptor) AsNavigableMap(tpl []*config.FCTemplate) (nM *config.N // RemoteHost is part of utils.DataProvider func (cd *CallDescriptor) RemoteHost() net.Addr { - return new(utils.LocalAddr) + return utils.LocalAddr() } diff --git a/engine/mapevent.go b/engine/mapevent.go index 9918d83a5..f8fdf2904 100644 --- a/engine/mapevent.go +++ b/engine/mapevent.go @@ -65,7 +65,7 @@ func (me MapEvent) AsNavigableMap([]*config.FCTemplate) (*config.NavigableMap, e } func (me MapEvent) RemoteHost() net.Addr { - return new(utils.LocalAddr) + return utils.LocalAddr() } func (me MapEvent) HasField(fldName string) (has bool) { diff --git a/loaders/libloader.go b/loaders/libloader.go index 547dc18fc..f2823df90 100644 --- a/loaders/libloader.go +++ b/loaders/libloader.go @@ -139,5 +139,5 @@ func (cP *csvProvider) AsNavigableMap([]*config.FCTemplate) ( // RemoteHost is part of engine.DataProvider interface func (cP *csvProvider) RemoteHost() net.Addr { - return new(utils.LocalAddr) + return utils.LocalAddr() } diff --git a/utils/dateseries.go b/utils/dateseries.go index 7d119a66a..e447dba7e 100644 --- a/utils/dateseries.go +++ b/utils/dateseries.go @@ -20,6 +20,7 @@ package utils import ( "fmt" + "net" "reflect" "sort" "strconv" @@ -340,12 +341,49 @@ func DaysInYear(year int) float64 { return float64(last.Sub(first).Hours() / 24) } -type LocalAddr struct{} - -func (lc *LocalAddr) Network() string { - return Local +func LocalAddr() *NetAddr { + return &NetAddr{network: Local, ip: Local} } -func (lc *LocalAddr) String() string { - return Local +func NewNetAddr(network, host string) *NetAddr { + ip, port, err := net.SplitHostPort(host) + if err != nil { + Logger.Warning(fmt.Sprintf("failed parsing RemoteAddr: %s, err: %s", + host, err.Error())) + } + p, err := strconv.Atoi(port) + if err != nil { + Logger.Warning(fmt.Sprintf("failed converting port : %+v, err: %s", + port, err.Error())) + } + return &NetAddr{network: network, ip: ip, port: p} +} + +type NetAddr struct { + network string + ip string + port int +} + +// Network is part of net.Addr interface +func (lc *NetAddr) Network() string { + return lc.network +} + +// String is part of net.Addr interface +func (lc *NetAddr) String() string { + return lc.ip +} + +// Port +func (lc *NetAddr) Port() int { + return lc.port +} + +// Host +func (lc *NetAddr) Host() string { + if lc.ip == Local { + return Local + } + return ConcatenatedKey(lc.ip, strconv.Itoa(lc.port)) }