diff --git a/cli/jprqc.go b/cli/jprqc.go index 6128bfd..2be3a14 100644 --- a/cli/jprqc.go +++ b/cli/jprqc.go @@ -8,6 +8,7 @@ import ( "strings" "github.com/azimjohn/jprq/cli/debugger" + qr_coder "github.com/azimjohn/jprq/cli/utils" "github.com/azimjohn/jprq/server/events" "github.com/azimjohn/jprq/server/tunnel" ) @@ -23,7 +24,7 @@ type jprqClient struct { httpDebugger debugger.Debugger } -func (j *jprqClient) Start(port int, debug bool) { +func (j *jprqClient) Start(port int, debug bool, gen_qe bool) { eventCon, err := net.Dial("tcp", j.config.Remote.Events) if err != nil { log.Fatalf("failed to connect to event server: %s\n", err) @@ -62,6 +63,10 @@ func (j *jprqClient) Start(port int, debug bool) { fmt.Printf("Status: \t Online \n") fmt.Printf("Protocol: \t %s \n", strings.ToUpper(j.protocol)) fmt.Printf("Forwarded: \t %s -> %s \n", strings.TrimSuffix(j.publicServer, ":80"), j.localServer) + if gen_qe { + fmt.Println("Qr Code:") + qr_coder.GenerateQRStr(j.publicServer) + } if j.protocol == "http" && debug { j.httpDebugger = debugger.New() diff --git a/cli/main.go b/cli/main.go index f75ea7b..e998512 100644 --- a/cli/main.go +++ b/cli/main.go @@ -18,6 +18,7 @@ type Flags struct { debug bool cname string subdomain string + qr bool } func printVersion() { @@ -26,7 +27,7 @@ func printVersion() { } func printHelp() { - fmt.Printf("Usage: jprq [arguments]\n\n") + fmt.Printf("Usage: jprq [arguments] [flags]\n\n") fmt.Println("Commands:") fmt.Println(" auth Set authentication token from jprq.io/auth") fmt.Println(" tcp Start a TCP tunnel on the specified port") @@ -36,6 +37,7 @@ func printHelp() { fmt.Println(" serve Serve files with built-in Http Server") fmt.Println(" --help Show this help message") fmt.Println(" --version Show the version number") + fmt.Println(" --qr Generate QR code for public URL") os.Exit(0) } @@ -93,7 +95,7 @@ func main() { cname: flags.cname, } - go client.Start(port, flags.debug) + go client.Start(port, flags.debug, flags.qr) signalChan := make(chan os.Signal, 1) signal.Notify(signalChan, os.Interrupt) @@ -110,6 +112,8 @@ func parseFlags(args []string) Flags { flags.subdomain = args[i+1] case "-c", "-cname", "--cname": flags.cname = args[i+1] + case "--qr", "--share-qr": + flags.qr = true } } return flags diff --git a/cli/utils/qr_coder.go b/cli/utils/qr_coder.go new file mode 100644 index 0000000..a955a0a --- /dev/null +++ b/cli/utils/qr_coder.go @@ -0,0 +1,20 @@ +package qr_coder + +import ( + "fmt" + + qrcode "github.com/skip2/go-qrcode" +) + +func GenerateQRStr(content string) error { + + q, err := qrcode.New(content, qrcode.Medium) + if err != nil { + fmt.Printf("\033[38;5;208mError: could not generate QRCode: %v\033[0m\n", err) // color is orange + return err + } + fmt.Println(q.ToSmallString(false)) + fmt.Println() + return nil + +} diff --git a/go.mod b/go.mod index ad794d6..63f3fb0 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,11 @@ module github.com/azimjohn/jprq -go 1.22 +go 1.23.0 + +toolchain go1.23.4 require ( github.com/djherbis/buffer v1.2.0 github.com/djherbis/nio/v3 v3.0.1 + github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e ) diff --git a/go.sum b/go.sum index 344f01e..673d276 100644 --- a/go.sum +++ b/go.sum @@ -3,3 +3,5 @@ github.com/djherbis/buffer v1.2.0 h1:PH5Dd2ss0C7CRRhQCZ2u7MssF+No9ide8Ye71nPHcrQ github.com/djherbis/buffer v1.2.0/go.mod h1:fjnebbZjCUpPinBRD+TDwXSOeNQ7fPQWLfGQqiAiUyE= github.com/djherbis/nio/v3 v3.0.1 h1:6wxhnuppteMa6RHA4L81Dq7ThkZH8SwnDzXDYy95vB4= github.com/djherbis/nio/v3 v3.0.1/go.mod h1:Ng4h80pbZFMla1yKzm61cF0tqqilXZYrogmWgZxOcmg= +github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= +github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M=