Skip to content

Commit 81146ec

Browse files
committed
Limit CPU and RAM for Each User Using cgroup
1 parent 6e0443a commit 81146ec

File tree

17 files changed

+443
-37
lines changed

17 files changed

+443
-37
lines changed

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 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-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-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

bin/v-update-user-cgroup

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
#!/bin/bash
2+
# info: update user disk quota
3+
# options: USER
4+
#
5+
# example: v-update-user-cgroup admin
6+
#
7+
# The functions upates cgroup, cpu, ram ,... for specific user
8+
9+
#----------------------------------------------------------#
10+
# Variables & Functions #
11+
#----------------------------------------------------------#
12+
13+
# Argument definition
14+
user=$1
15+
16+
# Includes
17+
# shellcheck source=/etc/hestiacp/hestia.conf
18+
source /etc/hestiacp/hestia.conf
19+
# shellcheck source=/usr/local/hestia/func/main.sh
20+
source $HESTIA/func/main.sh
21+
# load config file
22+
source_conf "$HESTIA/conf/hestia.conf"
23+
24+
#----------------------------------------------------------#
25+
# Verifications #
26+
#----------------------------------------------------------#
27+
28+
check_args '0' "$#" 'USER'
29+
is_format_valid 'user'
30+
is_object_valid 'user' 'USER' "$user"
31+
32+
# Perform verification if read-only mode is enabled
33+
check_hestia_demo_mode
34+
35+
#----------------------------------------------------------#
36+
# Action #
37+
#----------------------------------------------------------#
38+
user_id=$(id -u "$user")
39+
user_slice="user-${user_id}.slice"
40+
# get user resources values
41+
cpu_quota=$(get_user_value '$CPU_QUOTA')
42+
cpu_quota_period=$(get_user_value '$CPU_QUOTA_PERIOD')
43+
memory_limit=$(get_user_value '$MEMORY_LIMIT')
44+
swap_limit=$(get_user_value '$SWAP_LIMIT')
45+
46+
# Set CPU quota for CFS:
47+
if [ "$cpu_quota" != 'unlimited' ]; then
48+
systemctl set-property "$user_slice" CPUQuota="$cpu_quota"
49+
else
50+
systemctl set-property "$user_slice" CPUQuota=
51+
fi
52+
53+
# Set CPU period for CFS:
54+
if [ "$cpu_quota_period" != 'unlimited' ]; then
55+
systemctl set-property "$user_slice" CPUQuotaPeriodSec="$cpu_quota_period"
56+
else
57+
systemctl set-property "$user_slice" CPUQuotaPeriodSec=
58+
fi
59+
60+
# Set memory limits:
61+
if [ "$memory_limit" != 'unlimited' ]; then
62+
systemctl set-property "$user_slice" MemoryMax="$memory_limit"
63+
else
64+
systemctl set-property "$user_slice" MemoryMax=
65+
fi
66+
67+
# Set memory swap limits:
68+
if [ "$swap_limit" != 'unlimited' ]; then
69+
systemctl set-property "$user_slice" MemorySwapMax="$swap_limit"
70+
else
71+
systemctl set-property "$user_slice" MemorySwapMax=
72+
fi
73+
74+
# Apply change immediately: not needed for now
75+
#systemctl restart "$user_slice"
76+
#----------------------------------------------------------#
77+
# Hestia #
78+
#----------------------------------------------------------#
79+
80+
# Logging
81+
log_event "$OK" "$ARGUMENTS"
82+
83+
exit

bin/v-update-user-package

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,10 @@ is_package_valid
3232
#----------------------------------------------------------#
3333
# Action #
3434
#----------------------------------------------------------#
35-
3635
for user in $("$BIN/v-list-users" list); do
37-
check_package=$(grep "PACKAGE='$package'" $USER_DATA/$user/user.conf)
36+
# Fix Bug User Data contain path to the root user
37+
USER_DATA="$HESTIA/data/users/$user"
38+
check_package=$(grep "PACKAGE='$package'" $USER_DATA/user.conf)
3839
if [ -n "$check_package" ]; then
3940
"$BIN/v-change-user-package" "$user" "$package" 'yes'
4041
fi

func/main.sh

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1150,6 +1150,34 @@ is_cron_format_valid() {
11501150
fi
11511151
}
11521152

1153+
# Validate CPU Quota:
1154+
is_valid_cpu_quota() {
1155+
if [[ ! "$1" =~ ^[0-9]+%$ ]]; then
1156+
check_result "$E_INVALID" "Invalid CPU Quota format :: $1"
1157+
fi
1158+
}
1159+
1160+
# Validate CPU Quota Period:
1161+
is_valid_cpu_quota_period() {
1162+
if [[ ! "$1" =~ ^[0-9]+(ms|s)$ ]]; then
1163+
check_result "$E_INVALID" "Invalid CPU Quota Period format :: $1"
1164+
fi
1165+
}
1166+
1167+
# Validate Memory Size:
1168+
is_valid_memory_size() {
1169+
if [[ ! "$1" =~ ^[0-9]+[KMGTK]?$ ]]; then
1170+
check_result "$E_INVALID" "Invalid Memory Size format :: $1"
1171+
fi
1172+
}
1173+
1174+
# Validate Swap Size:
1175+
is_valid_swap_size() {
1176+
if [[ ! "$1" =~ ^[0-9]+[KMGTK]?$ ]]; then
1177+
check_result "$E_INVALID" "Invalid Swap Size format :: $1"
1178+
fi
1179+
}
1180+
11531181
is_object_name_format_valid() {
11541182
if ! [[ "$1" =~ ^[-|\ |\.|_[:alnum:]]{0,50}$ ]]; then
11551183
check_result "$E_INVALID" "invalid $2 format :: $1"

install/common/packages/default.pkg

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ RATE_LIMIT='200'
1212
DATABASES='unlimited'
1313
CRON_JOBS='unlimited'
1414
DISK_QUOTA='unlimited'
15+
CPU_QUOTA='unlimited'
16+
CPU_QUOTA_PERIOD='unlimited'
17+
MEMORY_LIMIT='unlimited'
18+
SWAP_LIMIT='unlimited'
1519
BANDWIDTH='unlimited'
1620
NS='ns1.domain.tld,ns2.domain.tld'
1721
SHELL='nologin'

0 commit comments

Comments
 (0)