summaryrefslogtreecommitdiff
path: root/bitmask/main.go
diff options
context:
space:
mode:
authorRuben Pollan <meskio@sindominio.net>2018-01-19 19:51:03 +0100
committerRuben Pollan <meskio@sindominio.net>2018-01-19 19:51:03 +0100
commit96a892f8400bc60a3a4021d7783776e2315036ba (patch)
tree50c3129c7d8a8724c6233a644de09b050bf265ac /bitmask/main.go
parent56b9c951111a4627cd5d9f5d8e72623a0c8ecb57 (diff)
[feat] implement bitmask.core zmq comunication
Diffstat (limited to 'bitmask/main.go')
-rw-r--r--bitmask/main.go77
1 files changed, 77 insertions, 0 deletions
diff --git a/bitmask/main.go b/bitmask/main.go
new file mode 100644
index 0000000..b4607b3
--- /dev/null
+++ b/bitmask/main.go
@@ -0,0 +1,77 @@
+package bitmask
+
+import (
+ "encoding/json"
+ "errors"
+
+ "github.com/pebbe/zmq4"
+)
+
+const (
+ // On win should be: tcp://127.0.0.1:5001
+ coreEndpoint = "ipc:///tmp/bitmask.core.sock"
+)
+
+// Bitmask holds the bitmask client data
+type Bitmask struct {
+ //eventsoc *zmq4.Socket
+ coresoc *zmq4.Socket
+ statusCh chan string
+}
+
+// Init the connection to bitmask
+func Init() (*Bitmask, error) {
+ statusCh := make(chan string)
+ socket, err := initCore()
+ if err != nil {
+ return nil, err
+ }
+
+ b := Bitmask{socket, statusCh}
+ go b.fetchStatus()
+ return &b, nil
+}
+
+// GetStatusCh returns a channel that will recieve VPN status changes
+func (b *Bitmask) GetStatusCh() chan string {
+ return b.statusCh
+}
+
+// Close the connection to bitmask
+func (b *Bitmask) Close() {
+ b.coresoc.Close()
+}
+
+func (b *Bitmask) send(parts ...interface{}) (map[string]interface{}, error) {
+ _, err := b.coresoc.SendMessage(parts...)
+ if err != nil {
+ return nil, err
+ }
+ resJSON, err := b.coresoc.RecvBytes(0)
+ if err != nil {
+ return nil, err
+ }
+ return parseResponse(resJSON)
+}
+
+func parseResponse(resJSON []byte) (map[string]interface{}, error) {
+ var response struct {
+ Result map[string]interface{}
+ Error string
+ }
+ err := json.Unmarshal(resJSON, &response)
+ if response.Error != "" {
+ return nil, errors.New(response.Error)
+ }
+ return response.Result, err
+}
+
+func initCore() (*zmq4.Socket, error) {
+ socket, err := zmq4.NewSocket(zmq4.REQ)
+ if err != nil {
+ return nil, err
+ }
+
+ err = socket.Connect(coreEndpoint)
+ return socket, err
+}