Advertisement
Guest User

Untitled

a guest
Feb 21st, 2020
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.67 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "io"
  6. "io/ioutil"
  7. "net/http"
  8. "os"
  9. "path/filepath"
  10. "time"
  11.  
  12. "github.com/prasmussen/gdrive/auth"
  13. "github.com/prasmussen/gdrive/cli"
  14. "github.com/prasmussen/gdrive/drive"
  15. )
  16.  
  17. const ClientId = "884864406153-ojvfu1h8nmedo5qp7bsp07e9olubudj0.apps.googleusercontent.com"
  18. const ClientSecret = "Z0NCmRgnxVwq5cT0J0gl6ZcR"
  19. const TokenFilename = "token_v2.json"
  20. const DefaultCacheFileName = "file_cache.json"
  21.  
  22. func listHandler(ctx cli.Context) {
  23. args := ctx.Args()
  24. err := newDrive(args).List(drive.ListFilesArgs{
  25. Out: os.Stdout,
  26. MaxFiles: args.Int64("maxFiles"),
  27. NameWidth: args.Int64("nameWidth"),
  28. Query: args.String("query"),
  29. SortOrder: args.String("sortOrder"),
  30. SkipHeader: args.Bool("skipHeader"),
  31. SizeInBytes: args.Bool("sizeInBytes"),
  32. AbsPath: args.Bool("absPath"),
  33. })
  34. checkErr(err)
  35. }
  36.  
  37. func listChangesHandler(ctx cli.Context) {
  38. args := ctx.Args()
  39. err := newDrive(args).ListChanges(drive.ListChangesArgs{
  40. Out: os.Stdout,
  41. PageToken: args.String("pageToken"),
  42. MaxChanges: args.Int64("maxChanges"),
  43. Now: args.Bool("now"),
  44. NameWidth: args.Int64("nameWidth"),
  45. SkipHeader: args.Bool("skipHeader"),
  46. })
  47. checkErr(err)
  48. }
  49.  
  50. func downloadHandler(ctx cli.Context) {
  51. args := ctx.Args()
  52. checkDownloadArgs(args)
  53. err := newDrive(args).Download(drive.DownloadArgs{
  54. Out: os.Stdout,
  55. Id: args.String("fileId"),
  56. Force: args.Bool("force"),
  57. Skip: args.Bool("skip"),
  58. Path: args.String("path"),
  59. Delete: args.Bool("delete"),
  60. Recursive: args.Bool("recursive"),
  61. Stdout: args.Bool("stdout"),
  62. Progress: progressWriter(args.Bool("noProgress")),
  63. Timeout: durationInSeconds(args.Int64("timeout")),
  64. })
  65. checkErr(err)
  66. }
  67.  
  68. func downloadQueryHandler(ctx cli.Context) {
  69. args := ctx.Args()
  70. err := newDrive(args).DownloadQuery(drive.DownloadQueryArgs{
  71. Out: os.Stdout,
  72. Query: args.String("query"),
  73. Force: args.Bool("force"),
  74. Skip: args.Bool("skip"),
  75. Recursive: args.Bool("recursive"),
  76. Path: args.String("path"),
  77. Progress: progressWriter(args.Bool("noProgress")),
  78. })
  79. checkErr(err)
  80. }
  81.  
  82. func downloadSyncHandler(ctx cli.Context) {
  83. args := ctx.Args()
  84. cachePath := filepath.Join(args.String("configDir"), DefaultCacheFileName)
  85. err := newDrive(args).DownloadSync(drive.DownloadSyncArgs{
  86. Out: os.Stdout,
  87. Progress: progressWriter(args.Bool("noProgress")),
  88. Path: args.String("path"),
  89. RootId: args.String("fileId"),
  90. DryRun: args.Bool("dryRun"),
  91. DeleteExtraneous: args.Bool("deleteExtraneous"),
  92. Timeout: durationInSeconds(args.Int64("timeout")),
  93. Resolution: conflictResolution(args),
  94. Comparer: NewCachedMd5Comparer(cachePath),
  95. })
  96. checkErr(err)
  97. }
  98.  
  99. func downloadRevisionHandler(ctx cli.Context) {
  100. args := ctx.Args()
  101. err := newDrive(args).DownloadRevision(drive.DownloadRevisionArgs{
  102. Out: os.Stdout,
  103. FileId: args.String("fileId"),
  104. RevisionId: args.String("revId"),
  105. Force: args.Bool("force"),
  106. Stdout: args.Bool("stdout"),
  107. Path: args.String("path"),
  108. Progress: progressWriter(args.Bool("noProgress")),
  109. Timeout: durationInSeconds(args.Int64("timeout")),
  110. })
  111. checkErr(err)
  112. }
  113.  
  114. func uploadHandler(ctx cli.Context) {
  115. args := ctx.Args()
  116. checkUploadArgs(args)
  117. err := newDrive(args).Upload(drive.UploadArgs{
  118. Out: os.Stdout,
  119. Progress: progressWriter(args.Bool("noProgress")),
  120. Path: args.String("path"),
  121. Name: args.String("name"),
  122. Description: args.String("description"),
  123. Parents: args.StringSlice("parent"),
  124. Mime: args.String("mime"),
  125. Recursive: args.Bool("recursive"),
  126. Share: args.Bool("share"),
  127. Delete: args.Bool("delete"),
  128. ChunkSize: args.Int64("chunksize"),
  129. Timeout: durationInSeconds(args.Int64("timeout")),
  130. })
  131. checkErr(err)
  132. }
  133.  
  134. func uploadStdinHandler(ctx cli.Context) {
  135. args := ctx.Args()
  136. err := newDrive(args).UploadStream(drive.UploadStreamArgs{
  137. Out: os.Stdout,
  138. In: os.Stdin,
  139. Name: args.String("name"),
  140. Description: args.String("description"),
  141. Parents: args.StringSlice("parent"),
  142. Mime: args.String("mime"),
  143. Share: args.Bool("share"),
  144. ChunkSize: args.Int64("chunksize"),
  145. Timeout: durationInSeconds(args.Int64("timeout")),
  146. Progress: progressWriter(args.Bool("noProgress")),
  147. })
  148. checkErr(err)
  149. }
  150.  
  151. func uploadSyncHandler(ctx cli.Context) {
  152. args := ctx.Args()
  153. cachePath := filepath.Join(args.String("configDir"), DefaultCacheFileName)
  154. err := newDrive(args).UploadSync(drive.UploadSyncArgs{
  155. Out: os.Stdout,
  156. Progress: progressWriter(args.Bool("noProgress")),
  157. Path: args.String("path"),
  158. RootId: args.String("fileId"),
  159. DryRun: args.Bool("dryRun"),
  160. DeleteExtraneous: args.Bool("deleteExtraneous"),
  161. ChunkSize: args.Int64("chunksize"),
  162. Timeout: durationInSeconds(args.Int64("timeout")),
  163. Resolution: conflictResolution(args),
  164. Comparer: NewCachedMd5Comparer(cachePath),
  165. })
  166. checkErr(err)
  167. }
  168.  
  169. func updateHandler(ctx cli.Context) {
  170. args := ctx.Args()
  171. err := newDrive(args).Update(drive.UpdateArgs{
  172. Out: os.Stdout,
  173. Id: args.String("fileId"),
  174. Path: args.String("path"),
  175. Name: args.String("name"),
  176. Description: args.String("description"),
  177. Parents: args.StringSlice("parent"),
  178. Mime: args.String("mime"),
  179. Progress: progressWriter(args.Bool("noProgress")),
  180. ChunkSize: args.Int64("chunksize"),
  181. Timeout: durationInSeconds(args.Int64("timeout")),
  182. })
  183. checkErr(err)
  184. }
  185.  
  186. func infoHandler(ctx cli.Context) {
  187. args := ctx.Args()
  188. err := newDrive(args).Info(drive.FileInfoArgs{
  189. Out: os.Stdout,
  190. Id: args.String("fileId"),
  191. SizeInBytes: args.Bool("sizeInBytes"),
  192. })
  193. checkErr(err)
  194. }
  195.  
  196. func importHandler(ctx cli.Context) {
  197. args := ctx.Args()
  198. err := newDrive(args).Import(drive.ImportArgs{
  199. Mime: args.String("mime"),
  200. Out: os.Stdout,
  201. Path: args.String("path"),
  202. Parents: args.StringSlice("parent"),
  203. Progress: progressWriter(args.Bool("noProgress")),
  204. })
  205. checkErr(err)
  206. }
  207.  
  208. func exportHandler(ctx cli.Context) {
  209. args := ctx.Args()
  210. err := newDrive(args).Export(drive.ExportArgs{
  211. Out: os.Stdout,
  212. Id: args.String("fileId"),
  213. Mime: args.String("mime"),
  214. PrintMimes: args.Bool("printMimes"),
  215. Force: args.Bool("force"),
  216. })
  217. checkErr(err)
  218. }
  219.  
  220. func listRevisionsHandler(ctx cli.Context) {
  221. args := ctx.Args()
  222. err := newDrive(args).ListRevisions(drive.ListRevisionsArgs{
  223. Out: os.Stdout,
  224. Id: args.String("fileId"),
  225. NameWidth: args.Int64("nameWidth"),
  226. SizeInBytes: args.Bool("sizeInBytes"),
  227. SkipHeader: args.Bool("skipHeader"),
  228. })
  229. checkErr(err)
  230. }
  231.  
  232. func mkdirHandler(ctx cli.Context) {
  233. args := ctx.Args()
  234. err := newDrive(args).Mkdir(drive.MkdirArgs{
  235. Out: os.Stdout,
  236. Name: args.String("name"),
  237. Description: args.String("description"),
  238. Parents: args.StringSlice("parent"),
  239. })
  240. checkErr(err)
  241. }
  242.  
  243. func shareHandler(ctx cli.Context) {
  244. args := ctx.Args()
  245. err := newDrive(args).Share(drive.ShareArgs{
  246. Out: os.Stdout,
  247. FileId: args.String("fileId"),
  248. Role: args.String("role"),
  249. Type: args.String("type"),
  250. Email: args.String("email"),
  251. Domain: args.String("domain"),
  252. Discoverable: args.Bool("discoverable"),
  253. })
  254. checkErr(err)
  255. }
  256.  
  257. func shareListHandler(ctx cli.Context) {
  258. args := ctx.Args()
  259. err := newDrive(args).ListPermissions(drive.ListPermissionsArgs{
  260. Out: os.Stdout,
  261. FileId: args.String("fileId"),
  262. })
  263. checkErr(err)
  264. }
  265.  
  266. func shareRevokeHandler(ctx cli.Context) {
  267. args := ctx.Args()
  268. err := newDrive(args).RevokePermission(drive.RevokePermissionArgs{
  269. Out: os.Stdout,
  270. FileId: args.String("fileId"),
  271. PermissionId: args.String("permissionId"),
  272. })
  273. checkErr(err)
  274. }
  275.  
  276. func deleteHandler(ctx cli.Context) {
  277. args := ctx.Args()
  278. err := newDrive(args).Delete(drive.DeleteArgs{
  279. Out: os.Stdout,
  280. Id: args.String("fileId"),
  281. Recursive: args.Bool("recursive"),
  282. })
  283. checkErr(err)
  284. }
  285.  
  286. func listSyncHandler(ctx cli.Context) {
  287. args := ctx.Args()
  288. err := newDrive(args).ListSync(drive.ListSyncArgs{
  289. Out: os.Stdout,
  290. SkipHeader: args.Bool("skipHeader"),
  291. })
  292. checkErr(err)
  293. }
  294.  
  295. func listRecursiveSyncHandler(ctx cli.Context) {
  296. args := ctx.Args()
  297. err := newDrive(args).ListRecursiveSync(drive.ListRecursiveSyncArgs{
  298. Out: os.Stdout,
  299. RootId: args.String("fileId"),
  300. SkipHeader: args.Bool("skipHeader"),
  301. PathWidth: args.Int64("pathWidth"),
  302. SizeInBytes: args.Bool("sizeInBytes"),
  303. SortOrder: args.String("sortOrder"),
  304. })
  305. checkErr(err)
  306. }
  307.  
  308. func deleteRevisionHandler(ctx cli.Context) {
  309. args := ctx.Args()
  310. err := newDrive(args).DeleteRevision(drive.DeleteRevisionArgs{
  311. Out: os.Stdout,
  312. FileId: args.String("fileId"),
  313. RevisionId: args.String("revId"),
  314. })
  315. checkErr(err)
  316. }
  317.  
  318. func aboutHandler(ctx cli.Context) {
  319. args := ctx.Args()
  320. err := newDrive(args).About(drive.AboutArgs{
  321. Out: os.Stdout,
  322. SizeInBytes: args.Bool("sizeInBytes"),
  323. })
  324. checkErr(err)
  325. }
  326.  
  327. func aboutImportHandler(ctx cli.Context) {
  328. args := ctx.Args()
  329. err := newDrive(args).AboutImport(drive.AboutImportArgs{
  330. Out: os.Stdout,
  331. })
  332. checkErr(err)
  333. }
  334.  
  335. func aboutExportHandler(ctx cli.Context) {
  336. args := ctx.Args()
  337. err := newDrive(args).AboutExport(drive.AboutExportArgs{
  338. Out: os.Stdout,
  339. })
  340. checkErr(err)
  341. }
  342.  
  343. func getOauthClient(args cli.Arguments) (*http.Client, error) {
  344. if args.String("refreshToken") != "" && args.String("accessToken") != "" {
  345. ExitF("Access token not needed when refresh token is provided")
  346. }
  347.  
  348. if args.String("refreshToken") != "" {
  349. return auth.NewRefreshTokenClient(ClientId, ClientSecret, args.String("refreshToken")), nil
  350. }
  351.  
  352. if args.String("accessToken") != "" {
  353. return auth.NewAccessTokenClient(ClientId, ClientSecret, args.String("accessToken")), nil
  354. }
  355.  
  356. configDir := getConfigDir(args)
  357.  
  358. if args.String("serviceAccount") != "" {
  359. serviceAccountPath := ConfigFilePath(configDir, args.String("serviceAccount"))
  360. serviceAccountClient, err := auth.NewServiceAccountClient(serviceAccountPath)
  361. if err != nil {
  362. return nil, err
  363. }
  364. return serviceAccountClient, nil
  365. }
  366.  
  367. tokenPath := ConfigFilePath(configDir, TokenFilename)
  368. return auth.NewFileSourceClient(ClientId, ClientSecret, tokenPath, authCodePrompt)
  369. }
  370.  
  371. func getConfigDir(args cli.Arguments) string {
  372. // Use dir from environment var if present
  373. if os.Getenv("GDRIVE_CONFIG_DIR") != "" {
  374. return os.Getenv("GDRIVE_CONFIG_DIR")
  375. }
  376. return args.String("configDir")
  377. }
  378.  
  379. func newDrive(args cli.Arguments) *drive.Drive {
  380. oauth, err := getOauthClient(args)
  381. if err != nil {
  382. ExitF("Failed getting oauth client: %s", err.Error())
  383. }
  384.  
  385. client, err := drive.New(oauth)
  386. if err != nil {
  387. ExitF("Failed getting drive: %s", err.Error())
  388. }
  389.  
  390. return client
  391. }
  392.  
  393. func authCodePrompt(url string) func() string {
  394. return func() string {
  395. fmt.Println("Authentication needed")
  396. fmt.Println("Go to the following url in your browser:")
  397. fmt.Printf("%s\n\n", url)
  398. fmt.Print("Enter verification code: ")
  399.  
  400. var code string
  401. if _, err := fmt.Scan(&code); err != nil {
  402. fmt.Printf("Failed reading code: %s", err.Error())
  403. }
  404. return code
  405. }
  406. }
  407.  
  408. func progressWriter(discard bool) io.Writer {
  409. if discard {
  410. return ioutil.Discard
  411. }
  412. return os.Stderr
  413. }
  414.  
  415. func durationInSeconds(seconds int64) time.Duration {
  416. return time.Second * time.Duration(seconds)
  417. }
  418.  
  419. func conflictResolution(args cli.Arguments) drive.ConflictResolution {
  420. keepLocal := args.Bool("keepLocal")
  421. keepRemote := args.Bool("keepRemote")
  422. keepLargest := args.Bool("keepLargest")
  423.  
  424. if (keepLocal && keepRemote) || (keepLocal && keepLargest) || (keepRemote && keepLargest) {
  425. ExitF("Only one conflict resolution flag can be given")
  426. }
  427.  
  428. if keepLocal {
  429. return drive.KeepLocal
  430. }
  431.  
  432. if keepRemote {
  433. return drive.KeepRemote
  434. }
  435.  
  436. if keepLargest {
  437. return drive.KeepLargest
  438. }
  439.  
  440. return drive.NoResolution
  441. }
  442.  
  443. func checkUploadArgs(args cli.Arguments) {
  444. if args.Bool("recursive") && args.Bool("delete") {
  445. ExitF("--delete is not allowed for recursive uploads")
  446. }
  447.  
  448. if args.Bool("recursive") && args.Bool("share") {
  449. ExitF("--share is not allowed for recursive uploads")
  450. }
  451. }
  452.  
  453. func checkDownloadArgs(args cli.Arguments) {
  454. if args.Bool("recursive") && args.Bool("delete") {
  455. ExitF("--delete is not allowed for recursive downloads")
  456. }
  457. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement