From 1fb82f20c966e7056edf7b58914a14ebe72ffe47 Mon Sep 17 00:00:00 2001 From: Joonas Kuorilehto Date: Fri, 23 Nov 2018 20:48:47 +0200 Subject: [PATCH 1/7] Init go module --- go.mod | 3 +++ go.sum | 2 ++ 2 files changed, 5 insertions(+) create mode 100644 go.mod create mode 100644 go.sum diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..e1fda73 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module gitlab.com/jtaimisto/bluewalker + +require golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..34a9b67 --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b h1:MQE+LT/ABUuuvEZ+YQAMSXindAdUh7slEmAkup74op4= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -- GitLab From 916f0cd0971fa521d251ce2fdccb0b40024eb6d2 Mon Sep 17 00:00:00 2001 From: Joonas Kuorilehto Date: Wed, 28 Nov 2018 20:21:48 +0200 Subject: [PATCH 2/7] Clarify hci not implemented error --- hci/dummy.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hci/dummy.go b/hci/dummy.go index dfc8dbc..1ee3216 100644 --- a/hci/dummy.go +++ b/hci/dummy.go @@ -6,7 +6,7 @@ import "fmt" // ErrNotImplemented is returned for functions which are not // implemented by this transport -var ErrNotImplemented = fmt.Errorf("Not implemented") +var ErrNotImplemented = fmt.Errorf("HCI transport not implemented on Darwin") type dummy struct { } -- GitLab From d5fe6b58df43f0d1dd14481b06df8e68b7f04e90 Mon Sep 17 00:00:00 2001 From: Joonas Kuorilehto Date: Wed, 28 Nov 2018 21:15:44 +0200 Subject: [PATCH 3/7] Simulate delay in dummy hci --- hci/dummy.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/hci/dummy.go b/hci/dummy.go index 1ee3216..0ae4a48 100644 --- a/hci/dummy.go +++ b/hci/dummy.go @@ -2,7 +2,10 @@ package hci -import "fmt" +import ( + "fmt" + "time" +) // ErrNotImplemented is returned for functions which are not // implemented by this transport @@ -22,9 +25,11 @@ func (d *dummy) Close() { } func (d *dummy) Read() ([]byte, error) { + <-time.After(time.Second) return nil, ErrNotImplemented } func (d *dummy) Write(buffer []byte) error { + <-time.After(time.Second) return ErrNotImplemented } -- GitLab From bab3fa6a1c9342609dd83e2dc9f2fb4831a8feb8 Mon Sep 17 00:00:00 2001 From: Joonas Kuorilehto Date: Wed, 28 Nov 2018 21:21:36 +0200 Subject: [PATCH 4/7] Refactor main and fix interrupt if hci blocks --- main.go | 100 ++++++++++++++++++++++++++------------------------------ 1 file changed, 46 insertions(+), 54 deletions(-) diff --git a/main.go b/main.go index e92a254..fa6dff4 100644 --- a/main.go +++ b/main.go @@ -14,7 +14,6 @@ import ( "os" "os/signal" "strings" - "sync" "syscall" "time" @@ -407,11 +406,17 @@ func collectorLoop(reportChan chan *host.ScanReport, out *output) { } func main() { + err := realMain() + if err != nil { + fmt.Fprintf(os.Stderr, "%v", err) + os.Exit(255) + } +} +func realMain() error { flag.Parse() if cmdline.device == "" { - fmt.Fprintf(os.Stderr, "Missing device name\n") - os.Exit(255) + return fmt.Errorf("Missing device name\n") } if !cmdline.debug { @@ -420,38 +425,32 @@ func main() { var filters []filter.AdFilter if cmdline.addrFilter != "" { if cmdline.ruuvi { - fmt.Fprintf(os.Stderr, "Address filters not supported on Ruuvi tag mode\n") - os.Exit(255) + return fmt.Errorf("Address filters not supported on Ruuvi tag mode") } var err error if filters, err = parseAddressFilters(cmdline.addrFilter); err != nil { - fmt.Fprintf(os.Stderr, "%s\n", err.Error()) - os.Exit(255) + return fmt.Errorf("%s", err.Error()) } } if cmdline.vendorFilter != "" { if cmdline.ruuvi { - fmt.Fprintf(os.Stderr, "Vendor filter not supported on Ruuvi tag mode\n") - os.Exit(255) + return fmt.Errorf("Vendor filter not supported on Ruuvi tag mode") } filt, err := parseVendorSpecFilter(cmdline.vendorFilter) if err != nil { - fmt.Fprintf(os.Stderr, "%s\n", err.Error()) - os.Exit(255) + return fmt.Errorf("%s", err.Error()) } filters = append(filters, filt) } if cmdline.adTypeFilter != "" { if cmdline.ruuvi { - fmt.Fprintf(os.Stderr, "AD type filter not supported on Ruuvi tag mode\n") - os.Exit(255) + return fmt.Errorf("AD type filter not supported on Ruuvi tag mode") } filt, err := parseAdTypeFilters(cmdline.adTypeFilter) if err != nil { - fmt.Fprintf(os.Stderr, "%s\n", err.Error()) - os.Exit(255) + return fmt.Errorf("%s", err.Error()) } for _, f := range filt { filters = append(filters, f) @@ -459,21 +458,19 @@ func main() { } if cmdline.duration == 0 || cmdline.duration < -1 { - fmt.Fprintf(os.Stderr, "Invalid duration %d\n", cmdline.duration) - os.Exit(255) + return fmt.Errorf("Invalid duration %d", cmdline.duration) } var out *output if cmdline.socketPath != "" { if !cmdline.json { - fmt.Fprintf(os.Stderr, "Forcing JSON mode when writing to socket. Use -json to silence this warning\n") + fmt.Fprintf(os.Stderr, "Forcing JSON mode when writing to socket. Use -json to silence this warning") cmdline.json = true } var err error out, err = outputForSocket(cmdline.socketPath) if err != nil { - fmt.Printf("Unable to open unix socket at %s (%s)\n", cmdline.socketPath, err.Error()) - os.Exit(255) + return fmt.Errorf("Unable to open unix socket at %s (%v)", cmdline.socketPath, err) } defer out.Close() } else { @@ -496,47 +493,42 @@ func main() { raw, err := hci.Raw(cmdline.device) if err != nil { - fmt.Fprintf(os.Stderr, "Error while opening RAW HCI socket: %s\nAre you running as root and have you run sudo hciconfig %s down?\n", err.Error(), cmdline.device) - os.Exit(255) + return fmt.Errorf("Error while opening RAW HCI socket: %v\nAre you running as root and have you run sudo hciconfig %s down?", err, cmdline.device) } - host := host.New(raw) - if err = host.Init(); err != nil { - fmt.Fprintf(os.Stderr, "Unable to initialize host: %s\n", err.Error()) - host.Deinit() - os.Exit(255) - } + errCh := make(chan error) - reportChan, err := host.StartScanning(cmdline.active, filters) - if err != nil { - fmt.Fprintf(os.Stderr, "Unable to start scanning: %s\n", err.Error()) - host.Deinit() - os.Exit(255) - } + go func(errCh chan<- error) { + host := host.New(raw) + defer host.Deinit() + if err = host.Init(); err != nil { + errCh <- fmt.Errorf("Unable to initialize host: %v", err) + return + } + + defer host.StopScanning() // FIXME: error ignored + reportChan, err := host.StartScanning(cmdline.active, filters) + if err != nil { + errCh <- fmt.Errorf("Unable to start scanning: %v", err) + return + } - var wg sync.WaitGroup - wg.Add(1) - go func() { loop(reportChan, out) - wg.Done() - }() + close(errCh) + }(errCh) + scanComplete := time.After(time.Duration(cmdline.duration) * time.Second) if cmdline.duration == -1 { - select { - case s := <-sig: - log.Printf("Received signal %s, stopping ", s.String()) - - } - } else { - ch := time.Tick(time.Duration(cmdline.duration) * time.Second) - select { - case <-ch: - case s := <-sig: - log.Printf("Received signal %s, stopping ", s.String()) + scanComplete = nil // read blocks forever + } - } + select { + case <-scanComplete: + case err := <-errCh: + log.Printf("Received error %v, stopping ", err) + return err + case s := <-sig: + log.Printf("Received signal %v, stopping ", s) } - host.StopScanning() - host.Deinit() - wg.Wait() + return nil } -- GitLab From c7a32c81398014430b3e155d3b682e84e54e853d Mon Sep 17 00:00:00 2001 From: Joonas Kuorilehto Date: Wed, 28 Nov 2018 21:35:04 +0200 Subject: [PATCH 5/7] Fix gitlab CI script --- .gitlab-ci.yml | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ad8846e..433a431 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,24 +1,16 @@ -image: golang:alpine +image: golang:1.11 stages: - build - test -before_script: - - mkdir -p /go/src/gitlab.com/jtaimisto - - cp -a $(pwd) /go/src/gitlab.com/jtaimisto/bluewalker - - apk add --no-cache git - - go get golang.org/x/sys/unix - build-main-app: stage: build script: - - cd /go/ - go install gitlab.com/jtaimisto/bluewalker - go install gitlab.com/jtaimisto/bluewalker/listener run-tests: stage: test script: - - cd /go/ - - CGO_ENABLED=0 go test gitlab.com/jtaimisto/bluewalker... + - CGO_ENABLED=0 go test gitlab.com/jtaimisto/bluewalker/... -- GitLab From 9436e21d84f25a5469446e88168512b45026fa88 Mon Sep 17 00:00:00 2001 From: Joonas Kuorilehto Date: Wed, 28 Nov 2018 21:55:34 +0200 Subject: [PATCH 6/7] Restore accidentally removed linebreak --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index fa6dff4..5bd50aa 100644 --- a/main.go +++ b/main.go @@ -408,7 +408,7 @@ func collectorLoop(reportChan chan *host.ScanReport, out *output) { func main() { err := realMain() if err != nil { - fmt.Fprintf(os.Stderr, "%v", err) + fmt.Fprintf(os.Stderr, "%v\n", err) os.Exit(255) } } -- GitLab From 9b20d816e66f46db059b025140bff3996618ce5f Mon Sep 17 00:00:00 2001 From: Joonas Kuorilehto Date: Wed, 28 Nov 2018 21:58:26 +0200 Subject: [PATCH 7/7] Remove extra linebreaks --- main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index 5bd50aa..35bcdfe 100644 --- a/main.go +++ b/main.go @@ -330,7 +330,7 @@ func ruuviLoop(reportChan chan *host.ScanReport, out *output) { if ads.Typ == hci.AdManufacturerSpecific && len(ads.Data) >= 2 && binary.LittleEndian.Uint16(ads.Data) == 0x0499 { ruuviData, err := ruuvi.Unmarshall(ads.Data) if err != nil { - log.Printf("Unable to parse ruuvi data: %s\n", err.Error()) + log.Printf("Unable to parse ruuvi data: %v", err) continue } if cmdline.json { @@ -416,7 +416,7 @@ func main() { func realMain() error { flag.Parse() if cmdline.device == "" { - return fmt.Errorf("Missing device name\n") + return fmt.Errorf("Missing device name") } if !cmdline.debug { -- GitLab