diff --git a/cmd/autostart/autostart.go b/cmd/autostart/autostart.go index 0f4438a..a0bafeb 100644 --- a/cmd/autostart/autostart.go +++ b/cmd/autostart/autostart.go @@ -2,54 +2,64 @@ package main import ( "git.timovolkmann.de/gyrogpsc/core" - "git.timovolkmann.de/gyrogpsc/database" + "git.timovolkmann.de/gyrogpsc/storage" "git.timovolkmann.de/gyrogpsc/web" + "github.com/sirupsen/logrus" "github.com/spf13/viper" - "log" "time" ) func main() { conf := configurationFromFile() - repo := database.NewRepository(conf) + repo := storage.NewRepository(conf) disp := core.NewDispatcher() service := core.TrackingService(repo, disp, conf) go func() { - service.NewTracking(core.TCP) + service.NewTracking(core.TCP, core.SERIAL) time.Sleep(5 * time.Second) service.StartRecord() - time.Sleep(15 * time.Second) - //service.StopRecord() + time.Sleep(20 * time.Second) + service.StopRecord() + time.Sleep(5 * time.Second) + service.NewTracking(core.TCP) + service.NewTracking(core.SERIAL) + time.Sleep(5 * time.Second) + service.StartRecord() + time.Sleep(20 * time.Second) + service.StopRecord() }() web.CreateServer(service, disp, conf) } func configurationFromFile() *core.Configuration { - viper.SetDefault("collectors.port_tcp", ":3010") - viper.SetDefault("collectors.port_serial", "/dev/tty.usbmodem14201") + viper.SetDefault("collectors.porttcp", ":3010") + viper.SetDefault("collectors.portserial", "/dev/tty.usbmodem14201") viper.SetDefault("webserver.port", ":3011") viper.SetDefault("pipeline.publishIntervalMs", 50) viper.SetDefault("pipeline.syncUpdateIntervalMs", 494) + viper.SetDefault("debuglevel", "INFO") viper.SetConfigName("gpsconfig") // name of config file (without extension) viper.SetConfigType("yaml") viper.AddConfigPath(".") viper.AddConfigPath("./../../") if err := viper.ReadInConfig(); err != nil { - log.Println("couldn't find config file. using standard configuration") + logrus.Warn("couldn't find config file. using standard configuration") } - log.Println(viper.AllKeys()) - log.Println(viper.AllSettings()) c := core.Configuration{} if err := viper.Unmarshal(&c); err != nil { - log.Println("couldn't load config...") - log.Println(err) + logrus.Debug("couldn't load config...") + logrus.Error(err) } - log.Println(c) + lvl, err := logrus.ParseLevel(c.Debuglevel) + if err != nil { + logrus.Error(err) + } + logrus.SetLevel(lvl) return &c -} \ No newline at end of file +} diff --git a/cmd/server/server.go b/cmd/server/server.go index a5a9ef1..33d557d 100644 --- a/cmd/server/server.go +++ b/cmd/server/server.go @@ -2,17 +2,17 @@ package main import ( "git.timovolkmann.de/gyrogpsc/core" - "git.timovolkmann.de/gyrogpsc/database" + "git.timovolkmann.de/gyrogpsc/storage" "git.timovolkmann.de/gyrogpsc/web" + "github.com/sirupsen/logrus" "github.com/spf13/viper" - "log" ) func main() { conf := &core.Configuration{} configurationFromFile(conf) - repo := database.NewRepository(conf) + repo := storage.NewRepository(conf) disp := core.NewDispatcher() service := core.TrackingService(repo, disp, conf) @@ -33,5 +33,5 @@ func configurationFromFile(c *core.Configuration) { viper.AddConfigPath("./../../") viper.Unmarshal(c) - log.Println(c) -} \ No newline at end of file + logrus.Println(c) +} diff --git a/core/collectors.go b/core/collectors.go index fb3ed1a..27339ea 100644 --- a/core/collectors.go +++ b/core/collectors.go @@ -3,8 +3,8 @@ package core import ( "fmt" "git.timovolkmann.de/gyrogpsc/ublox" + "github.com/sirupsen/logrus" "go.bug.st/serial" - "log" "net" "os" ) @@ -50,13 +50,13 @@ type serialCollector struct { func (s *serialCollector) Collect() { s.active = true go func() { - log.Println("start serial collector") + logrus.Println("start serial collector") mode := &serial.Mode{ BaudRate: 115200, } port, err := serial.Open(s.config.Collectors.SerialCollectorPort, mode) if err != nil { - log.Fatalln(err.Error()) + logrus.Fatalln(err.Error()) } defer port.Close() @@ -68,12 +68,12 @@ func (s *serialCollector) Collect() { if err.Error() == "NMEA not implemented" { continue } - log.Println("serial read err:", err) + logrus.Println("serial read err:", err) break } sd, err := ConvertUbxToSensorData(meas) if err != nil { - log.Println("convert err:", err, meas, sd) + logrus.Println("convert err:", err, meas, sd) continue } // skip irrelevant messages @@ -83,11 +83,11 @@ func (s *serialCollector) Collect() { err = s.proc.Push(sd) if err != nil { - log.Println("process err:", err, *sd) + logrus.Println("process err:", err, *sd) continue } } - log.Println("serial collector stopped") + logrus.Println("serial collector stopped") }() } @@ -122,7 +122,7 @@ func (t *tcpCollector) SetProcessor(p Pusher) { } func newTcp(proc Pusher, config *Configuration) *tcpCollector { - log.Println("start tcp collector") + logrus.Println("start tcp collector") listener, err := net.Listen("tcp", config.Collectors.TcpCollectorPort) if err != nil { @@ -141,7 +141,7 @@ func newTcp(proc Pusher, config *Configuration) *tcpCollector { fmt.Println("Error accepting: ", err.Error()) os.Exit(1) } - log.Println("...new incoming tcp connection...") + logrus.Println("...new incoming tcp connection...") // Handle connections in a new goroutine. go coll.jsonHandler(conn) @@ -169,7 +169,7 @@ func (c *tcpCollector) jsonHandler(conn net.Conn) { //fmt.Println(string(buf[:n])) sd, err := ConvertSensorDataPhone(buf[:n]) if err != nil { - log.Println(err) + logrus.Println(err) continue } if !c.active { @@ -178,7 +178,7 @@ func (c *tcpCollector) jsonHandler(conn net.Conn) { } err = c.processor.Push(sd) if err != nil { - log.Fatalln(err) + logrus.Fatalln(err) } } -} \ No newline at end of file +} diff --git a/core/config.go b/core/config.go index dad3510..7d6255d 100644 --- a/core/config.go +++ b/core/config.go @@ -1,23 +1,16 @@ package core type Configuration struct { - Collectors struct{ - TcpCollectorPort string `mapstructure:"porttcp"` - SerialCollectorPort string `mapstructure:"portserial"` + Collectors struct { + TcpCollectorPort string `mapstructure:"porttcp"` + SerialCollectorPort string `mapstructure:"portserial"` } `mapstructure:"collectors"` Webserver struct { Port string `mapstructure:"port"` } `mapstructure:"webserver"` Pipeline struct { - PublishIntervalMs int `mapstructure:"publishintervalms"` - SyncUpdateIntervalMs int `mapstructure:"syncupdateintervalms"` + PublishIntervalMs int `mapstructure:"publishintervalms"` + SyncUpdateIntervalMs int `mapstructure:"syncupdateintervalms"` } `mapstructure:"pipeline"` -} - -type Configuration2 struct { - TcpCollectorPort string `mapstructure:"collectors.porttcp"` - SerialCollectorPort string `mapstructure:"collectors.portserial"` - HttpPort string `mapstructure:"webserver.port"` - PublishIntervalMs int `mapstructure:"pipeline.publishintervalms"` - SyncUpdateIntervalMs int `mapstructure:"pipeline.syncupdateintervalms"` + Debuglevel string `mapstructure:"debuglevel"` } diff --git a/core/dispatcher.go b/core/dispatcher.go index f2c7684..94d2197 100644 --- a/core/dispatcher.go +++ b/core/dispatcher.go @@ -2,7 +2,7 @@ package core import ( "errors" - "log" + "github.com/sirupsen/logrus" ) type dispatcher struct { @@ -17,9 +17,8 @@ func NewDispatcher() *dispatcher { } } - func (d *dispatcher) Publish(message string) { - log.Printf("publish to %v listeners:\n%v\n", len(d.listeners), message) + logrus.Debugf("publish to %v listeners:\n%v\n", len(d.listeners), message) for _, ch := range d.listeners { ch <- message } diff --git a/core/pipeline.go b/core/pipeline.go index faf2032..e77bbe3 100644 --- a/core/pipeline.go +++ b/core/pipeline.go @@ -1,194 +1,204 @@ package core import ( - "encoding/json" - "errors" - "fmt" - "github.com/google/go-cmp/cmp" - "github.com/google/go-cmp/cmp/cmpopts" - "log" - "sync" - "time" + "encoding/json" + "errors" + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/sirupsen/logrus" + "sync" + "time" ) type pipeline struct { - active bool - record bool - synchroniz synchronizer - buffer pipeBuffer - publisher Publisher - storer Storer - publishTicker *time.Ticker + active bool + record bool + synchroniz synchronizer + buffer pipeBuffer + publisher Publisher + storer Storer + publishTicker *time.Ticker } // pipe implements Runner & Pusher func NewPipeline(d Publisher, s Storer, conf *Configuration) *pipeline { - return &pipeline{ - false, - false, - synchronizer{ - //bufferSize: 100, - mutex: &sync.Mutex{}, - updateTicker: time.NewTicker(time.Duration(conf.Pipeline.SyncUpdateIntervalMs) * time.Millisecond), - }, - pipeBuffer{ - tcpMutex: &sync.Mutex{}, - serialMutex: &sync.Mutex{}, - }, - d, - s, - time.NewTicker(time.Duration(conf.Pipeline.PublishIntervalMs) * time.Millisecond), - } + return &pipeline{ + false, + false, + synchronizer{ + //bufferSize: 100, + mutex: &sync.RWMutex{}, + updateTicker: time.NewTicker(time.Duration(conf.Pipeline.SyncUpdateIntervalMs) * time.Millisecond), + }, + pipeBuffer{ + tcpMutex: &sync.Mutex{}, + serialMutex: &sync.Mutex{}, + }, + d, + s, + time.NewTicker(time.Duration(conf.Pipeline.PublishIntervalMs) * time.Millisecond), + } } func (p *pipeline) Run() { - p.active = true - log.Println("pipe: processing service started") - go func() { - for p.active { - <-p.synchroniz.updateTicker.C - err := p.refreshDelay() - if err != nil { - log.Println(err) - } - } - log.Println("pipe: updater stopped") - }() - go func() { - for p.active { - <-p.publishTicker.C - err := p.publish() - if err != nil && err.Error() != "no data available" { - log.Println(err) - } - } - log.Println("pipe: publisher stopped") - }() + p.active = true + logrus.Println("pipe: processing service started") + go func() { + for p.active { + <-p.synchroniz.updateTicker.C + err := p.refreshDelay() + if err != nil { + logrus.Debugln(err) + } + } + logrus.Println("pipe: updater stopped") + }() + go func() { + for p.active { + <-p.publishTicker.C + err := p.publish() + if err != nil && err.Error() != "no data available" { + logrus.Debug(err) + } + } + logrus.Println("pipe: publisher stopped") + }() } func (p *pipeline) Record() { - p.record = true + p.record = true } func (p *pipeline) Stop() { - p.record = false + p.record = false } func (p *pipeline) publish() error { - p.buffer.tcpMutex.Lock() - p.buffer.serialMutex.Lock() + p.buffer.tcpMutex.Lock() + p.buffer.serialMutex.Lock() - if (p.buffer.MeasTcp == sensorData{} && p.buffer.MeasSerial == sensorData{}) { - p.buffer.tcpMutex.Unlock() - p.buffer.serialMutex.Unlock() - return errors.New("no data available") - } - if cmp.Equal(p.buffer.MeasTcp, p.buffer.LastMeasTcp, cmpopts.IgnoreUnexported(sensorData{})) && - cmp.Equal(p.buffer.MeasSerial, p.buffer.LastMeasSerial, cmpopts.IgnoreUnexported(sensorData{})) { - p.buffer.tcpMutex.Unlock() - p.buffer.serialMutex.Unlock() - return errors.New("same data") - } - log.Println("––––––––––––––––––––––––––––––––––––") - log.Printf("MEAS old: %v", p.buffer.LastMeasTcp) - log.Printf("MEAS new: %v", p.buffer.MeasTcp) - log.Println("––––––––––––––––––––––––––––––––––––") - p.buffer.LastMeasTcp = p.buffer.MeasTcp - p.buffer.LastMeasSerial = p.buffer.MeasSerial - p.storer.EnqueuePair(p.buffer.MeasTcp, p.buffer.MeasSerial) + if (p.buffer.MeasTcp == sensorData{} && p.buffer.MeasSerial == sensorData{}) { + p.buffer.tcpMutex.Unlock() + p.buffer.serialMutex.Unlock() + return errors.New("no data available") + } + if cmp.Equal(p.buffer.MeasTcp, p.buffer.LastMeasTcp, cmpopts.IgnoreUnexported(sensorData{})) && + cmp.Equal(p.buffer.MeasSerial, p.buffer.LastMeasSerial, cmpopts.IgnoreUnexported(sensorData{})) { + p.buffer.tcpMutex.Unlock() + p.buffer.serialMutex.Unlock() + return errors.New("same data") + } + logrus.Debug("––––––––––––––––––––––––––––––––––––") + logrus.Debugf("MEAS old: %v", p.buffer.LastMeasTcp) + logrus.Debugf("MEAS new: %v", p.buffer.MeasTcp) + logrus.Debug("––––––––––––––––––––––––––––––––––––") + p.buffer.LastMeasTcp = p.buffer.MeasTcp + p.buffer.LastMeasSerial = p.buffer.MeasSerial + p.storer.EnqueuePair(p.buffer.MeasTcp, p.buffer.MeasSerial) - data := map[string]sensorData{ - string(SOURCE_TCP): p.buffer.MeasTcp, - string(SOURCE_SERIAL): p.buffer.MeasSerial, - } + data := map[string]sensorData{ + string(SOURCE_TCP): p.buffer.MeasTcp, + string(SOURCE_SERIAL): p.buffer.MeasSerial, + } - p.buffer.tcpMutex.Unlock() - p.buffer.serialMutex.Unlock() + p.buffer.tcpMutex.Unlock() + p.buffer.serialMutex.Unlock() - jdata, err := json.Marshal(data) - //log.Println(string(pretty.Pretty(jdata))) - if err != nil { - return err - } - p.publisher.Publish(string(jdata)) - return nil + jdata, err := json.Marshal(data) + //logrus.Println(string(pretty.Pretty(jdata))) + if err != nil { + return err + } + p.publisher.Publish(string(jdata)) + return nil } type pipeBuffer struct { - MeasTcp sensorData - MeasSerial sensorData - LastMeasTcp sensorData - LastMeasSerial sensorData - tcpMutex *sync.Mutex - serialMutex *sync.Mutex + MeasTcp sensorData + MeasSerial sensorData + LastMeasTcp sensorData + LastMeasSerial sensorData + tcpMutex *sync.Mutex + serialMutex *sync.Mutex } type UnixNanoTime int64 type synchronizer struct { - tcpSerialDelayMs int64 - mutex *sync.Mutex - updateTicker *time.Ticker + tcpSerialDelayMs int64 + mutex *sync.RWMutex + updateTicker *time.Ticker } func (p *pipeline) refreshDelay() error { - log.Println("refreshing delay....") - fmt.Println("Delay TCP/SERIAL", p.synchroniz.tcpSerialDelayMs) - p.buffer.serialMutex.Lock() - p.buffer.tcpMutex.Lock() - tcpTime := time.Unix(0, p.buffer.MeasTcp.Timestamp) - serTime := time.Unix(0, p.buffer.MeasSerial.Timestamp) - p.buffer.serialMutex.Unlock() - p.buffer.tcpMutex.Unlock() - if tcpTime.UnixNano() == 0 || serTime.UnixNano() == 0 { - return errors.New("no sync possible. check if both collectors running. otherwise check GPS fix") - } - currentDelay := tcpTime.Sub(serTime).Milliseconds() - if currentDelay > 5000 || currentDelay < -5000 { - p.synchroniz.tcpSerialDelayMs = 0 - return errors.New("skipping synchronisation! time not properly configured or facing network problems.") - } - log.Println("TCP", tcpTime.String()) - log.Println("SER", serTime.String()) - log.Println("Difference", tcpTime.Sub(serTime).Milliseconds(), "ms") - delay := tcpTime.Sub(serTime).Milliseconds() - p.synchroniz.tcpSerialDelayMs += delay - return nil + p.synchroniz.mutex.RLock() + if p.synchroniz.tcpSerialDelayMs != 0 { + logrus.Println("Delay TCP/SERIAL", p.synchroniz.tcpSerialDelayMs) + } + p.synchroniz.mutex.RUnlock() + p.buffer.serialMutex.Lock() + p.buffer.tcpMutex.Lock() + tcpTime := time.Unix(0, p.buffer.MeasTcp.Timestamp) + serTime := time.Unix(0, p.buffer.MeasSerial.Timestamp) + p.buffer.tcpMutex.Unlock() + p.buffer.serialMutex.Unlock() + if tcpTime.UnixNano() == 0 || serTime.UnixNano() == 0 { + return errors.New("no sync possible. check if both collectors running. otherwise check GPS fix") + } + currentDelay := tcpTime.Sub(serTime).Milliseconds() + if currentDelay > 5000 || currentDelay < -5000 { + p.synchroniz.mutex.Lock() + p.synchroniz.tcpSerialDelayMs = 0 + p.synchroniz.mutex.Unlock() + return errors.New("skipping synchronisation! time not properly configured or facing network problems.") + } + logrus.Debug("TCP", tcpTime.String()) + logrus.Debug("SER", serTime.String()) + logrus.Debug("Difference", tcpTime.Sub(serTime).Milliseconds(), "ms") + delay := tcpTime.Sub(serTime).Milliseconds() + p.synchroniz.mutex.Lock() + p.synchroniz.tcpSerialDelayMs += delay + p.synchroniz.mutex.Unlock() + return nil } func (p *pipeline) Push(data *sensorData) error { - if data == nil { - return errors.New("nil processing not allowed") - } - //log.Println("push data to pipe:", string(data.source)) - p.storer.EnqueueRaw(*data) - switch data.source { - case SOURCE_TCP: - go p.pushTcpDataToBuffer(*data) - case SOURCE_SERIAL: - go p.pushSerialDataToBuffer(*data) - default: - panic("pipe: invalid data source") - } - return nil + if data == nil { + return errors.New("nil processing not allowed") + } + //logrus.Println("push data to pipe:", string(data.source)) + p.storer.EnqueueRaw(*data) + switch data.source { + case SOURCE_TCP: + go p.pushTcpDataToBuffer(*data) + case SOURCE_SERIAL: + go p.pushSerialDataToBuffer(*data) + default: + panic("pipe: invalid data source") + } + return nil } func (p *pipeline) pushTcpDataToBuffer(data sensorData) { - if p.synchroniz.tcpSerialDelayMs > 0 { - time.Sleep(time.Duration(p.synchroniz.tcpSerialDelayMs) * time.Millisecond) - } - p.buffer.tcpMutex.Lock() - p.buffer.MeasTcp = p.buffer.MeasTcp.ConsolidateExTime(data) - p.buffer.tcpMutex.Unlock() + p.synchroniz.mutex.RLock() + if p.synchroniz.tcpSerialDelayMs > 0 { + time.Sleep(time.Duration(p.synchroniz.tcpSerialDelayMs) * time.Millisecond) + } + p.synchroniz.mutex.RLock() + p.buffer.tcpMutex.Lock() + p.buffer.MeasTcp = p.buffer.MeasTcp.ConsolidateExTime(data) + p.buffer.tcpMutex.Unlock() } func (p *pipeline) pushSerialDataToBuffer(data sensorData) { - if p.synchroniz.tcpSerialDelayMs < 0 { - time.Sleep(time.Duration(-p.synchroniz.tcpSerialDelayMs) * time.Millisecond) - } - p.buffer.serialMutex.Lock() - p.buffer.MeasSerial = p.buffer.MeasSerial.ConsolidateEpochsOnly(data) - p.buffer.serialMutex.Unlock() + p.synchroniz.mutex.RLock() + if p.synchroniz.tcpSerialDelayMs < 0 { + time.Sleep(time.Duration(-p.synchroniz.tcpSerialDelayMs) * time.Millisecond) + } + p.synchroniz.mutex.RUnlock() + p.buffer.serialMutex.Lock() + p.buffer.MeasSerial = p.buffer.MeasSerial.ConsolidateEpochsOnly(data) + p.buffer.serialMutex.Unlock() } func (p *pipeline) Close() { - p.active = false + p.active = false } diff --git a/core/sensordata.go b/core/sensordata.go index f13dc31..e4d8ebf 100644 --- a/core/sensordata.go +++ b/core/sensordata.go @@ -3,8 +3,8 @@ package core import ( "errors" "git.timovolkmann.de/gyrogpsc/ublox" + "github.com/sirupsen/logrus" "github.com/tidwall/gjson" - "log" "math" "time" ) @@ -19,6 +19,7 @@ const ( type sensorData struct { itow uint32 source sourceId + ServerTime time.Time Timestamp int64 Position [3]float64 Orientation [3]float64 @@ -26,7 +27,7 @@ type sensorData struct { type recordPair struct { RecordTime time.Time - data map[sourceId]sensorData + data map[sourceId]sensorData } type rawRecord struct { @@ -34,7 +35,6 @@ type rawRecord struct { sensorData } - func (s sensorData) isSameEpoch(n sensorData) bool { if n.itow == 0 { return false @@ -77,9 +77,9 @@ func (s sensorData) ConsolidateExTime(n sensorData) sensorData { func (s *sensorData) checkSources(n *sensorData) { if (s.source != n.source && *s != sensorData{}) { - log.Println(s) - log.Println(n) - log.Fatalln("Do not consolidate sensorData from different Sources") + logrus.Println(s) + logrus.Println(n) + logrus.Fatalln("Do not consolidate sensorData from different Sources") } } @@ -90,25 +90,26 @@ var ( func ConvertUbxToSensorData(msg interface{}) (*sensorData, error) { sd := &sensorData{ - source: SOURCE_SERIAL, + ServerTime: time.Now(), + source: SOURCE_SERIAL, } switch v := msg.(type) { case *ublox.NavPvt: - //log.Println("NAV-PVT") + //logrus.Println("NAV-PVT") sd.itow = v.ITOW_ms sd.Timestamp = time.Date(int(v.Year_y), time.Month(v.Month_month), int(v.Day_d), int(v.Hour_h), int(v.Min_min), int(v.Sec_s), int(v.Nano_ns), time.UTC).UnixNano() sd.Position[0] = float64(v.Lat_dege7) / 1e+7 sd.Position[1] = float64(v.Lon_dege7) / 1e+7 sd.Position[2] = float64(v.HMSL_mm) / 1e+3 // mm in m case *ublox.HnrPvt: - //log.Println("HNR-PVT") + //logrus.Println("HNR-PVT") sd.itow = v.ITOW_ms sd.Timestamp = time.Date(int(v.Year_y), time.Month(v.Month_month), int(v.Day_d), int(v.Hour_h), int(v.Min_min), int(v.Sec_s), int(v.Nano_ns), time.UTC).UnixNano() sd.Position[0] = float64(v.Lat_dege7) / 1e+7 sd.Position[1] = float64(v.Lon_dege7) / 1e+7 sd.Position[2] = float64(v.HMSL_mm) / 1e+3 // mm in m case *ublox.NavAtt: - //log.Println("NAV-ATT") + //logrus.Println("NAV-ATT") sd.itow = v.ITOW_ms sd.Orientation[0] = float64(v.Pitch_deg) * 1e-5 sd.Orientation[1] = float64(v.Roll_deg) * 1e-5 @@ -116,7 +117,7 @@ func ConvertUbxToSensorData(msg interface{}) (*sensorData, error) { case *ublox.RawMessage: //class := make([]byte, 2) //binary.LittleEndian.PutUint16(class, v.ClassID()) - //log.Printf("%#v, %#v", class[0],class[1]) + //logrus.Printf("%#v, %#v", class[0],class[1]) return nil, nil default: return nil, errNotImplemented @@ -140,14 +141,15 @@ func convertIPhoneSensorLog(jsonData []byte) (*sensorData, error) { roll := gjson.Get(string(jsonData), "motionRoll").Float() * 180 / math.Pi yaw := gjson.Get(string(jsonData), "motionYaw").Float() * 180 / math.Pi sd := &sensorData{ - source: SOURCE_TCP, - Timestamp: int64(timestamp * float64(time.Second)), - //Timestamp: time.Unix(0, prep.Timestamp * int64(time.Millisecond)), + ServerTime: time.Now(), + source: SOURCE_TCP, + Timestamp: int64(timestamp * float64(time.Second)), Position: [3]float64{lat, lon, alt}, Orientation: [3]float64{pitch, roll, yaw}, + //Timestamp: time.Unix(0, prep.Timestamp * int64(time.Millisecond)), } - //log.Println(string(pretty.Pretty(jsonData))) - //log.Println(sd) + //logrus.Println(string(pretty.Pretty(jsonData))) + //logrus.Println(sd) return sd, nil } @@ -161,11 +163,12 @@ func convertAndroidHyperImu(jsonData []byte) (*sensorData, error) { yaw := gjson.Get(string(jsonData), "orientation.2").Float() sd := &sensorData{ - source: SOURCE_TCP, - Timestamp: timestamp * int64(time.Millisecond), - //Timestamp: time.Unix(0, prep.Timestamp * int64(time.Millisecond)), + ServerTime: time.Now(), + source: SOURCE_TCP, + Timestamp: timestamp * int64(time.Millisecond), Position: [3]float64{lat, lon, alt}, Orientation: [3]float64{pitch, roll, yaw}, + //Timestamp: time.Unix(0, prep.Timestamp * int64(time.Millisecond)), } return sd, nil } diff --git a/core/service.go b/core/service.go index 8df6a23..cbb6bb1 100644 --- a/core/service.go +++ b/core/service.go @@ -1,107 +1,104 @@ package core import ( - "github.com/google/uuid" - "log" - "time" + "github.com/google/uuid" + "github.com/sirupsen/logrus" + "time" ) type OpMode uint8 const ( - STOPPED OpMode = iota - LIVE - REPLAY + STOPPED OpMode = iota + LIVE + REPLAY ) type trackingService struct { - current *Tracking - config *Configuration - pipe *pipeline - repo Repo - opMode OpMode - collectors []Collector + current *Tracking + config *Configuration + pipe *pipeline + repo Repo + opMode OpMode + collectors []Collector } func TrackingService(r Repo, d Publisher, c *Configuration) *trackingService { - t := &Tracking{} - return &trackingService{ - current: t, - opMode: STOPPED, - config: c, - repo: r, - pipe: NewPipeline(d, t, c), - collectors: nil, - } + t := &Tracking{} + return &trackingService{ + current: t, + opMode: STOPPED, + config: c, + repo: r, + pipe: NewPipeline(d, t, c), + collectors: nil, + } } func (t *trackingService) AllTrackings() { - panic("implement me") + panic("implement me") } func (t *trackingService) NewTracking(cols ...CollectorType) { - log.Println("new tracking:", cols) - t.opMode = LIVE - t.collectors = nil - for _, col := range cols { - t.collectors = append(t.collectors, NewCollector(col, t.pipe, t.config)) - } - *t.current = emptyTracking() - t.current.collectors = cols - for _, e := range t.collectors { - e.Collect() - } - t.pipe.Run() + logrus.Debug("new tracking:", cols) + t.opMode = LIVE + t.collectors = nil + for _, col := range cols { + t.collectors = append(t.collectors, NewCollector(col, t.pipe, t.config)) + } + *t.current = emptyTracking() + t.current.collectors = cols + for _, e := range t.collectors { + e.Collect() + } + t.pipe.Run() } func (t *trackingService) StartRecord() { - if t.opMode != LIVE { - log.Println("trackingservice: wrong mode of operation") - } - t.current.TimeCreated = time.Now() - t.pipe.Record() + if t.opMode != LIVE { + logrus.Println("trackingservice: wrong mode of operation") + } + t.current.TimeCreated = time.Now() + t.pipe.Record() } func (t *trackingService) StopRecord() { - if t.opMode != LIVE { - log.Println("trackingservice: wrong mode of operation") - } - t.pipe.Stop() - for _, e := range t.collectors { - e.Stop() - } - err := t.repo.Save(*t.current) - if err != nil { - log.Println(err) - } - t.NewTracking(t.current.collectors...) + if t.opMode != LIVE { + logrus.Println("trackingservice: wrong mode of operation") + } + t.pipe.Stop() + for _, e := range t.collectors { + e.Stop() + } + err := t.repo.Save(*t.current) + if err != nil { + logrus.Println(err) + } + t.NewTracking(t.current.collectors...) } func (t *trackingService) Reset() { - t.opMode = STOPPED - t.collectors = nil + t.opMode = STOPPED + t.collectors = nil } - func (t *trackingService) DeleteTracking(trackingId uuid.UUID) { - panic("implement me") + panic("implement me") } func (t *trackingService) StartReplay() { - panic("implement me") + panic("implement me") } func (t *trackingService) PauseReplay() { - panic("implement me") + panic("implement me") } func (t *trackingService) StopReplay() { - panic("implement me") + panic("implement me") } func (t *trackingService) LoadTracking(trackingId uuid.UUID) { } - - diff --git a/core/trackings.go b/core/trackings.go index 1864d17..beb1f98 100644 --- a/core/trackings.go +++ b/core/trackings.go @@ -1,61 +1,60 @@ package core import ( - "github.com/google/uuid" - "log" - "sync" - "time" + "github.com/google/uuid" + "github.com/sirupsen/logrus" + "sync" + "time" ) type Tracking struct { - TrackingMetadata - Records []recordPair - Rawdata []rawRecord - mu sync.Mutex - + TrackingMetadata + Records []recordPair + Rawdata []rawRecord + mu sync.Mutex } type TrackingMetadata struct { - UUID uuid.UUID - TimeCreated time.Time - collectors []CollectorType + UUID uuid.UUID + TimeCreated time.Time + collectors []CollectorType } func (s *Tracking) EnqueuePair(tcp sensorData, ser sensorData) { - s.mu.Lock() - defer s.mu.Unlock() - rp := recordPair{ - RecordTime: time.Now(), - data: map[sourceId]sensorData{ - tcp.source: tcp, - ser.source: ser, - }, - } - s.Records = append(s.Records, rp) - log.Println("tracking Records: len->", len(s.Records)) + s.mu.Lock() + defer s.mu.Unlock() + rp := recordPair{ + RecordTime: time.Now(), + data: map[sourceId]sensorData{ + tcp.source: tcp, + ser.source: ser, + }, + } + s.Records = append(s.Records, rp) + logrus.Debugln("tracking Records: len->", len(s.Records)) } func (s *Tracking) EnqueueRaw(data sensorData) { - s.mu.Lock() - defer s.mu.Unlock() - sr := rawRecord{ - time.Now(), - data, - } - s.Rawdata = append(s.Rawdata, sr) - log.Println("raw data points: len->", len(s.Records)) + s.mu.Lock() + defer s.mu.Unlock() + sr := rawRecord{ + time.Now(), + data, + } + s.Rawdata = append(s.Rawdata, sr) + logrus.Debugln("raw data points: len->", len(s.Records)) } func emptyTracking() Tracking { - return Tracking{ - TrackingMetadata: TrackingMetadata{ - UUID: uuid.New(), - }, - Records: []recordPair{}, - Rawdata: []rawRecord{}, - } + return Tracking{ + TrackingMetadata: TrackingMetadata{ + UUID: uuid.New(), + }, + Records: []recordPair{}, + Rawdata: []rawRecord{}, + } } func (s *Tracking) isEmpty() bool { - return len(s.Rawdata) + len(s.Records) == 0 + return len(s.Rawdata)+len(s.Records) == 0 } diff --git a/database/repository.go b/database/repository.go deleted file mode 100644 index 1f9d413..0000000 --- a/database/repository.go +++ /dev/null @@ -1,27 +0,0 @@ -package database - -import ( - "git.timovolkmann.de/gyrogpsc/core" - "github.com/google/uuid" -) - -// Must implement Repo -type repository struct { -} - -func NewRepository(c *core.Configuration) *repository { - return &repository{} -} - -func (r *repository) Save(tracking core.Tracking) error { - panic("implement me") -} - -func (r *repository) LoadAll() ([]core.TrackingMetadata, error) { - panic("implement me") -} - -func (r *repository) Load(id uuid.UUID) (core.Tracking, error) { - panic("implement me") -} - diff --git a/example_config.yml b/example_config.yml index 5d18e96..872032e 100644 --- a/example_config.yml +++ b/example_config.yml @@ -1,3 +1,6 @@ +# !!! copy this file and rename it to gpsconfig.yml !!! +# !!! file must be located in working directory !!! + # server configurations webserver: port: ":3011" @@ -10,4 +13,20 @@ collectors: # processing pipeline configurations pipeline: publishIntervalMs: 50 - syncUpdateIntervalMs: 494 \ No newline at end of file + syncUpdateIntervalMs: 494 + +debuglevel: "INFO" + +#// ErrorLevel level. Logs. Used for errors that should definitely be noted. +#// Commonly used for hooks to send errors to an error tracking service. +#ErrorLevel + +#// WarnLevel level. Non-critical entries that deserve eyes. +#WarnLevel + +#// InfoLevel level. General operational entries about what's going on inside the +#// application. +#InfoLevel + +#// DebugLevel level. Usually only enabled when debugging. Very verbose logging. +#DebugLevel \ No newline at end of file diff --git a/go.mod b/go.mod index 201ab81..67522e3 100644 --- a/go.mod +++ b/go.mod @@ -3,15 +3,15 @@ module git.timovolkmann.de/gyrogpsc go 1.15 require ( + github.com/dgraph-io/badger/v2 v2.2007.2 github.com/gofiber/fiber/v2 v2.2.4 github.com/gofiber/websocket/v2 v2.0.2 github.com/google/go-cmp v0.3.0 github.com/google/uuid v1.1.2 - github.com/gorilla/websocket v1.4.2 + github.com/sirupsen/logrus v1.6.0 github.com/spf13/viper v1.7.1 github.com/stretchr/testify v1.6.1 // indirect github.com/tidwall/gjson v1.6.0 github.com/tidwall/pretty v1.0.2 // indirect - github.com/upper/db/v4 v4.0.1 // indirect go.bug.st/serial v1.1.1 ) diff --git a/go.sum b/go.sum index de176c1..9f012a5 100644 --- a/go.sum +++ b/go.sum @@ -11,38 +11,53 @@ cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqCl cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= +github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/andybalholm/brotli v1.0.0 h1:7UCwP93aiSfvWpapti8g88vVVGp2qqtGyePsSuDafo4= github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/creack/goselect v0.1.1 h1:tiSSgKE1eJtxs1h/VgGQWuXUP0YS4CDIFMp6vaI1ls0= github.com/creack/goselect v0.1.1/go.mod h1:a/NhLweNvqIYMuxcMOuWY516Cimucms3DglDzQP3hKY= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.0.0-20200620013148-b91950f658ec/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/dgraph-io/badger/v2 v2.2007.2 h1:EjjK0KqwaFMlPin1ajhP943VPENHJdEz1KLIegjaI3k= +github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de h1:t0UHb5vdojIDUqktM6+xJAfScFBsVpXZmqC9dsgJmeA= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/fasthttp/websocket v1.4.3 h1:qjhRJ/rTy4KB8oBxljEC00SDt6HUY9jLRfM601SUdS4= github.com/fasthttp/websocket v1.4.3/go.mod h1:5r4oKssgS7W6Zn6mPWap3NWzNPJNzUUh3baWTOhcYQk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -53,7 +68,6 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gofiber/fiber/v2 v2.1.0/go.mod h1:aG+lMkwy3LyVit4CnmYUbUdgjpc3UYOltvlJZ78rgQ0= github.com/gofiber/fiber/v2 v2.2.4 h1:t2V2SxlbQGdt8+SS/Mo+tQB0pDQn7OajKdA72qHcBVw= @@ -62,7 +76,6 @@ github.com/gofiber/websocket/v2 v2.0.2 h1:UA/6NpyG+vmPGlvJvW8MJPJpRFuS7abinZ5HbL github.com/gofiber/websocket/v2 v2.0.2/go.mod h1:7VBnzEVRK0K0eTIVc5GbXPF1JWUFnllY0X4cRtG2v78= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -70,7 +83,10 @@ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -80,11 +96,11 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -112,9 +128,11 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= @@ -123,22 +141,24 @@ github.com/klauspost/compress v1.10.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs github.com/klauspost/compress v1.10.7 h1:7rix8v8GpI3ZBb0nSozFRgbtXKv+hOe+qfEpZqybrAg= github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-sqlite3 v1.14.1 h1:AHx9Ra40wIzl+GelgX2X6AWxmT5tfxhI1PL0523HcSw= -github.com/mattn/go-sqlite3 v1.14.1/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= @@ -153,6 +173,7 @@ github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FI github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -166,27 +187,34 @@ github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/savsgio/gotils v0.0.0-20200608150037-a5f6f5aef16c h1:2nF5+FZ4/qp7pZVL7fR6DEaSTzuDmNaFTyqp92/hwF8= github.com/savsgio/gotils v0.0.0-20200608150037-a5f6f5aef16c/go.mod h1:TWNAOTaVzGOXq8RbEvHnhzA/A2sLZzgn0m6URjnukY8= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -207,10 +235,7 @@ github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhV github.com/tidwall/pretty v1.0.2 h1:Z7S3cePv9Jwm1KwS0513MRaoUe3S01WPbLNV40pwWZU= github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/upper/db v1.0.1 h1:AFzy0fFO7EZ5woZGE/LVl9BWLKqyAWlglu+ZyHQTlbU= -github.com/upper/db v3.7.1+incompatible h1:ehR+Q0msV25yZWXdFYD+3n4BvY9jefI336lmZy7FlAQ= -github.com/upper/db/v4 v4.0.1 h1:mHmGBffne8fdiJjmtYXCuHSghO9027q4TJA9oGP50OM= -github.com/upper/db/v4 v4.0.1/go.mod h1:pyAEIpPfnhpvO4zVbyUI+asgZjppZlq705fOFTyUOso= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.14.0/go.mod h1:ol1PCaL0dX20wC0htZ7sYCsvCYmrouYra0zHzaclZhE= @@ -220,8 +245,7 @@ github.com/valyala/fasthttp v1.17.0/go.mod h1:jjraHZVbKOXftJfsOYoAjaeygpj5hr8erm github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a h1:0R4NLDRDZX6JcmhJgXi5E4b8Wg84ihbmUKp/GvSPEzc= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -gitlab.com/cznic/ebnf2y v1.0.0/go.mod h1:jx14dqOldV2pRvSi8HASTB/k5fkIv2TwjYAp5py0MTs= -gitlab.com/cznic/golex v1.0.0/go.mod h1:vkWdDgqbbThjRHoOLU7yNPgMxaubAkwnvF/4zeG8cvU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= go.bug.st/serial v1.1.1 h1:5J1DpaIaSIruBi7jVnKXnhRS+YQ9+2PLJMtIZKoIgnc= go.bug.st/serial v1.1.1/go.mod h1:VmYBeyJWp5BnJ0tw2NUJHZdJTGl2ecBGABHlzRK1knY= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= @@ -232,14 +256,13 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190411193353-0480eff6dd7c/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= @@ -256,7 +279,6 @@ golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -271,9 +293,9 @@ golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201016165138-7b1cca2348c0 h1:5kGOVHlq0euqwzgTC9Vu15p6fV1Wi0ArVi8da2urnVg= golang.org/x/net v0.0.0-20201016165138-7b1cca2348c0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -289,6 +311,7 @@ golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -297,6 +320,7 @@ golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -353,11 +377,13 @@ google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -371,19 +397,4 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -modernc.org/b v1.0.0/go.mod h1:uZWcZfRj1BpYzfN9JTerzlNUnnPsV9O2ZA8JsRcubNg= -modernc.org/db v1.0.0/go.mod h1:kYD/cO29L/29RM0hXYl4i3+Q5VojL31kTUVpVJDw0s8= -modernc.org/ebnfutil v1.0.0/go.mod h1:+2n/OnQXoild9pzrPa/2wmVtR+ufWjB/0fYkc0BV9sc= -modernc.org/file v1.0.0/go.mod h1:uqEokAEn1u6e+J45e54dsEA/pw4o7zLrA2GwyntZzjw= -modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= -modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= -modernc.org/internal v1.0.0/go.mod h1:VUD/+JAkhCpvkUitlEOnhpVxCgsBI90oTzSCRcqQVSM= -modernc.org/lex v1.0.0/go.mod h1:G6rxMTy3cH2iA0iXL/HRRv4Znu8MK4higxph/lE7ypk= -modernc.org/lexer v1.0.0/go.mod h1:F/Dld0YKYdZCLQ7bD0USbWL4YKCyTDRDHiDTOs0q0vk= -modernc.org/lldb v1.0.0/go.mod h1:jcRvJGWfCGodDZz8BPwiKMJxGJngQ/5DrRapkQnLob8= -modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= -modernc.org/ql v1.1.0/go.mod h1:Fj1ylcVyzcu/fgWZTrvBO9j/aEUg/ixLFnGtmzh7quI= -modernc.org/sortutil v1.0.0/go.mod h1:1QO0q8IlIlmjBIwm6t/7sof874+xCfZouyqZMLIAtxM= -modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= -modernc.org/zappy v1.0.0/go.mod h1:hHe+oGahLVII/aTTyWK/b53VDHMAGCBYYeZ9sn83HC4= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/storage/kvstore.go b/storage/kvstore.go new file mode 100644 index 0000000..c1fcae8 --- /dev/null +++ b/storage/kvstore.go @@ -0,0 +1,33 @@ +package storage + +import ( + "git.timovolkmann.de/gyrogpsc/core" + "github.com/dgraph-io/badger/v2" + "github.com/google/uuid" + "github.com/sirupsen/logrus" +) + +// Must implement Repo +type badgerStore struct { + db *badger.DB +} + +func NewRepository(c *core.Configuration) *badgerStore { + db, err := badger.Open(badger.DefaultOptions(".")) + if err != nil { + logrus.Warn(err) + } + return &badgerStore{db} +} + +func (r *badgerStore) Save(tracking core.Tracking) error { + panic("implement me") +} + +func (r *badgerStore) LoadAll() ([]core.TrackingMetadata, error) { + panic("implement me") +} + +func (r *badgerStore) Load(id uuid.UUID) (core.Tracking, error) { + panic("implement me") +} diff --git a/web/http.go b/web/http.go index 3eb6033..c68f38f 100644 --- a/web/http.go +++ b/web/http.go @@ -4,8 +4,8 @@ import ( "git.timovolkmann.de/gyrogpsc/core" "github.com/gofiber/fiber/v2" "github.com/gofiber/websocket/v2" + "github.com/sirupsen/logrus" "html/template" - "log" ) func CreateServer(s core.Service, sub core.Subscriber, c *core.Configuration) { @@ -29,14 +29,14 @@ func CreateServer(s core.Service, sub core.Subscriber, c *core.Configuration) { trackings.Put("/", stubhander()) // Stops current recording. Returns trackingId if record was successful trackings.Delete("/", stubhander()) // Stops websocket connection, pipelines and collectors - trackings.Get("/:trackingId", stubhander()) // Gets Tracking Metadata and loads sensorRecords from database. - trackings.Delete("/:trackingId", stubhander()) // Deletes Tracking from database + trackings.Get("/:trackingId", stubhander()) // Gets Tracking Metadata and loads sensorRecords from storage. + trackings.Delete("/:trackingId", stubhander()) // Deletes Tracking from storage - trackings.Post("/current", stubhander()) // Starts Replay. - trackings.Patch("/current", stubhander()) // Pauses Replay. - trackings.Put("/current", stubhander()) // Stops Replay. + trackings.Post("/current", stubhander()) // Starts Replay. + trackings.Patch("/current", stubhander()) // Pauses Replay. + trackings.Put("/current", stubhander()) // Stops Replay. - log.Fatal(app.Listen(c.Webserver.Port)) + logrus.Fatal(app.Listen(c.Webserver.Port)) } func stubhander() fiber.Handler { @@ -63,7 +63,7 @@ func createFiberWebsocketHandler(s core.Subscriber) func(conn *websocket.Conn) { cmsg := <-channel err := c.WriteMessage(websocket.TextMessage, []byte(cmsg)) if err != nil { - log.Println("write:", err) + logrus.Println("write:", err) break }