disconnect_all_users.mjs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import { promisify } from 'node:util'
  2. import Settings from '@overleaf/settings'
  3. import AdminController from '../app/src/Features/ServerAdmin/AdminController.mjs'
  4. import minimist from 'minimist'
  5. import { fileURLToPath } from 'node:url'
  6. import { scriptRunner } from './lib/ScriptRunner.mjs'
  7. const args = minimist(process.argv.slice(2), {
  8. string: ['confirm-site-url', 'delay-in-seconds'],
  9. default: {
  10. 'delay-in-seconds': 10,
  11. 'confirm-site-url': '',
  12. },
  13. })
  14. const sleep = promisify(setTimeout)
  15. async function main() {
  16. if (args.help) {
  17. console.error()
  18. console.error(
  19. ' usage: node disconnect_all_users.mjs [--delay-in-seconds=10] --confirm-site-url=https://www....\n'
  20. )
  21. process.exit(1)
  22. }
  23. const isSaaS = Boolean(Settings.overleaf)
  24. if (isSaaS && args['confirm-site-url'] !== Settings.siteUrl) {
  25. console.error()
  26. console.error(
  27. 'Please confirm the environment you want to disconnect ALL USERS from by specifying the site URL aka PUBLIC_URL, e.g. --confirm-site-url=https://www.dev-overleaf.com for the dev-env'
  28. )
  29. console.error()
  30. console.error(
  31. `!!! --confirm-site-url=${
  32. args['confirm-site-url'] || "''"
  33. } does not match the PUBLIC_URL in this environment.`
  34. )
  35. console.error()
  36. console.error(' Are you running this script in the correct environment?')
  37. process.exit(1)
  38. }
  39. const delay = parseInt(args['delay-in-seconds'] || '10', 10)
  40. if (!(delay >= 0)) {
  41. console.error(
  42. `--delay-in-seconds='${args['delay-in-seconds']}' should be a number >=0`
  43. )
  44. process.exit(1)
  45. }
  46. console.log()
  47. console.log(
  48. `Disconnect all users from ${args['confirm-site-url']}, with delay ${delay}`
  49. )
  50. if (isSaaS) {
  51. console.error(' Use CTRL+C in the next 5s to abort.')
  52. await sleep(5 * 1000)
  53. }
  54. await AdminController._sendDisconnectAllUsersMessage(delay)
  55. }
  56. if (fileURLToPath(import.meta.url) === process.argv[1]) {
  57. try {
  58. await scriptRunner(main)
  59. console.error('Done.')
  60. process.exit(0)
  61. } catch (error) {
  62. console.error('Error', error)
  63. process.exit(1)
  64. }
  65. }