62 lines
1.2 KiB
Go
62 lines
1.2 KiB
Go
|
package client
|
||
|
|
||
|
import (
|
||
|
"crypto/tls"
|
||
|
"net/url"
|
||
|
|
||
|
"fmt"
|
||
|
|
||
|
"git.daplie.com/Daplie/go-rvpn-server/rvpn/packer"
|
||
|
"github.com/gorilla/websocket"
|
||
|
)
|
||
|
|
||
|
type Config struct {
|
||
|
Server string
|
||
|
Token string
|
||
|
Services map[string]int
|
||
|
Insecure bool
|
||
|
}
|
||
|
|
||
|
func Run(config *Config) error {
|
||
|
serverURL, err := url.Parse(config.Server)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("Invalid server URL: %v", err)
|
||
|
}
|
||
|
if serverURL.Scheme == "" {
|
||
|
serverURL.Scheme = "wss"
|
||
|
}
|
||
|
serverURL.Path = ""
|
||
|
|
||
|
query := make(url.Values)
|
||
|
query.Set("access_token", config.Token)
|
||
|
serverURL.RawQuery = query.Encode()
|
||
|
|
||
|
dialer := websocket.Dialer{}
|
||
|
if config.Insecure {
|
||
|
dialer.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
|
||
|
}
|
||
|
|
||
|
conn, _, err := dialer.Dial(serverURL.String(), nil)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("First connection to server failed - check auth: %v", err)
|
||
|
}
|
||
|
|
||
|
localConns := newLocalConns(conn, config.Services)
|
||
|
for {
|
||
|
_, message, err := conn.ReadMessage()
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("websocket read errored: %v", err)
|
||
|
}
|
||
|
|
||
|
p, err := packer.ReadMessage(message)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("packer read failed: %v", err)
|
||
|
}
|
||
|
|
||
|
err = localConns.Write(p)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("failed to write data: %v", err)
|
||
|
}
|
||
|
}
|
||
|
}
|