summaryrefslogtreecommitdiff
path: root/bitmask
diff options
context:
space:
mode:
Diffstat (limited to 'bitmask')
-rw-r--r--bitmask/events.go40
-rw-r--r--bitmask/main.go77
-rw-r--r--bitmask/vpn.go27
3 files changed, 144 insertions, 0 deletions
diff --git a/bitmask/events.go b/bitmask/events.go
new file mode 100644
index 0000000..3fed26a
--- /dev/null
+++ b/bitmask/events.go
@@ -0,0 +1,40 @@
+package bitmask
+
+import (
+ "github.com/pebbe/zmq4"
+)
+
+const (
+ eventsEndpoint = "tcp://127.0.0.1:9001"
+ //serverKeyPath = "/home/user/.config/leap/events/zmq_certificates/public_keys/server.key" // FIXME
+)
+
+func initEvents() (*zmq4.Socket, error) {
+ socket, err := zmq4.NewSocket(zmq4.SUB)
+ if err != nil {
+ return nil, err
+ }
+
+ if zmq4.HasCurve() {
+ // TODO
+ }
+
+ err = socket.Connect(eventsEndpoint)
+ if err != nil {
+ return nil, err
+ }
+ return socket, nil
+}
+
+func (b *Bitmask) fetchStatus() {
+ // TODO: this should be a subscription to the event
+ for {
+ time.Sleep(time.Second)
+ status, err := b.GetStatus()
+ if err != nil {
+ log.Printf("Error receiving status: %v", err)
+ continue
+ }
+ b.statusCh <- status
+ }
+}
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
+}
diff --git a/bitmask/vpn.go b/bitmask/vpn.go
new file mode 100644
index 0000000..025e2e3
--- /dev/null
+++ b/bitmask/vpn.go
@@ -0,0 +1,27 @@
+package bitmask
+
+import (
+ "log"
+ "time"
+)
+
+// StartVPN for provider
+func (b *Bitmask) StartVPN(provider string) error {
+ _, err := b.send("vpn", "start", provider)
+ return err
+}
+
+// StopVPN or cancel
+func (b *Bitmask) StopVPN() error {
+ _, err := b.send("vpn", "stop")
+ return err
+}
+
+// GetStatus returns the VPN status
+func (b *Bitmask) GetStatus() (string, error) {
+ res, err := b.send("vpn", "status")
+ if err != nil {
+ return "", err
+ }
+ return res["status"].(string), nil
+}