AdminController.coffee 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. metrics = require("metrics-sharelatex")
  2. logger = require('logger-sharelatex')
  3. _ = require('underscore')
  4. User = require('../../models/User').User
  5. Quote = require('../../models/Quote').Quote
  6. Project = require('../../models/Project').Project
  7. DocumentUpdaterHandler = require('../DocumentUpdater/DocumentUpdaterHandler')
  8. Settings = require('settings-sharelatex')
  9. util = require('util')
  10. redis = require('redis')
  11. rclient = redis.createClient(Settings.redis.web.port, Settings.redis.web.host)
  12. rclient.auth(Settings.redis.web.password)
  13. RecurlyWrapper = require('../Subscription/RecurlyWrapper')
  14. SubscriptionHandler = require('../Subscription/SubscriptionHandler')
  15. projectEntityHandler = require('../Project/ProjectEntityHandler')
  16. TpdsPollingBackgroundTasks = require("../ThirdPartyDataStore/TpdsPollingBackgroundTasks")
  17. EditorRealTimeController = require("../Editor/EditorRealTimeController")
  18. oneMinInMs = 60 * 1000
  19. updateOpenConnetionsMetrics = ()->
  20. metrics.gauge "open_connections.socketio", require("../../infrastructure/Server").io?.sockets?.clients()?.length
  21. metrics.gauge "open_connections.http", _.size(require('http').globalAgent?.sockets)
  22. metrics.gauge "open_connections.https", _.size(require('https').globalAgent?.sockets)
  23. setTimeout updateOpenConnetionsMetrics, oneMinInMs
  24. setTimeout updateOpenConnetionsMetrics, oneMinInMs
  25. module.exports = AdminController =
  26. index : (req, res)=>
  27. http = require('http')
  28. openSockets = {}
  29. for url, agents of require('http').globalAgent.sockets
  30. openSockets["http://#{url}"] = (agent._httpMessage.path for agent in agents)
  31. for url, agents of require('https').globalAgent.sockets
  32. openSockets["https://#{url}"] = (agent._httpMessage.path for agent in agents)
  33. memory = process.memoryUsage()
  34. io = require("../../infrastructure/Server").io
  35. allUsers = io.sockets.clients()
  36. users = []
  37. allUsers.forEach (user)->
  38. u = {}
  39. user.get "email", (err, email)->
  40. u.email = email
  41. user.get "first_name", (err, first_name)->
  42. u.first_name = first_name
  43. user.get "last_name", (err, last_name)->
  44. u.last_name = last_name
  45. user.get "project_id", (err, project_id)->
  46. u.project_id = project_id
  47. user.get "user_id", (err, user_id)->
  48. u.user_id = user_id
  49. user.get "signup_date", (err, signup_date)->
  50. u.signup_date = signup_date
  51. user.get "login_count", (err, login_count)->
  52. u.login_count = login_count
  53. user.get "connected_time", (err, connected_time)->
  54. now = new Date()
  55. connected_mins = (((now - new Date(connected_time))/1000)/60).toFixed(2)
  56. u.connected_mins = connected_mins
  57. users.push u
  58. d = new Date()
  59. today = d.getDate()+":"+(d.getMonth()+1)+":"+d.getFullYear()+":"
  60. yesterday = (d.getDate()-1)+":"+(d.getMonth()+1)+":"+d.getFullYear()+":"
  61. multi = rclient.multi()
  62. multi.get today+"docsets"
  63. multi.get yesterday+"docsets"
  64. multi.exec (err, replys)->
  65. redisstats =
  66. today:
  67. docsets: replys[0]
  68. compiles: replys[1]
  69. yesterday:
  70. docsets: replys[2]
  71. compiles: replys[3]
  72. DocumentUpdaterHandler.getNumberOfDocsInMemory (err, numberOfInMemoryDocs)=>
  73. User.count (err, totalUsers)->
  74. Project.count (err, totalProjects)->
  75. res.render 'admin',
  76. title: 'System Admin'
  77. currentConnectedUsers:allUsers.length
  78. users: users
  79. numberOfAceDocs : numberOfInMemoryDocs
  80. totalUsers: totalUsers
  81. totalProjects: totalProjects
  82. openSockets: openSockets
  83. redisstats: redisstats
  84. dissconectAllUsers: (req, res)=>
  85. logger.warn "disconecting everyone"
  86. EditorRealTimeController.emitToAll 'forceDisconnect', "Sorry, we are performing a quick update to the editor and need to close it down. Please refresh the page to continue."
  87. res.send(200)
  88. closeEditor : (req, res)->
  89. logger.warn "closing editor"
  90. Settings.editorIsOpen = req.body.isOpen
  91. res.send(200)
  92. writeAllToMongo : (req, res)->
  93. logger.log "writing all docs to mongo"
  94. Settings.mongo.writeAll = true
  95. DocumentUpdaterHandler.flushAllDocsToMongo ()->
  96. logger.log "all docs have been saved to mongo"
  97. res.send()
  98. addQuote : (req, res)->
  99. quote = new Quote
  100. author: req.body.author
  101. quote: req.body.quote
  102. quote.save (err)->
  103. res.send 200
  104. syncUserToSubscription: (req, res)->
  105. {user_id, subscription_id} = req.body
  106. RecurlyWrapper.getSubscription subscription_id, {}, (err, subscription)->
  107. User.findById user_id, (err, user)->
  108. SubscriptionHandler.syncSubscriptionToUser subscription, user._id, (err)->
  109. logger.log user_id:user_id, subscription_id:subscription_id, "linked account to subscription"
  110. res.send()
  111. flushProjectToTpds: (req, res)->
  112. projectEntityHandler.flushProjectToThirdPartyDataStore req.body.project_id, (err)->
  113. res.send 200
  114. pollUsersWithDropbox: (req, res)->
  115. TpdsPollingBackgroundTasks.pollUsersWithDropbox ->
  116. res.send 200
  117. updateProjectCompiler: (req, res, next = (error) ->)->
  118. Project.findOne _id: req.body.project_id, (error, project) ->
  119. return next(error) if error?
  120. project.useClsi2 = (req.body.new == "new")
  121. logger.log project_id: req.body.project_id, useClsi2: project.useClsi2, "updating project compiler"
  122. project.save (error) ->
  123. return next(error) if error?
  124. res.send(200)