Skip to content

Commit d0567b5

Browse files
authored
Merge pull request hestiacp#4305 from oulfr/main
Limit CPU and RAM for Each User Using cgroup
2 parents 169a5ec + cee0d1f commit d0567b5

23 files changed

+636
-105
lines changed

bin/v-add-sys-cgroups

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#!/bin/bash
2+
# info: Enable cgroup support for user
3+
# options: NONE
4+
#
5+
# example: v-add-sys-cgroup
6+
7+
#----------------------------------------------------------#
8+
# Variables & Functions #
9+
#----------------------------------------------------------#
10+
11+
# Includes
12+
# shellcheck source=/etc/hestiacp/hestia.conf
13+
source /etc/hestiacp/hestia.conf
14+
# shellcheck source=/usr/local/hestia/func/main.sh
15+
source $HESTIA/func/main.sh
16+
# load config file
17+
source_conf "$HESTIA/conf/hestia.conf"
18+
19+
#----------------------------------------------------------#
20+
# Verifications #
21+
#----------------------------------------------------------#
22+
23+
# Perform verification if read-only mode is enabled
24+
check_hestia_demo_mode
25+
26+
#----------------------------------------------------------#
27+
# Action #
28+
#----------------------------------------------------------#
29+
30+
# Updating hestia.conf value
31+
$BIN/v-change-sys-config-value "RESOURCES_LIMIT" "yes"
32+
33+
# enable cgroup for all users
34+
for user in $("$BIN/v-list-users" list); do
35+
$BIN/v-update-user-cgroup "$user"
36+
done
37+
38+
# Reload daemon
39+
systemctl daemon-reload
40+
41+
#----------------------------------------------------------#
42+
# Hestia #
43+
#----------------------------------------------------------#
44+
45+
# Logging
46+
$BIN/v-log-action "system" "Info" "Plugins" "System cgroup Enforcement Enabled."
47+
log_event "$OK" "$ARGUMENTS"
48+
49+
exit

bin/v-add-user

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,11 @@ if [ "$DISK_QUOTA" = 'yes' ]; then
266266
$BIN/v-update-user-quota "$user"
267267
fi
268268

269+
# Update resource limitation (cgroup)
270+
if [ "$RESOURCES_LIMIT" = 'yes' ]; then
271+
$BIN/v-update-user-cgroup "$user"
272+
fi
273+
269274
# Updating admin counter
270275
if [ "$user" != "$ROOT_USER" ]; then
271276
increase_user_value "$ROOT_USER" '$U_USERS'

bin/v-add-user-package

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,18 @@ is_package_consistent() {
5555
if [ "$DISK_QUOTA" != 'unlimited' ]; then
5656
is_int_format_valid "$DISK_QUOTA" 'DISK_QUOTA'
5757
fi
58+
if [ "$CPU_QUOTA" != 'unlimited' ]; then
59+
is_valid_cpu_quota "$CPU_QUOTA" 'CPU_QUOTA'
60+
fi
61+
if [ "$CPU_QUOTA_PERIOD" != 'unlimited' ]; then
62+
is_valid_cpu_quota_period "$CPU_QUOTA_PERIOD" 'CPU_QUOTA_PERIOD'
63+
fi
64+
if [ "$MEMORY_LIMIT" != 'unlimited' ]; then
65+
is_valid_memory_size "$MEMORY_LIMIT" 'MEMORY_LIMIT'
66+
fi
67+
if [ "$SWAP_LIMIT" != 'unlimited' ]; then
68+
is_valid_swap_size "$SWAP_LIMIT" 'SWAP_LIMIT'
69+
fi
5870
if [ "$BANDWIDTH" != 'unlimited' ]; then
5971
is_int_format_valid "$BANDWIDTH" 'BANDWIDTH'
6072
fi
@@ -130,6 +142,10 @@ RATE_LIMIT='$RATE_LIMIT'
130142
DATABASES='$DATABASES'
131143
CRON_JOBS='$CRON_JOBS'
132144
DISK_QUOTA='$DISK_QUOTA'
145+
CPU_QUOTA='$CPU_QUOTA'
146+
CPU_QUOTA_PERIOD='$CPU_QUOTA_PERIOD'
147+
MEMORY_LIMIT='$MEMORY_LIMIT'
148+
SWAP_LIMIT='$SWAP_LIMIT'
133149
BANDWIDTH='$BANDWIDTH'
134150
NS='$NS'
135151
SHELL='$SHELL'

bin/v-change-user-package

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ RATE_LIMIT='$RATE_LIMIT'
9696
DATABASES='$DATABASES'
9797
CRON_JOBS='$CRON_JOBS'
9898
DISK_QUOTA='$DISK_QUOTA'
99+
CPU_QUOTA='$CPU_QUOTA'
100+
CPU_QUOTA_PERIOD='$CPU_QUOTA_PERIOD'
101+
MEMORY_LIMIT='$MEMORY_LIMIT'
102+
SWAP_LIMIT='$SWAP_LIMIT'
99103
BANDWIDTH='$BANDWIDTH'
100104
NS='$NS'
101105
SHELL='$SHELL'
@@ -185,6 +189,10 @@ if [ "$DISK_QUOTA" = 'yes' ]; then
185189
$BIN/v-update-user-quota "$user"
186190
fi
187191

192+
# Update cgroup
193+
if [ "$RESOURCES_LIMIT" = 'yes' ]; then
194+
$BIN/v-update-user-cgroup "$user"
195+
fi
188196
#----------------------------------------------------------#
189197
# Hestia #
190198
#----------------------------------------------------------#

bin/v-delete-sys-cgroup

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#!/bin/bash
2+
# info: delete all cgroup
3+
# options: NONE
4+
#
5+
# example: v-delete-sys-cgroup
6+
#
7+
# This function disables cgroup
8+
9+
#----------------------------------------------------------#
10+
# Variables & Functions #
11+
#----------------------------------------------------------#
12+
13+
# Includes
14+
# shellcheck source=/etc/hestiacp/hestia.conf
15+
source /etc/hestiacp/hestia.conf
16+
# shellcheck source=/usr/local/hestia/func/main.sh
17+
source $HESTIA/func/main.sh
18+
# load config file
19+
source_conf "$HESTIA/conf/hestia.conf"
20+
21+
#----------------------------------------------------------#
22+
# Verifications #
23+
#----------------------------------------------------------#
24+
25+
# Perform verification if read-only mode is enabled
26+
check_hestia_demo_mode
27+
28+
#----------------------------------------------------------#
29+
# Action #
30+
#----------------------------------------------------------#
31+
32+
# Revert cgroup for all users
33+
for user in $("$BIN/v-list-users" list); do
34+
user_id=$(id -u "$user")
35+
user_slice="user-${user_id}.slice"
36+
systemctl revert "$user_slice"
37+
done
38+
39+
# Reload daemon
40+
systemctl daemon-reload
41+
42+
# Updating hestia.conf value
43+
$BIN/v-change-sys-config-value "RESOURCES_LIMIT" "no"
44+
45+
#----------------------------------------------------------#
46+
# Hestia #
47+
#----------------------------------------------------------#
48+
49+
# Logging
50+
$BIN/v-log-action "system" "Info" "Plugins" "System cgroup Enforcement disabled."
51+
log_event "$OK" "$ARGUMENTS"
52+
53+
exit

bin/v-list-sys-config

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ json_list() {
4646
"DEMO_MODE": "'$DEMO_MODE'",
4747
"DISABLE_IP_CHECK": "'$DISABLE_IP_CHECK'",
4848
"DISK_QUOTA": "'$DISK_QUOTA'",
49+
"RESOURCES_LIMIT": "'$RESOURCES_LIMIT'",
4950
"DNS_CLUSTER": "'$DNS_CLUSTER'",
5051
"DNS_CLUSTER_SYSTEM": "'$DNS_CLUSTER_SYSTEM'",
5152
"DNS_SYSTEM": "'$DNS_SYSTEM'",
@@ -86,7 +87,7 @@ json_list() {
8687
"PROXY_SYSTEM": "'$PROXY_SYSTEM'",
8788
"RELEASE_BRANCH": "'$RELEASE_BRANCH'",
8889
"REPOSITORY": "'$REPOSITORY'",
89-
"ROOT_USER": "'$ROOT_USER'",
90+
"ROOT_USER": "'$ROOT_USER'",
9091
"SERVER_SMTP_ADDR": "'$SERVER_SMTP_ADDR'",
9192
"SERVER_SMTP_HOST": "'$SERVER_SMTP_HOST'",
9293
"SERVER_SMTP_PASSWD": "'$SERVER_SMTP_PASSWD'",
@@ -189,6 +190,9 @@ shell_list() {
189190
if [ -n "$DISK_QUOTA" ]; then
190191
echo "Disk Quota enabled: $DISK_QUOTA"
191192
fi
193+
if [ -n "$RESOURCES_LIMIT" ]; then
194+
echo "Resource limit with cgroup enabled: $RESOURCES_LIMIT"
195+
fi
192196
if [ -n "$LANGUAGE" ] && [ "$LANGUAGE" != 'en' ]; then
193197
echo "System Language: $LANGUAGE"
194198
fi
@@ -239,7 +243,7 @@ plain_list() {
239243
echo -ne "$PROXY_SSL_PORT\t$FTP_SYSTEM\t$MAIL_SYSTEM\t$IMAP_SYSTEM\t"
240244
echo -ne "$ANTIVIRUS_SYSTEM\t$ANTISPAM_SYSTEM\t$DB_SYSTEM\t"
241245
echo -ne "$DNS_SYSTEM\t$DNS_CLUSTER\t$STATS_SYSTEM\t$BACKUP_SYSTEM\t"
242-
echo -ne "$CRON_SYSTEM\t$DISK_QUOTA\t$FIREWALL_SYSTEM\t$FIREWALL_EXTENSION\t"
246+
echo -ne "$CRON_SYSTEM\t$DISK_QUOTA\t$RESOURCES_LIMIT\t$FIREWALL_SYSTEM\t$FIREWALL_EXTENSION\t"
243247
echo -ne "$FILE_MANAGER\t$REPOSITORY\t$VERSION\t$DEMO_MODE\t$RELEASE_BRANCH\t"
244248
echo -ne "$SMTP_RELAY_HOST\t$SMTP_RELAY_PORT\t$SMTP_RELAY_USER\t"
245249
echo -ne "$UPGRADE_SEND_EMAIL\t$UPGRADE_SEND_EMAIL_LOG\t$THEME\t$LANGUAGE\t$BACKUP_GZIP\t"
@@ -254,7 +258,7 @@ csv_list() {
254258
echo -n "'PROXY_SSL_PORT','FTP_SYSTEM','MAIL_SYSTEM','IMAP_SYSTEM',"
255259
echo -n "'ANTIVIRUS_SYSTEM','ANTISPAM_SYSTEM','DB_SYSTEM',"
256260
echo -n "'DNS_SYSTEM','DNS_CLUSTER','STATS_SYSTEM','BACKUP_SYSTEM',"
257-
echo -n "'CRON_SYSTEM','DISK_QUOTA','FIREWALL_SYSTEM',"
261+
echo -n "'CRON_SYSTEM','DISK_QUOTA','RESOURCES_LIMIT','FIREWALL_SYSTEM',"
258262
echo -n "'FIREWALL_EXTENSION','FILE_MANAGER','REPOSITORY',"
259263
echo -n "'VERSION','DEMO_MODE','RELEASE_BRANCH',"
260264
echo -n "'SMTP_RELAY','SMTP_RELAY_HOST','SMTP_RELAY_PORT','SMTP_RELAY_USER',"
@@ -268,7 +272,7 @@ csv_list() {
268272
echo -n "'$PROXY_SSL_PORT','$FTP_SYSTEM','$MAIL_SYSTEM','$IMAP_SYSTEM',"
269273
echo -n "'$ANTIVIRUS_SYSTEM','$ANTISPAM_SYSTEM','$DB_SYSTEM','$DNS_SYSTEM',"
270274
echo -n "'$DNS_CLUSTER','$STATS_SYSTEM','$BACKUP_SYSTEM','$CRON_SYSTEM',"
271-
echo -n "'$DISK_QUOTA','$FIREWALL_SYSTEM','$FIREWALL_EXTENSION','$FILE_MANAGER',"
275+
echo -n "'$DISK_QUOTA','$RESOURCES_LIMIT','$FIREWALL_SYSTEM','$FIREWALL_EXTENSION','$FILE_MANAGER',"
272276
echo -n "'$REPOSITORY', '$VERSION','$DEMO_MODE','$RELEASE_BRANCH',"
273277
echo -n "'$SMTP_RELAY','$SMTP_RELAY_HOST','$SMTP_RELAY_PORT','$SMTP_RELAY_USER',"
274278
echo -n "'$UPGRADE_SEND_EMAIL','$UPGRADE_SEND_EMAIL_LOG','$THEME','$LANGUAGE',"

bin/v-list-user-package

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ json_list() {
3838
"DATABASES": "'$DATABASES'",
3939
"CRON_JOBS": "'$CRON_JOBS'",
4040
"DISK_QUOTA": "'$DISK_QUOTA'",
41+
"CPU_QUOTA":"'$CPU_QUOTA'",
42+
"CPU_QUOTA_PERIOD":"'$CPU_QUOTA_PERIOD'",
43+
"MEMORY_LIMIT":"'$MEMORY_LIMIT'",
44+
"SWAP_LIMIT":"'$SWAP_LIMIT'",
4145
"BANDWIDTH": "'$BANDWIDTH'",
4246
"NS": "'$NS'",
4347
"SHELL": "'$SHELL'",
@@ -66,6 +70,10 @@ shell_list() {
6670
echo "DATABASES: $DATABASES"
6771
echo "CRON JOBS: $CRON_JOBS"
6872
echo "DISK QUOTA: $DISK_QUOTA"
73+
echo "CPU_QUOTA: $CPU_QUOTA"
74+
echo "CPU_QUOTA_PERIOD: $CPU_QUOTA_PERIOD"
75+
echo "MEMORY_LIMIT: $MEMORY_LIMIT"
76+
echo "SWAP_LIMIT: $SWAP_LIMIT"
6977
echo "BANDWIDTH: $BANDWIDTH"
7078
echo "NS: $NS"
7179
echo "SHELL: $SHELL"
@@ -80,6 +88,7 @@ plain_list() {
8088
echo -ne "$PACKAGE\t$WEB_TEMPLATE\t$BACKEND_TEMPLATE\t$PROXY_TEMPLATE\t$DNS_TEMPLATE\t"
8189
echo -ne "$WEB_DOMAINS\t$WEB_ALIASES\t$DNS_DOMAINS\t$DNS_RECORDS\t"
8290
echo -ne "$MAIL_DOMAINS\t$MAIL_ACCOUNTS\t$RATE_LIMIT\t$DATABASES\t$CRON_JOBS\t"
91+
echo -ne "$CPU_QUOTA\t$CPU_QUOTA_PERIOD\t$MEMORY_LIMIT\t$SWAP_LIMIT\t"
8392
echo -e "$DISK_QUOTA\t$BANDWIDTH\t$NS\t$SHELL\t$SHELL_JAIL_ENABLED\t$BACKUPS\t$TIME\t$DATE"
8493
}
8594

@@ -88,11 +97,11 @@ csv_list() {
8897
echo -n "PACKAGE,WEB_TEMPLATE,BACKEND_TEMPLATE,PROXY_TEMPLATE,DNS_TEMPLATE,"
8998
echo -n "WEB_DOMAINS,WEB_ALIASES,DNS_DOMAINS,DNS_RECORDS,"
9099
echo -n "MAIL_DOMAINS,MAIL_ACCOUNTS,RATE_LIMIT,DATABASES,CRON_JOBS,"
91-
echo "DISK_QUOTA,BANDWIDTH,NS,SHELL,SHELL_JAIL_ENABLED,BACKUPS,TIME,DATE"
100+
echo "DISK_QUOTA,CPU_QUOTA,CPU_QUOTA_PERIOD,MEMORY_LIMIT,SWAP_LIMIT,BANDWIDTH,NS,SHELL,SHELL_JAIL_ENABLED,BACKUPS,TIME,DATE"
92101
echo -n "$PACKAGE,$WEB_TEMPLATE,$BACKEND_TEMPLATE,$PROXY_TEMPLATE,$DNS_TEMPLATE,"
93102
echo -n "$WEB_DOMAINS,$WEB_ALIASES,$DNS_DOMAINS,$DNS_RECORDS,"
94103
echo -n "$MAIL_DOMAINS,$MAIL_ACCOUNTS,$RATE_LIMIT,$DATABASES,$CRON_JOBS,"
95-
echo "$DISK_QUOTA,$BANDWIDTH,\"$NS\",$SHELL,$BACKUPS,$TIME,$DATE"
104+
echo "$DISK_QUOTA,$CPU_QUOTA,$CPU_QUOTA_PERIOD,$MEMORY_LIMIT,$SWAP_LIMIT,$BANDWIDTH,\"$NS\",$SHELL,$BACKUPS,$TIME,$DATE"
96105
}
97106

98107
#----------------------------------------------------------#

bin/v-list-users

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ json_list() {
4949
"DATABASES": "'$DATABASES'",
5050
"CRON_JOBS": "'$CRON_JOBS'",
5151
"DISK_QUOTA": "'$DISK_QUOTA'",
52+
"CPU_QUOTA": "'$CPU_QUOTA'",
53+
"CPU_QUOTA_PERIOD": "'$CPU_QUOTA_PERIOD'",
54+
"MEMORY_LIMIT": "'$MEMORY_LIMIT'",
55+
"SWAP_LIMIT": "'$SWAP_LIMIT'",
5256
"BANDWIDTH": "'$BANDWIDTH'",
5357
"NS": "'$NS'",
5458
"SHELL": "'$SHELL'",
@@ -118,7 +122,8 @@ plain_list() {
118122
echo -ne "$BACKEND_TEMPLATE\t$PROXY_TEMPLATE\t$DNS_TEMPLATE\t"
119123
echo -ne "$WEB_DOMAINS\t$WEB_ALIASES\t$DNS_DOMAINS\t$DNS_RECORDS\t"
120124
echo -ne "$MAIL_DOMAINS\t$MAIL_ACCOUNTS\t$DATABASES\t$CRON_JOBS\t"
121-
echo -ne "$DISK_QUOTA\t$BANDWIDTH\t$NS\t$SHELL\t$BACKUPS\t"
125+
echo -ne "$DISK_QUOTA\t$CPU_QUOTA\t$CPU_QUOTA_PERIOD\t$MEMORY_LIMIT\t"
126+
echo -ne "$SWAP_LIMIT\t$BANDWIDTH\t$NS\t$SHELL\t$BACKUPS\t"
122127
echo -ne "$CONTACT\t$CRON_REPORTS\t$RKEY\t$ROLE\t$SUSPENDED\t"
123128
echo -ne "$SUSPENDED_USERS\t$SUSPENDED_WEB\t$SUSPENDED_DNS\t"
124129
echo -ne "$SUSPENDED_MAIL\t$SUSPENDED_DB\t$SUSPENDED_CRON\t"
@@ -136,7 +141,8 @@ csv_list() {
136141
echo -n "USER,NAME,PACKAGE,WEB_TEMPLATE,BACKEND_TEMPLATE,"
137142
echo -n "PROXY_TEMPLATE,DNS_TEMPLATE,WEB_DOMAINS,WEB_ALIASES,"
138143
echo -n "DNS_DOMAINS,DNS_RECORDS,MAIL_DOMAINS,MAIL_ACCOUNTS,"
139-
echo -n "DATABASES,CRON_JOBS,DISK_QUOTA,BANDWIDTH,NS,HOME,SHELL,"
144+
echo -n "DATABASES,CRON_JOBS,DISK_QUOTA,CPU_QUOTA,CPU_QUOTA_PERIOD,"
145+
echo -n "MEMORY_LIMIT,SWAP_LIMIT,BANDWIDTH,NS,HOME,SHELL,"
140146
echo -n "BACKUPS,CONTACT,CRON_REPORTS,RKEY,ROLE,SUSPENDED,SUSPENDED_USERS,"
141147
echo -n "SUSPENDED_WEB,SUSPENDED_DNS,SUSPENDED_MAIL,SUSPENDED_DB,"
142148
echo -n "SUSPENDED_CRON,IP_AVAIL,IP_OWNED,U_USERS,U_DISK,U_DISK_DIRS,"
@@ -153,7 +159,8 @@ csv_list() {
153159
echo -n "$BACKEND_TEMPLATE,$PROXY_TEMPLATE,$DNS_TEMPLATE,"
154160
echo -n "$WEB_DOMAINS,$WEB_ALIASES,$DNS_DOMAINS,$DNS_RECORDS,"
155161
echo -n "$MAIL_DOMAINS,$MAIL_ACCOUNTS,$DATABASES,$CRON_JOBS,"
156-
echo -n "$DISK_QUOTA,$BANDWIDTH,\"$NS\",$HOME,$SHELL,$BACKUPS,"
162+
echo -n "$DISK_QUOTA,$CPU_QUOTA,$CPU_QUOTA_PERIOD,$MEMORY_LIMIT,"
163+
echo -n "$SWAP_LIMIT,$BANDWIDTH,\"$NS\",$HOME,$SHELL,$BACKUPS,"
157164
echo -n "$CONTACT,$CRON_REPORTS,\"$RKEY\",$ROLE,$SUSPENDED,"
158165
echo -n "$SUSPENDED_USERS,$SUSPENDED_WEB,$SUSPENDED_DNS,"
159166
echo -n "$SUSPENDED_MAIL,$SUSPENDED_DB,$SUSPENDED_CRON,$IP_AVAIL,"

bin/v-rebuild-user

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ if [ "$DISK_QUOTA" = 'yes' ]; then
5454
$BIN/v-update-user-quota "$user"
5555
fi
5656

57+
# Update cgroup
58+
if [ "$RESOURCES_LIMIT" = 'yes' ]; then
59+
$BIN/v-update-user-cgroup "$user"
60+
fi
61+
5762
# Rebuild user
5863
rebuild_user_conf
5964

0 commit comments

Comments
 (0)