diff options
author | Ruben Pollan <meskio@sindominio.net> | 2018-01-19 19:51:03 +0100 |
---|---|---|
committer | Ruben Pollan <meskio@sindominio.net> | 2018-01-19 19:51:03 +0100 |
commit | 96a892f8400bc60a3a4021d7783776e2315036ba (patch) | |
tree | 50c3129c7d8a8724c6233a644de09b050bf265ac /bitmask/main.go | |
parent | 56b9c951111a4627cd5d9f5d8e72623a0c8ecb57 (diff) |
[feat] implement bitmask.core zmq comunication
Diffstat (limited to 'bitmask/main.go')
-rw-r--r-- | bitmask/main.go | 77 |
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 +} |