Linux evo.fastest-server.com 5.14.0-284.1101.el9.tuxcare.11.els11.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Aug 14 13:30:35 UTC 2026 x86_64
LiteSpeed
Server IP : 103.249.112.113 & Your IP : 216.73.217.135
Domains : 988 Domain
User : tanishks
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
usr /
sbin /
Delete
Unzip
Name
Size
Permission
Date
Action
NetworkManager
3.71
MB
-rwxr-xr-x
2026-08-24 11:56
accessdb
15.42
KB
-rwxr-xr-x
2025-09-21 12:57
addgnupghome
3.01
KB
-rwxr-xr-x
2019-03-18 18:40
addpart
15.16
KB
-rwxr-xr-x
2026-04-04 22:15
adduser
137.84
KB
-rwxr-xr-x
2026-04-08 19:49
agetty
56.71
KB
-rwxr-xr-x
2026-04-04 22:15
alternatives
39.59
KB
-rwxr-xr-x
2025-03-12 10:43
anacron
39.52
KB
-rwxr-xr-x
2026-04-09 05:59
apachectl
4.7
KB
-rwxr-xr-x
2026-06-10 15:53
applygnupgdefaults
2.17
KB
-rwxr-xr-x
2018-01-25 15:06
arp
63.21
KB
-rwxr-xr-x
2024-10-02 19:02
arping
27.25
KB
-rwxr-xr-x
2025-10-20 12:44
arptables
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
arptables-nft
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
arptables-nft-restore
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
arptables-nft-save
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
arptables-restore
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
arptables-save
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
atd
31.26
KB
-rwxr-xr-x
2025-11-12 00:38
atrun
70
B
-rwxr-xr-x
2025-11-12 00:38
auditctl
51.59
KB
-rwxr-xr-x
2026-04-04 20:12
auditd
137.05
KB
-rwxr-xr-x
2026-04-04 20:12
augenrules
4.05
KB
-rwxr-xr-x
2026-04-04 20:12
aureport
120.3
KB
-rwxr-xr-x
2026-04-04 20:12
ausearch
120.27
KB
-rwxr-xr-x
2026-04-04 20:12
autrace
19.17
KB
-rwxr-x---
2026-04-04 20:12
avcstat
15.35
KB
-rwxr-xr-x
2025-03-12 23:36
badblocks
35.35
KB
-rwxr-xr-x
2025-09-21 15:03
biosdecode
28.06
KB
-rwxr-xr-x
2026-04-09 07:32
blkdeactivate
15.97
KB
-r-xr-xr-x
2026-06-03 10:51
blkdiscard
23.2
KB
-rwxr-xr-x
2026-04-04 22:15
blkid
51.61
KB
-rwxr-xr-x
2026-04-04 22:15
blkmapd
39.41
KB
-rwxr-xr-x
2026-04-08 16:14
blkzone
35.45
KB
-rwxr-xr-x
2026-04-04 22:15
blockdev
31.41
KB
-rwxr-xr-x
2026-04-04 22:15
bridge
130.95
KB
-rwxr-xr-x
2026-04-05 08:31
bsock
27.45
KB
-r-xr-xr-x
2026-07-23 20:57
cagefs-mount
19.49
KB
-rwxr-xr-x
2026-07-31 12:29
cagefs_enter_site
1.83
KB
-rwxr-xr-x
2026-07-31 12:29
cagefs_enter_user
28.84
KB
-rwxr-xr-x
2026-08-14 07:06
cagefsctl
665
B
-rwxr-xr-x
2026-07-31 12:29
cagefsctl-user
15.55
KB
-rwxr-xr-x
2026-07-31 12:29
capsh
31.21
KB
-rwxr-xr-x
2026-05-20 10:00
cfdisk
96.34
KB
-rwxr-xr-x
2026-04-04 22:15
cgdisk
150.86
KB
-rwxr-xr-x
2022-01-30 23:44
chcpu
31.42
KB
-rwxr-xr-x
2026-04-04 22:15
chgpasswd
59.77
KB
-rwxr-xr-x
2026-04-08 19:49
chkconfig
43.78
KB
-rwxr-xr-x
2025-03-12 10:43
chpasswd
55.63
KB
-rwxr-xr-x
2026-04-08 19:49
chronyd
373.58
KB
-rwxr-xr-x
2026-04-09 00:49
chroot
39.55
KB
-rwxr-xr-x
2026-06-25 00:26
cl-link-to-cln
7.34
KB
-rwxr-xr-x
2026-07-29 13:47
cl-post-jwt-update
6.15
KB
-rwxr-xr-x
2026-07-29 13:47
cl-pre-jwt-update
2.17
KB
-rwxr-xr-x
2026-07-29 13:47
cl-smart-advice
711
B
-rwxr-xr-x
2026-08-05 18:28
clncheck
1.92
KB
-rwxr-xr-x
2026-07-29 13:47
clncheck-3.9
1.92
KB
-rwxr-xr-x
2026-07-29 13:47
clnreg_ks
3.55
KB
-rwxr-xr-x
2026-07-29 13:47
clock
59.77
KB
-rwxr-xr-x
2026-04-04 22:15
cloudlinux-autotracing
382
B
-rwxr-xr-x
2026-07-24 11:40
cloudlinux-awp-installer
5.29
KB
-rwxr-xr-x
2026-08-11 11:38
cloudlinux-config
573
B
-rwxr-xr-x
2026-07-29 13:24
cloudlinux-customizer
2.79
KB
-rwxr-xr-x
2026-07-29 13:45
cloudlinux-edition-watcher
2.3
KB
-rwxr-xr-x
2026-07-29 13:45
cloudlinux-license
573
B
-rwxr-xr-x
2026-07-29 13:24
cloudlinux-limits
573
B
-rwxr-xr-x
2026-07-29 13:24
cloudlinux-packages
573
B
-rwxr-xr-x
2026-07-29 13:24
cloudlinux-selector
654
B
-rwxr-xr-x
2026-08-11 11:38
cloudlinux-server-flags
3.67
KB
-rwxr-xr-x
2026-08-05 07:40
cloudlinux-ssa-agent
374
B
-rwxr-xr-x
2026-07-24 11:40
cloudlinux-ssa-manager
378
B
-rwxr-xr-x
2026-07-24 11:40
cloudlinux-statistics
5.77
MB
-rwxr-xr-x
2026-08-20 13:34
cloudlinux-statistics.python
496
B
-rwxr-xr-x
2026-06-23 08:44
cloudlinux-statistics.rust
5.77
MB
-rwxr-xr-x
2026-08-20 13:34
cloudlinux-statsnotifier
2.24
MB
-rwxr-xr-x
2026-08-20 13:34
cloudlinux-statsnotifier.python
496
B
-rwxr-xr-x
2026-06-23 08:44
cloudlinux-statsnotifier.rust
2.24
MB
-rwxr-xr-x
2026-08-20 13:34
cloudlinux-summary
573
B
-rwxr-xr-x
2026-07-29 13:24
cloudlinux-top
1.26
MB
-rwxr-xr-x
2026-08-20 13:34
cloudlinux-top.python
496
B
-rwxr-xr-x
2026-06-23 08:44
cloudlinux-top.rust
1.26
MB
-rwxr-xr-x
2026-08-20 13:34
cloudlinux-user-cron
4.3
KB
-rwxr-xr-x
2026-07-31 12:29
cloudlinux-wizard
863
B
-rwxr-xr-x
2026-07-29 13:45
cloudlinux-xray
807
B
-rwxr-xr-x
2026-08-11 11:38
cloudlinux-xray-agent
375
B
-rwxr-xr-x
2026-08-05 18:28
cloudlinux-xray-continuous
383
B
-rwxr-xr-x
2026-08-05 18:28
cloudlinux-xray-manager
384
B
-rwxr-xr-x
2026-08-05 18:28
cloudlinux-xray-migrate
1.47
KB
-rwxr-xr-x
2026-08-05 18:28
cloudlinux-xray-user-agent
372
B
-rwxr-xr-x
2026-08-05 18:28
clwpos-uninstall-smart-advice-plugins
2.97
KB
-rwxr-xr-x
2026-07-31 10:23
clwpos_collect_information.py
6.6
KB
-rwxr-xr-x
2026-07-31 10:23
consoletype
15.13
KB
-rwxr-xr-x
2025-05-14 14:50
convertquota
69.01
KB
-rwxr-xr-x
2025-03-12 20:44
cracklib-check
15.11
KB
-rwxr-xr-x
2026-04-09 05:18
cracklib-format
255
B
-rwxr-xr-x
2026-04-09 05:18
cracklib-packer
15.11
KB
-rwxr-xr-x
2026-04-09 05:18
cracklib-unpacker
15.1
KB
-rwxr-xr-x
2026-04-09 05:18
create-cracklib-dict
994
B
-rwxr-xr-x
2015-08-18 18:41
crond
76.16
KB
-rwxr-xr-x
2026-04-09 05:59
ctrlaltdel
15.19
KB
-rwxr-xr-x
2026-04-04 22:15
ctstat
23.59
KB
-rwxr-xr-x
2026-04-05 08:31
db_governor
191.5
KB
-rwxr-xr-x
2026-08-06 17:01
db_governor_test
177.27
KB
-rwxr-xr-x
2026-08-06 17:01
dbctl
11.7
KB
-rwxr-xr-x
2026-08-06 17:01
dbgovchart
10.37
MB
-rwxr-xr-x
2026-08-20 13:34
dbgovchart.python
496
B
-rwxr-xr-x
2026-06-23 08:44
dbgovchart.rust
10.37
MB
-rwxr-xr-x
2026-08-20 13:34
dbtop
44.82
KB
-rwxr-xr-x
2026-08-06 17:01
dcb
94.69
KB
-rwxr-xr-x
2026-04-05 08:31
ddns-confgen
27.26
KB
-rwxr-xr-x
2026-08-13 11:36
debugfs
233.03
KB
-rwxr-xr-x
2025-09-21 15:03
delpart
15.12
KB
-rwxr-xr-x
2026-04-04 22:15
depmod
165.58
KB
-rwxr-xr-x
2025-11-13 10:09
devlink
165.84
KB
-rwxr-xr-x
2026-04-05 08:31
dhclient
1.91
MB
-rwxr-xr-x
2026-04-09 06:48
dhclient-script
32.86
KB
-rwxr-xr-x
2026-04-09 00:58
dmfilemapd
23.3
KB
-r-xr-xr-x
2026-06-03 10:52
dmidecode
164.31
KB
-rwxr-xr-x
2026-04-09 07:32
dmsetup
156.77
KB
-r-xr-xr-x
2026-06-03 10:52
dmstats
156.77
KB
-r-xr-xr-x
2026-06-03 10:52
dnssec-cds
47.67
KB
-rwxr-xr-x
2026-08-13 11:36
dnssec-checkds
924
B
-rwxr-xr-x
2026-08-13 11:35
dnssec-coverage
926
B
-rwxr-xr-x
2026-08-13 11:35
dnssec-dsfromkey
39.44
KB
-rwxr-xr-x
2026-08-13 11:36
dnssec-importkey
35.44
KB
-rwxr-xr-x
2026-08-13 11:36
dnssec-keyfromlabel
39.42
KB
-rwxr-xr-x
2026-08-13 11:36
dnssec-keygen
47.45
KB
-rwxr-xr-x
2026-08-13 11:36
dnssec-keymgr
922
B
-rwxr-xr-x
2026-08-13 11:35
dnssec-revoke
31.41
KB
-rwxr-xr-x
2026-08-13 11:36
dnssec-settime
47.44
KB
-rwxr-xr-x
2026-08-13 11:36
dnssec-signzone
95.88
KB
-rwxr-xr-x
2026-08-13 11:36
dnssec-verify
31.45
KB
-rwxr-xr-x
2026-08-13 11:36
dosfsck
84.56
KB
-rwxr-xr-x
2022-01-29 18:41
dosfslabel
40.02
KB
-rwxr-xr-x
2022-01-29 18:41
dovecot
144.02
KB
-rwxr-xr-x
2026-07-15 21:53
dovecot_cpshutdown
3.27
KB
-rwxr-xr-x
2026-07-13 00:00
dpll
48.16
KB
-rwxr-xr-x
2026-04-05 08:31
dumpe2fs
31.29
KB
-rwxr-xr-x
2025-09-21 15:03
e2freefrag
15.19
KB
-rwxr-xr-x
2025-09-21 15:03
e2fsck
356.09
KB
-rwxr-xr-x
2025-09-21 15:03
e2image
43.41
KB
-rwxr-xr-x
2025-09-21 15:03
e2label
104.46
KB
-rwxr-xr-x
2025-09-21 15:03
e2mmpstatus
31.29
KB
-rwxr-xr-x
2025-09-21 15:03
e2undo
23.16
KB
-rwxr-xr-x
2025-09-21 15:03
e4crypt
31.3
KB
-rwxr-xr-x
2025-09-21 15:03
e4defrag
31.26
KB
-rwxr-xr-x
2025-09-21 15:03
ebtables
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
ebtables-nft
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
ebtables-nft-restore
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
ebtables-nft-save
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
ebtables-restore
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
ebtables-save
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
ebtables-translate
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
edquota
89.5
KB
-rwxr-xr-x
2025-03-12 20:44
efibootdump
23.87
KB
-rwxr-xr-x
2022-01-30 05:12
efibootmgr
45.18
KB
-rwxr-xr-x
2022-01-30 05:12
enable_redis_for_panel_php
1.66
KB
-rwxr-xr-x
2026-07-31 10:23
ether-wake
50.24
KB
-rwxr-xr-x
2024-10-02 19:02
ethtool
988.96
KB
-rwxr-xr-x
2025-10-20 14:14
exicyclog
11.1
KB
-rwxr-xr-x
2026-07-24 13:18
exigrep
11.44
KB
-rwxr-xr-x
2026-07-24 13:18
exim
1.55
MB
-rwsr-xr-x
2026-07-24 13:18
exim_checkaccess
4.83
KB
-rwxr-xr-x
2026-07-24 13:18
exim_dbmbuild
22.45
KB
-rwxr-xr-x
2026-07-24 13:18
exim_dumpdb
23.68
KB
-rwxr-xr-x
2026-07-24 13:18
exim_fixdb
32.24
KB
-rwxr-xr-x
2026-07-24 13:18
exim_lock
22.79
KB
-rwxr-xr-x
2026-07-24 13:18
exim_tidydb
23.7
KB
-rwxr-xr-x
2026-07-24 13:18
eximstats
149.14
KB
-rwxr-xr-x
2026-07-24 13:18
exinext
8.03
KB
-rwxr-xr-x
2026-07-24 13:18
exiqgrep
6.58
KB
-rwxr-xr-x
2026-07-24 13:18
exiqsumm
6.29
KB
-rwxr-xr-x
2026-07-24 13:18
exiwhat
4.42
KB
-rwxr-xr-x
2026-07-24 13:18
exportfs
68.47
KB
-rwxr-xr-x
2026-04-08 16:14
faillock
23.18
KB
-rwxr-xr-x
2026-04-04 23:44
fatlabel
40.02
KB
-rwxr-xr-x
2022-01-29 18:41
fb_lock_print
1.46
MB
-rwxr-xr-x
2026-04-17 16:37
fbguard
1.41
MB
-rwxr-xr-x
2026-04-17 16:37
fcgistarter
15.42
KB
-rwxr-xr-x
2026-06-10 15:54
fdformat
23.19
KB
-rwxr-xr-x
2026-04-04 22:15
fdisk
112.07
KB
-rwxr-xr-x
2026-04-04 22:15
filefrag
19.22
KB
-rwxr-xr-x
2025-09-21 15:03
findfs
15.16
KB
-rwxr-xr-x
2026-04-04 22:15
firebird
2.2
MB
-rwxr-xr-x
2026-04-17 16:37
fix-info-dir
7.85
KB
-rwxr-xr-x
2022-05-01 13:12
fixfiles
12.1
KB
-rwxr-xr-x
2026-04-04 23:51
fixparts
60.98
KB
-rwxr-xr-x
2022-01-30 23:44
fsck
43.55
KB
-rwxr-xr-x
2026-04-04 22:15
fsck.cramfs
31.38
KB
-rwxr-xr-x
2026-04-04 22:15
fsck.ext2
356.09
KB
-rwxr-xr-x
2025-09-21 15:03
fsck.ext3
356.09
KB
-rwxr-xr-x
2025-09-21 15:03
fsck.ext4
356.09
KB
-rwxr-xr-x
2025-09-21 15:03
fsck.fat
84.56
KB
-rwxr-xr-x
2022-01-29 18:41
fsck.minix
55.71
KB
-rwxr-xr-x
2026-04-04 22:15
fsck.msdos
84.56
KB
-rwxr-xr-x
2022-01-29 18:41
fsck.vfat
84.56
KB
-rwxr-xr-x
2022-01-29 18:41
fsck.xfs
2.54
KB
-rwxr-xr-x
2025-09-21 13:01
fsfreeze
15.15
KB
-rwxr-xr-x
2026-04-04 22:15
fstrim
43.5
KB
-rwxr-xr-x
2026-04-04 22:15
fuser
41.09
KB
-rwxr-xr-x
2022-03-25 15:53
g13-syshelp
88.6
KB
-rwxr-xr-x
2026-01-15 21:34
gdisk
187.38
KB
-rwxr-xr-x
2022-01-30 23:44
generate_accelerate_wp_cache.py
2.25
KB
-rwxr-xr-x
2026-07-31 10:23
genhomedircon
32.04
KB
-rwxr-xr-x
2026-04-04 23:52
genhostid
15.13
KB
-rwxr-xr-x
2025-05-14 14:50
genl
130.15
KB
-rwxr-xr-x
2026-04-05 08:31
getcap
15.13
KB
-rwxr-xr-x
2026-05-20 10:00
getenforce
15.27
KB
-rwxr-xr-x
2025-03-12 23:36
getpaneluserscount
738
B
-rwxr-xr-x
2026-08-05 07:40
getpcaps
15.13
KB
-rwxr-xr-x
2026-05-20 10:00
getpidprevcon
15.29
KB
-rwxr-xr-x
2025-03-12 23:36
getpolicyload
15.28
KB
-rwxr-xr-x
2025-03-12 23:36
getsebool
15.3
KB
-rwxr-xr-x
2025-03-12 23:36
groupadd
68.77
KB
-rwxr-xr-x
2026-04-08 19:49
groupdel
64.53
KB
-rwxr-xr-x
2026-04-08 19:49
groupmems
55.77
KB
-rwxr-xr-x
2026-04-08 19:49
groupmod
72.76
KB
-rwxr-xr-x
2026-04-08 19:49
grpck
59.76
KB
-rwxr-xr-x
2026-04-08 19:49
grpconv
51.56
KB
-rwxr-xr-x
2026-04-08 19:49
grpunconv
51.53
KB
-rwxr-xr-x
2026-04-08 19:49
grub2-bios-setup
1.67
MB
-rwxr-xr-x
2026-04-06 12:55
grub2-get-kernel-settings
2.68
KB
-rwxr-xr-x
2026-04-06 12:55
grub2-install
1.97
MB
-rwxr-xr-x
2026-04-06 12:55
grub2-mkconfig
9.21
KB
-rwxr-xr-x
2026-04-06 12:55
grub2-probe
1.67
MB
-rwxr-xr-x
2026-04-06 12:55
grub2-reboot
4.7
KB
-rwxr-xr-x
2026-04-06 12:55
grub2-set-bootflag
15.09
KB
-rwxr-xr-x
2026-04-06 12:55
grub2-set-default
3.46
KB
-rwxr-xr-x
2026-04-06 12:55
grub2-set-password
2.74
KB
-rwxr-xr-x
2026-04-06 12:55
grub2-setpassword
2.74
KB
-rwxr-xr-x
2026-04-06 12:55
grub2-switch-to-blscfg
8.81
KB
-rwxr-xr-x
2026-04-06 12:55
grubby
260
B
-rwxr-xr-x
2026-04-14 16:50
gssproxy
124.89
KB
-rwxr-xr-x
2024-10-02 23:09
halt
298.41
KB
-rwxr-xr-x
2026-06-25 00:28
hdparm
143.06
KB
-rwxr-xr-x
2022-03-25 06:20
htcacheclean
39.59
KB
-rwxr-xr-x
2026-06-10 15:54
httpd
724.81
KB
-rwxr-xr-x
2026-06-10 15:54
hwclock
59.77
KB
-rwxr-xr-x
2026-04-04 22:15
hybrid-to-normal
2.08
KB
-rwxr-xr-x
2026-07-29 13:47
iconvconfig
31.67
KB
-rwxr-xr-x
2026-08-03 10:14
ifconfig
78.98
KB
-rwxr-xr-x
2024-10-02 19:02
ifenslave
23.73
KB
-rwxr-xr-x
2025-10-20 12:44
ifstat
39.6
KB
-rwxr-xr-x
2026-04-05 08:31
init
95.74
KB
-rwxr-xr-x
2026-06-25 00:28
insmod
165.58
KB
-rwxr-xr-x
2025-11-13 10:09
install-info
106.7
KB
-rwxr-xr-x
2022-05-01 13:12
installkernel
323
B
-rwxr-xr-x
2026-04-14 16:50
intel_sdsi
22.43
KB
-rwxr-xr-x
2026-08-27 16:28
ip
774.32
KB
-rwxr-xr-x
2026-04-05 08:31
ip6tables
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
ip6tables-nft
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
ip6tables-nft-restore
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
ip6tables-nft-save
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
ip6tables-restore
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
ip6tables-restore-translate
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
ip6tables-save
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
ip6tables-translate
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
ipmaddr
19.45
KB
-rwxr-xr-x
2024-10-02 19:02
iptables
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
iptables-nft
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
iptables-nft-restore
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
iptables-nft-save
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
iptables-restore
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
iptables-restore-translate
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
iptables-save
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
iptables-translate
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
iptunnel
19.5
KB
-rwxr-xr-x
2024-10-02 19:02
irqbalance
64.45
KB
-rwxr-xr-x
2026-04-08 16:40
irqbalance-ui
39.59
KB
-rwxr-xr-x
2026-04-08 16:40
isolatectl
9.19
KB
-rwxr-xr-x
2026-07-29 13:24
kexec
192.59
KB
-rwxr-xr-x
2026-04-08 18:11
key.dns_resolver
31.35
KB
-rwxr-xr-x
2023-04-05 19:15
kill_php_script
792
B
-rwxr-xr-x
2026-07-29 13:24
kpartx
47.52
KB
-rwxr-xr-x
2026-04-05 00:24
lchage
23.16
KB
-rwxr-xr-x
2025-09-21 10:53
ldattach
27.23
KB
-rwxr-xr-x
2026-04-04 22:15
ldconfig
1.12
MB
-rwxr-xr-x
2026-08-03 10:14
lgroupadd
15.12
KB
-rwxr-xr-x
2025-09-21 10:53
lgroupdel
15.11
KB
-rwxr-xr-x
2025-09-21 10:53
lgroupmod
23.13
KB
-rwxr-xr-x
2025-09-21 10:53
lid
19.13
KB
-rwxr-xr-x
2025-09-21 10:53
lnewusers
23.13
KB
-rwxr-xr-x
2025-09-21 10:53
lnstat
23.59
KB
-rwxr-xr-x
2026-04-05 08:31
load_policy
15.12
KB
-rwxr-xr-x
2026-04-04 23:52
logrotate
95.66
KB
-rwxr-xr-x
2025-09-21 12:04
logsave
15.19
KB
-rwxr-xr-x
2025-09-21 15:03
losetup
72.09
KB
-rwxr-xr-x
2026-04-04 22:15
lpasswd
23.13
KB
-rwxr-xr-x
2025-09-21 10:53
lshw
853.58
KB
-rwxr-xr-x
2026-04-09 18:29
lsmod
165.58
KB
-rwxr-xr-x
2025-11-13 10:09
lspci
97.57
KB
-rwxr-xr-x
2025-03-12 20:27
luseradd
23.13
KB
-rwxr-xr-x
2025-09-21 10:53
luserdel
15.12
KB
-rwxr-xr-x
2025-09-21 10:53
lusermod
23.13
KB
-rwxr-xr-x
2025-09-21 10:53
lvdctl
683
B
-rwxr-xr-x
2026-07-29 13:24
lve-bursting-cleanup
5.62
MB
-rwxr-xr-x
2026-08-20 13:34
lve-bursting-cleanup.python
496
B
-rwxr-xr-x
2026-06-23 08:44
lve-bursting-cleanup.rust
5.62
MB
-rwxr-xr-x
2026-08-20 13:34
lve-bursting-info
5.62
MB
-rwxr-xr-x
2026-08-20 13:34
lve-bursting-info.python
496
B
-rwxr-xr-x
2026-06-23 08:44
lve-bursting-info.rust
5.62
MB
-rwxr-xr-x
2026-08-20 13:34
lve-create-db
6.78
MB
-rwxr-xr-x
2026-08-20 13:34
lve-create-db.python
496
B
-rwxr-xr-x
2026-06-23 08:44
lve-create-db.rust
6.78
MB
-rwxr-xr-x
2026-08-20 13:34
lve-read-snapshot
2.53
MB
-rwxr-xr-x
2026-08-20 13:34
lve-read-snapshot.python
496
B
-rwxr-xr-x
2026-06-23 08:44
lve-read-snapshot.rust
2.53
MB
-rwxr-xr-x
2026-08-20 13:34
lve_ns_setup
122.34
KB
-rwxr-xr-x
2026-06-16 09:25
lve_root_setup
81.87
KB
-rwxr-xr-x
2026-06-16 09:25
lvechart
10.56
MB
-rwxr-xr-x
2026-08-20 13:34
lvechart.python
496
B
-rwxr-xr-x
2026-06-23 08:44
lvechart.rust
10.56
MB
-rwxr-xr-x
2026-08-20 13:34
lvectl
56.5
KB
-rwxr-xr-x
2026-07-29 13:24
lveinfo
5.85
MB
-rwxr-xr-x
2026-08-20 13:34
lveinfo.python
496
B
-rwxr-xr-x
2026-06-23 08:44
lveinfo.rust
5.85
MB
-rwxr-xr-x
2026-08-20 13:34
lveps
41.4
KB
-rwxr-xr-x
2026-07-29 13:45
lvestats-burstwatcher
1.91
MB
-rwxr-xr-x
2026-08-20 13:34
lvestats-burstwatcher.python
496
B
-rwxr-xr-x
2026-06-23 08:44
lvestats-burstwatcher.rust
1.91
MB
-rwxr-xr-x
2026-08-20 13:34
lvestats-server
16.86
MB
-rwxr-xr-x
2026-08-20 13:34
lvestats-server.python
496
B
-rwxr-xr-x
2026-06-23 08:44
lvestats-server.rust
16.86
MB
-rwxr-xr-x
2026-08-20 13:34
lvetop
41
B
-rwxr-xr-x
2026-07-29 13:24
makedumpfile
431.84
KB
-rwxr-xr-x
2026-04-08 18:11
mariadbd
25.19
MB
-rwxr-xr-x
2026-08-19 10:32
matchpathcon
15.31
KB
-rwxr-xr-x
2025-03-12 23:36
mii-diag
24.2
KB
-rwxr-xr-x
2024-10-02 19:02
mii-tool
27.78
KB
-rwxr-xr-x
2024-10-02 19:02
mkdict
255
B
-rwxr-xr-x
2026-04-09 05:18
mkdosfs
52.51
KB
-rwxr-xr-x
2022-01-29 18:41
mkdumprd
12.13
KB
-rwxr-xr-x
2026-04-08 18:11
mke2fs
132.53
KB
-rwxr-xr-x
2025-09-21 15:03
mkfs
15.17
KB
-rwxr-xr-x
2026-04-04 22:15
mkfs.cramfs
35.38
KB
-rwxr-xr-x
2026-04-04 22:15
mkfs.ext2
132.53
KB
-rwxr-xr-x
2025-09-21 15:03
mkfs.ext3
132.53
KB
-rwxr-xr-x
2025-09-21 15:03
mkfs.ext4
132.53
KB
-rwxr-xr-x
2025-09-21 15:03
mkfs.fat
52.51
KB
-rwxr-xr-x
2022-01-29 18:41
mkfs.minix
43.55
KB
-rwxr-xr-x
2026-04-04 22:15
mkfs.msdos
52.51
KB
-rwxr-xr-x
2022-01-29 18:41
mkfs.vfat
52.51
KB
-rwxr-xr-x
2022-01-29 18:41
mkfs.xfs
450.77
KB
-rwxr-xr-x
2025-09-21 13:02
mkhomedir_helper
23.21
KB
-rwxr-xr-x
2026-04-04 23:44
mklost+found
15.12
KB
-rwxr-xr-x
2025-09-21 15:03
mksquashfs
197.62
KB
-rwxr-xr-x
2024-04-03 13:45
mkswap
47.5
KB
-rwxr-xr-x
2026-04-04 22:15
modinfo
165.58
KB
-rwxr-xr-x
2025-11-13 10:09
modprobe
165.58
KB
-rwxr-xr-x
2025-11-13 10:09
modsec-sdbm-util
33.56
KB
-rwxr-x---
2026-08-11 22:29
mount.fuse
15.34
KB
-rwxr-xr-x
2025-03-12 19:30
mount.nfs
100.52
KB
-rwxr-xr-x
2026-04-08 16:14
mount.nfs4
100.52
KB
-rwxr-xr-x
2026-04-08 16:14
mountstats
42.5
KB
-rwxr-xr-x
2026-04-08 16:13
mysql_unfreeze
93.36
KB
-rwxr-xr-x
2026-08-06 17:01
mysqld
25.19
MB
-rwxr-xr-x
2026-08-19 10:32
named
545.02
KB
-rwxr-xr-x
2026-08-13 11:36
named-checkconf
39.4
KB
-rwxr-xr-x
2026-08-13 11:36
named-checkzone
39.34
KB
-rwxr-xr-x
2026-08-13 11:36
named-compilezone
39.34
KB
-rwxr-xr-x
2026-08-13 11:36
named-journalprint
15.13
KB
-rwxr-xr-x
2026-08-13 11:36
named-nzd2nzf
15.12
KB
-rwxr-xr-x
2026-08-13 11:36
nameif
15.58
KB
-rwxr-xr-x
2024-10-02 19:02
newusers
88.7
KB
-rwxr-xr-x
2026-04-08 19:49
nfsconf
39.86
KB
-rwxr-xr-x
2026-04-08 16:14
nfsdcld
55.87
KB
-rwxr-xr-x
2026-04-08 16:14
nfsdclddb
9.99
KB
-rwxr-xr-x
2026-04-08 16:13
nfsdclnts
9.05
KB
-rwxr-xr-x
2026-04-08 16:13
nfsdcltrack
39.91
KB
-rwxr-xr-x
2026-04-08 16:14
nfsidmap
23.3
KB
-rwxr-xr-x
2026-04-08 16:14
nfsiostat
23.35
KB
-rwxr-xr-x
2026-04-08 16:13
nfsref
43.52
KB
-rwxr-xr-x
2026-04-08 16:14
nfsstat
38.27
KB
-rwxr-xr-x
2026-04-08 16:14
nft
27.17
KB
-rwxr-xr-x
2026-08-26 12:09
nologin
15.16
KB
-rwxr-xr-x
2026-04-04 22:15
normal-to-hybrid
2.23
KB
-rwxr-xr-x
2026-07-29 13:47
nscd
162.95
KB
-rwxr-xr-x
2026-08-03 10:14
nsec3hash
15.2
KB
-rwxr-xr-x
2026-08-13 11:36
nstat
31.34
KB
-rwxr-xr-x
2026-04-05 08:31
ownership
15.13
KB
-rwxr-xr-x
2026-04-09 07:32
packer
15.11
KB
-rwxr-xr-x
2026-04-09 05:18
pam_console_apply
43.51
KB
-rwxr-xr-x
2026-04-04 23:44
pam_namespace_helper
471
B
-rwxr-xr-x
2026-04-04 23:44
pam_timestamp_check
15.13
KB
-rwxr-xr-x
2026-04-04 23:44
paperconfig
4.08
KB
-rwxr-xr-x
2022-02-10 01:15
parted
96.39
KB
-rwxr-xr-x
2025-03-12 20:00
partprobe
15.34
KB
-rwxr-xr-x
2025-03-12 20:00
partx
59.77
KB
-rwxr-xr-x
2026-04-04 22:15
pdns_server
5.88
MB
-rwxr-xr-x
2026-08-10 19:14
pidof
23.33
KB
-rwxr-xr-x
2024-04-30 16:43
ping
89.33
KB
-rwxr-xr-x
2025-10-20 12:44
ping6
89.33
KB
-rwxr-xr-x
2025-10-20 12:44
pivot_root
15.16
KB
-rwxr-xr-x
2026-04-04 22:15
plipconfig
15.35
KB
-rwxr-xr-x
2024-10-02 19:02
pluginviewer
19.39
KB
-rwxr-xr-x
2025-09-25 11:46
poweroff
298.41
KB
-rwxr-xr-x
2026-06-25 00:28
processpaneluserspackages
3.19
KB
-rwxr-xr-x
2026-07-29 13:24
proxyexec
24.01
KB
-r-xr-xr-x
2026-07-23 20:57
pwck
55.6
KB
-rwxr-xr-x
2026-04-08 19:49
pwconv
47.45
KB
-rwxr-xr-x
2026-04-08 19:49
pwhistory_helper
19.2
KB
-rwxr-xr-x
2026-04-04 23:44
pwunconv
47.41
KB
-rwxr-xr-x
2026-04-08 19:49
quotacheck
93.62
KB
-rwxr-xr-x
2025-03-12 20:44
quotaoff
56.67
KB
-rwxr-xr-x
2025-03-12 20:44
quotaon
56.67
KB
-rwxr-xr-x
2025-03-12 20:44
quotastats
15.34
KB
-rwxr-xr-x
2025-03-12 20:44
rdisc
31.36
KB
-rwxr-xr-x
2025-10-20 12:44
rdma
117.06
KB
-rwxr-xr-x
2026-04-05 08:31
readprofile
23.27
KB
-rwxr-xr-x
2026-04-04 22:15
reboot
298.41
KB
-rwxr-xr-x
2026-06-25 00:28
repquota
77.55
KB
-rwxr-xr-x
2025-03-12 20:44
request-key
27.29
KB
-rwxr-xr-x
2023-04-05 19:15
resize2fs
67.64
KB
-rwxr-xr-x
2025-09-21 15:03
resizepart
23.4
KB
-rwxr-xr-x
2026-04-04 22:15
restorecon
23.19
KB
-rwxr-xr-x
2026-04-04 23:52
restorecon_xattr
15.13
KB
-rwxr-xr-x
2026-04-04 23:52
rfkill
31.34
KB
-rwxr-xr-x
2026-04-04 22:15
rhn_check
4.24
KB
-rwxr-xr-x
2026-07-29 13:47
rhn_check-3.9
4.24
KB
-rwxr-xr-x
2026-07-29 13:47
rhnreg_ks
7.3
KB
-rwxr-xr-x
2026-07-29 13:47
rhnreg_ks-3.9
7.3
KB
-rwxr-xr-x
2026-07-29 13:47
rmmod
165.58
KB
-rwxr-xr-x
2025-11-13 10:09
rndc
43.25
KB
-rwxr-xr-x
2026-08-13 11:36
rndc-confgen
23.26
KB
-rwxr-xr-x
2026-08-13 11:36
rotatelogs
27.48
KB
-rwxr-xr-x
2026-06-10 15:54
route
65.77
KB
-rwxr-xr-x
2024-10-02 19:02
rpc.gssd
88.11
KB
-rwxr-xr-x
2026-04-08 16:14
rpc.idmapd
47.73
KB
-rwxr-xr-x
2026-04-08 16:14
rpc.mountd
132.55
KB
-rwxr-xr-x
2026-04-08 16:14
rpc.nfsd
40
KB
-rwxr-xr-x
2026-04-08 16:14
rpc.statd
80.79
KB
-rwxr-xr-x
2026-04-08 16:14
rpcbind
59.89
KB
-rwxr-xr-x
2024-04-03 13:53
rpcctl
9.42
KB
-rwxr-xr-x
2026-04-08 16:13
rpcdebug
18.66
KB
-rwxr-xr-x
2026-04-08 16:14
rpcinfo
35.58
KB
-rwxr-xr-x
2024-04-03 13:53
rsyslogd
806.88
KB
-rwxr-xr-x
2026-04-14 20:44
rtacct
29.34
KB
-rwxr-xr-x
2026-04-05 08:31
rtcwake
35.26
KB
-rwxr-xr-x
2026-04-04 22:15
rtkitctl
15.24
KB
-rwxr-xr-x
2024-10-02 21:35
rtmon
126.05
KB
-rwxr-xr-x
2026-04-05 08:31
rtstat
23.59
KB
-rwxr-xr-x
2026-04-05 08:31
runlevel
298.41
KB
-rwxr-xr-x
2026-06-25 00:28
runq
1.55
MB
-rwsr-xr-x
2026-07-24 13:18
runuser
55.61
KB
-rwxr-xr-x
2026-04-04 22:15
saslauthd
88.33
KB
-rwxr-xr-x
2025-09-25 11:46
sasldblistusers2
15.27
KB
-rwxr-xr-x
2025-09-25 11:46
saslpasswd2
15.24
KB
-rwxr-xr-x
2025-09-25 11:46
sefcontext_compile
72.38
KB
-rwxr-xr-x
2025-03-12 23:36
selabel_digest
15.31
KB
-rwxr-xr-x
2025-03-12 23:36
selabel_get_digests_all_partial_matches
15.33
KB
-rwxr-xr-x
2025-03-12 23:36
selabel_lookup
15.3
KB
-rwxr-xr-x
2025-03-12 23:36
selabel_lookup_best_match
15.31
KB
-rwxr-xr-x
2025-03-12 23:36
selabel_partial_match
15.3
KB
-rwxr-xr-x
2025-03-12 23:36
selinux_check_access
15.31
KB
-rwxr-xr-x
2025-03-12 23:36
selinuxconlist
15.3
KB
-rwxr-xr-x
2025-03-12 23:36
selinuxdefcon
15.3
KB
-rwxr-xr-x
2025-03-12 23:36
selinuxenabled
15.27
KB
-rwxr-xr-x
2025-03-12 23:36
selinuxexeccon
15.29
KB
-rwxr-xr-x
2025-03-12 23:36
semanage
40.64
KB
-rwxr-xr-x
2026-04-05 11:05
semodule
32.04
KB
-rwxr-xr-x
2026-04-04 23:52
sendmail
18.08
KB
-rwxr-sr-x
2026-07-24 13:18
service
4.51
KB
-rwxr-xr-x
2024-08-27 11:35
sestatus
23.13
KB
-rwxr-xr-x
2026-04-04 23:52
setcap
15.13
KB
-rwxr-xr-x
2026-05-20 10:00
setenforce
15.3
KB
-rwxr-xr-x
2025-03-12 23:36
setfiles
23.19
KB
-rwxr-xr-x
2026-04-04 23:52
setpci
31.35
KB
-rwxr-xr-x
2025-03-12 20:27
setquota
81.58
KB
-rwxr-xr-x
2025-03-12 20:44
setsebool
19.15
KB
-rwxr-xr-x
2026-04-04 23:52
sfdisk
103.98
KB
-rwxr-xr-x
2026-04-04 22:15
sgdisk
167.14
KB
-rwxr-xr-x
2022-01-30 23:44
showmount
15.48
KB
-rwxr-xr-x
2026-04-08 16:14
shutdown
298.41
KB
-rwxr-xr-x
2026-06-25 00:28
slattach
37.57
KB
-rwxr-xr-x
2024-10-02 19:02
sm-notify
51.77
KB
-rwxr-xr-x
2026-04-08 16:14
smartctl
853.84
KB
-rwxr-xr-x
2026-04-08 20:38
smartd
615.47
KB
-rwxr-xr-x
2026-04-08 20:38
snmpd
35.22
KB
-rwxr-xr-x
2026-04-10 02:30
snmptrapd
35.33
KB
-rwxr-xr-x
2026-04-10 02:30
ss
131.32
KB
-rwxr-xr-x
2026-04-05 08:31
sshd
406.9
KB
-rwxr-xr-x
2026-07-29 23:09
sss_cache
35.25
KB
-rwxr-xr-x
2026-07-23 19:31
sssd
71.61
KB
-rwxr-xr-x
2026-07-23 19:31
start-statd
1
KB
-rwxr-xr-x
2021-06-10 18:07
start-stop-daemon
48.65
KB
-rwxr-xr-x
2026-03-23 13:44
suexec
27.45
KB
-rwsr-s---
2026-06-10 15:54
sulogin
43.4
KB
-rwxr-xr-x
2026-04-04 22:15
swaplabel
19.19
KB
-rwxr-xr-x
2026-04-04 22:15
swapoff
23.27
KB
-rwxr-xr-x
2026-04-04 22:15
swapon
43.31
KB
-rwxr-xr-x
2026-04-04 22:15
switch_root
23.2
KB
-rwxr-xr-x
2026-04-04 22:15
sysctl
31.49
KB
-rwxr-xr-x
2024-04-30 16:43
t1libconfig
3.83
KB
-rwxr-xr-x
2007-12-23 15:49
tc
640.09
KB
-rwxr-xr-x
2026-04-05 08:31
tcpdump
1.28
MB
-rwxr-xr-x
2024-04-03 15:16
tcpslice
27.39
KB
-rwxr-xr-x
2024-04-03 15:16
telinit
298.41
KB
-rwxr-xr-x
2026-06-25 00:28
testsaslauthd
15.16
KB
-rwxr-xr-x
2025-09-25 11:46
tipc
92.8
KB
-rwxr-xr-x
2026-04-05 08:31
tmpwatch
36.03
KB
-rwxr-xr-x
2022-02-11 11:52
tracepath
19.22
KB
-rwxr-xr-x
2025-10-20 12:44
tracepath6
19.22
KB
-rwxr-xr-x
2025-10-20 12:44
tsig-keygen
27.26
KB
-rwxr-xr-x
2026-08-13 11:36
tune2fs
104.46
KB
-rwxr-xr-x
2025-09-21 15:03
tuned
3.87
KB
-rwxr-xr-x
2026-02-22 19:49
tuned-adm
6.68
KB
-rwxr-xr-x
2026-02-22 19:49
udevadm
587.85
KB
-rwxr-xr-x
2026-06-25 00:28
umount.nfs
100.52
KB
-rwxr-xr-x
2026-04-08 16:14
umount.nfs4
100.52
KB
-rwxr-xr-x
2026-04-08 16:14
unix_chkpwd
23.29
KB
-rwxr-xr-x
2026-04-04 23:44
unix_update
31.32
KB
-rwx------
2026-04-04 23:44
unsquashfs
113.8
KB
-rwxr-xr-x
2024-04-03 13:45
update-alternatives
39.59
KB
-rwxr-xr-x
2025-03-12 10:43
update-pciids
1.72
KB
-rwxr-xr-x
2025-03-12 20:27
update-smart-drivedb
23.33
KB
-rwxr-xr-x
2026-04-08 20:37
useradd
137.84
KB
-rwxr-xr-x
2026-04-08 19:49
userdel
88.84
KB
-rwxr-xr-x
2026-04-08 19:49
userhelper
43.48
KB
-rwx--x--x
2025-09-21 11:17
usermod
129.66
KB
-rwxr-xr-x
2026-04-08 19:49
validatetrans
15.29
KB
-rwxr-xr-x
2025-03-12 23:36
vdpa
35.88
KB
-rwxr-xr-x
2026-04-05 08:31
vigr
58.16
KB
-rwxr-xr-x
2026-04-08 19:49
vipw
58.16
KB
-rwxr-xr-x
2026-04-08 19:49
virt-what
15.71
KB
-rwxr-xr-x
2025-09-21 11:48
virt-what-cvm
15.32
KB
-rwxr-xr-x
2025-09-21 11:48
visudo
267.27
KB
-rwxr-xr-x
2026-05-21 01:23
vmcore-dmesg
27.3
KB
-rwxr-xr-x
2026-04-08 18:11
vpddecode
19.15
KB
-rwxr-xr-x
2026-04-09 07:32
weak-modules
39.38
KB
-rwxr-xr-x
2025-11-13 09:55
whmapi0
3.32
MB
-rwxr-xr-x
2026-09-04 09:53
whmapi1
3.32
MB
-rwxr-xr-x
2026-09-04 09:53
whmlogin
2.33
KB
-rwxr-xr-x
2022-02-09 18:45
wipefs
39.28
KB
-rwxr-xr-x
2026-04-04 22:15
wp-toolkit-clone-awp-settings
20.22
KB
-rwxr-xr-x
2026-07-31 10:23
xfs_admin
2.13
KB
-rwxr-xr-x
2025-09-21 13:01
xfs_bmap
699
B
-rwxr-xr-x
2025-09-21 13:01
xfs_copy
92.62
KB
-rwxr-xr-x
2025-09-21 13:02
xfs_db
708.08
KB
-rwxr-xr-x
2025-09-21 13:02
xfs_estimate
15.16
KB
-rwxr-xr-x
2025-09-21 13:02
xfs_freeze
804
B
-rwxr-xr-x
2025-09-21 13:01
xfs_fsr
43.51
KB
-rwxr-xr-x
2025-09-21 13:02
xfs_growfs
43.63
KB
-rwxr-xr-x
2025-09-21 13:02
xfs_info
1.27
KB
-rwxr-xr-x
2025-09-21 13:01
xfs_io
202.59
KB
-rwxr-xr-x
2025-09-21 13:02
xfs_logprint
88.26
KB
-rwxr-xr-x
2025-09-21 13:02
xfs_mdrestore
27.28
KB
-rwxr-xr-x
2025-09-21 13:02
xfs_metadump
786
B
-rwxr-xr-x
2025-09-21 13:01
xfs_mkfile
1.02
KB
-rwxr-xr-x
2025-09-21 13:01
xfs_ncheck
689
B
-rwxr-xr-x
2025-09-21 13:01
xfs_quota
92.1
KB
-rwxr-xr-x
2025-09-21 13:02
xfs_repair
686.23
KB
-rwxr-xr-x
2025-09-21 13:02
xfs_rtcp
19.14
KB
-rwxr-xr-x
2025-09-21 13:02
xfs_spaceman
43.78
KB
-rwxr-xr-x
2025-09-21 13:02
xqmstats
15.33
KB
-rwxr-xr-x
2025-03-12 20:44
xtables-monitor
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
xtables-nft-multi
231.41
KB
-rwxr-xr-x
2025-02-04 03:47
zic
59.63
KB
-rwxr-xr-x
2026-08-03 10:14
zramctl
55.87
KB
-rwxr-xr-x
2026-04-04 22:15
Save
Rename
#!/opt/cloudlinux/venv/bin/python3 -bb # coding=utf-8 # # Copyright © Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2018 All Rights Reserved # # Licensed under CLOUD LINUX LICENSE AGREEMENT # http://cloudlinux.com/docs/LICENCE.TXT # import getopt import logging import sys import pwd import syslog import os from typing import Tuple, Text # NOQA from clcommon.utils import is_root_or_exit, get_cl_version from cllimits_validator import LimitsValidator, ENTITY_USER, ENTITY_PACKAGE, ENTITY_RESELLER, ENTITY_DEFAULTS from cllimitslib_v2 import DEFAULTS from clveconfig import DEFAULT_PROVIDER, VE_CFG_PATH from cllimits.lib.utils import write_lower_bound, check_pmem_lower_bound, LowerBoundsConfigException is_root_or_exit() # check here or imports will fail import clcommon from clcommon.clproc import NoSuchLvp, LIMIT_LVP_ID from clcommon.cpapi.cpapiexceptions import CPAPIException from clcommon.lib.cledition import skip_without_lve from cllvectl.log import get_synchronous_logger import lveapi import lvestat as LVEStat from lve_utils.sentry import init_lve_utils_sentry_client from lve_utils.cagefs import ensure_lvd_proxy_commands import lvectllib as lve_commands from lvectllib import _page_to_memory_or_bytes, DomainLveIdError import cldetectlib as detect from lve_utils import PKG_VERSION from clcommon.cpapi import domain_owner as cpapi_domain_owner from websiteisolation.config import resolve_docroot from websiteisolation.exceptions import LvdError skip_without_lve() logger = get_synchronous_logger('lvectl') DO_NOT_EXIT = 999 PRINT_FORMATS = {True: { 8: '{"ID":"%s","SPEED":"%s","CPU":"%s","PMEM":"%s","VMEM":"%s","EP":"%s","NPROC":"%s","IO":"%s","IOPS":"%s"}', 6: '{"ID":"%s","SPEED":"%s","CPU":"%s","PMEM":"%s","VMEM":"%s","EP":"%s","NPROC":"%s","IO":"%s"}', 4: '{"ID":"%s","SPEED":"%s","CPU":"%s","VMEM":"%s","EP":"%s","IO":"%s"}'}, False: { 8: "%8s%8s%8s%8s%8s%8s%8s%8s", 6: "%8s%8s%8s%8s%8s%8s%8s", 4: "%8s%8s%8s%8s%8s"}} PRINT_HEADERS = {8: ('ID', 'SPEED', 'PMEM', 'VMEM', 'EP', 'NPROC', 'IO', 'IOPS'), 6: ('ID', 'SPEED', 'PMEM', 'VMEM', 'EP', 'NPROC', 'IO'), 4: ('ID', 'SPEED', 'VMEM', 'EP', 'IO')} _WPOS_DAEMON_SIGHUP_FILE = '/var/lve/wpos_reload' def _wpos_reload(): """ Create flag file for force sighup WPOS daemon """ try: if os.path.exists('/etc/clwpos/clwpos.json'): open(_WPOS_DAEMON_SIGHUP_FILE, 'w').close() except (OSError, IOError,): pass def print_error(message, print_usage_flag=False): if lve_commands.JSON: lve_commands.json_format( lve_commands.MULTI_FORMAT, ['ERROR', message] ) else: err_message = "error: %s" % message sys.stderr.write("%s\n" % err_message) if print_usage_flag: print_usage() def print_error_and_exit(message, exit_code=-1, print_usage_flag=False): print_error(message, print_usage_flag) if exit_code != DO_NOT_EXIT: sys.exit(exit_code) # GET VERSION from /proc/lve/list lve_ver = clcommon.get_lve_version() if lve_ver[0] is None: print_error_and_exit(lve_ver[1], 1) LVE_VERSION = lve_ver[0] LVE_VERSION = max(key for key in PRINT_HEADERS.keys() if key <= LVE_VERSION) # use max supported version try: lve_commands.init(LVE_VERSION) except Exception as e: print_error_and_exit(e, 1) # Check if JSON output required or old format without iops command_prompt = sys.argv[:] for i, el in enumerate(sys.argv): if el in ('json', '--json'): lve_commands.set_json(True) lve_commands.set_bytes('--bytes' in sys.argv) command_prompt.pop(i) if '--bytes' in sys.argv: command_prompt.pop(command_prompt.index('--bytes')) continue if el in ('no-iops', '--no-iops'): # check no-iops key in command prompt and drop LVE_VERSION to 6 if this key founded and LVE_VERSION is 8 if LVE_VERSION == 8: lve_commands.NOIOPS = True # STUPID HACK. Remove with iops release command_prompt.pop(i) continue syslog.openlog('lve-utils') def print_usage(): print('lvectl version ' + PKG_VERSION) print('usage: lvectl command [veid] [options]') print('commands:') print('apply apply config settings to specified LVE') print('apply all apply config settings to all the LVEs') print( 'apply-many to apply LVE limits to multiple distinct LVEs (uids of users are read from stdin)') print('set set parameters for a LVE and/or create a LVE') print('set-reseller create a LVP (resellers) container move LVE there') print('set-reseller-default set default limits for users inside LVP') print('sync-map load/update reseller:user map for correct support resellers limits') print('set-user set parameters for a LVE and/or create a LVE using username instead of ID') print('list list loaded LVEs') print('list-reseller list loaded LVPs, --with-name for display reselers name') print('list-domains <uid> list domain LVEs inside the user LVP for <uid>') print('allow-domain-limits <user> create user LVP and enable per-domain isolation for <user>') print('deny-domain-limits <user> remove user LVP and disable per-domain isolation for <user>') print('enable-domain-limits <domain> register domain LVE under user LVP (resolve domain internally)') print('disable-domain-limits <domain> unregister domain LVE and remove registry entry') print('list-user list loaded LVEs, display username instead of user id') print('limits show limits for loaded LVEs') print('all-user-list show limits for loaded LVEs with packages info') print('delete delete LVE and set configuration for that LVE to defaults') print( 'remove-reseller delete LVP container and record in config, move LVE containers to host container') print('delete-user delete LVE and set configuration for that user to defaults') print('destroy destroy LVE (configuration file remains unchanged)') print('destroy all destroy all LVE (configuration file remains unchanged)') print( 'destroy-many to destroy LVE limits to multiple distinct LVEs (uids of users are read from stdin)') print('package-set set LVE parameters for a package') print('package-list list LVE parameters for packages') print('reseller-package-list list LVE parameters for resellers packages') print( 'all-package-list list LVE parameters for all packages (whether it is resseler package or not )') print('package-delete delete LVE parameters for a package') print( 'paneluserslimits [reseller] show current user\'s limits for control panel. Reseller name is optional parameter') print('paneluserlimits show current limits for one user-id of user in control panel') print('set-pmem-lower-bound set PMEM lower bound, the minimal possible value of the PMEM limit') print('regenerate-domains update LVD domain config and ID mapping after domain rename, docroot change, or user rename') print('limit limit PID into specified LVE. Parameters PID LVE_ID') print('release release PID from LVE. Parameters PID') print('set-binary add binary to be run inside LVE on execution') print('del-binary remove binary from being run inside LVE on execution') print('list-binaries list all binaries to be run inside LVE on execution') print('load-binaries load binaries (used on startup) from config file') print('reload-binaries re-load list of binaries from config file') print('help (-h) show this message') print('version (-v) version number') print('lve-version lve version number') print('options:') print('--enters-count enable limit for enters count (by default disabled), use only with command "limit"') if "cl6" not in get_cl_version(): print('--io-and-memory enable limit for IO and memory (by default disabled), use only with command "limit"') print('--cpu=N limit CPU usage; (deprecated. Use --speed)') print('--speed=N% limit CPU usage in percentage; 100% is one core ') print('--speed=Nmhz\ghz limit CPU usage in mhz\ghz') print('--io=N define io limits (KB/s)') if LVE_VERSION > 4: print('--nproc=N limit number of processes') print('--pmem=N limit physical memory usage for aplications inside LVE') if LVE_VERSION > 6: print('--iops=N limit io operations per second') print('--mem=N mem alias for vmem (deprecated)') print('--vmem=N limit virtual memory for applications inside LVE') print('--maxEntryProcs=N limit number of entry processes') print('--save save configuration settings (use with set) (deprecated)') print('--save-all-parameters save all parameters even if they match with defaults settings') print('--json returns result of command json formatted') print('--bytes show all limits in bytes. Works only with --json') print('--unlimited set all limits to unlimited') print( '--reseller specify reseller name who owns the package/uid; use with package-set/package-delete/set command') print('--skip-custom skip calling custom script inside lvectl') print("""--default=A,B,C set limits to default value (will delete lve first) available limits are either from %s or 'all' to reset all limits""" % ( "cpu, io, mem/vmem, ep/maxEntryProcs, nproc, pmem" if LVE_VERSION > 4 else "cpu, io, mem/vmem, ep/maxEntryProcs, nproc, pmem, iops" if LVE_VERSION > 6 else "cpu, io, mem/vmem, ep/maxEntryProcs")) print( '--save-username save username in the config file. This parameter is used in conjunction with set-user') print(f'--skip-update-cfg skip updating LVE parameters in {VE_CFG_PATH} (use with set)') print('') def validate_options(options): opts = {'ncpu', 'speed', 'cpu', 'io', 'mem', 'vmem', 'ep', 'maxEntryProcs'} if LVE_VERSION > 4: opts.update(['nproc', 'pmem']) if LVE_VERSION > 6: opts.update(['iops']) if len(options) == 1 and "all" in options: options = opts # check all options are valid if len(set(options) - opts) > 0: print_error_and_exit( "%s are not available options.\n\navailable options are:\n%s" % ( ', '.join(set(options) - opts), '\n'.join(opts)) ) # map options to set_data keys opts_map = {'ncpu': 'ncpu', 'speed': 'cpu', 'cpu': 'cpu', 'io': 'io', 'mem': 'mem', 'vmem': 'mem', 'ep': 'ep', 'maxEntryProcs': 'ep', 'nproc': 'nproc', 'pmem': 'pmem', 'iops': 'iops'} return set([opts_map[k] for k in options]) def invalid_option(o, a): print('Invalid value for option %s: %s' % (o, a)) print_usage() sys.exit(1) def id_to_name(ve_id, display_user): if ve_id == 0: return 'default' elif ve_id == LIMIT_LVP_ID: return 'limit' if display_user: try: return pwd.getpwuid(ve_id).pw_name except KeyError: pass return str(ve_id) def get_line_data(line, stats, display_user, with_reseller_name=False, prefix=''): ID = id_to_name(line, display_user) if with_reseller_name and ID.isdigit(): # for show reseller name with id ID += ':' + (lve_commands.lve.map.get_reseller_name(int(ID)) or 'N/A') # N/A if can't find lvp_id reseller name ID = prefix + ID data = () stats_line = stats[line] # type: lvestat.LVEStat if lve_commands.JSON: if lve_commands.NOIOPS and LVE_VERSION == 8: data = (ID, stats_line.cpu, lve_commands.speed_to_old_cpu(stats_line.cpu), _page_to_memory_or_bytes(stats_line.lmemphy), _page_to_memory_or_bytes(stats_line.lmem), stats_line.lep, stats_line.lnproc, stats_line.io) elif LVE_VERSION == 8: data = (ID, stats_line.cpu, lve_commands.speed_to_old_cpu(stats_line.cpu), _page_to_memory_or_bytes(stats_line.lmemphy), _page_to_memory_or_bytes(stats_line.lmem), stats_line.lep, stats_line.lnproc, stats_line.io, stats_line.liops) elif LVE_VERSION == 6: data = (ID, stats_line.cpu, lve_commands.speed_to_old_cpu(stats_line.cpu), _page_to_memory_or_bytes(stats_line.lmemphy), _page_to_memory_or_bytes(stats_line.lmem), stats_line.lep, stats_line.lnproc, stats_line.io) elif LVE_VERSION == 4: data = (ID, stats_line.cpu, lve_commands.speed_to_old_cpu(stats_line.cpu), _page_to_memory_or_bytes(stats_line.lmem), stats_line.lep, stats_line.io) else: if lve_commands.NOIOPS and LVE_VERSION == 8: data = (ID, stats_line.cpu, _page_to_memory_or_bytes(stats_line.lmemphy), _page_to_memory_or_bytes(stats_line.lmem), stats_line.lep, stats_line.lnproc, stats_line.io) elif LVE_VERSION == 8: data = (ID, stats_line.cpu, _page_to_memory_or_bytes(stats_line.lmemphy), _page_to_memory_or_bytes(stats_line.lmem), stats_line.lep, stats_line.lnproc, stats_line.io, stats_line.liops) elif LVE_VERSION == 6: data = (ID, stats_line.cpu, _page_to_memory_or_bytes(stats_line.lmemphy), _page_to_memory_or_bytes(stats_line.lmem), stats_line.lep, stats_line.lnproc, stats_line.io) elif LVE_VERSION == 4: data = (ID, stats_line.cpu, _page_to_memory_or_bytes(stats_line.lmem), stats_line.lep, stats_line.io) return data def limits_print(ve_id, display_user=False, lvp=False, with_reseller_name=False): if lvp: if ve_id == 'all': stats = parseLVPList() else: try: stats = parseLVEList(ve_id) except IOError: # if /proc/lve/resellers/lvp{ve_id}/list no present stats = dict() else: stats = dict() if lve_commands.lve.reseller_limit_supported(): # CLOS-4390: iterate every kernel LVP (including per-user # isolation LVPs that parseLVPList now filters out of the # list-reseller view) so 'lvectl list' still surfaces user # LVEs nested inside isolation LVPs. lve_commands.remove_absent_resellers() for lvp_id_ in lve_commands.lve.proc.lvp_id_list(): stats.update(parseLVEList(lvp_id_, ignore_id=LIMIT_LVP_ID)) stats.update(parseLVEList()) if lve_commands.NOIOPS and LVE_VERSION == 8: out_format = PRINT_FORMATS[lve_commands.JSON][6] else: out_format = PRINT_FORMATS[lve_commands.JSON][LVE_VERSION] # Calculate the maximum username/reseller name length dynamically if not lve_commands.JSON and (display_user or with_reseller_name): # Default minimum width is 8 max_username_len = 8 for line in stats: username = id_to_name(line, display_user) if with_reseller_name and username.isdigit(): username += ":" + (lve_commands.lve.map.get_reseller_name(int(username)) or "N/A") max_username_len = max(max_username_len, len(username)) # Add 2 spaces of padding username_width = max_username_len + 2 # Replace the %8s format specifier for ID from PRINT_FORMATS template with the calculated dynamic width out_format = f"%{username_width}s" + out_format[3:] if lve_commands.JSON: result = '{"data":[' separator = "," else: if lve_commands.NOIOPS and LVE_VERSION == 8: result = out_format % PRINT_HEADERS[6] + "\n" else: result = out_format % PRINT_HEADERS[LVE_VERSION] + "\n" separator = "\n" if ve_id == 'all' or lvp: result += separator.join( (out_format % get_line_data(line, stats, display_user, with_reseller_name=with_reseller_name) for line in stats)) else: for line in stats: if line == ve_id: result += out_format % get_line_data(line, stats, display_user) if lve_commands.JSON: result += ']}' else: result += separator try: print(result) except IOError: pass def _parse_lve_lines(lines, id_=None, ignore_id=None): stats = {} for line in lines: stat = LVEStat.LVEStat(line, lve_ver[0]) if id_ is not None and stat.id != id_: # filter by id if need continue if ignore_id is not None and stat.id == ignore_id: continue if (lve_ver[0] < 8): cpu_data = lve_commands.CPUINFO_DATA stat.cpu = stat.cpu * cpu_data[0] # cpu_data[0] - Num_core elif (lve_ver[0] >= 8): stat.cpu = stat.cpu // 100 stats[stat.id] = stat return stats def parseLVEList(lvp_id=0, id_=None, ignore_id=None): with open(lve_commands.lve.proc.get_list_path(lvp_id=lvp_id)) as lines: lines.readline() return _parse_lve_lines(lines, id_=id_, ignore_id=ignore_id) def parseLVPList(): # Remove from LVE all resellers, wich absent in panel lve_commands.remove_absent_resellers() # CLOS-4390: kernel registers per-user isolation LVPs (lvp<uid>, created # by lve_apply for domain-isolated users) in /proc/lve/resellers along # with real resellers. Those user LVPs have no <reseller> block in # ve.cfg and the panel does not list them as resellers either, so # CloudLinux Manager can only render their kernel-side state — the # "shortened" limits form the customer reported. Filter them out by # asking lve.map.get_reseller_name(): it returns a name only when the # uid is declared as a reseller in ve.cfg OR cpapi.is_reseller(name) # is true (matching how remove_absent_resellers determines what is # a real reseller). Phantom isolation LVPs hit neither and resolve # to None. stats = {} for lvp_id in lve_commands.lve.proc.lvp_id_list(): if lve_commands.lve.map.get_reseller_name(lvp_id) is None: continue try: stats[lvp_id] = parseLVEList(lvp_id=lvp_id, id_=LIMIT_LVP_ID)[LIMIT_LVP_ID] except KeyError: pass return stats def delete_lve(a, lvp_id=0): if not str(a).isdigit(): print_error_and_exit("LVE id must be number") if delete_lve_int(int(a)): return print_error_and_exit("Invalid LVE id") def send_json_ok(): if lve_commands.JSON: lve_commands.json_format(lve_commands.SINGLE_FORMAT, ['OK']) def delete_lve_int(lve_id): if lve_id > 0: try: lve_commands.lve_delete(lve_id) except DomainLveIdError as e: print_error_and_exit(str(e)) send_json_ok() return True def delete_lve_by_name(a): try: if delete_lve_int(pwd.getpwnam(a).pw_uid): return except KeyError: pass print_error_and_exit("invalid username given") def convert_to_int_or_exit(val, error_message, exit_code=-1): try: return int(val) except ValueError: print_error_and_exit(error_message, exit_code) def parse_int_param(el, set_data, param_name, min_val, set_limits, max_val=sys.maxsize, alias=None): if not alias: alias = param_name try: set_data[param_name] = convert_to_int_or_exit(el.split('--' + alias + '=')[1], 'Non integer %s limit provided' % alias) if max_val >= set_data[param_name] >= min_val: set_limits.add(param_name) return True else: print_error_and_exit("%s limit is out of range" % alias) except IndexError: pass return False def parse_set_data(args, set_data): args.pop(0) args.pop(0) args2 = [] if len(args) > 0 and not args[0].startswith("--"): raise Exception("Wrong args") skip_next = False args_length = len(args) for idx, el in enumerate(args): # used current value as value for previous key if skip_next: skip_next = False continue if el.startswith("--"): # --key=value format if el.find("=") > 0: args2.append(el) elif idx < (args_length - 1): # next element is key again if (args[idx + 1]).startswith("--"): args2.append(el) # either value else: args2.append(el + "=" + args[idx + 1]) skip_next = True # no more elements, so it is key elif idx == args_length - 1: args2.append(el) args = args2 set_limits = set([]) set_options = [set(['default']), set(['unlimited']), set(['cpu', 'speed', 'ncpu', 'vmem', 'mem', 'pmem', 'io', 'maxEntryProcs', 'ep', 'nproc', 'iops'])] for el in args: parsed = False if el.startswith('--'): if el.startswith('--cpu'): print('Warning: --cpu option had been deprecated, use --speed instead') if 'speed' in set_limits: print_error_and_exit('Error: used both cpu and speed limit.') parsed = parsed or parse_int_param(el, set_data, 'cpu', 1, set_limits, max_val=100) if el.startswith('--speed'): if 'cpu' in set_limits: print_error_and_exit('Error: used both cpu and speed limit.') speed = el.split('--speed=')[1] speedlimit = lve_commands.convert_from_speed(speed) if speedlimit is None: print_error_and_exit('Speed limit error', 1, 1) parsed = False else: parsed = True set_data['cpu'] = speed set_limits.add('speed') parsed = parsed or parse_int_param(el, set_data, 'ncpu', 0, set_limits) if el.startswith('--mem') or el.startswith('--vmem'): set_data['mem'] = clcommon.memory_to_page(el.split('=')[1]) if set_data['mem'] == None: print_error_and_exit("Invalid vmem value") parsed = parsed or True set_limits.add('mem') parsed = parsed or parse_int_param(el, set_data, 'io', 0, set_limits) parsed = parsed or parse_int_param(el, set_data, 'ep', 0, set_limits) parsed = parsed or parse_int_param(el, set_data, 'ep', 0, set_limits, alias='maxEntryProcs') parsed = parsed or parse_int_param(el, set_data, 'nproc', 0, set_limits) if el.startswith('--pmem'): set_data['pmem'] = clcommon.memory_to_page(el.split('=')[1]) if set_data['pmem'] is None: print_error_and_exit("Invalid pmem value") error = check_pmem_lower_bound(set_data['pmem']) if error: print_error_and_exit(error['message'] % error['context']) parsed = parsed or True set_limits.add('pmem') parsed = parsed or parse_int_param(el, set_data, 'iops', 0, set_limits) if el == '--save': print_error('--save option had been deprecated') parsed = True if el == '--save-all-parameters': set_data['save'] = True parsed = True if el == '--unlimited': set_data['cpu'] = 100 set_data['ncpu'] = 0 set_data['mem'] = 0 set_data['io'] = 0 set_data['ep'] = 0 set_data['pmem'] = 0 set_data['nproc'] = 0 set_data['iops'] = 0 set_limits.add('unlimited') parsed = True if el.startswith('--default='): if set_data['ve_id'] == 0: print_error_and_exit("Can not reset default ve to default") opts_to_default = set([p for p in el.split('=')[1].split(',') if p != '']) set_data['set-default'] = validate_options(opts_to_default) set_limits.add('default') parsed = True if el.startswith('--reseller='): reseller_name = el.split("=")[1] set_data['reseller_name'] = reseller_name parsed = True # LU-400 if el == '--skip-custom': parsed = True if el == '--skip-update-cfg': set_data['skip-update-cfg'] = True parsed = True else: print_error_and_exit("wrong arguments for command: set", print_usage_flag=True) if not parsed: print_error_and_exit("unrecognized option or bad limit given %s" % el) if sum(bool(set_limits.intersection(s)) for s in set_options) > 1: print_error_and_exit("can not combine options: %s" % ', '.join(set_limits)) def parse_reseller(reseller_id): # type: (Text) -> Tuple[Text, int] """ Try to obtain reseller name and LVP id from given info :param reseller_id: reseller name or LVP id """ def _lvp_id_to_reseller_name(_lvp_id): # type: (int) -> Optional[Text] if _lvp_id <= 0: print_error_and_exit('Incorrect user id {}'.format(reseller_id)) lve_commands.get_XML_cfg() reseller_name = lve_commands.lve.map.get_reseller_name(_lvp_id) return reseller_name def _reseller_name_to_lvp_id(name): # type: (Text) -> Optional[int] lve_commands.get_XML_cfg() _lvp_id = lve_commands.lve.map.get_reseller_id(name) return _lvp_id lvp_id = None reseller_name = None try: lvp_id = int(reseller_id) except ValueError: reseller_name = reseller_id lvp_id = _reseller_name_to_lvp_id(reseller_name) else: reseller_name = _lvp_id_to_reseller_name(lvp_id) if reseller_name is None or lvp_id is None: print_error_and_exit( "{} is neither an existing reseller's name nor an LVE id".format(reseller_id) ) return lvp_id, reseller_name def process_lve_set(args, o): # variable lvp_id using for identificate operations with lve top container; # None - operations with default lve container; # list[lve_id1, lve_id2, ..., lveid_n] - operations with lve top container included simple lve containers id lvp_id = 0 # args example set limitt to uid: # args: ['set', '1023', '--reseller=res', '--iops=2222'] # o == 'set' if len(args) == 1: print_error_and_exit('No LVE ID provided') else: set_data = {} entity_type = None entity_id = None if o in ('set',): if args[1] == 'default': set_data['ve_id'] = 0 entity_type = ENTITY_DEFAULTS entity_id = DEFAULTS else: set_data['ve_id'] = convert_to_int_or_exit(args[1], "LVE ID must be numeric") entity_type = ENTITY_USER if set_data['ve_id'] != 0 else ENTITY_DEFAULTS entity_id = set_data['ve_id'] if set_data['ve_id'] != 0 else DEFAULTS elif o == 'set-reseller-default': set_data['ve_id'] = 0 lve_commands.get_XML_cfg() # load config or load reseller_name:reseller_id map lvp_id, set_data['user'] = parse_reseller(args[1]) if not lve_commands.lve.proc.exist_lvp(lvp_id): # We can not set up defaults for non-existing reseller container print_error_and_exit('LVP container does not exist', 1) entity_type = ENTITY_DEFAULTS entity_id = set_data['user'] elif o == 'set-reseller': # TODO: LU-952 if args[1] == '--all': # for anable lvp containers all resellers lvp_id = list() lve_commands.get_XML_cfg() # load config or load reseller_name:reseller_id map for reseller_name in lve_commands.lve.map.resellers(): lvp_id.append((reseller_name, lve_commands.lve.map.get_reseller_id(reseller_name))) else: lvp_id, set_data['user'] = parse_reseller(args[1]) set_data['ve_id'] = lvp_id entity_type = ENTITY_RESELLER entity_id = set_data['user'] else: if '--save-username' in args: set_data['save-username'] = True args.remove('--save-username') try: set_data['ve_id'] = pwd.getpwnam(args[1]).pw_uid except KeyError: print_error_and_exit("Invalid user name") entity_type = ENTITY_USER entity_id = set_data['ve_id'] # initializing 'save' flag. # then it will be set True in parse_set_data if "--save-all-parameters" argument is given # LU-574 # Force to save the limits for reseller (not for user with the same name, but for reseller as virtual entity) set_data['save'] = True if o == 'set-reseller' else False parse_set_data(args, set_data) # TODO: LU-952 if '--all' not in args: # Validation of settable limits. LU-919 limits_validator = LimitsValidator() result, messages = limits_validator.validate_input_limits( entity_type, entity_id, set_data ) if not result: print_error_and_exit( 'You\'re trying to set invalid LVE limits. {}'.format(' '.join(messages)), ) try: if isinstance(lvp_id, list): # if lvp list use for many lvp for reseller_name, lvp_id_ in lvp_id: set_data_ = dict(set_data) set_data_.update({'user': reseller_name, 've_id': lvp_id_}) lve_commands.lve_set(set_data_, lvp_id=lvp_id_) else: # Set limits for user's LVE if not lve_commands.lve_set(set_data, lvp_id=lvp_id): # Error lve_id does not match reseller print_error_and_exit( "User id '%s' is not owned by '%s'" % ( set_data['ve_id'], set_data.get('reseller_name', 'root') ) ) except DomainLveIdError as e: print_error_and_exit(str(e)) send_json_ok() return set_data def process_lve_package_set(args, lve_command_func=lve_commands.package_set): if len(args) == 1: print_error_and_exit('No package ID provided') else: set_data = {'ve_id': args[1], 'save': True} parse_set_data(args, set_data) entity_id = set_data['ve_id'] reseller = set_data.get('reseller_name', DEFAULT_PROVIDER) limits_validator = LimitsValidator() result, messages = limits_validator.validate_input_limits( ENTITY_PACKAGE, entity_id, set_data, reseller=reseller ) if not result: print_error_and_exit( 'You\'re trying to set invalid LVE limits. {}'.format(' '.join(messages)), ) if 'reseller_name' in set_data: if not lve_commands.reseller_package_set(set_data): print_error_and_exit("Reseller '%s' does not have package '%s'" % (set_data['reseller_name'], set_data['ve_id'])) else: lve_command_func(set_data) send_json_ok() def check_support_reseller_limits(): """ Check support resellers limits If not enabled or not support exit end print diagnostic message """ # error code 38 - ENOSYS Function not implemented # check supported kernel if not lve_commands.lve.is_lve10(): print_error_and_exit( 'Please, update your LVE to 1.5.x to use this command', exit_code=38 ) # check supported clcommon panel_name = detect.getCPName() # check supported control panel if not lve_commands.lve.is_panel_supported(): print_error_and_exit( 'Reseller limits is not supported on "{}" control panel now'.format(panel_name), exit_code=38 ) def check_support_domain_limits(): """Check that the kernel supports per-domain LVPs (lve_lvp_create2).""" if not lve_commands.lve.py.domains_supported(): print_error_and_exit( 'Domain limits are not supported by this kernel (requires lve_lvp_create2)', exit_code=38 ) def sync_map(): """ load/update reseller:user map :return: """ lve_commands.get_XML_cfg() lve_commands.lve.sync_map() lve_commands.remove_absent_users() lve_commands.remove_absent_resellers() def _parse_named_args(raw_args): """Parse --key value / --key=value pairs from a raw arg list.""" result = {} i = 0 while i < len(raw_args): a = raw_args[i] if '=' in a and a.startswith('--'): key, val = a.split('=', 1) result[key.lstrip('-')] = val i += 1 elif a.startswith('--') and i + 1 < len(raw_args): result[a.lstrip('-')] = raw_args[i + 1] i += 2 else: print_error_and_exit(f"unknown argument '{a}'") return result def regenerate_domains(args): """Parse CLI args and delegate to lvectllib.regenerate_domains().""" if not lve_commands.lve.py.domains_supported(): return params = _parse_named_args(args[1:]) username = params.get('username') domain = params.get('domain') old_domain = params.get('old-domain') old_docroot = params.get('old-docroot') if not username: print_error_and_exit("regenerate-domains: --username is required") try: uid = pwd.getpwnam(username).pw_uid except KeyError: print_error_and_exit( f"regenerate-domains: user '{username}' not found") lve_commands.regenerate_domains(uid, domain=domain, old_domain=old_domain, old_docroot=old_docroot) def main(argv=None): opts = () args = () try: logger.info('Starting lvectl with arguments: %s', sys.argv) opts, args = getopt.getopt(argv or command_prompt[1:], 'vh:', ['help', 'version', 'apply=', 'list', 'list-reseller', 'list-domains', 'list-user', 'limits=', 'all-user-list', 'destroy=', 'delete=', 'remove-reseller=', 'allow-domain-limits=', 'deny-domain-limits=', 'enable-domain-limits=', 'disable-domain-limits=', "delete-user=", 'set=', 'set-reseller=', 'set-user=', 'ubc', 'package-set=', 'package-set-ext=', 'package-delete=', 'package-list', 'reseller-package-list', 'all-package-list', 'sync-map', 'start', 'lve-version', 'destroy-many', 'apply-many', 'paneluserslimits', 'limit=', 'release=', 'set-binary', 'del-binary', 'list-binaries', 'load-binaries', 'reload-binaries', 'paneluserlimits', 'set-pmem-lower-bound=', 'destroy-and-recreate-all']) except getopt.GetoptError: print_error_and_exit('unknown or missing command', 1, True) if len(opts) == 0 and len(args) == 0: print_error_and_exit('unknown or missing command', 1, True) # hack for using line like lvectl command argument if len(opts) == 0: opts = [] for i in range(0, len(args), 2): if i + 1 < len(args): opts.append((args[i], args[i + 1])) else: opts.append((args[i], '')) executed = False for command, arg in opts: arg: str if command in ('-v', '--version', 'version'): print(PKG_VERSION) sys.exit(0) if command in ('--lve-version', 'lve-version'): if lve_commands.JSON: lve_commands.json_format( lve_commands.MULTI_FORMAT, ['OK', LVE_VERSION] ) else: print(LVE_VERSION) sys.exit(0) if command in ('-h', '--help', 'help'): print_usage() sys.exit(0) if command in ('start', '--start'): executed = True lve_commands.get_XML_cfg() lve_commands.lve_start() if command in ('sync-map',): check_support_reseller_limits() sync_map() lve_commands.write_effective_cache() sys.exit(0) if command in ('regenerate-domains',): regenerate_domains(args) send_json_ok() sys.exit(0) if command in ('set-binary', '--set-binary'): lve_commands.get_global_lock(True) lve_commands.set_binary(arg) send_json_ok() sys.exit(0) if command in ('del-binary', '--del-binary'): lve_commands.get_global_lock(True) lve_commands.del_binary(arg) send_json_ok() sys.exit(0) if command in ('list-binaries', '--list-binaries'): lve_commands.list_binaries() sys.exit(0) if command in ('load-binaries', '--load-binaries'): lve_commands.load_binaries() send_json_ok() sys.exit(0) if command in ('reload-binaries', '--reload-binaries'): lve_commands.reload_binaries() send_json_ok() sys.exit(0) if command in ('apply-many', '--apply-many'): executed = True users = sys.stdin.readlines() if len(users) == 0: print_error_and_exit('user list is empty') lve_commands.apply_many(users) # Cached effective limits will be written to file once per operation. lve_commands.write_effective_cache() if command in ('destroy-many', '--destroy-many'): executed = True users = sys.stdin.readlines() if len(users) == 0: print_error_and_exit('user list is empty') lve_commands.destroy_many(users) _wpos_reload() if command in ('apply', '--apply'): executed = True if len(arg) != 0: if arg == 'all': lve_commands.lve_apply_all() if lve_commands.lve.reseller_limit_supported(): lve_commands.lve.sync_map() lve_commands.write_effective_cache(reset=True) send_json_ok() sys.exit(0) else: lve_id = convert_to_int_or_exit(arg, 'Invalid LVE ID') if lve_id >= 0: lve_commands.get_XML_cfg() if lve_commands.lve.reseller_limit_supported(): lve_commands.get_XML_cfg(lvp_id=lve_commands.lve.lve2lvp(lve_id)) lve_commands.lve_apply(lve_id) if lve_commands.lve.reseller_limit_supported(): lve_commands.lve.sync_map() else: print_error_and_exit("Invalid LVE Id") lve_commands.write_effective_cache() send_json_ok() if command in ('limit', '--limit'): executed = True flags = lveapi.LVE_NO_UBC | lveapi.LVE_NO_MAXENTER supported_flags = { "enters-count": lveapi.LVE_NO_MAXENTER } if "cl6" not in get_cl_version(): supported_flags["io-and-memory"] = lveapi.LVE_NO_UBC flags_count = 0 for arg in args[1:]: if not arg.startswith("--"): break flag = arg[2:] if flag in supported_flags: flags &= ~supported_flags[flag] flags_count += 1 else: print_error_and_exit(f"No such flag: {arg}. Please, use only {list(supported_flags.keys())}.") try: PID = convert_to_int_or_exit(args[flags_count + 1], "PID must be numeric.") except IndexError: print_error_and_exit("You have to specify PID.") try: VE = convert_to_int_or_exit(args[flags_count + 2], "LVE ID must be numeric.") except IndexError: print_error_and_exit("You have to specify LVE ID.") lve_commands.limit_pid(VE, PID, flags) send_json_ok() if command in ('release', '--release'): executed = True PID = convert_to_int_or_exit(arg, 'PID must be numeric') lve_commands.release_pid(PID) send_json_ok() if command in ('list', '--list'): executed = True limits_print('all') if command in ('list-user', '--list-user'): executed = True limits_print('all', True) if command in ('paneluserslimits', '--paneluserslimits'): executed = True if len(arg) == 0: lve_commands.paneluserslimits() # LU-530 else: reseller = str(arg) lve_commands.paneluserslimits(reseller=reseller) if command in ('paneluserlimits', '--paneluserlimits'): executed = True if len(arg) == 0: print_error_and_exit('paneluserlimits takes USER ID of control panel') user_id = convert_to_int_or_exit(arg, "bad USER ID") if user_id >= 0: lve_commands.paneluserslimits(userid=user_id) else: print_error_and_exit("bad USER ID") if command in ('set-pmem-lower-bound', '--set-pmem-lower-bound'): executed = True if len(arg) == 0: print_error_and_exit('set-pmem-lower-bound requires a memory limit (e.g., 512M, 1024M)') # Validate the memory format by trying to parse it pmem_pages = clcommon.memory_to_page(arg) if pmem_pages is None: print_error_and_exit("Invalid memory format. Use format like 512M, 1024M, 2G") # Write to config file try: result = write_lower_bound('PMEM', arg) except LowerBoundsConfigException as e: print_error_and_exit(e.message % e.context) else: if result: print(f"PMEM lower bound set to {arg}") send_json_ok() else: print_error_and_exit("Failed to write PMEM lower bound config file") if command in ('limits', '--limits'): executed = True if len(arg) == 0: print_error_and_exit("limits takes LVE ID or 'all' argument") if arg == 'default': arg = 0 if arg == 'all': limits_print(arg) sys.exit(0) lve_id = convert_to_int_or_exit(arg, "bad LVE ID") if lve_id >= 0: limits_print(lve_id) else: print_error_and_exit("bad LVE id") if command in ('list-reseller',): executed = True check_support_reseller_limits() if len(arg) == 0 or arg in ('--bytes',): limits_print('all', lvp=True) # print limits for all resellers elif '--with-name' == arg: lve_commands.get_XML_cfg() # for loading reseller_name<=>reseller_id map form ve.cfg limits_print('all', lvp=True, with_reseller_name=True) else: lvp_id, _ = parse_reseller(arg) limits_print(lvp_id, lvp=True) if command in ('list-domains',): executed = True check_support_domain_limits() if not arg: print_error_and_exit('Usage: lvectl list-domains <uid>') lvp_id = convert_to_int_or_exit(arg, 'bad user id') limits_print(lvp_id, lvp=True) if command in ('allow-domain-limits',): executed = True check_support_domain_limits() if not arg: print_error_and_exit('Usage: lvectl allow-domain-limits <user>') try: lve_id = pwd.getpwnam(arg).pw_uid except KeyError: print_error_and_exit(f'unknown user: {arg}') # CLOS-4402: register LVD proxyexec helpers in /etc/cagefs/proxy.commands # so `isolatectl limits set` works inside CageFS without requiring a # prior `cagefsctl --isolates-allow`. No-op when CageFS isn't installed. ensure_lvd_proxy_commands() lve_commands.get_XML_cfg() if lve_commands.lve.reseller_limit_supported(): lve_commands.get_XML_cfg(lvp_id=lve_commands.lve.lve2lvp(lve_id)) lve_commands.enable_domain_isolation(lve_id) lve_commands.lve_apply(lve_id) lve_commands.write_effective_cache() send_json_ok() if command in ('deny-domain-limits',): executed = True check_support_domain_limits() if not arg: print_error_and_exit('Usage: lvectl deny-domain-limits <user>') try: lve_id = pwd.getpwnam(arg).pw_uid except KeyError: print_error_and_exit(f'unknown user: {arg}') lve_commands.get_XML_cfg() if lve_commands.lve.reseller_limit_supported(): lve_commands.get_XML_cfg(lvp_id=lve_commands.lve.lve2lvp(lve_id)) lve_commands.disable_domain_isolation(lve_id) lve_commands.lve_apply(lve_id) lve_commands.write_effective_cache() send_json_ok() if command in ('enable-domain-limits',): executed = True check_support_domain_limits() if not arg: print_error_and_exit('Usage: lvectl enable-domain-limits <domain>') domain = arg owner_name = cpapi_domain_owner(domain) if not owner_name: print_error_and_exit(f'cannot determine owner of domain {domain!r} via panel API') owner_uid = pwd.getpwnam(owner_name).pw_uid try: docroot = resolve_docroot(domain) except LvdError as exc: print_error_and_exit(f'failed to resolve docroot for domain {domain!r}: {exc}') # CLOS-4402: ensure LVD proxyexec helpers are registered for callers # that skip the allow-domain-limits step (idempotent, no-op without CageFS). ensure_lvd_proxy_commands() lve_commands.enable_domain_lve(owner_uid, docroot) # CLOS-4370: enabling the first domain flips _is_domain_isolated_user # from False to True, so re-run lve_apply now to enter the per-domain # branch and seed lvp<uid> with the user's caps. Without this the LVP # stays uncapped until the next `lvectl set` / `apply` for the user. # Load reseller XML cfg too so a reseller user's limits derive from # their reseller's defaults rather than global defaults. lve_commands.get_XML_cfg() if lve_commands.lve.reseller_limit_supported(): lve_commands.get_XML_cfg(lvp_id=lve_commands.lve.lve2lvp(owner_uid)) lve_commands.lve_apply(owner_uid) lve_commands.write_effective_cache() send_json_ok() if command in ('disable-domain-limits',): executed = True check_support_domain_limits() if not arg: print_error_and_exit('Usage: lvectl disable-domain-limits <domain>') domain = arg owner_name = cpapi_domain_owner(domain) if not owner_name: print_error_and_exit(f'cannot determine owner of domain {domain!r} via panel API') owner_uid = pwd.getpwnam(owner_name).pw_uid try: docroot = resolve_docroot(domain) except LvdError as exc: print_error_and_exit(f'failed to resolve docroot for domain {domain!r}: {exc}') lve_commands.disable_domain_lve(owner_uid, docroot) # CLOS-4370: symmetric with enable-domain-limits — removing the last # domain flips _is_domain_isolated_user back to False, so re-run # lve_apply to drop the per-domain branch and re-apply user limits # on lve<uid> directly. # Load reseller XML cfg too so a reseller user's limits derive from # their reseller's defaults rather than global defaults. lve_commands.get_XML_cfg() if lve_commands.lve.reseller_limit_supported(): lve_commands.get_XML_cfg(lvp_id=lve_commands.lve.lve2lvp(owner_uid)) lve_commands.lve_apply(owner_uid) lve_commands.write_effective_cache() send_json_ok() if command == 'destroy-and-recreate-all': # NOTE(vlebedev): This is a workaround/hack to avoid the two-step process of first destroying all lves # and only then recreating them all with proper limits. This proofed to be problematic # due to the fact that destroy (and possibly create/apply) might hang indefinitely and # the server will be left with limits already reset for all but not yet re-applied for # some due to lvectl transitive hanging. # Technically, this is an equivalent of `lvectl destroy all` and `lvectl apply all` # executed sequentially, but in a single command and this additionanl safety net. executed = True lve_commands.lve_destroy_and_recreate_all() if lve_commands.lve.reseller_limit_supported(): lve_commands.lve.sync_map() lve_commands.write_effective_cache(reset=True) _wpos_reload() if command in ('destroy', '--destroy'): executed = True if len(arg) == 0: print_error_and_exit('destroy takes 2 arguments') if arg == 'default' or arg == '0': print_error_and_exit('cannot destroy default LVE') if arg == 'all': lve_commands.lve_destroy('all') else: lve_id = convert_to_int_or_exit(arg, 'BAD LVE ID') if lve_id > 0: try: lve_commands._reject_if_domain_lve_id(lve_id) except DomainLveIdError as e: print_error_and_exit(str(e)) lve_commands.lve_destroy(int(arg)) else: print_error_and_exit("Bad LVE ID") _wpos_reload() if command in ('delete', '--delete', 'remove-reseller'): executed = True lve_commands.get_global_lock(True) if len(arg) == 0 or arg == 'all': print_error_and_exit("wrong arguments for --delete") if arg == '0' or arg == 'default': print_error_and_exit("cannot delete default LVE") if command == 'remove-reseller': check_support_reseller_limits() lvp_id, reseller_name = parse_reseller(arg) lve_commands.disable_reseller_limits(reseller_name=reseller_name, lvp_id=lvp_id) send_json_ok() else: delete_lve(arg) # Not resetting because not all effective limits would be calculated during this # lvectl run, and write_effective_cache with reset replaces the cache file data with # those specifically. lve_commands.write_effective_cache() if command in ('delete-user', '--delete-user'): executed = True lve_commands.get_global_lock(True) delete_lve_by_name(arg) if command in ('--set',): executed = True print_usage() if command in ('--ubc', 'ubc'): executed = True print('UBC option is no longer available. If you would like to disable virtual memory limit,' ' please use --vmem=0 option') if command in ('--package-set',): # not accepted with dashes executed = True print_usage() # LU-400 # call custom script for Endurance than we set/delete limits for user if command in ('set', 'set-user', 'delete', 'delete-user', 'package-set', 'package-set-ext', 'package-delete'): if '--skip-custom' not in args: lve_commands.call_endurance_custom_script(args=args) if command in ('set', 'set-user'): executed = True lve_commands.get_global_lock(True) lve_set_data = process_lve_set(args, command) # We want to keep the effective limit cache matched to the ve.cfg file, # so if ve.cfg is not updated, neither should the cache. # "skip-update-cfg" might not be in the dict, so we get() if not lve_set_data.get('skip-update-cfg', False): lve_commands.write_effective_cache() if command in ('set-reseller', 'set-reseller-default'): executed = True check_support_reseller_limits() lve_commands.get_global_lock(True) lve_set_data = process_lve_set(args, command) if not lve_set_data.get('skip-update-cfg', False): lve_commands.write_effective_cache() if command in ('package-set',): executed = True lve_commands.get_global_lock(True) process_lve_package_set(args) lve_commands.write_effective_cache() if command in ('package-set-ext',): executed = True lve_commands.get_global_lock(True) process_lve_package_set(args, lve_command_func=lve_commands.package_set_ext) lve_commands.write_effective_cache() if command in ('package-delete', '--package-delete'): executed = True lve_commands.get_global_lock(True) if len(arg) == 0: print_error_and_exit("wrong arguments for delete command") reseller = [el for el in args if el.startswith("--reseller=")] if len(reseller) == 1: lve_commands.reseller_plan_delete(arg, reseller[0].split("=")[1]) else: lve_commands.plan_delete(arg) # lve_apply_all is called under the hood, so it's OK to reset the cache file after lve_commands.write_effective_cache(reset=True) send_json_ok() if command in ('package-list', '--package-list'): executed = True lve_commands.get_packages_list() if command in ('all-package-list',): executed = True lve_commands.get_all_packages_list() if command in ('all-user-list',): executed = True lve_commands.all_users_limits() if command in ('reseller-package-list', '--reseller-package-list'): executed = True lve_commands.get_resellers_packages_list() if not executed: print_error_and_exit('unknown or missing command', exit_code=1, print_usage_flag=True) if __name__ == "__main__": init_lve_utils_sentry_client('lvectl') try: main() except (NoSuchLvp, lveapi.PyLveError, CPAPIException) as e: print_error_and_exit(str(e), exit_code=1)