forked from engineering/cloudservices
automatic hard enforcement for memory limits
parent
7d4ac0b479
commit
1371b0efdf
|
@ -0,0 +1,73 @@
|
||||||
|
/* eslint-disable no-await-in-loop */
|
||||||
|
import { Client } from '..';
|
||||||
|
import { RichEmbed } from '../class';
|
||||||
|
|
||||||
|
const channelID = '691824484230889546';
|
||||||
|
|
||||||
|
export const memoryLimits = {
|
||||||
|
TIER_1_SOFT: 250,
|
||||||
|
TIER_1_HARD: 300,
|
||||||
|
TIER_2_SOFT: 300,
|
||||||
|
TIER_2_HARD: 350,
|
||||||
|
TIER_3_SOFT: 450,
|
||||||
|
TIER_3_HARD: 500,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default async function memory(client: Client) {
|
||||||
|
const accounts = await client.db.Account.find();
|
||||||
|
for (const acc of accounts) {
|
||||||
|
if (acc.root) return;
|
||||||
|
// memory in bytes
|
||||||
|
const mem = Number(await client.util.exec(`memory ${acc.username}`)) * 1000;
|
||||||
|
// memory in megabytes
|
||||||
|
const memoryConversion = mem / 1024 / 1024;
|
||||||
|
let userLimits: { soft: number, hard: number };
|
||||||
|
if (acc.tier === 1) {
|
||||||
|
userLimits = { soft: memoryLimits.TIER_1_SOFT, hard: memoryLimits.TIER_1_HARD };
|
||||||
|
} else if (acc.tier === 2) {
|
||||||
|
userLimits = { soft: memoryLimits.TIER_2_SOFT, hard: memoryLimits.TIER_2_HARD };
|
||||||
|
} else if (acc.tier === 3) {
|
||||||
|
userLimits = { soft: memoryLimits.TIER_3_SOFT, hard: memoryLimits.TIER_3_HARD };
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if the user has exceeded their soft memory limit, which is the one described in the
|
||||||
|
resource limit guidelines, we'll inform staff.
|
||||||
|
*/
|
||||||
|
if (acc.tier === 1 && memoryConversion >= userLimits.soft) {
|
||||||
|
const embed = new RichEmbed();
|
||||||
|
if (client.users.get(acc.userID)) embed.setThumbnail(client.users.get(acc.userID).avatarURL);
|
||||||
|
embed.addField('User', `${acc.username} | <@${acc.userID}> | ${acc.userID}`, true);
|
||||||
|
embed.addField('Tier', String(acc.tier), true);
|
||||||
|
embed.addField('Memory Usage', `${String(memoryConversion)} MB`, true);
|
||||||
|
embed.addField('Memory Limit', `${String(userLimits.soft)} MB`, true);
|
||||||
|
embed.setFooter(client.user.username, client.user.avatarURL);
|
||||||
|
embed.setTimestamp();
|
||||||
|
|
||||||
|
// if they exceed the hard limit, we'll kill all of their processes.
|
||||||
|
if (memoryConversion >= userLimits.hard) {
|
||||||
|
client.util.exec(`killall -9 -u ${acc.username}`);
|
||||||
|
embed.setTitle('Resource Enforcement Notification');
|
||||||
|
embed.setDescription('Someone has reached the (hard) resource limit for their tier on RAM. The system has automatically killed all of their processes.');
|
||||||
|
client.util.createModerationLog(acc.userID, client.guilds.get('446067825673633794').members.get(client.user.id), 1, '[AUTO] Exceeded resource limit for RAM.');
|
||||||
|
client.util.transport.sendMail({
|
||||||
|
to: acc.emailAddress,
|
||||||
|
from: 'Library of Code sp-us | Cloud Services <help@libraryofcode.org>',
|
||||||
|
subject: 'Your account has been warned',
|
||||||
|
html: `
|
||||||
|
<h1>Library of Code sp-us | Cloud Services</h1>
|
||||||
|
<p>Your account has received an official warning from a Moderator. Please get the underlying issue resolved to avoid <i>possible</i> moderative action.</p>
|
||||||
|
<p><strong>Reason:</strong> [AUTO] Exceeded resource limit for RAM.</p>
|
||||||
|
<p><strong>Moderator:</strong> ${client.user.username}</p>
|
||||||
|
|
||||||
|
<b><i>Library of Code sp-us | Support Team</i></b>
|
||||||
|
`,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
embed.setTitle('Resource Limit Notification');
|
||||||
|
embed.setDescription('Someone has reached the (soft) resource limit for their tier on RAM.');
|
||||||
|
}
|
||||||
|
// @ts-ignore
|
||||||
|
client.createMessage(channelID, { embed });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue