Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add --remotes flag for reading remotes from file #144

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
80 changes: 73 additions & 7 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package main

import (
"bufio"
"bytes"
"flag"
"fmt"
"io/ioutil"
Expand Down Expand Up @@ -34,6 +36,7 @@ var help = `

func main() {

envPrefix := flag.String("env-prefix", "CHISEL_", "")
version := flag.Bool("version", false, "")
v := flag.Bool("v", false, "")
flag.Bool("help", false, "")
Expand All @@ -56,9 +59,9 @@ func main() {

switch subcmd {
case "server":
server(args)
server(args, *envPrefix)
case "client":
client(args)
client(args, *envPrefix)
default:
fmt.Print(help)
os.Exit(0)
Expand Down Expand Up @@ -164,7 +167,7 @@ var serverHelp = `
instead of the system roots. This is commonly used to implement mutual-TLS.
` + commonHelp

func server(args []string) {
func server(args []string, envPrefix string) {

flags := flag.NewFlagSet("server", flag.ContinueOnError)

Expand Down Expand Up @@ -192,6 +195,7 @@ func server(args []string) {
fmt.Print(serverHelp)
os.Exit(0)
}
flagsFromEnv(flags, envPrefix)
flags.Parse(args)

if *host == "" {
Expand Down Expand Up @@ -387,9 +391,11 @@ var clientHelp = `
--tls-cert, a path to a PEM encoded certificate matching the provided
private key. The certificate must have client authentication
enabled (mutual-TLS).

--remotes, a file to read remotes from (one per line).
` + commonHelp

func client(args []string) {
func client(args []string, envPrefix string) {
flags := flag.NewFlagSet("client", flag.ContinueOnError)
config := chclient.Config{Headers: http.Header{}}
flags.StringVar(&config.Fingerprint, "fingerprint", "", "")
Expand All @@ -407,18 +413,29 @@ func client(args []string) {
sni := flags.String("sni", "", "")
pid := flags.Bool("pid", false, "")
verbose := flags.Bool("v", false, "")
flagRemotes := flags.String("remotes", "", "")
flags.Usage = func() {
fmt.Print(clientHelp)
os.Exit(0)
}
flagsFromEnv(flags, envPrefix)
flags.Parse(args)
//pull out options, put back remaining args
args = flags.Args()
if len(args) < 2 {
log.Fatalf("A server and least one remote is required")
switch len(args) {
case 0:
log.Fatalf("A server is required")
case 1:
if *flagRemotes == "" {
log.Fatalf("A server and least one remote is required")
}
}
config.Server = args[0]
config.Remotes = args[1:]
//read remotes
var err error
if config.Remotes, err = readRemotes(args[1:], *flagRemotes); err != nil {
log.Fatal(err)
}
//default auth
if config.Auth == "" {
config.Auth = os.Getenv("AUTH")
Expand Down Expand Up @@ -451,3 +468,52 @@ func client(args []string) {
log.Fatal(err)
}
}

var envRepl = strings.NewReplacer(" ", "_", "-", "_")

func flagsFromEnv(fs *flag.FlagSet, prefix string) {
notSet := make(map[string]*flag.Flag)
fs.VisitAll(func(f *flag.Flag) {
notSet[f.Name] = f
})
fs.Visit(func(f *flag.Flag) {
delete(notSet, f.Name)
})

for k, f := range notSet {
f.Value.Set(os.Getenv(prefix + strings.ToUpper(envRepl.Replace(k))))
}
}

func readRemotes(remotes []string, fl string) ([]string, error) {
var remotesFn string
if fl != "" {
remotesFn = fl
} else if len(remotes) == 1 && (remotes[0] == "-" || remotes[0] == "") {
remotes = remotes[:0]
remotesFn = "-"
}
if remotesFn == "" {
return remotes, nil
}
fh := os.Stdin
if remotesFn != "-" {
var err error
if fh, err = os.Open(remotesFn); err != nil {
return remotes, nil
}
}
scanner := bufio.NewScanner(fh)
for scanner.Scan() {
line := scanner.Bytes()
if i := bytes.IndexByte(line, '#'); i >= 0 {
line = line[:i]
}
line = bytes.TrimSpace(line)
if len(line) != 0 {
remotes = append(remotes, string(line))
}
}
fh.Close()
return remotes, nil
}