MongoAWSexternal.coffee 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. settings = require "settings-sharelatex"
  2. child_process = require "child_process"
  3. mongoUri = require "mongo-uri";
  4. logger = require "logger-sharelatex"
  5. AWS = require 'aws-sdk'
  6. fs = require 'fs'
  7. S3S = require 's3-streams'
  8. module.exports = MongoAWSexternal =
  9. archiveDocHistory: (project_id, doc_id, callback = (error) ->) ->
  10. MongoAWS.mongoExportDocHistory doc_id, (error, filepath) ->
  11. MongoAWS.s3upStream project_id, doc_id, filepath, callback
  12. #delete temp file?
  13. unArchiveDocHistory: (project_id, doc_id, callback = (error) ->) ->
  14. MongoAWS.s3downStream project_id, doc_id, (error, filepath) ->
  15. if error == null
  16. MongoAWS.mongoImportDocHistory filepath, callback
  17. #delete temp file?
  18. else
  19. callback
  20. mongoExportDocHistory: (doc_id, callback = (error, filepath) ->) ->
  21. uriData = mongoUri.parse(settings.mongo.url);
  22. filepath = settings.path.dumpFolder + '/' + doc_id + '.jsonUp'
  23. args = []
  24. args.push '-h'
  25. args.push uriData.hosts[0]
  26. args.push '-d'
  27. args.push uriData.database
  28. args.push '-c'
  29. args.push 'docHistory'
  30. args.push '-q'
  31. args.push "{doc_id: ObjectId('#{doc_id}') , expiresAt: {$exists : false} }"
  32. args.push '-o'
  33. args.push filepath
  34. proc = child_process.spawn "mongoexport", args
  35. proc.on "error", callback
  36. stderr = ""
  37. proc.stderr.on "data", (chunk) -> stderr += chunk.toString()
  38. proc.on "close", (code) ->
  39. if code == 0
  40. return callback(null,filepath)
  41. else
  42. return callback(new Error("mongodump failed: #{stderr}"),null)
  43. mongoImportDocHistory: (filepath, callback = (error) ->) ->
  44. uriData = mongoUri.parse(settings.mongo.url);
  45. args = []
  46. args.push '-h'
  47. args.push uriData.hosts[0]
  48. args.push '-d'
  49. args.push uriData.database
  50. args.push '-c'
  51. args.push 'docHistory'
  52. args.push '--file'
  53. args.push filepath
  54. proc = child_process.spawn "mongoimport", args
  55. proc.on "error", callback
  56. stderr = ""
  57. proc.stderr.on "data", (chunk) -> stderr += chunk.toString()
  58. proc.on "close", (code) ->
  59. if code == 0
  60. return callback(null,filepath)
  61. else
  62. return callback(new Error("mongodump failed: #{stderr}"),null)
  63. s3upStream: (project_id, doc_id, filepath, callback = (error) ->) ->
  64. AWS.config.update {
  65. accessKeyId: settings.filestore.s3.key
  66. secretAccessKey: settings.filestore.s3.secret
  67. }
  68. upload = S3S.WriteStream new AWS.S3(), {
  69. "Bucket": settings.filestore.stores.user_files,
  70. "Key": project_id+"/changes-"+doc_id
  71. }
  72. fs.createReadStream(filepath)
  73. .on 'open', (obj) ->
  74. return 1
  75. .pipe(upload)
  76. .on 'finish', () ->
  77. return callback(null)
  78. .on 'error', (err) ->
  79. return callback(err)
  80. s3downStream: (project_id, doc_id, callback = (error, filepath) ->) ->
  81. filepath = settings.path.dumpFolder + '/' + doc_id + '.jsonDown'
  82. AWS.config.update {
  83. accessKeyId: settings.filestore.s3.key
  84. secretAccessKey: settings.filestore.s3.secret
  85. }
  86. download = S3S.ReadStream new AWS.S3(), {
  87. "Bucket": settings.filestore.stores.user_files,
  88. "Key": project_id+"/changes-"+doc_id
  89. }
  90. download
  91. .on 'open', (obj) ->
  92. return 1
  93. .pipe(fs.createWriteStream(filepath))
  94. .on 'finish', () ->
  95. return callback(null, filepath)
  96. .on 'error', (err) ->
  97. return callback(err, null)