croc/main.go

131 lines
3.5 KiB
Go
Raw Normal View History

2018-06-28 15:38:07 +02:00
package main
2018-06-29 03:47:34 +02:00
import (
2018-06-30 18:47:27 +02:00
"errors"
2018-06-30 18:01:30 +02:00
"fmt"
2018-06-30 18:47:27 +02:00
"os"
2018-07-01 02:58:55 +02:00
"strings"
2018-06-30 18:47:27 +02:00
"time"
2018-06-29 03:47:34 +02:00
croc "github.com/schollz/croc/src"
2018-06-30 18:47:27 +02:00
"github.com/urfave/cli"
2018-06-29 03:47:34 +02:00
)
2018-06-28 15:38:07 +02:00
2018-06-30 18:47:27 +02:00
var version string
var cr *croc.Croc
2018-06-28 15:38:07 +02:00
func main() {
2018-06-30 18:47:27 +02:00
app := cli.NewApp()
app.Name = "croc"
if version == "" {
version = "dev"
}
app.Version = version
app.Compiled = time.Now()
app.Usage = "easily and securely transfer stuff from one computer to another"
app.UsageText = "croc allows any two computers to directly and securely transfer files"
// app.ArgsUsage = "[args and such]"
app.Commands = []cli.Command{
cli.Command{
Name: "send",
Usage: "send a file",
Description: "send a file over the relay",
ArgsUsage: "[filename]",
Flags: []cli.Flag{
2018-07-02 16:45:46 +02:00
cli.BoolFlag{Name: "no-compress, o"},
cli.BoolFlag{Name: "no-encrypt, e"},
2018-06-30 18:47:27 +02:00
},
HelpName: "croc send",
Action: func(c *cli.Context) error {
return send(c)
},
},
cli.Command{
Name: "receive",
Usage: "receive a file",
Description: "receve a file over the relay",
HelpName: "croc receive",
Action: func(c *cli.Context) error {
return receive(c)
},
},
cli.Command{
Name: "relay",
Usage: "start a croc relay",
Description: "the croc relay will handle websocket and TCP connections",
Flags: []cli.Flag{
cli.StringFlag{Name: "tcp", Value: "27130,27131,27132,27133", Usage: "ports for the tcp connections"},
cli.StringFlag{Name: "port", Value: "8130", Usage: "port that the websocket listens on"},
2018-07-01 02:58:55 +02:00
cli.StringFlag{Name: "curve", Value: "siec", Usage: "specify elliptic curve to use (p224, p256, p384, p521, siec)"},
2018-06-30 18:47:27 +02:00
},
HelpName: "croc relay",
Action: func(c *cli.Context) error {
return relay(c)
},
},
}
app.Flags = []cli.Flag{
2018-07-03 00:31:03 +02:00
cli.StringFlag{Name: "relay", Value: "wss://croc3.schollz.com"},
2018-06-30 18:47:27 +02:00
cli.StringFlag{Name: "code, c", Usage: "codephrase used to connect to relay"},
2018-07-01 22:43:15 +02:00
cli.BoolFlag{Name: "no-local", Usage: "disable local mode"},
2018-06-30 18:47:27 +02:00
cli.BoolFlag{Name: "local", Usage: "use only local mode"},
cli.BoolFlag{Name: "debug", Usage: "increase verbosity (a lot)"},
cli.BoolFlag{Name: "yes", Usage: "automatically agree to all prompts"},
cli.BoolFlag{Name: "stdout", Usage: "redirect file to stdout"},
2018-06-29 03:47:34 +02:00
}
2018-06-30 18:47:27 +02:00
app.EnableBashCompletion = true
app.HideHelp = false
app.HideVersion = false
app.BashComplete = func(c *cli.Context) {
fmt.Fprintf(c.App.Writer, "lipstick\nkiss\nme\nlipstick\nringo\n")
}
app.Action = func(c *cli.Context) error {
2018-06-30 19:45:23 +02:00
return cr.Receive(c.Args().First())
2018-06-30 18:47:27 +02:00
}
app.Before = func(c *cli.Context) error {
cr = croc.Init()
cr.AllowLocalDiscovery = true
cr.WebsocketAddress = c.GlobalString("relay")
2018-06-30 19:45:23 +02:00
cr.SetDebug(c.GlobalBool("debug"))
2018-06-30 18:47:27 +02:00
cr.Yes = c.GlobalBool("yes")
cr.Stdout = c.GlobalBool("stdout")
cr.LocalOnly = c.GlobalBool("local")
2018-07-01 22:43:15 +02:00
cr.NoLocal = c.GlobalBool("no-local")
2018-06-30 18:47:27 +02:00
return nil
}
err := app.Run(os.Args)
2018-06-28 15:38:07 +02:00
if err != nil {
2018-06-30 18:47:27 +02:00
fmt.Printf("error: %s", err.Error())
2018-06-28 15:38:07 +02:00
}
}
2018-06-30 18:47:27 +02:00
func send(c *cli.Context) error {
2018-07-01 23:53:35 +02:00
stat, _ := os.Stdin.Stat()
var fname string
if (stat.Mode() & os.ModeCharDevice) == 0 {
fname = "stdin"
} else {
fname = c.Args().First()
}
if fname == "" {
2018-06-30 18:47:27 +02:00
return errors.New("must specify file: croc send [filename]")
}
2018-07-02 16:45:46 +02:00
cr.UseCompression = !c.Bool("no-compress")
cr.UseEncryption = !c.Bool("no-encrypt")
2018-07-01 23:53:35 +02:00
return cr.Send(fname, c.GlobalString("code"))
2018-06-30 18:47:27 +02:00
}
func receive(c *cli.Context) error {
2018-06-30 19:45:23 +02:00
return cr.Receive(c.GlobalString("code"))
2018-06-30 18:47:27 +02:00
}
func relay(c *cli.Context) error {
2018-07-01 18:27:38 +02:00
cr.TcpPorts = strings.Split(c.String("tcp"), ",")
cr.ServerPort = c.String("port")
cr.CurveType = c.String("curve")
2018-07-01 18:23:15 +02:00
return cr.Relay()
2018-06-30 18:47:27 +02:00
}