DeploymentManager.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. const logger = require('logger-sharelatex')
  2. const settings = require('settings-sharelatex')
  3. const fs = require('fs')
  4. // Monitor a status file (e.g. /etc/real_time_status) periodically and close the
  5. // service if the file contents don't contain the matching deployment colour.
  6. const FILE_CHECK_INTERVAL = 5000
  7. const statusFile = settings.deploymentFile
  8. const deploymentColour = settings.deploymentColour
  9. var serviceCloseTime
  10. function updateDeploymentStatus(fileContent) {
  11. const closed = fileContent && !fileContent.includes(deploymentColour)
  12. if (closed && !settings.serviceIsClosed) {
  13. settings.serviceIsClosed = true
  14. serviceCloseTime = Date.now() + 60 * 1000 // delay closing by 1 minute
  15. logger.warn({ fileContent }, 'closing service')
  16. } else if (!closed && settings.serviceIsClosed) {
  17. settings.serviceIsClosed = false
  18. logger.warn({ fileContent }, 'opening service')
  19. }
  20. }
  21. function pollStatusFile() {
  22. fs.readFile(statusFile, { encoding: 'utf8' }, (err, fileContent) => {
  23. if (err) {
  24. logger.error(
  25. { file: statusFile, fsErr: err },
  26. 'error reading service status file'
  27. )
  28. return
  29. }
  30. updateDeploymentStatus(fileContent)
  31. })
  32. }
  33. function checkStatusFileSync() {
  34. // crash on start up if file does not exist
  35. const content = fs.readFileSync(statusFile, { encoding: 'utf8' })
  36. updateDeploymentStatus(content)
  37. }
  38. module.exports = {
  39. initialise() {
  40. if (statusFile && deploymentColour) {
  41. logger.log(
  42. { statusFile, deploymentColour, interval: FILE_CHECK_INTERVAL },
  43. 'monitoring deployment status file'
  44. )
  45. checkStatusFileSync() // perform an initial synchronous check at start up
  46. setInterval(pollStatusFile, FILE_CHECK_INTERVAL) // continue checking periodically
  47. }
  48. },
  49. deploymentIsClosed() {
  50. return settings.serviceIsClosed && Date.now() > serviceCloseTime
  51. }
  52. }