mirror of
https://github.com/HackPlan/RootPanel.git
synced 2026-04-24 03:35:59 +08:00
finish refactor linux
This commit is contained in:
@@ -2,98 +2,27 @@ child_process = require 'child_process'
|
||||
os = require 'os'
|
||||
fs = require 'fs'
|
||||
|
||||
config = require '../../config.coffee'
|
||||
{config} = app
|
||||
{mAccount} = app.models
|
||||
|
||||
mAccount = require '../../core/model/account'
|
||||
linux = require './linux'
|
||||
|
||||
REDIS_KEY = 'rp:linux:resources_usage'
|
||||
REDIS_OVERVIEW = 'rp:linux:overview'
|
||||
ITEM_IN_RESOURCES_LIST = 3600 * 1000 / config.plugins.linux.monitor_cycle
|
||||
|
||||
exports.last_plist = []
|
||||
passwd_cache = {}
|
||||
last_plist = []
|
||||
|
||||
exports.resources_usage = {}
|
||||
exports.storage_usage = {}
|
||||
|
||||
exports.run = ->
|
||||
exports.monitoring()
|
||||
setInterval exports.monitoring, config.plugins.linux.monitor_cycle
|
||||
exports.monitoring ->
|
||||
setInterval ->
|
||||
exports.monitoring ->
|
||||
, config.plugins.linux.monitor_cycle
|
||||
|
||||
exports.loadMemoryInfo = (callback) ->
|
||||
fs.readFile '/proc/meminfo', (err, content) ->
|
||||
mapping = {}
|
||||
exports.monitoring = (callback) ->
|
||||
REDIS_KEY = "#{config.redis.prefix}:linux.recent_resources_usage"
|
||||
ITEM_IN_RESOURCES_LIST = 3600 * 1000 / config.plugins.linux.monitor_cycle
|
||||
|
||||
for line in content.toString().split('\n')
|
||||
[key, value] = line.split ':'
|
||||
if value
|
||||
mapping[key.trim()] = parseInt (parseInt(value.trim().match(/\d+/)) / 1024).toFixed()
|
||||
|
||||
used = mapping['MemTotal'] - mapping['MemFree'] - mapping['Buffers'] - mapping['Cached']
|
||||
used_per = (used / mapping['MemTotal'] * 100).toFixed()
|
||||
cached_per = (mapping['Cached'] / mapping['MemTotal'] * 100).toFixed()
|
||||
buffers_per = (mapping['Buffers'] / mapping['MemTotal'] * 100).toFixed()
|
||||
free_per = 100 - used_per - cached_per - buffers_per
|
||||
|
||||
swap_free_per = (mapping['SwapFree'] / mapping['SwapTotal'] * 100).toFixed()
|
||||
swap_used_per = 100 - swap_free_per
|
||||
|
||||
callback null,
|
||||
used: used
|
||||
cached: mapping['Cached']
|
||||
buffers: mapping['Buffers']
|
||||
free: mapping['MemFree']
|
||||
total: mapping['MemTotal']
|
||||
swap_used: mapping['SwapTotal'] - mapping['SwapFree']
|
||||
swap_free: mapping['SwapFree']
|
||||
swap_total: mapping['SwapTotal']
|
||||
|
||||
used_per: used_per
|
||||
cached_per: cached_per
|
||||
buffers_per: buffers_per
|
||||
free_per: free_per
|
||||
|
||||
swap_used_per: swap_used_per
|
||||
swap_free_per: swap_free_per
|
||||
|
||||
exports.getProcessList = (callback) ->
|
||||
app.redis.get 'rp:process_list', (err, plist) ->
|
||||
if plist
|
||||
callback JSON.parse plist
|
||||
else
|
||||
exports.loadPasswd ->
|
||||
child_process.exec "ps awufxn", (err, stdout, stderr) ->
|
||||
plist = stdout.split('\n')[1...-1]
|
||||
|
||||
plist = _.map plist, (item) ->
|
||||
rx = /^\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(.+)$/
|
||||
result = rx.exec item
|
||||
return {
|
||||
user: do ->
|
||||
if passwd_cache[result[1]]
|
||||
return passwd_cache[result[1]]
|
||||
else
|
||||
return result[1]
|
||||
pid: parseInt result[2]
|
||||
cpu_per: parseInt result[3]
|
||||
mem_per: result[4]
|
||||
vsz: result[5]
|
||||
rss: parseInt result[6]
|
||||
tty: result[7]
|
||||
stat: result[8]
|
||||
start: result[9]
|
||||
time: do ->
|
||||
[minute, second] = result[10].split ':'
|
||||
return parseInt(minute) * 60 + parseInt(second)
|
||||
command: result[11]
|
||||
}
|
||||
|
||||
app.redis.setex 'rp:process_list', 5, JSON.stringify(plist), ->
|
||||
callback plist
|
||||
|
||||
exports.monitoring = ->
|
||||
exports.loadPasswd ->
|
||||
exports.getProcessList (plist) ->
|
||||
linux.getMemoryInfo (err, memory_info) ->
|
||||
linux.getProcessList (plist) ->
|
||||
plist = _.reject plist, (item) ->
|
||||
return item.rss == 0
|
||||
|
||||
@@ -105,88 +34,56 @@ exports.monitoring = ->
|
||||
exports.monitoringMemory plist, callback
|
||||
|
||||
, (err, result) ->
|
||||
app.redis.get REDIS_KEY, (err, resources_usage_list) ->
|
||||
resources_usage_list = JSON.parse(resources_usage_list) ? []
|
||||
resources_usage_list.push result
|
||||
resources_usage_list = _.last resources_usage_list, ITEM_IN_RESOURCES_LIST
|
||||
app.redis.get REDIS_KEY, (err, recent_resources_usage) ->
|
||||
recent_resources_usage = JSON.parse(recent_resources_usage) ? []
|
||||
recent_resources_usage.push result
|
||||
recent_resources_usage = _.last recent_resources_usage, ITEM_IN_RESOURCES_LIST
|
||||
|
||||
account_usage = {}
|
||||
resources_usage = {}
|
||||
|
||||
addAccountUsage = (account_name, type, value) ->
|
||||
account_usage[account_name] ?= {}
|
||||
IncreaseAccountUsage = (username, type, value) ->
|
||||
resources_usage[username] ?= {}
|
||||
|
||||
if account_usage[account_name][type]
|
||||
account_usage[account_name][type] += value
|
||||
if resources_usage[username][type]
|
||||
resources_usage[username][type] += value
|
||||
else
|
||||
account_usage[account_name][type] = value
|
||||
resources_usage[username][type] = value
|
||||
|
||||
for item in resources_usage_list
|
||||
for item in recent_resources_usage
|
||||
for account_name, cpu_usage of item.cpu
|
||||
addAccountUsage account_name, 'cpu', cpu_usage
|
||||
IncreaseAccountUsage account_name, 'cpu', cpu_usage
|
||||
|
||||
for account_name, memory_usage of item.memory
|
||||
addAccountUsage account_name, 'memory', memory_usage
|
||||
IncreaseAccountUsage account_name, 'memory', memory_usage
|
||||
|
||||
for account_name, usage of account_usage
|
||||
usage.memory = usage.memory / resources_usage_list.length / config.plugins.linux.monitor_cycle * 1000
|
||||
for username, usage of resources_usage
|
||||
usage.memory = usage.memory / recent_resources_usage.length / config.plugins.linux.monitor_cycle * 1000
|
||||
|
||||
exports.resources_usage = account_usage
|
||||
async.each _.keys(resources_usage), (username, callback) ->
|
||||
mAccount.search username, (err, account) ->
|
||||
unless account
|
||||
return callback()
|
||||
|
||||
app.redis.setex REDIS_OVERVIEW, 60, JSON.stringify(account_usage), ->
|
||||
async.each _.keys(account_usage), (account_name, callback) ->
|
||||
mAccount.byUsername account_name, (err, account) ->
|
||||
unless account
|
||||
return callback()
|
||||
if os.loadavg()[0] > 1
|
||||
if resources_usage[username].cpu > account.resources_limit.cpu
|
||||
child_process.exec "sudo pkill -SIGKILL -u #{username}", ->
|
||||
|
||||
if os.loadavg()[0] > 1
|
||||
if account_usage[account_name].cpu > account.attribute.resources_limit.cpu
|
||||
child_process.exec "sudo pkill -SIGKILL -u #{account_name}", ->
|
||||
if memory_info.used_per > 75
|
||||
if resources_usage[username].memory > account.resources_limit.memory
|
||||
child_process.exec "sudo pkill -SIGKILL -u #{username}", ->
|
||||
|
||||
exports.loadMemoryInfo (err, memory_info) ->
|
||||
if account_usage[account_name].memory > account.attribute.resources_limit.memory
|
||||
if memory_info.used_per > 70
|
||||
child_process.exec "sudo pkill -SIGKILL -u #{account_name}", ->
|
||||
|
||||
callback()
|
||||
, ->
|
||||
app.redis.set REDIS_KEY, JSON.stringify(resources_usage_list), ->
|
||||
exports.last_plist = plist
|
||||
|
||||
exports.monitoringStorage = (callback) ->
|
||||
app.redis.get 'rp:storage_usage', (err, result) ->
|
||||
if result
|
||||
callback JSON.parse result
|
||||
else
|
||||
child_process.exec "sudo repquota -a", (err, stdout, stderr) ->
|
||||
lines = stdout.split('\n')[5...-1]
|
||||
lines = _.filter lines, (i) -> i
|
||||
|
||||
lines = _.map lines, (line) ->
|
||||
fields = _.filter line.split(' '), (i) -> i and i != ' '
|
||||
[username, __, size_used, size_soft, size_hard, inode_used, inode_soft, inode_hard, inode_grace] = fields
|
||||
|
||||
if /days/.test inode_used
|
||||
[size_grace, inode_used, inode_soft, inode_hard, inode_grace] = [inode_used, inode_soft, inode_hard, inode_grace]
|
||||
|
||||
return {
|
||||
username: username
|
||||
size_used: size_used
|
||||
inode_used: inode_used
|
||||
}
|
||||
|
||||
exports.storage_usage = {}
|
||||
|
||||
for item in lines
|
||||
exports.storage_usage[item.username] = item
|
||||
|
||||
app.redis.setex 'rp:storage_usage', 3, JSON.stringify(exports.storage_usage), ->
|
||||
callback()
|
||||
callback()
|
||||
, ->
|
||||
app.redis.set REDIS_KEY, JSON.stringify(recent_resources_usage), ->
|
||||
exports.resources_usage = resources_usage
|
||||
last_plist = plist
|
||||
callback()
|
||||
|
||||
exports.monitoringCpu = (plist, callback) ->
|
||||
total_time = {}
|
||||
|
||||
findLastProcess = (process) ->
|
||||
return _.find exports.last_plist, (i) ->
|
||||
return _.find last_plist, (i) ->
|
||||
return i.pid == process.pid and i.user == process.user and i.command == process.command
|
||||
|
||||
addTime = (account_name, time) ->
|
||||
|
||||
Reference in New Issue
Block a user