Hello.
package processors
import (
"github.com/lodgify/ngx-lp/format"
log "github.com/sirupsen/logrus"
geo "github.com/oschwald/geoip2-golang"
"net"
"fmt"
"time"
"github.com/lodgify/ngx-lp/configuration"
)
// SetProxyTypeProcessor detects the type of proxy from the LogSource field
func SetGeoIPProcessor(processor Processor, config configuration.Configuration) Processor {
var componentName = "SetGeoIPProcessor"
contextLogger := log.WithFields(log.Fields{
"component": componentName,
})
defer initTimeTrack(time.Now(), componentName, contextLogger)
contextLogger.Debugf("Loading GeoIP database from %s", config.GeoIPDatabaseFile)
db, err := geo.Open(config.GeoIPDatabaseFile)
defer db.Close()
if err != nil {
contextLogger.Fatal("Failed to load GEOIP database ", err)
}
return ProcessorFunc(func(entry format.NginxRequestLogEntry) {
defer timeTrack(time.Now(), componentName, contextLogger)
if entry.DeducedIP == "" {
contextLogger.Error("Missing deduced IP, cannot process GEOIP analysis")
processor.Process(entry)
} else {
ip := net.ParseIP(entry.DeducedIP)
data, err := db.City(ip)
if err != nil {
contextLogger.Error("Failed to get data from IP", err)
}
entry.GeoIP.CityName = data.City.Names["en"]
entry.GeoIP.PostalCode = data.Postal.Code
entry.GeoIP.ContinentCode = data.Continent.Code
entry.GeoIP.ContinentName = data.Continent.Names["en"]
entry.GeoIP.Coordinates = fmt.Sprintf("%f, %f", data.Location.Latitude, data.Location.Longitude)
entry.GeoIP.Latitude = data.Location.Latitude
entry.GeoIP.Longitude = data.Location.Longitude
entry.GeoIP.CountryName = data.Country.Names["en"]
entry.GeoIP.CountryCode = data.Country.IsoCode
entry.GeoIP.Location.Longitude = data.Location.Longitude
entry.GeoIP.Location.Latitude = data.Location.Latitude
processor.Process(entry)
}
})
}
The init phase works fine, but when the ProcessorFunc run, it's crashing the whole Go runtime :
unexpected fault address 0x7fa662d282a3
fatal error: fault
[signal SIGSEGV: segmentation violation code=0x1 addr=0x7fa662d282a3 pc=0x631ab3]
goroutine 7 [running]:
runtime.throw(0x6c778b, 0x5)
/usr/local/Cellar/go/1.9.2/libexec/src/runtime/panic.go:605 +0x95 fp=0xc42012a880 sp=0xc42012a860 pc=0x429c65
runtime.sigpanic()
/usr/local/Cellar/go/1.9.2/libexec/src/runtime/signal_unix.go:374 +0x227 fp=0xc42012a8d0 sp=0xc42012a880 pc=0x43f917
github.com/oschwald/maxminddb-golang.(*Reader).readNode(0xc42006f040, 0x60, 0x0, 0x1, 0x0, 0xc42012a9e0)
/Users/mathieu.poussin/Go/src/github.com/oschwald/maxminddb-golang/reader.go:214 +0xf3 fp=0xc42012a940 sp=0xc42012a8d0 pc=0x631ab3
github.com/oschwald/maxminddb-golang.(*Reader).findAddressInTree(0xc42006f040, 0xc42010e45c, 0x4, 0x4, 0x4, 0x4, 0x0)
/Users/mathieu.poussin/Go/src/github.com/oschwald/maxminddb-golang/reader.go:187 +0xdd fp=0xc42012a9b0 sp=0xc42012a940 pc=0x63186d
github.com/oschwald/maxminddb-golang.(*Reader).lookupPointer(0xc42006f040, 0xc42010e450, 0x10, 0x10, 0x6b3420, 0xc42012aa01, 0xc4200f4100)
/Users/mathieu.poussin/Go/src/github.com/oschwald/maxminddb-golang/reader.go:169 +0x9b fp=0xc42012aa20 sp=0xc42012a9b0 pc=0x6315db
github.com/oschwald/maxminddb-golang.(*Reader).Lookup(0xc42006f040, 0xc42010e450, 0x10, 0x10, 0x6573e0, 0xc4200f4100, 0xc, 0xc42010e450)
/Users/mathieu.poussin/Go/src/github.com/oschwald/maxminddb-golang/reader.go:110 +0x4d fp=0xc42012aa68 sp=0xc42012aa20 pc=0x63135d
github.com/oschwald/geoip2-golang.(*Reader).City(0xc42000efd0, 0xc42010e450, 0x10, 0x10, 0x10, 0x6ca56d, 0x11)
/Users/mathieu.poussin/Go/src/github.com/oschwald/geoip2-golang/reader.go:239 +0x185 fp=0xc42012ab40 sp=0xc42012aa68 pc=0x633395
github.com/lodgify/ngx-lp/processors.SetGeoIPProcessor.func1(0xc420132000, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc42010e382, 0xa, ...)
/Users/mathieu.poussin/Go/src/github.com/lodgify/ngx-lp/processors/geoip.go:38 +0x1ff fp=0xc42012adb8 sp=0xc42012ab40 pc=0x63542f
github.com/lodgify/ngx-lp/processors.ProcessorFunc.Process(0xc42004c2c0, 0xc420132000, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc42010e382, ...)
/Users/mathieu.poussin/Go/src/github.com/lodgify/ngx-lp/processors/processor.go:18 +0x59 fp=0xc42012af98 sp=0xc42012adb8 pc=0x6345e9
github.com/lodgify/ngx-lp/processors.SetDeducedIPProcessor.func1(0xc420132000, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc42010e382, 0xa, ...)
/Users/mathieu.poussin/Go/src/github.com/lodgify/ngx-lp/processors/deduce_ip.go:32 +0x1f1 fp=0xc42012b1d8 sp=0xc42012af98 pc=0x634d61
github.com/lodgify/ngx-lp/processors.ProcessorFunc.Process(0xc42005d410, 0xc420132000, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc42010e382, ...)
/Users/mathieu.poussin/Go/src/github.com/lodgify/ngx-lp/processors/processor.go:18 +0x59 fp=0xc42012b3b8 sp=0xc42012b1d8 pc=0x6345e9
github.com/lodgify/ngx-lp/processors.SetEnvironmentProcessor.func1(0xc420132000, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc42010e382, 0xa, ...)
/Users/mathieu.poussin/Go/src/github.com/lodgify/ngx-lp/processors/detect_environment.go:32 +0x1ad fp=0xc42012b5c8 sp=0xc42012b3b8 pc=0x6350ed
github.com/lodgify/ngx-lp/processors.ProcessorFunc.Process(0xc42005d4a0, 0xc420132000, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc42010e382, ...)
/Users/mathieu.poussin/Go/src/github.com/lodgify/ngx-lp/processors/processor.go:18 +0x59 fp=0xc42012b7a8 sp=0xc42012b5c8 pc=0x6345e9
github.com/lodgify/ngx-lp/processors.SetProxyTypeProcessor.func1(0xc420132000, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc42010e382, 0xa, ...)
/Users/mathieu.poussin/Go/src/github.com/lodgify/ngx-lp/processors/proxy_type.go:31 +0x1ad fp=0xc42012b9b8 sp=0xc42012b7a8 pc=0x635a4d
github.com/lodgify/ngx-lp/processors.ProcessorFunc.Process(0xc42005d530, 0xc420132000, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc42010e382, ...)
/Users/mathieu.poussin/Go/src/github.com/lodgify/ngx-lp/processors/processor.go:18 +0x59 fp=0xc42012bb98 sp=0xc42012b9b8 pc=0x6345e9
main.main.func1(0xc420062460, 0x807a00, 0xc42005d530, 0xc42005a1e0)
/Users/mathieu.poussin/Go/src/github.com/lodgify/ngx-lp/main.go:60 +0x85 fp=0xc42012bfc0 sp=0xc42012bb98 pc=0x636a25
runtime.goexit()
/usr/local/Cellar/go/1.9.2/libexec/src/runtime/asm_amd64.s:2337 +0x1 fp=0xc42012bfc8 sp=0xc42012bfc0 pc=0x457501
created by main.main
/Users/mathieu.poussin/Go/src/github.com/lodgify/ngx-lp/main.go:50 +0x72e
goroutine 1 [semacquire]:
sync.runtime_Semacquire(0xc4200962fc)
/usr/local/Cellar/go/1.9.2/libexec/src/runtime/sema.go:56 +0x39
sync.(*WaitGroup).Wait(0xc4200962f0)
/usr/local/Cellar/go/1.9.2/libexec/src/sync/waitgroup.go:131 +0x72
gopkg.in/mcuadros/go-syslog%2ev2.(*Server).Wait(0xc4200962c0)
/Users/mathieu.poussin/Go/src/gopkg.in/mcuadros/go-syslog.v2/server.go:305 +0x31
main.main()
/Users/mathieu.poussin/Go/src/github.com/lodgify/ngx-lp/main.go:67 +0x73c
goroutine 5 [chan receive]:
gopkg.in/mcuadros/go-syslog%2ev2.(*Server).goParseDatagrams.func1(0xc4200962c0)
/Users/mathieu.poussin/Go/src/gopkg.in/mcuadros/go-syslog.v2/server.go:363 +0x12a
created by gopkg.in/mcuadros/go-syslog%2ev2.(*Server).goParseDatagrams
/Users/mathieu.poussin/Go/src/gopkg.in/mcuadros/go-syslog.v2/server.go:359 +0x90
goroutine 6 [IO wait]:
internal/poll.runtime_pollWait(0x7fa665edff70, 0x72, 0x0)
/usr/local/Cellar/go/1.9.2/libexec/src/runtime/netpoll.go:173 +0x57
internal/poll.(*pollDesc).wait(0xc4200ee098, 0x72, 0x0, 0x0, 0x0)
/usr/local/Cellar/go/1.9.2/libexec/src/internal/poll/fd_poll_runtime.go:85 +0xae
internal/poll.(*pollDesc).waitRead(0xc4200ee098, 0xc420110000, 0x10000, 0x10000)
/usr/local/Cellar/go/1.9.2/libexec/src/internal/poll/fd_poll_runtime.go:90 +0x3d
internal/poll.(*FD).ReadFrom(0xc4200ee080, 0xc420110000, 0x10000, 0x10000, 0x0, 0x0, 0x0, 0x0, 0x0)
/usr/local/Cellar/go/1.9.2/libexec/src/internal/poll/fd_unix.go:170 +0x19a
net.(*netFD).readFrom(0xc4200ee080, 0xc420110000, 0x10000, 0x10000, 0x451de0, 0xc42003cdf8, 0xc42003ce50, 0xc42003ce70, 0x40e30e)
/usr/local/Cellar/go/1.9.2/libexec/src/net/fd_unix.go:208 +0x5e
net.(*UDPConn).readFrom(0xc42000c078, 0xc420110000, 0x10000, 0x10000, 0xc42003cf10, 0x46bccb, 0x6619c0, 0xc420106020)
/usr/local/Cellar/go/1.9.2/libexec/src/net/udpsock_posix.go:47 +0x6a
net.(*UDPConn).ReadFrom(0xc42000c078, 0xc420110000, 0x10000, 0x10000, 0x264, 0x808f00, 0xc42010c000, 0x0, 0x0)
/usr/local/Cellar/go/1.9.2/libexec/src/net/udpsock.go:118 +0x72
gopkg.in/mcuadros/go-syslog%2ev2.(*Server).goReceiveDatagrams.func1(0xc4200962c0, 0x80c0c0, 0xc42000c078)
/Users/mathieu.poussin/Go/src/gopkg.in/mcuadros/go-syslog.v2/server.go:329 +0x103
created by gopkg.in/mcuadros/go-syslog%2ev2.(*Server).goReceiveDatagrams
/Users/mathieu.poussin/Go/src/gopkg.in/mcuadros/go-syslog.v2/server.go:325 +0x70
Any idea of what can be the issue ? In this case the IP trying to be analysed is a private one but I suppose it should not panic for this.