2014-05-08 10:33:46 +00:00
metrics = require ( " metrics-sharelatex " )
2014-02-12 10:23:40 +00:00
logger = require ( ' logger-sharelatex ' )
_ = require ( ' underscore ' )
2014-04-07 10:02:12 +00:00
User = require ( ' ../../models/User ' ) . User
Project = require ( ' ../../models/Project ' ) . Project
DocumentUpdaterHandler = require ( ' ../DocumentUpdater/DocumentUpdaterHandler ' )
2014-02-12 10:23:40 +00:00
Settings = require ( ' settings-sharelatex ' )
util = require ( ' util ' )
redis = require ( ' redis ' )
rclient = redis . createClient ( Settings . redis . web . port , Settings . redis . web . host )
rclient . auth ( Settings . redis . web . password )
2014-04-07 10:02:12 +00:00
RecurlyWrapper = require ( ' ../Subscription/RecurlyWrapper ' )
SubscriptionHandler = require ( ' ../Subscription/SubscriptionHandler ' )
projectEntityHandler = require ( ' ../Project/ProjectEntityHandler ' )
TpdsPollingBackgroundTasks = require ( " ../ThirdPartyDataStore/TpdsPollingBackgroundTasks " )
EditorRealTimeController = require ( " ../Editor/EditorRealTimeController " )
2014-02-12 10:23:40 +00:00
2014-05-08 10:33:46 +00:00
oneMinInMs = 60 * 1000
updateOpenConnetionsMetrics = ()->
metrics . gauge " open_connections.socketio " , require ( " ../../infrastructure/Server " ) . io ? . sockets ? . clients ( ) ? . length
metrics . gauge " open_connections.http " , _ . size ( require ( ' http ' ) . globalAgent ? . sockets )
metrics . gauge " open_connections.https " , _ . size ( require ( ' https ' ) . globalAgent ? . sockets )
setTimeout updateOpenConnetionsMetrics , oneMinInMs
setTimeout updateOpenConnetionsMetrics , oneMinInMs
2014-02-12 10:23:40 +00:00
module.exports = AdminController =
index : (req, res)=>
http = require ( ' http ' )
openSockets = { }
for url , agents of require ( ' http ' ) . globalAgent . sockets
openSockets [ " http:// #{ url } " ] = ( agent . _httpMessage . path for agent in agents )
for url , agents of require ( ' https ' ) . globalAgent . sockets
openSockets [ " https:// #{ url } " ] = ( agent . _httpMessage . path for agent in agents )
memory = process . memoryUsage ( )
2014-04-07 10:02:12 +00:00
io = require ( " ../../infrastructure/Server " ) . io
2014-02-12 10:23:40 +00:00
allUsers = io . sockets . clients ( )
users = [ ]
allUsers . forEach (user)->
u = { }
user . get " email " , (err, email)->
u.email = email
user . get " first_name " , (err, first_name)->
u.first_name = first_name
user . get " last_name " , (err, last_name)->
u.last_name = last_name
user . get " project_id " , (err, project_id)->
u.project_id = project_id
user . get " user_id " , (err, user_id)->
u.user_id = user_id
user . get " signup_date " , (err, signup_date)->
u.signup_date = signup_date
user . get " login_count " , (err, login_count)->
u.login_count = login_count
user . get " connected_time " , (err, connected_time)->
now = new Date ( )
connected_mins = ( ( ( now - new Date ( connected_time ) ) / 1000 ) / 60 ) . toFixed ( 2 )
u.connected_mins = connected_mins
users . push u
d = new Date ( )
today = d . getDate ( ) + " : " + ( d . getMonth ( ) + 1 ) + " : " + d . getFullYear ( ) + " : "
yesterday = ( d . getDate ( ) - 1 ) + " : " + ( d . getMonth ( ) + 1 ) + " : " + d . getFullYear ( ) + " : "
multi = rclient . multi ( )
multi . get today + " docsets "
multi . get yesterday + " docsets "
multi . exec (err, replys)->
redisstats =
today:
docsets: replys [ 0 ]
compiles: replys [ 1 ]
yesterday:
docsets: replys [ 2 ]
compiles: replys [ 3 ]
DocumentUpdaterHandler . getNumberOfDocsInMemory (err, numberOfInMemoryDocs)=>
User . count (err, totalUsers)->
Project . count (err, totalProjects)->
res . render ' admin ' ,
title: ' System Admin '
currentConnectedUsers : allUsers . length
users: users
numberOfAceDocs : numberOfInMemoryDocs
totalUsers: totalUsers
totalProjects: totalProjects
openSockets: openSockets
redisstats: redisstats
dissconectAllUsers: (req, res)=>
logger . warn " disconecting everyone "
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. "
res . send ( 200 )
closeEditor : (req, res)->
logger . warn " closing editor "
Settings.editorIsOpen = req . body . isOpen
res . send ( 200 )
writeAllToMongo : (req, res)->
logger . log " writing all docs to mongo "
Settings.mongo.writeAll = true
DocumentUpdaterHandler . flushAllDocsToMongo ()->
logger . log " all docs have been saved to mongo "
res . send ( )
syncUserToSubscription: (req, res)->
{ user_id , subscription_id } = req . body
RecurlyWrapper . getSubscription subscription_id , { } , (err, subscription)->
User . findById user_id , (err, user)->
SubscriptionHandler . syncSubscriptionToUser subscription , user . _id , (err)->
logger . log user_id : user_id , subscription_id : subscription_id , " linked account to subscription "
res . send ( )
flushProjectToTpds: (req, res)->
projectEntityHandler . flushProjectToThirdPartyDataStore req . body . project_id , (err)->
res . send 200
pollUsersWithDropbox: (req, res)->
TpdsPollingBackgroundTasks . pollUsersWithDropbox ->
res . send 200
updateProjectCompiler: ( req , res , next = (error) -> ) ->
Project . findOne _id: req . body . project_id , (error, project) ->
return next ( error ) if error ?
project.useClsi2 = ( req . body . new == " new " )
logger . log project_id: req . body . project_id , useClsi2: project . useClsi2 , " updating project compiler "
project . save (error) ->
return next ( error ) if error ?
res . send ( 200 )