set_tex_live_image.mjs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import Settings from '@overleaf/settings'
  2. import mongodb from 'mongodb-legacy'
  3. import { Project } from '../app/src/models/Project.js'
  4. const { ObjectId } = mongodb
  5. async function main() {
  6. const { image, projectIds } = parseArgs()
  7. await updateImage(image, projectIds)
  8. }
  9. function parseArgs() {
  10. if (process.argv.length < 4) {
  11. printUsage()
  12. process.exit(1)
  13. }
  14. const image = parseImage(process.argv[2])
  15. const projectIds = parseProjectIds(process.argv.slice(3))
  16. return { image, projectIds }
  17. }
  18. function printUsage() {
  19. console.error('Usage: node set_tex_live_image.js <image> <projectId> ...')
  20. }
  21. function parseImage(image) {
  22. const allowedImageNames = Settings.allowedImageNames.map(x => x.imageName)
  23. if (!allowedImageNames.includes(image)) {
  24. console.error(`Unknown image: ${image}`)
  25. console.error('Please use one of:')
  26. for (const allowedImage of allowedImageNames) {
  27. console.error(` - ${allowedImage}`)
  28. }
  29. process.exit(1)
  30. }
  31. return image
  32. }
  33. function parseProjectIds(projectIds) {
  34. const oids = []
  35. for (const projectId of projectIds) {
  36. let oid
  37. try {
  38. oid = new ObjectId(projectId)
  39. } catch (err) {
  40. console.error(`Invalid project id: ${projectId}`)
  41. process.exit(1)
  42. }
  43. oids.push(oid)
  44. }
  45. return oids
  46. }
  47. async function updateImage(image, projectIds) {
  48. const res = await Project.updateMany(
  49. { _id: { $in: projectIds.map(id => new ObjectId(id)) } },
  50. { $set: { imageName: `quay.io/sharelatex/${image}` } }
  51. ).exec()
  52. console.log(`Found ${res.matchedCount} out of ${projectIds.length} projects`)
  53. console.log(`Modified ${res.modifiedCount} projects`)
  54. }
  55. try {
  56. await main()
  57. process.exit()
  58. } catch (error) {
  59. console.error(error)
  60. process.exit(1)
  61. }