diff options
Diffstat (limited to 'bitmask')
-rw-r--r-- | bitmask/events.go | 40 | ||||
-rw-r--r-- | bitmask/main.go | 77 | ||||
-rw-r--r-- | bitmask/vpn.go | 27 |
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 +} |