Skip to content
This repository has been archived by the owner on Nov 19, 2022. It is now read-only.

Commit

Permalink
TLS support for server
Browse files Browse the repository at this point in the history
  • Loading branch information
miguelmota committed Jun 14, 2020
1 parent b7b4459 commit 378aa9a
Show file tree
Hide file tree
Showing 9 changed files with 221 additions and 64 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -110,3 +110,5 @@ package-lock.json
data.txt
todo.txt
/main
localhost.pem
localhost-key.pem
26 changes: 19 additions & 7 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@ all:build
.PHONY: build
build: release-dry

.PHONY: start
start:
.PHONY: run
run:
go run cmd/streamhut/main.go

.PHONY: server
server:
go run cmd/streamhut/main.go server

.PHONY: listen
Expand Down Expand Up @@ -59,10 +63,18 @@ rollback:
schema:
sqlite3 data/sqlite3.db .schema > schema.sql

.PHONY: server
server:
CGO_CFLAGS="-g -O2 -Wno-return-local-addr" go run -gccgoflags "-L /lib64 -l pthread" cmd/streamhut/main.go server
.PHONY: fix-server
fix-server:
CGO_CFLAGS="-g -O2 -Wno-return-local-addr" go run -gccgoflags "-L /lib64 -l pthread" cmd/streamhut/main.go server $(args)

.PHONY: run
run:
.PHONY: fix-listen
fix-listen:
CGO_CFLAGS="-g -O2 -Wno-return-local-addr" go run -gccgoflags "-L /lib64 -l pthread" cmd/streamhut/main.go listen $(args)

.PHONY: fix-run
fix-run:
CGO_CFLAGS="-g -O2 -Wno-return-local-addr" go run -gccgoflags "-L /lib64 -l pthread" cmd/streamhut/main.go $(args)

.PHONY: fix-build
fix-build:
CGO_CFLAGS="-g -O2 -Wno-return-local-addr" go build -gccgoflags "-L /lib64 -l pthread" cmd/streamhut/main.go
12 changes: 10 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,12 @@ Stream to different server:
$ htop | streamhut -h localhost -p 1337
```

Stream to custom channel:

```bash
$ htop | streamhut -c mychannel
```

For more options, run `streamhut --help`

#### Run your own server:
Expand All @@ -131,10 +137,12 @@ HTTP/WebSocket port: 8080
TCP port: 1337
```

Stream to your server using netcat:
Run server with TLS/SSL:

```bash
$ exec > >(nc localhost 1337) 2>&1
$ mkcert localhost

$ sudo streamhut server --tls --tls-cert=localhost.pem --tls-key=localhost-key.pem -p 443
```

For more options, run `streamhut server --help`
Expand Down
64 changes: 53 additions & 11 deletions cmd/streamhut/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ var ErrChannelRequired = errors.New("Channel is required")

var yellow = color.New(color.FgYellow)
var yellowSprintf = color.New(color.FgYellow).SprintFunc()
var redSprintf = color.New(color.FgRed).SprintFunc()
var green = color.New(color.FgGreen)

func main() {
Expand All @@ -49,10 +50,13 @@ func main() {
var delay int
var timeout int
var open bool
var channel string

rootCmd := &cobra.Command{
Use: "streamhut",
Short: "Streamhut",
SilenceErrors: true,
SilenceUsage: true,
Use: "streamhut",
Short: "Streamhut",
Long: `Streamhut lets you stream and share your terminal.
For more info, visit: https://github.com/streamhut/streamhut`,
RunE: func(cmd *cobra.Command, args []string) error {
Expand All @@ -66,26 +70,32 @@ For more info, visit: https://github.com/streamhut/streamhut`,
Delay: time.Duration(delay) * time.Second,
Timeout: time.Duration(timeout) * time.Second,
Open: open,
Channel: channel,
})
},
}

rootCmd.PersistentFlags().BoolVarP(&help, "help", "", false, "Show help")
rootCmd.Flags().UintVarP(&connectPort, "port", "p", defaultTCPPort, "Host port")
rootCmd.Flags().StringVarP(&connectHost, "host", "h", "127.0.0.1", "Host to connect to")
rootCmd.Flags().StringVarP(&channel, "channel", "c", "", "Channel to stream to")
rootCmd.Flags().IntVarP(&delay, "delay", "d", defaultDelay, "Delay in seconds before starting stream")
rootCmd.Flags().IntVarP(&timeout, "timeout", "t", defaultTimeout, "Max timeout allowed before exiting if no data is recieved after starting")
rootCmd.Flags().BoolVarP(&open, "open", "o", false, "Open the stream url in your browser")

var httpPort uint
var tcpPort uint
var tls bool
var tlsCert string
var tlsKey string
var dbPath string
var dbType string
var shareBaseURL string
var webTarURL string
var webDir string
var humanBandwidthQuotaLimit string
var humanBandwidthQuotaDuration string
var randomChannelLength uint

serverCmd := &cobra.Command{
Use: "server",
Expand All @@ -111,7 +121,16 @@ For more info, visit: https://github.com/streamhut/streamhut`,
})

if shareBaseURL == "" {
shareBaseURL = fmt.Sprintf("http://127.0.0.1:%d/", httpPort)
protocol := "http"
if tls {
protocol = "https"
}

if httpPort == 443 || httpPort == 80 {
shareBaseURL = fmt.Sprintf("%s://localhost/", protocol)
} else {
shareBaseURL = fmt.Sprintf("%s://localhost:%d/", protocol, httpPort)
}
}

bandwidthQuotaLimit := util.StorageSizeToUint64(humanBandwidthQuotaLimit)
Expand All @@ -124,17 +143,25 @@ For more info, visit: https://github.com/streamhut/streamhut`,
ShareBaseURL: shareBaseURL,
BandwidthQuotaLimit: bandwidthQuotaLimit,
BandwidthQuotaDuration: bandwidthQuotaDuration,
RandomChannelLength: randomChannelLength,
})

errCh := make(chan error, 2)
go func() {
log.Fatal(tcpServer.Start())
err := tcpServer.Start()
if err != nil {
errCh <- err
}
}()

server := httpserver.NewServer(&httpserver.Config{
Port: httpPort,
WS: ws,
WebTarURL: webTarURL,
WebDir: webDir,
TLS: tls,
TLSCert: tlsCert,
TLSKey: tlsKey,
})

handleExit(func() {
Expand All @@ -152,7 +179,17 @@ For more info, visit: https://github.com/streamhut/streamhut`,
yellow.Printf("Bandwidth quota duration: %s\n", tcpServer.BandwidthQuotaDuration().String())
}

return server.Start()
err := server.Start()
if err != nil {
errCh <- err
}

select {
case err := <-errCh:
return err
default:
return nil
}
},
}

Expand Down Expand Up @@ -192,25 +229,29 @@ For more info, visit: https://github.com/streamhut/streamhut`,

serverCmd.Flags().UintVarP(&httpPort, "port", "p", defaultHTTPPort, "HTTP Port")
serverCmd.Flags().UintVarP(&tcpPort, "tcp-port", "t", defaultTCPPort, "TCP Port")
serverCmd.Flags().BoolVarP(&tls, "tls", "", false, "Enable TLS. Requires TLS cert and TLS key parameters.")
serverCmd.Flags().StringVarP(&tlsCert, "tls-cert", "", "", "TLS certificate file path")
serverCmd.Flags().StringVarP(&tlsKey, "tls-key", "", "", "TLS key file path")
serverCmd.Flags().StringVarP(&dbPath, "db-path", "", sqlite3db.DefaultDBPath, "Sqlite3 database path")
serverCmd.Flags().StringVarP(&dbType, "db-type", "", "sqlite3", "Database type: Options are \"sqlite\"")
serverCmd.Flags().StringVarP(&shareBaseURL, "share-base-url", "", defaultShareBaseURL, "Share base URL. Example: \"https://stream.ht/\"")
serverCmd.Flags().StringVarP(&webTarURL, "web-tar-url", "", httpserver.DefaultWebTarURL, "Web app tarball url to download")
serverCmd.Flags().StringVarP(&webDir, "web-dir", "", httpserver.DefaultWebDir, "Web app directory")
serverCmd.Flags().StringVarP(&humanBandwidthQuotaLimit, "bandwidth-quota-limit", "", os.Getenv("BANDWIDTH_QUOTA_LIMIT"), "bandwidth quota limit (eg. 100kb, 1mb, 1gb, etc)")
serverCmd.Flags().StringVarP(&humanBandwidthQuotaDuration, "bandwidth-quota-duration", "", os.Getenv("BANDWIDTH_QUOTA_DURATION"), "bandwidth quota duration (eg. 45s, 10m, 1h, 1d, 1w, etc)")
serverCmd.Flags().StringVarP(&humanBandwidthQuotaLimit, "bandwidth-quota-limit", "", os.Getenv("BANDWIDTH_QUOTA_LIMIT"), "Bandwidth quota limit (eg. 100kb, 1mb, 1gb, etc)")
serverCmd.Flags().StringVarP(&humanBandwidthQuotaDuration, "bandwidth-quota-duration", "", os.Getenv("BANDWIDTH_QUOTA_DURATION"), "Bandwidth quota duration (eg. 45s, 10m, 1h, 1d, 1w, etc)")
serverCmd.Flags().UintVarP(&randomChannelLength, "random-channel-length", "", 6, "Number of characters to use for random channel generation.")

var host string
var port uint
var listenChannel string
var insecure bool
var channel string

listenCmd := &cobra.Command{
Use: "listen",
Short: "Listen on a channel",
Long: "Listen on a channel and receive messages",
Args: func(cmd *cobra.Command, args []string) error {
if channel == "" {
if listenChannel == "" {
return ErrChannelRequired
}

Expand All @@ -229,14 +270,15 @@ For more info, visit: https://github.com/streamhut/streamhut`,
},
}

listenCmd.Flags().StringVarP(&channel, "channel", "c", "", "Channel to listen on")
listenCmd.Flags().StringVarP(&listenChannel, "channel", "c", "", "Channel to listen on")
listenCmd.Flags().StringVarP(&host, "host", "h", "127.0.0.1", "Host to run listener on")
listenCmd.Flags().UintVarP(&port, "port", "p", 1337, "Host port listening on")
listenCmd.Flags().UintVarP(&port, "port", "p", 8080, "Host port listening on")
listenCmd.Flags().BoolVarP(&insecure, "insecure", "i", false, "Set if remote host is insecure (not using HTTPS)")

rootCmd.AddCommand(serverCmd, listenCmd)

if err := rootCmd.Execute(); err != nil {
fmt.Println(redSprintf(err))
os.Exit(1)
}
}
Expand Down

0 comments on commit 378aa9a

Please sign in to comment.