You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

336 lines
7.3 KiB

  1. package cmd
  2. import (
  3. "fmt"
  4. "os"
  5. "strings"
  6. "github.com/dutchcoders/transfer.sh/server"
  7. "github.com/fatih/color"
  8. "github.com/minio/cli"
  9. "log"
  10. )
  11. var Version = "0.1"
  12. var helpTemplate = `NAME:
  13. {{.Name}} - {{.Usage}}
  14. DESCRIPTION:
  15. {{.Description}}
  16. USAGE:
  17. {{.Name}} {{if .Flags}}[flags] {{end}}command{{if .Flags}}{{end}} [arguments...]
  18. COMMANDS:
  19. {{range .Commands}}{{join .Names ", "}}{{ "\t" }}{{.Usage}}
  20. {{end}}{{if .Flags}}
  21. FLAGS:
  22. {{range .Flags}}{{.}}
  23. {{end}}{{end}}
  24. VERSION:
  25. ` + Version +
  26. `{{ "\n"}}`
  27. var globalFlags = []cli.Flag{
  28. cli.StringFlag{
  29. Name: "listener",
  30. Usage: "127.0.0.1:8080",
  31. Value: "127.0.0.1:8080",
  32. },
  33. // redirect to https?
  34. // hostnames
  35. cli.StringFlag{
  36. Name: "profile-listener",
  37. Usage: "127.0.0.1:6060",
  38. Value: "",
  39. },
  40. cli.BoolFlag{
  41. Name: "force-https",
  42. Usage: "",
  43. },
  44. cli.StringFlag{
  45. Name: "tls-listener",
  46. Usage: "127.0.0.1:8443",
  47. Value: "",
  48. },
  49. cli.BoolFlag{
  50. Name: "tls-listener-only",
  51. Usage: "",
  52. },
  53. cli.StringFlag{
  54. Name: "tls-cert-file",
  55. Value: "",
  56. },
  57. cli.StringFlag{
  58. Name: "tls-private-key",
  59. Value: "",
  60. },
  61. cli.StringFlag{
  62. Name: "temp-path",
  63. Usage: "path to temp files",
  64. Value: os.TempDir(),
  65. },
  66. cli.StringFlag{
  67. Name: "web-path",
  68. Usage: "path to static web files",
  69. Value: "",
  70. },
  71. cli.StringFlag{
  72. Name: "ga-key",
  73. Usage: "key for google analytics (front end)",
  74. Value: "",
  75. },
  76. cli.StringFlag{
  77. Name: "uservoice-key",
  78. Usage: "key for user voice (front end)",
  79. Value: "",
  80. },
  81. cli.StringFlag{
  82. Name: "provider",
  83. Usage: "s3|gdrive|local",
  84. Value: "",
  85. },
  86. cli.StringFlag{
  87. Name: "s3-endpoint",
  88. Usage: "",
  89. Value: "http://s3-eu-west-1.amazonaws.com",
  90. EnvVar: "S3_ENDPOINT",
  91. },
  92. cli.StringFlag{
  93. Name: "aws-access-key",
  94. Usage: "",
  95. Value: "",
  96. EnvVar: "AWS_ACCESS_KEY",
  97. },
  98. cli.StringFlag{
  99. Name: "aws-secret-key",
  100. Usage: "",
  101. Value: "",
  102. EnvVar: "AWS_SECRET_KEY",
  103. },
  104. cli.StringFlag{
  105. Name: "bucket",
  106. Usage: "",
  107. Value: "",
  108. EnvVar: "BUCKET",
  109. },
  110. cli.StringFlag{
  111. Name: "gdrive-client-json-filepath",
  112. Usage: "",
  113. Value: "",
  114. },
  115. cli.StringFlag{
  116. Name: "gdrive-local-config-path",
  117. Usage: "",
  118. Value: "",
  119. },
  120. cli.IntFlag{
  121. Name: "rate-limit",
  122. Usage: "requests per minute",
  123. Value: 0,
  124. EnvVar: "",
  125. },
  126. cli.StringFlag{
  127. Name: "lets-encrypt-hosts",
  128. Usage: "host1, host2",
  129. Value: "",
  130. EnvVar: "HOSTS",
  131. },
  132. cli.StringFlag{
  133. Name: "log",
  134. Usage: "/var/log/transfersh.log",
  135. Value: "",
  136. },
  137. cli.StringFlag{
  138. Name: "basedir",
  139. Usage: "path to storage",
  140. Value: "",
  141. },
  142. cli.StringFlag{
  143. Name: "clamav-host",
  144. Usage: "clamav-host",
  145. Value: "",
  146. EnvVar: "CLAMAV_HOST",
  147. },
  148. cli.StringFlag{
  149. Name: "virustotal-key",
  150. Usage: "virustotal-key",
  151. Value: "",
  152. EnvVar: "VIRUSTOTAL_KEY",
  153. },
  154. cli.BoolFlag{
  155. Name: "profiler",
  156. Usage: "enable profiling",
  157. },
  158. cli.StringFlag{
  159. Name: "http-auth-user",
  160. Usage: "user for http basic auth",
  161. Value: "",
  162. },
  163. cli.StringFlag{
  164. Name: "http-auth-pass",
  165. Usage: "pass for http basic auth",
  166. Value: "",
  167. },
  168. }
  169. type Cmd struct {
  170. *cli.App
  171. }
  172. func VersionAction(c *cli.Context) {
  173. fmt.Println(color.YellowString(fmt.Sprintf("transfer.sh: Easy file sharing from the command line")))
  174. }
  175. func New() *Cmd {
  176. logger := log.New(os.Stdout, "[transfer.sh]", log.LstdFlags)
  177. app := cli.NewApp()
  178. app.Name = "transfer.sh"
  179. app.Author = ""
  180. app.Usage = "transfer.sh"
  181. app.Description = `Easy file sharing from the command line`
  182. app.Flags = globalFlags
  183. app.CustomAppHelpTemplate = helpTemplate
  184. app.Commands = []cli.Command{
  185. {
  186. Name: "version",
  187. Action: VersionAction,
  188. },
  189. }
  190. app.Before = func(c *cli.Context) error {
  191. return nil
  192. }
  193. app.Action = func(c *cli.Context) {
  194. options := []server.OptionFn{}
  195. if v := c.String("listener"); v != "" {
  196. options = append(options, server.Listener(v))
  197. }
  198. if v := c.String("tls-listener"); v == "" {
  199. } else if c.Bool("tls-listener-only") {
  200. options = append(options, server.TLSListener(v, true))
  201. } else {
  202. options = append(options, server.TLSListener(v, false))
  203. }
  204. if v := c.String("profile-listener"); v != "" {
  205. options = append(options, server.ProfileListener(v))
  206. }
  207. if v := c.String("web-path"); v != "" {
  208. options = append(options, server.WebPath(v))
  209. }
  210. if v := c.String("ga-key"); v != "" {
  211. options = append(options, server.GoogleAnalytics(v))
  212. }
  213. if v := c.String("uservoice-key"); v != "" {
  214. options = append(options, server.UserVoice(v))
  215. }
  216. if v := c.String("temp-path"); v != "" {
  217. options = append(options, server.TempPath(v))
  218. }
  219. if v := c.String("log"); v != "" {
  220. options = append(options, server.LogFile(logger, v))
  221. } else {
  222. options = append(options, server.Logger(logger))
  223. }
  224. if v := c.String("lets-encrypt-hosts"); v != "" {
  225. options = append(options, server.UseLetsEncrypt(strings.Split(v, ",")))
  226. }
  227. if v := c.String("virustotal-key"); v != "" {
  228. options = append(options, server.VirustotalKey(v))
  229. }
  230. if v := c.String("clamav-host"); v != "" {
  231. options = append(options, server.ClamavHost(v))
  232. }
  233. if v := c.Int("rate-limit"); v > 0 {
  234. options = append(options, server.RateLimit(v))
  235. }
  236. if cert := c.String("tls-cert-file"); cert == "" {
  237. } else if pk := c.String("tls-private-key"); pk == "" {
  238. } else {
  239. options = append(options, server.TLSConfig(cert, pk))
  240. }
  241. if c.Bool("profiler") {
  242. options = append(options, server.EnableProfiler())
  243. }
  244. if c.Bool("force-https") {
  245. options = append(options, server.ForceHTTPs())
  246. }
  247. if httpAuthUser := c.String("http-auth-user"); httpAuthUser == "" {
  248. } else if httpAuthPass := c.String("http-auth-pass"); httpAuthPass == "" {
  249. } else {
  250. options = append(options, server.HttpAuthCredentials(httpAuthUser, httpAuthPass))
  251. }
  252. switch provider := c.String("provider"); provider {
  253. case "s3":
  254. if accessKey := c.String("aws-access-key"); accessKey == "" {
  255. panic("access-key not set.")
  256. } else if secretKey := c.String("aws-secret-key"); secretKey == "" {
  257. panic("secret-key not set.")
  258. } else if bucket := c.String("bucket"); bucket == "" {
  259. panic("bucket not set.")
  260. } else if storage, err := server.NewS3Storage(accessKey, secretKey, bucket, c.String("s3-endpoint"), logger); err != nil {
  261. panic(err)
  262. } else {
  263. options = append(options, server.UseStorage(storage))
  264. }
  265. case "gdrive":
  266. if clientJsonFilepath := c.String("gdrive-client-json-filepath"); clientJsonFilepath == "" {
  267. panic("client-json-filepath not set.")
  268. } else if localConfigPath := c.String("gdrive-local-config-path"); localConfigPath == "" {
  269. panic("local-config-path not set.")
  270. } else if basedir := c.String("basedir"); basedir == "" {
  271. panic("basedir not set.")
  272. } else if storage, err := server.NewGDriveStorage(clientJsonFilepath, localConfigPath, basedir, logger); err != nil {
  273. panic(err)
  274. } else {
  275. options = append(options, server.UseStorage(storage))
  276. }
  277. case "local":
  278. if v := c.String("basedir"); v == "" {
  279. panic("basedir not set.")
  280. } else if storage, err := server.NewLocalStorage(v, logger); err != nil {
  281. panic(err)
  282. } else {
  283. options = append(options, server.UseStorage(storage))
  284. }
  285. default:
  286. panic("Provider not set or invalid.")
  287. }
  288. srvr, err := server.New(
  289. options...,
  290. )
  291. if err != nil {
  292. logger.Println(color.RedString("Error starting server: %s", err.Error()))
  293. return
  294. }
  295. srvr.Run()
  296. }
  297. return &Cmd{
  298. App: app,
  299. }
  300. }