set_tex_live_image.mjs 1.8 KB

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