send.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package cmd
  2. import (
  3. "fmt"
  4. "github.com/claudiodangelis/qrcp/config"
  5. "github.com/claudiodangelis/qrcp/logger"
  6. "github.com/claudiodangelis/qrcp/payload"
  7. "github.com/claudiodangelis/qrcp/qr"
  8. "github.com/eiannone/keyboard"
  9. "github.com/claudiodangelis/qrcp/server"
  10. "github.com/spf13/cobra"
  11. )
  12. func sendCmdFunc(command *cobra.Command, args []string) error {
  13. log := logger.New(quietFlag)
  14. payload, err := payload.FromArgs(args, zipFlag)
  15. if err != nil {
  16. return err
  17. }
  18. // Load configuration
  19. configOptions := config.Options{
  20. Interface: interfaceFlag,
  21. Port: portFlag,
  22. Path: pathFlag,
  23. FQDN: fqdnFlag,
  24. KeepAlive: keepaliveFlag,
  25. ListAllInterfaces: listallinterfacesFlag,
  26. Secure: secureFlag,
  27. TLSCert: tlscertFlag,
  28. TLSKey: tlskeyFlag,
  29. }
  30. cfg, err := config.New(configFlag, configOptions)
  31. if err != nil {
  32. return err
  33. }
  34. srv, err := server.New(&cfg)
  35. if err != nil {
  36. return err
  37. }
  38. // Sets the payload
  39. srv.Send(payload)
  40. log.Print(`Scan the following URL with a QR reader to start the file transfer, press CTRL+C or "q" to exit:`)
  41. log.Print(srv.SendURL)
  42. qr.RenderString(srv.SendURL)
  43. if browserFlag {
  44. srv.DisplayQR(srv.SendURL)
  45. }
  46. if err := keyboard.Open(); err == nil {
  47. defer func() {
  48. keyboard.Close()
  49. }()
  50. go func() {
  51. for {
  52. char, key, _ := keyboard.GetKey()
  53. if string(char) == "q" || key == keyboard.KeyCtrlC {
  54. srv.Shutdown()
  55. }
  56. }
  57. }()
  58. } else {
  59. log.Print(fmt.Sprintf("Warning: keyboard not detected: %v", err))
  60. }
  61. if err := srv.Wait(); err != nil {
  62. return err
  63. }
  64. return nil
  65. }
  66. var sendCmd = &cobra.Command{
  67. Use: "send",
  68. Short: "Send a file(s) or directories from this host",
  69. Long: "Send a file(s) or directories from this host",
  70. Aliases: []string{"s"},
  71. Example: `# Send /path/file.gif. Webserver listens on a random port
  72. qrcp send /path/file.gif
  73. # Shorter version:
  74. qrcp /path/file.gif
  75. # Zip file1.gif and file2.gif, then send the zip package
  76. qrcp /path/file1.gif /path/file2.gif
  77. # Zip the content of directory, then send the zip package
  78. qrcp /path/directory
  79. # Send file.gif by creating a webserver on port 8080
  80. qrcp --port 8080 /path/file.gif
  81. `,
  82. Args: cobra.MinimumNArgs(1),
  83. RunE: sendCmdFunc,
  84. }