From 1371b0efdf7d1c4b025994c35902b3f692226c6b Mon Sep 17 00:00:00 2001 From: Matthew R Date: Mon, 23 Mar 2020 22:26:06 -0400 Subject: [PATCH] automatic hard enforcement for memory limits --- src/intervals/memory.ts | 73 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/intervals/memory.ts diff --git a/src/intervals/memory.ts b/src/intervals/memory.ts new file mode 100644 index 0000000..56013ed --- /dev/null +++ b/src/intervals/memory.ts @@ -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 ', + subject: 'Your account has been warned', + html: ` +

Library of Code sp-us | Cloud Services

+

Your account has received an official warning from a Moderator. Please get the underlying issue resolved to avoid possible moderative action.

+

Reason: [AUTO] Exceeded resource limit for RAM.

+

Moderator: ${client.user.username}

+ + Library of Code sp-us | Support Team + `, + }); + } 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 }); + } + } +}