consolidate ENVs for remote server, truncate debug output, add --verbose option

This commit is contained in:
AJ ONeal 2020-07-17 23:28:12 -06:00
parent 2229f62e5f
commit d0b6a899f2
15 changed files with 175 additions and 43 deletions

View File

@ -87,9 +87,8 @@ func main() {
verbose := flag.Bool("verbose", false, "log excessively") verbose := flag.Bool("verbose", false, "log excessively")
flag.Parse() flag.Parse()
dbg.Debug = *verbose
if !dbg.Debug { if !dbg.Debug {
dbg.Debug = ("true" == os.Getenv("VERBOSE")) dbg.Debug = *verbose
} }
if len(os.Args) >= 2 { if len(os.Args) >= 2 {
@ -217,7 +216,7 @@ func main() {
} }
} }
if 0 == len(*relay) { if 0 == len(*relay) {
*relay = os.Getenv("RELAY_URL") // "wss://example.com:443" *relay = os.Getenv("TUNNEL_RELAY_URL") // "wss://example.com:443"
} }
if 0 == len(*relay) { if 0 == len(*relay) {
if len(bindAddrs) > 0 { if len(bindAddrs) > 0 {

View File

@ -58,7 +58,7 @@ func main() {
} }
} }
if 0 == len(*relay) { if 0 == len(*relay) {
*relay = os.Getenv("RELAY") // "wss://example.com:443" *relay = os.Getenv("TUNNEL_RELAY_URL") // "wss://example.com:443"
} }
if 0 == len(*relay) { if 0 == len(*relay) {
fmt.Fprintf(os.Stderr, "Missing relay url\n") fmt.Fprintf(os.Stderr, "Missing relay url\n")

55
dbg/dbg.go Normal file
View File

@ -0,0 +1,55 @@
package dbg
import (
"encoding/hex"
"fmt"
"os"
)
// Debug is a flag for whether or not verbose logging should be activated
var Debug bool
var rawBytes bool
var allBytes bool
func init() {
Init()
}
// Init will set debug vars from ENVs and print out whatever is set
func Init() {
if !Debug {
Debug = ("true" == os.Getenv("VERBOSE"))
}
if !allBytes {
allBytes = ("true" == os.Getenv("VERBOSE_BYTES"))
}
if !rawBytes {
rawBytes = ("true" == os.Getenv("VERBOSE_RAW"))
}
if Debug {
fmt.Fprintf(os.Stderr, "DEBUG=true\n")
}
if allBytes || rawBytes {
fmt.Fprintf(os.Stderr, "VERBOSE_BYTES=true\n")
}
if rawBytes {
fmt.Fprintf(os.Stderr, "VERBOSE_RAW=true\n")
}
}
// Trunc will take up to the first and last 20 bytes of the input to product 80 char hex output
func Trunc(b []byte, n int) string {
bin := b[:n]
if allBytes || rawBytes {
if rawBytes {
return string(bin)
}
return hex.EncodeToString(bin)
}
if n > 40 {
return hex.EncodeToString(bin[:19]) + ".." + hex.EncodeToString(bin[n-19:])
}
return hex.EncodeToString(bin)
}

View File

@ -1,4 +1,8 @@
CLIENT_SUBJECT=newbie CLIENT_SUBJECT=newbie
RELAY=wss://devices.example.com:8443 ACME_RELAY_URL=https://mgmt.example.com/api/dns
AUTH_URL=https://devices.example.com/api
TUNNEL_RELAY_URL=wss://devices.example.com
CLIENT_SECRET=xxxxxxxxxxxxxxxx CLIENT_SECRET=xxxxxxxxxxxxxxxx
LOCALS=https:$CLIENT_SUBJECT.devices.example.com:3000,http:$CLIENT_SUBJECT.devices.example.com:3000 LOCALS=https:$CLIENT_SUBJECT.devices.example.com:3000,http:$CLIENT_SUBJECT.devices.example.com:3000
#PORT_FORWARDS=3443:3001,8443:3002
#DUCKDNS_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

View File

@ -1,4 +1,5 @@
SECRET=xxxxxxxxxxxxxxxx MGMT_SECRET=xxxxxxxxxxxxxxxx
AUTH_BASEURL=https://devices.example.com
DUCKDNS_TOKEN=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX DUCKDNS_TOKEN=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
GODADDY_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx GODADDY_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
GODADDY_API_SECRET=XXXXXXXXXXXXXXXXXXXXXX GODADDY_API_SECRET=XXXXXXXXXXXXXXXXXXXXXX

View File

@ -1,9 +1,10 @@
source .env source .env
TOKEN=$(go run -mod=vendor cmd/signjwt/*.go $SECRET) TOKEN=$(go run -mod=vendor cmd/signjwt/*.go $SECRET)
AUTH_URL=${AUTH_URL:-"http://mgmt.example.com:3010"} AUTH_URL=${AUTH_URL:-"http://mgmt.example.com:3010/api"}
CLIENT_SUBJECT=${CLIENT_SUBJECT:-"newbie"} CLIENT_SUBJECT=${CLIENT_SUBJECT:-"newbie"}
curl -X POST $AUTH_URL/api/devices \ curl -X POST $AUTH_URL/devices \
-H "Authorization: Bearer ${TOKEN}" \ -H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \
-d '{ "slug": "'$CLIENT_SUBJECT'" }' -d '{ "slug": "'$CLIENT_SUBJECT'" }'

View File

@ -3,16 +3,52 @@
set -e set -e
set -u set -u
go generate -mod=vendor ./...
go build -mod=vendor -o telebit cmd/telebit/*.go
source .env source .env
ACME_RELAY_URL=${ACME_RELAY_URL:-"https://devices.examples.com"} #go generate -mod=vendor ./...
AUTH_URL=${AUTH_URL:-"https://devices.examples.com"} CLIENT_ID="${CLIENT_ID:-"${APP_ID:-"test-id"}"}"
CLIENT_SECRET=${CLIENT_SECRET:-"yyyyyyyyyyyyyyyy"} CLIENT_SECRET="${CLIENT_SECRET:-}"
go build -mod=vendor -o ./telebit \
-ldflags="-X 'main.ClientID=$CLIENT_ID' -X 'main.ClientSecret=$CLIENT_SECRET'" \
cmd/telebit/*.go
#go build -mod=vendor -o telebit \
# cmd/telebit/*.go
./telebit --acme-agree=true \ # For Device Authorization across services
--acme-relay-url $ACME_RELAY_URL/api \ AUTH_URL=${AUTH_URL:-"https://devices.examples.com/api"}
--auth-url $AUTH_URL/api \ APP_ID="$CLIENT_ID"
--app-id test-id --secret "$CLIENT_SECRET" SECRET="${CLIENT_SECRET:-"xxxxxxxxxxxxxxxx"}"
#CLIENT_SECRET=${CLIENT_SECRET:-"yyyyyyyyyyyyyyyy"}
LOCALS="${LOCALS:-"https:newbie.devices.examples.com:3000,http:newbie.devices.examples.com:3000"}"
# For the Remote Server (Tunnel Client)
TUNNEL_RELAY_URL=${TUNNEL_RELAY_URL:-"wss://devices.example.com"}
LISTEN=":3080"
# For Let's Encrypt / ACME registration
ACME_AGREE=${ACME_AGREE:-}
ACME_EMAIL=${ACME_EMAIL:-"me@example.com"}
# For Let's Encrypt / ACME challenges
ACME_RELAY_URL=${ACME_RELAY_URL:-"https://devices.examples.com/api/dns"}
VERBOSE=${VERBOSE:-}
VERBOSE_BYTES=${VERBOSE_BYTES:-}
VERBOSE_RAW=${VERBOSE_RAW:-}
./telebit \
--auth-url $AUTH_URL \
--app-id "$APP_ID" \
--secret "$CLIENT_SECRET" \
--relay-url $TUNNEL_RELAY_URL \
--listen "$LISTEN" \
--locals "$LOCALS" \
--acme-agree=${ACME_AGREE} \
--acme-email "$ACME_EMAIL" \
--acme-relay-url $ACME_RELAY_URL \
--verbose=$VERBOSE
# --subject "$CLIENT_SUBJECT" \
#PORT_FORWARDS=3443:3001,8443:3002

View File

@ -6,6 +6,7 @@ import (
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"git.coolaj86.com/coolaj86/go-telebitd/dbg"
"git.coolaj86.com/coolaj86/go-telebitd/mgmt/authstore" "git.coolaj86.com/coolaj86/go-telebitd/mgmt/authstore"
telebit "git.coolaj86.com/coolaj86/go-telebitd/mplexer" telebit "git.coolaj86.com/coolaj86/go-telebitd/mplexer"
) )
@ -35,10 +36,13 @@ func Ping(authURL, token string) error {
func Register(authURL, secret, ppid string) (kid string, err error) { func Register(authURL, secret, ppid string) (kid string, err error) {
pub := authstore.ToPublicKeyString(ppid) pub := authstore.ToPublicKeyString(ppid)
jsonb := bytes.NewBuffer([]byte( jsons := fmt.Sprintf(`{ "machine_ppid": "%s", "public_key": "%s" }`, ppid, pub)
fmt.Sprintf(`{ "machine_ppid": "%s", "public_key": "%s" }`, ppid, pub), jsonb := bytes.NewBuffer([]byte(jsons))
)) fullURL := authURL + "/register-device/" + secret
msg, err := telebit.Request("POST", authURL+"/register-device/"+secret, "", jsonb) if dbg.Debug {
fmt.Println("[debug] authURL, secret, ppid", fullURL, secret, jsons)
}
msg, err := telebit.Request("POST", fullURL, "", jsonb)
if nil != err { if nil != err {
return "", err return "", err
} }

View File

@ -5,8 +5,10 @@ import (
"crypto/sha256" "crypto/sha256"
"encoding/base64" "encoding/base64"
"errors" "errors"
"fmt"
"time" "time"
"git.coolaj86.com/coolaj86/go-telebitd/dbg"
jwt "github.com/dgrijalva/jwt-go" jwt "github.com/dgrijalva/jwt-go"
) )
@ -50,6 +52,9 @@ func ToPublicKeyString(secret string) string {
func HMACToken(secret string) (token string, err error) { func HMACToken(secret string) (token string, err error) {
keyID := ToPublicKeyString(secret) keyID := ToPublicKeyString(secret)
if dbg.Debug {
fmt.Printf("[debug] keyID=%s\n", keyID)
}
b := make([]byte, 16) b := make([]byte, 16)
_, _ = rand.Read(b) _, _ = rand.Read(b)

View File

@ -1,10 +1,11 @@
package telebit package telebit
import ( import (
"encoding/hex"
"fmt" "fmt"
"io" "io"
"log" "log"
"git.coolaj86.com/coolaj86/go-telebitd/dbg"
) )
// Decoder handles a Reader stream containing mplexy-encoded clients // Decoder handles a Reader stream containing mplexy-encoded clients
@ -33,7 +34,9 @@ func (d *Decoder) Decode(out Router) error {
for { for {
b := make([]byte, d.bufferSize) b := make([]byte, d.bufferSize)
n, err := d.in.Read(b) n, err := d.in.Read(b)
log.Println("[debug] [decoder] [srv] Tunnel read", n, string(b[:n])) if dbg.Debug {
log.Println("[debug] [decoder] [srv] Tunnel read", n, dbg.Trunc(b, n))
}
if n > 0 { if n > 0 {
rx <- b[:n] rx <- b[:n]
} }
@ -49,7 +52,9 @@ func (d *Decoder) Decode(out Router) error {
select { select {
case b := <-rx: case b := <-rx:
n, err := p.Write(b) n, err := p.Write(b)
fmt.Println("[debug] [decoder] [srv] Tunnel write", n, len(b), hex.EncodeToString(b)) if dbg.Debug {
fmt.Println("[debug] [decoder] [srv] Tunnel write", n, len(b), dbg.Trunc(b, len(b)))
}
// TODO BUG: handle when 'n' bytes written is less than len(b) // TODO BUG: handle when 'n' bytes written is less than len(b)
if nil != err { if nil != err {
fmt.Println("[debug] [decoder] [srv] Tunnel write error") fmt.Println("[debug] [decoder] [srv] Tunnel write error")

View File

@ -2,11 +2,13 @@ package telebit
import ( import (
"context" "context"
"encoding/hex"
"errors" "errors"
"fmt" "fmt"
"io" "io"
"strings"
"sync" "sync"
"git.coolaj86.com/coolaj86/go-telebitd/dbg"
) )
// TODO: try to be more like encoding/csv, or more like encoding/pem and encoding/json? // TODO: try to be more like encoding/csv, or more like encoding/pem and encoding/json?
@ -73,7 +75,9 @@ func (enc *Encoder) Encode(rin io.Reader, src, dst Addr) error {
b := make([]byte, enc.bufferSize) b := make([]byte, enc.bufferSize)
//fmt.Println("loopers gonna loop") //fmt.Println("loopers gonna loop")
n, err := rin.Read(b) n, err := rin.Read(b)
fmt.Println("[debug] [encoder] [srv] Browser read", n, hex.EncodeToString(b[:n])) if dbg.Debug {
fmt.Println("[debug] [encoder] [srv] Browser read", n, dbg.Trunc(b, n))
}
if n > 0 { if n > 0 {
rx <- b[:n] rx <- b[:n]
} }
@ -94,7 +98,9 @@ func (enc *Encoder) Encode(rin io.Reader, src, dst Addr) error {
case <-enc.ctx.Done(): case <-enc.ctx.Done():
// TODO: verify that closing the reader will cause the goroutine to be released // TODO: verify that closing the reader will cause the goroutine to be released
//rin.Close() //rin.Close()
fmt.Println("[debug] [encoder] [srv] Browser ctx.Done()") if dbg.Debug {
fmt.Println("[debug] [encoder] [srv] Browser ctx.Done()")
}
return errors.New("cancelled by encoder read or parent context") return errors.New("cancelled by encoder read or parent context")
/* /*
case <-enc.subctx.Done(): case <-enc.subctx.Done():
@ -113,8 +119,10 @@ func (enc *Encoder) Encode(rin io.Reader, src, dst Addr) error {
//fmt.Println("[debug] encode payload:", string(b)) //fmt.Println("[debug] encode payload:", string(b))
_, err = enc.write(header, b) _, err = enc.write(header, b)
fmt.Println("[debug] [encoder] [srv] Browser-to-tun write", len(header), string(header)) if dbg.Debug {
fmt.Println("[debug] [encoder] [srv]", len(b), hex.EncodeToString(b)) fmt.Println("[debug] [encoder] [srv] Browser-to-tun write", len(header), strings.TrimSpace(string(header)))
fmt.Println("[debug] [encoder] [srv]", len(b), dbg.Trunc(b, len(b)))
}
if nil != err { if nil != err {
fmt.Println("[debug] [encoder] [srv] Browser-to-tun write err", err) fmt.Println("[debug] [encoder] [srv] Browser-to-tun write err", err)
//rin.Close() //rin.Close()

View File

@ -3,6 +3,8 @@ package telebit
import ( import (
"errors" "errors"
"fmt" "fmt"
"git.coolaj86.com/coolaj86/go-telebitd/dbg"
) )
type Parser struct { type Parser struct {
@ -69,7 +71,9 @@ func (p *Parser) Write(b []byte) (int, error) {
switch p.parseState { switch p.parseState {
case VersionState: case VersionState:
fmt.Println("[debug] version state", b[0]) if dbg.Debug {
fmt.Println("[debug] MPLEXY version byte", b[0], string(b))
}
p.state.version = b[0] p.state.version = b[0]
b = b[1:] b = b[1:]
p.consumed++ p.consumed++
@ -80,7 +84,9 @@ func (p *Parser) Write(b []byte) (int, error) {
switch p.state.version { switch p.state.version {
case V1: case V1:
fmt.Println("[debug] v1 unmarshal") if dbg.Debug {
fmt.Println("[debug] MPLEXY packet is of type v1")
}
return p.unpackV1(b) return p.unpackV1(b)
default: default:
return 0, errors.New("incorrect version or version not implemented") return 0, errors.New("incorrect version or version not implemented")

View File

@ -5,6 +5,8 @@ import (
"fmt" "fmt"
"strconv" "strconv"
"strings" "strings"
"git.coolaj86.com/coolaj86/go-telebitd/dbg"
) )
const ( const (
@ -182,7 +184,9 @@ func (p *Parser) unpackV1Header(b []byte, n int) ([]byte, error) {
} }
*/ */
p.parseState++ p.parseState++
fmt.Printf("[debug] unpackV1 parse state: %v\n", p.parseState) if dbg.Debug {
fmt.Printf("[debug] unpackV1 parse state: %v\n", p.parseState)
}
if "end" == service { if "end" == service {
fmt.Println("[debug] unpackV1 end") fmt.Println("[debug] unpackV1 end")
@ -192,7 +196,9 @@ func (p *Parser) unpackV1Header(b []byte, n int) ([]byte, error) {
} }
func (p *Parser) unpackV1Payload(b []byte, n int) ([]byte, error) { func (p *Parser) unpackV1Payload(b []byte, n int) ([]byte, error) {
fmt.Printf("[debug] unpackV1 payload state: %+v\n", p.state) if dbg.Debug {
fmt.Printf("[debug] unpackV1 payload state: %+v\n", p.state)
}
// Handle "connect" and "end" // Handle "connect" and "end"
if 0 == p.state.payloadLen { if 0 == p.state.payloadLen {
/* /*
@ -241,6 +247,9 @@ func (p *Parser) unpackV1Payload(b []byte, n int) ([]byte, error) {
if p.state.payloadWritten == p.state.payloadLen { if p.state.payloadWritten == p.state.payloadLen {
p.state = ParserState{} p.state = ParserState{}
p.parseState = 0 p.parseState = 0
if dbg.Debug {
fmt.Println("[debug] MPLEXY completed packet and reset state")
}
} }
return b, nil return b, nil
} }

View File

@ -2,7 +2,6 @@ package telebit
import ( import (
"context" "context"
"encoding/hex"
"fmt" "fmt"
"io" "io"
"net" "net"
@ -75,11 +74,7 @@ func (wsw *WebsocketTunnel) Read(b []byte) (int, error) {
n, err := wsw.tmpr.Read(b) n, err := wsw.tmpr.Read(b)
if dbg.Debug { if dbg.Debug {
logmsg := hex.EncodeToString(b[:n]) fmt.Println("[debug] [wstun] Read", n, dbg.Trunc(b, n))
if len(logmsg) > 80 {
logmsg = logmsg[:39] + "..." + logmsg[n-38:]
}
fmt.Println("[debug] [wstun] Read", n, logmsg)
} }
if nil != err { if nil != err {
if dbg.Debug { if dbg.Debug {

View File

@ -1,7 +1,6 @@
package table package table
import ( import (
"encoding/hex"
"fmt" "fmt"
"net" "net"
"sync" "sync"
@ -10,6 +9,7 @@ import (
"strconv" "strconv"
"strings" "strings"
"git.coolaj86.com/coolaj86/go-telebitd/dbg"
telebit "git.coolaj86.com/coolaj86/go-telebitd/mplexer" telebit "git.coolaj86.com/coolaj86/go-telebitd/mplexer"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
) )
@ -114,7 +114,9 @@ type SubscriberConn struct {
func (s *SubscriberConn) RouteBytes(src, dst telebit.Addr, payload []byte) { func (s *SubscriberConn) RouteBytes(src, dst telebit.Addr, payload []byte) {
id := fmt.Sprintf("%s:%d", src.Hostname(), src.Port()) id := fmt.Sprintf("%s:%d", src.Hostname(), src.Port())
fmt.Println("[debug] Routing some more bytes:", len(payload)) if dbg.Debug {
fmt.Println("[debug] Routing some more bytes:", dbg.Trunc(payload, len(payload)))
}
fmt.Printf("id %s\nsrc %+v\n", id, src) fmt.Printf("id %s\nsrc %+v\n", id, src)
fmt.Printf("dst %s %+v\n", dst.Scheme(), dst) fmt.Printf("dst %s %+v\n", dst.Scheme(), dst)
clientX, ok := s.Clients.Load(id) clientX, ok := s.Clients.Load(id)
@ -133,7 +135,9 @@ func (s *SubscriberConn) RouteBytes(src, dst telebit.Addr, payload []byte) {
for { for {
n, err := client.Write(payload) n, err := client.Write(payload)
fmt.Println("[debug] table Write", len(payload), hex.EncodeToString(payload)) if dbg.Debug {
fmt.Println("[debug] table Write", dbg.Trunc(payload, len(payload)))
}
if nil == err || io.EOF == err { if nil == err || io.EOF == err {
break break
} }