Linux server.kiran-academy.com 3.10.0-1160.108.1.el7.x86_64 #1 SMP Thu Jan 25 16:17:31 UTC 2024 x86_64
Apache/2.4.57 (Unix) OpenSSL/1.0.2k-fips
: 194.233.91.196 | : 216.73.216.172
Cant Read [ /etc/named.conf ]
7.4.32
finalho
www.github.com/MadExploits
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
CPANEL RESET
CREATE WP USER
README
+ Create Folder
+ Create File
/
usr /
bin /
[ HOME SHELL ]
Name
Size
Permission
Action
7z
40
B
-rwxr-xr-x
7za
41
B
-rwxr-xr-x
GET
14.71
KB
-rwxr-xr-x
HEAD
14.71
KB
-rwxr-xr-x
Magick-config
1.23
KB
-rwxr-xr-x
MagickCore-config
1.24
KB
-rwxr-xr-x
MagickWand-config
1.25
KB
-rwxr-xr-x
Mail
383.67
KB
-rwxr-xr-x
POST
14.71
KB
-rwxr-xr-x
Wand-config
1.23
KB
-rwxr-xr-x
[
40.52
KB
-rwxr-xr-x
a2p
105.32
KB
-rwxr-xr-x
aclocal
35.87
KB
-rwxr-xr-x
aclocal-1.13
35.87
KB
-rwxr-xr-x
addr2line
28.42
KB
-rwxr-xr-x
agentxtrap
19.16
KB
-rwxr-xr-x
alias
29
B
-rwxr-xr-x
altermime
108.35
KB
-rwxr-xr-x
amavisd-agent
13.12
KB
-rwxr-xr-x
amavisd-nanny
11.72
KB
-rwxr-xr-x
amavisd-release
12.35
KB
-rwxr-xr-x
amavisd-signer
36.85
KB
-rwxr-xr-x
amavisd-submit
9.09
KB
-rwxr-xr-x
animate
7.04
KB
-rwxr-xr-x
apr-1-config
6.76
KB
-rwxr-xr-x
apropos
45.49
KB
-rwxr-xr-x
apu-1-config
5.97
KB
-rwxr-xr-x
ar
61.22
KB
-rwxr-xr-x
arch
32.3
KB
-rwxr-xr-x
aria_chk
4.56
MB
-rwxr-xr-x
aria_dump_log
4.36
MB
-rwxr-xr-x
aria_ftdump
4.37
MB
-rwxr-xr-x
aria_pack
4.4
MB
-rwxr-xr-x
aria_read_log
4.52
MB
-rwxr-xr-x
arj
199.56
KB
-rwxr-xr-x
arjdisp
12.55
KB
-rwxr-xr-x
arpaname
7.03
KB
-rwxr-xr-x
as
377.36
KB
-rwxr-xr-x
aserver
28.21
KB
-rwxr-xr-x
aspell
163.35
KB
-rwxr-xr-x
at
51.73
KB
-rwsr-xr-x
atq
51.73
KB
-rwsr-xr-x
atrm
51.73
KB
-rwsr-xr-x
audit2allow
14.21
KB
-rwxr-xr-x
audit2why
14.21
KB
-rwxr-xr-x
aulast
15.48
KB
-rwxr-xr-x
aulastlog
11.35
KB
-rwxr-xr-x
ausyscall
11.18
KB
-rwxr-xr-x
autoconf
14.42
KB
-rwxr-xr-x
autoheader
8.33
KB
-rwxr-xr-x
autom4te
31.43
KB
-rwxr-xr-x
automake
246.44
KB
-rwxr-xr-x
automake-1.13
246.44
KB
-rwxr-xr-x
autoreconf
20.57
KB
-rwxr-xr-x
autoscan
16.72
KB
-rwxr-xr-x
autoupdate
33.08
KB
-rwxr-xr-x
auvirt
31.93
KB
-rwxr-xr-x
awk
418.54
KB
-rwxr-xr-x
base64
36.48
KB
-rwxr-xr-x
basename
28.35
KB
-rwxr-xr-x
bash
941.93
KB
-rwxr-xr-x
bashbug
6.8
KB
-rwxr-xr-x
bashbug-64
6.8
KB
-rwxr-xr-x
batch
137
B
-rwxr-xr-x
bc
81.47
KB
-rwxr-xr-x
bdftopcf
44.19
KB
-rwxr-xr-x
bdftruncate
11.2
KB
-rwxr-xr-x
bg
26
B
-rwxr-xr-x
bison
393.34
KB
-rwxr-xr-x
bond2team
22.74
KB
-rwxr-xr-x
bootctl
68.99
KB
-rwxr-xr-x
bunzip2
31.89
KB
-rwxr-xr-x
busctl
403.2
KB
-rwxr-xr-x
bzcat
31.89
KB
-rwxr-xr-x
bzcmp
2.08
KB
-rwxr-xr-x
bzdiff
2.08
KB
-rwxr-xr-x
bzgrep
1.64
KB
-rwxr-xr-x
bzip2
31.89
KB
-rwxr-xr-x
bzip2recover
15.24
KB
-rwxr-xr-x
bzless
1.23
KB
-rwxr-xr-x
bzmore
1.23
KB
-rwxr-xr-x
c++
754.59
KB
-rwxr-xr-x
c++filt
27.92
KB
-rwxr-xr-x
c2ph
35.75
KB
-rwxr-xr-x
c89
224
B
-rwxr-xr-x
c99
215
B
-rwxr-xr-x
ca-legacy
1.6
KB
-rwxr-xr-x
cabextract
68.7
KB
-rwxr-xr-x
cairo-sphinx
69.99
KB
-rwxr-xr-x
cal
36.8
KB
-rwxr-xr-x
captoinfo
64.26
KB
-rwxr-xr-x
cat
52.81
KB
-rwxr-xr-x
catchsegv
3.26
KB
-rwxr-xr-x
catman
36.75
KB
-rwxr-xr-x
cc
750.59
KB
-rwxr-xr-x
ccmake
3.95
MB
-rwxr-xr-x
ccmake3
5.83
MB
-rwxr-xr-x
cd
26
B
-rwxr-xr-x
centrino-decode
6.13
KB
-rwxr-xr-x
certutil
179.75
KB
-rwxr-xr-x
certwatch
15.38
KB
-rwxr-xr-x
chacl
15.27
KB
-rwxr-xr-x
chage
72.16
KB
-rwsr-xr-x
chardetect
307
B
-rwxr-xr-x
chattr
11.27
KB
-rwxr-xr-x
chcat
13.12
KB
-rwxr-xr-x
chcon
61.46
KB
-rwxr-xr-x
checkmodule
400.48
KB
-rwxr-xr-x
checkpolicy
412.46
KB
-rwxr-xr-x
chfn
23.41
KB
-rws--x--x
chgrp
61.32
KB
-rwxr-xr-x
chmem
40.43
KB
-rwxr-xr-x
chmod
57.21
KB
-rwxr-xr-x
chown
61.36
KB
-rwxr-xr-x
chronyc
85.03
KB
-rwxr-xr-x
chrt
32.17
KB
-rwxr-xr-x
chsh
23.32
KB
-rws--x--x
chvt
11.14
KB
-rwxr-xr-x
cifsiostat
48.5
KB
-rwxr-xr-x
cksum
32.38
KB
-rwxr-xr-x
clambc
139.76
KB
-rwxr-xr-x
clamconf
139.43
KB
-rwxr-xr-x
clamdscan
155.77
KB
-rwxr-xr-x
clamdtop
155.74
KB
-rwxr-xr-x
clamscan
163.64
KB
-rwxr-xr-x
clamsubmit
147.73
KB
-rwxr-xr-x
clear
7.02
KB
-rwxr-xr-x
clusterdb
53.22
KB
-rwxr-xr-x
cmake
3.9
MB
-rwxr-xr-x
cmake3
6.21
MB
-rwxr-xr-x
cmp
44.14
KB
-rwxr-xr-x
cmsutil
110.59
KB
-rwxr-xr-x
col
23.88
KB
-rwxr-xr-x
colcrt
11.29
KB
-rwxr-xr-x
colrm
23.77
KB
-rwxr-xr-x
column
27.99
KB
-rwxr-xr-x
comm
36.55
KB
-rwxr-xr-x
command
31
B
-rwxr-xr-x
compare
11.09
KB
-rwxr-xr-x
compile_et
1.45
KB
-rwxr-xr-x
composite
7.04
KB
-rwxr-xr-x
conjure
7.04
KB
-rwxr-xr-x
consolehelper
6.95
KB
-rwxr-xr-x
convert
7.04
KB
-rwxr-xr-x
coredumpctl
154.52
KB
-rwxr-xr-x
cp
151.55
KB
-rwxr-xr-x
cpack
4.16
MB
-rwxr-xr-x
cpack3
6.31
MB
-rwxr-xr-x
cpio
142.55
KB
-rwxr-xr-x
cpp
754.58
KB
-rwxr-xr-x
cpulimit
23.78
KB
-rwxr-xr-x
cpupower
66.34
KB
-rwxr-xr-x
crc32
794
B
-rwxr-xr-x
createdb
53.27
KB
-rwxr-xr-x
createlang
57.09
KB
-rwxr-xr-x
createuser
57.63
KB
-rwxr-xr-x
crlutil
127
KB
-rwxr-xr-x
crontab
56.23
KB
-rwsr-xr-x
csplit
48.82
KB
-rwxr-xr-x
csslint-0.6
19.55
KB
-rwxr-xr-x
ctest
4.96
MB
-rwxr-xr-x
ctest3
7.14
MB
-rwxr-xr-x
curl
152.99
KB
-rwxr-xr-x
curl-config
4.08
KB
-rwxr-xr-x
cut
40.61
KB
-rwxr-xr-x
cvtsudoers
241.7
KB
-rwxr-xr-x
cxpm
28.05
KB
-rwxr-xr-x
date
60.74
KB
-rwxr-xr-x
db_archive
11.23
KB
-rwxr-xr-x
db_checkpoint
11.3
KB
-rwxr-xr-x
db_deadlock
11.31
KB
-rwxr-xr-x
db_dump
15.33
KB
-rwxr-xr-x
db_dump185
64.45
KB
-rwxr-xr-x
db_hotbackup
15.34
KB
-rwxr-xr-x
db_load
27.51
KB
-rwxr-xr-x
db_log_verify
15.34
KB
-rwxr-xr-x
db_printlog
32.26
KB
-rwxr-xr-x
db_recover
11.33
KB
-rwxr-xr-x
db_replicate
15.34
KB
-rwxr-xr-x
db_stat
15.26
KB
-rwxr-xr-x
db_tuner
19.33
KB
-rwxr-xr-x
db_upgrade
11.23
KB
-rwxr-xr-x
db_verify
11.25
KB
-rwxr-xr-x
dbilogstrip
1.43
KB
-rwxr-xr-x
dbinfo
3.29
KB
-rwxr-xr-x
dbiprof
6.15
KB
-rwxr-xr-x
dbiproxy
5.35
KB
-rwxr-xr-x
dbus-binding-tool
94.49
KB
-rwxr-xr-x
dbus-cleanup-sockets
11
KB
-rwxr-xr-x
dbus-daemon
218
KB
-rwxr-xr-x
dbus-monitor
23.13
KB
-rwxr-xr-x
dbus-run-session
14.97
KB
-rwxr-xr-x
dbus-send
27.07
KB
-rwxr-xr-x
dbus-test-tool
23.13
KB
-rwxr-xr-x
dbus-update-activation-environ...
15.02
KB
-rwxr-xr-x
dbus-uuidgen
10.98
KB
-rwxr-xr-x
dc
44.33
KB
-rwxr-xr-x
dd
73.14
KB
-rwxr-xr-x
deallocvt
11.16
KB
-rwxr-xr-x
debuginfo-install
7.88
KB
-rwxr-xr-x
delv
39.98
KB
-rwxr-xr-x
derb
19.95
KB
-rwxr-xr-x
df
102.55
KB
-rwxr-xr-x
dgawk
502.12
KB
-rwxr-xr-x
diff
195.46
KB
-rwxr-xr-x
diff3
60.65
KB
-rwxr-xr-x
dig
146.96
KB
-rwxr-xr-x
dir
114.85
KB
-rwxr-xr-x
dircolors
40.44
KB
-rwxr-xr-x
dirname
28.31
KB
-rwxr-xr-x
display
7.04
KB
-rwxr-xr-x
dm_date
5.47
KB
-rwxr-xr-x
dm_zdump
4.95
KB
-rwxr-xr-x
dmesg
48.52
KB
-rwxr-xr-x
dnsdomainname
15.41
KB
-rwxr-xr-x
domainname
15.41
KB
-rwxr-xr-x
doveadm
596.59
KB
-rwxr-xr-x
doveconf
161.41
KB
-rwxr-xr-x
dracut
55.83
KB
-rwxr-xr-x
dropdb
53.08
KB
-rwxr-xr-x
droplang
57.08
KB
-rwxr-xr-x
dropuser
53.05
KB
-rwxr-xr-x
dsync
596.59
KB
-rwxr-xr-x
dtrace
16.66
KB
-rwxr-xr-x
du
110.34
KB
-rwxr-xr-x
dumpkeys
77.51
KB
-rwxr-xr-x
dumpsexp
15.18
KB
-rwxr-xr-x
dwp
3.03
MB
-rwxr-xr-x
easy_install-3.6
234
B
-rwxr-xr-x
echo
32.31
KB
-rwxr-xr-x
ecpg
737.83
KB
-rwxr-xr-x
ed2k-link
71.57
KB
-rwxr-xr-x
egrep
290
B
-rwxr-xr-x
eject
48.81
KB
-rwxr-xr-x
elfedit
32.18
KB
-rwxr-xr-x
enchant
15.29
KB
-rwxr-xr-x
enchant-lsmod
11.13
KB
-rwxr-xr-x
env
28.33
KB
-rwxr-xr-x
envsubst
36.01
KB
-rwxr-xr-x
eqn
144.41
KB
-rwxr-xr-x
ex
906.45
KB
-rwxr-xr-x
expand
32.48
KB
-rwxr-xr-x
expr
36.53
KB
-rwxr-xr-x
factor
93.29
KB
-rwxr-xr-x
fallocate
27.84
KB
-rwxr-xr-x
false
28.25
KB
-rwxr-xr-x
fc
26
B
-rwxr-xr-x
fc-cache
132
B
-rwxr-xr-x
fc-cache-64
15.45
KB
-rwxr-xr-x
fc-cat
15.4
KB
-rwxr-xr-x
fc-conflist
11.2
KB
-rwxr-xr-x
fc-list
11.26
KB
-rwxr-xr-x
fc-match
11.32
KB
-rwxr-xr-x
fc-pattern
11.26
KB
-rwxr-xr-x
fc-query
11.23
KB
-rwxr-xr-x
fc-scan
11.27
KB
-rwxr-xr-x
fc-validate
11.27
KB
-rwxr-xr-x
fcat
23.82
KB
-rwxr-xr-x
fg
26
B
-rwxr-xr-x
fgconsole
11.16
KB
-rwxr-xr-x
fgrep
290
B
-rwxr-xr-x
filan
89.13
KB
-rwxr-xr-x
file
19.3
KB
-rwxr-xr-x
find
194.63
KB
-rwxr-xr-x
find-repos-of-install
4.27
KB
-rwxr-xr-x
find2perl
23.06
KB
-rwxr-xr-x
findmnt
58.38
KB
-rwxr-xr-x
fipscheck
15.37
KB
-rwxr-xr-x
fipshmac
11.3
KB
-rwxr-xr-x
firewall-cmd
113.48
KB
-rwxr-xr-x
firewall-offline-cmd
101.18
KB
-rwxr-xr-x
flex
318.07
KB
-rwxr-xr-x
flex++
318.07
KB
-rwxr-xr-x
flock
23.88
KB
-rwxr-xr-x
fmt
36.48
KB
-rwxr-xr-x
fold
36.46
KB
-rwxr-xr-x
fonttosfnt
35.99
KB
-rwxr-xr-x
formail
43.68
KB
-rwxr-xr-x
free
19.33
KB
-rwxr-xr-x
freetype-config
4.39
KB
-rwxr-xr-x
freeze
23.82
KB
-rwxr-xr-x
freshclam
39.23
KB
-rwxr-xr-x
fribidi
16.09
KB
-rwxr-xr-x
funzip
31.38
KB
-rwxr-xr-x
g++
754.59
KB
-rwxr-xr-x
galera_new_cluster
917
B
-rwxr-xr-x
galera_recovery
3.28
KB
-rwxr-xr-x
gapplication
19.48
KB
-rwxr-xr-x
garb-systemd
1.2
KB
-rwxr-xr-x
garbd
2.2
MB
-rwxr-xr-x
gawk
418.54
KB
-rwxr-xr-x
gcc
750.59
KB
-rwxr-xr-x
gcc-ar
26.45
KB
-rwxr-xr-x
gcc-nm
26.45
KB
-rwxr-xr-x
gcc-ranlib
26.45
KB
-rwxr-xr-x
gcov
307.45
KB
-rwxr-xr-x
gdbus
40.17
KB
-rwxr-xr-x
gdbus-codegen
2
KB
-rwxr-xr-x
gdk-pixbuf-query-loaders-64
15.38
KB
-rwxr-xr-x
gdk-pixbuf-thumbnailer
15.59
KB
-rwxr-xr-x
genbrk
15.75
KB
-rwxr-xr-x
gencat
22.11
KB
-rwxr-xr-x
gencfu
11.64
KB
-rwxr-xr-x
gencnval
19.71
KB
-rwxr-xr-x
gendict
24.01
KB
-rwxr-xr-x
genkey
43.13
KB
-rwxr-xr-x
genl-ctrl-list
11.27
KB
-rwxr-xr-x
genrb
95.2
KB
-rwxr-xr-x
geoiplookup
15.28
KB
-rwxr-xr-x
geoiplookup6
11.16
KB
-rwxr-xr-x
geoipupdate
31.28
KB
-rwxr-xr-x
geqn
144.41
KB
-rwxr-xr-x
getconf
22.02
KB
-rwxr-xr-x
getent
26.39
KB
-rwxr-xr-x
getfacl
24.29
KB
-rwxr-xr-x
getkeycodes
11.16
KB
-rwxr-xr-x
getopt
15.38
KB
-rwxr-xr-x
getopts
31
B
-rwxr-xr-x
gettext
35.94
KB
-rwxr-xr-x
gettext.sh
4.52
KB
-rwxr-xr-x
gio
73.41
KB
-rwxr-xr-x
gio-querymodules-64
11.31
KB
-rwxr-xr-x
git
1.46
MB
-rwxr-xr-x
git-receive-pack
1.46
MB
-rwxr-xr-x
git-shell
717.98
KB
-rwxr-xr-x
git-upload-archive
1.46
MB
-rwxr-xr-x
git-upload-pack
791.45
KB
-rwxr-xr-x
glib-compile-resources
40.25
KB
-rwxr-xr-x
glib-compile-schemas
44.38
KB
-rwxr-xr-x
glib-genmarshal
39.97
KB
-rwxr-xr-x
glib-gettextize
5.25
KB
-rwxr-xr-x
glib-mkenums
27.15
KB
-rwxr-xr-x
gmake
178.47
KB
-rwxr-xr-x
gneqn
271
B
-rwxr-xr-x
gnroff
3.31
KB
-rwxr-xr-x
goaccess
610.99
KB
-rwxr-xr-x
gobject-query
11.13
KB
-rwxr-xr-x
gost-hash
71.57
KB
-rwxr-xr-x
gpasswd
76.57
KB
-rwsr-xr-x
gpg
732.4
KB
-rwxr-xr-x
gpg-agent
289.74
KB
-rwxr-xr-x
gpg-connect-agent
152.69
KB
-rwxr-xr-x
gpg-error
23.18
KB
-rwxr-xr-x
gpg-error-config
1.83
KB
-rwxr-xr-x
gpg-zip
3.23
KB
-rwxr-xr-x
gpg2
732.4
KB
-rwxr-xr-x
gpgconf
140.31
KB
-rwxr-xr-x
gpgparsemail
23.7
KB
-rwxr-xr-x
gpgsplit
48.88
KB
-rwxr-xr-x
gpgv
345.38
KB
-rwxr-xr-x
gpgv2
345.38
KB
-rwxr-xr-x
gpic
180.41
KB
-rwxr-xr-x
gprof
98.41
KB
-rwxr-xr-x
gr2fonttest
23.66
KB
-rwxr-xr-x
grep
155.3
KB
-rwxr-xr-x
gresource
19.55
KB
-rwxr-xr-x
groff
81.63
KB
-rwxr-xr-x
grops
140.85
KB
-rwxr-xr-x
grotty
98.59
KB
-rwxr-xr-x
groups
32.41
KB
-rwxr-xr-x
grub2-editenv
396.07
KB
-rwxr-xr-x
grub2-file
830.36
KB
-rwxr-xr-x
grub2-fstest
1.03
MB
-rwxr-xr-x
grub2-glue-efi
258.85
KB
-rwxr-xr-x
grub2-kbdcomp
1.63
KB
-rwxr-xr-x
grub2-menulst2cfg
241.82
KB
-rwxr-xr-x
grub2-mkfont
287.6
KB
-rwxr-xr-x
grub2-mkimage
379.25
KB
-rwxr-xr-x
grub2-mklayout
264.91
KB
-rwxr-xr-x
grub2-mknetdir
429.8
KB
-rwxr-xr-x
grub2-mkpasswd-pbkdf2
271.29
KB
-rwxr-xr-x
grub2-mkrelpath
258.48
KB
-rwxr-xr-x
grub2-mkrescue
1017.84
KB
-rwxr-xr-x
grub2-mkstandalone
534.32
KB
-rwxr-xr-x
grub2-render-label
835.16
KB
-rwxr-xr-x
grub2-script-check
295.43
KB
-rwxr-xr-x
grub2-syslinux2cfg
763.7
KB
-rwxr-xr-x
gsettings
23.8
KB
-rwxr-xr-x
gsoelim
32.59
KB
-rwxr-xr-x
gss-client
23.17
KB
-rwxr-xr-x
gtar
338.02
KB
-rwxr-xr-x
gtbl
115.96
KB
-rwxr-xr-x
gtester
23.64
KB
-rwxr-xr-x
gtester-report
18.39
KB
-rwxr-xr-x
gtroff
512.96
KB
-rwxr-xr-x
gunzip
2.2
KB
-rwxr-xr-x
gzexe
5.79
KB
-rwxr-xr-x
gzip
98.43
KB
-rwxr-xr-x
h2ph
27.65
KB
-rwxr-xr-x
h2xs
59.15
KB
-rwxr-xr-x
has160-hash
71.57
KB
-rwxr-xr-x
hdsploader
11.18
KB
-rwxr-xr-x
head
40.51
KB
-rwxr-xr-x
hexdump
32.02
KB
-rwxr-xr-x
hmac256
15.67
KB
-rwxr-xr-x
host
127.02
KB
-rwxr-xr-x
hostid
28.32
KB
-rwxr-xr-x
hostname
15.41
KB
-rwxr-xr-x
hostnamectl
318.07
KB
-rwxr-xr-x
hunspell
53.11
KB
-rwxr-xr-x
i386
15.27
KB
-rwxr-xr-x
iceauth
31.73
KB
-rwxr-xr-x
iconv
58.14
KB
-rwxr-xr-x
icu-config
172
B
-rwxr-xr-x
icu-config-64
21.49
KB
-rwxr-xr-x
icuinfo
15.6
KB
-rwxr-xr-x
id
36.52
KB
-rwxr-xr-x
identify
7.06
KB
-rwxr-xr-x
idiag-socket-details
11.34
KB
-rwxr-xr-x
idn
32.45
KB
-rwxr-xr-x
ifnames
4.03
KB
-rwxr-xr-x
igawk
3.11
KB
-rwxr-xr-x
imapsync
338.75
KB
-rwxr-xr-x
import
7.04
KB
-rwxr-xr-x
info
265.19
KB
-rwxr-xr-x
infocmp
56.07
KB
-rwxr-xr-x
infokey
21.47
KB
-rwxr-xr-x
infotocap
64.26
KB
-rwxr-xr-x
innochecksum
3.64
MB
-rwxr-xr-x
install
139.59
KB
-rwxr-xr-x
instmodsh
4.15
KB
-rwxr-xr-x
ionice
23.86
KB
-rwxr-xr-x
iostat
60.77
KB
-rwxr-xr-x
ipcalc
15.05
KB
-rwxr-xr-x
ipcmk
24
KB
-rwxr-xr-x
ipcrm
27.85
KB
-rwxr-xr-x
ipcs
48.37
KB
-rwxr-xr-x
iptables-xml
91.52
KB
-rwxr-xr-x
isosize
23.83
KB
-rwxr-xr-x
ispell
988
B
-rwxr-xr-x
jemalloc.sh
125
B
-rwxr-xr-x
jobs
28
B
-rwxr-xr-x
join
48.75
KB
-rwxr-xr-x
journalctl
537.88
KB
-rwxr-xr-x
kbd_mode
11.16
KB
-rwxr-xr-x
kbdinfo
11.19
KB
-rwxr-xr-x
kbdrate
11.22
KB
-rwxr-xr-x
kdumpctl
33.18
KB
-rwxr-xr-x
kernel-install
4.7
KB
-rwxr-xr-x
keyrand
11.25
KB
-rwxr-xr-x
keyutil
60.84
KB
-rwxr-xr-x
kill
32.82
KB
-rwxr-xr-x
kmod
143.24
KB
-rwxr-xr-x
krb5-config
6.96
KB
-rwxr-xr-x
l4p-tmpl
1.89
KB
-rwxr-xr-x
last
19.11
KB
-rwxr-xr-x
lastb
19.11
KB
-rwxr-xr-x
lastlog
19.15
KB
-rwxr-xr-x
lchfn
15.52
KB
-rwxr-xr-x
lchsh
15.49
KB
-rwxr-xr-x
ld
982.61
KB
-rwxr-xr-x
ld.bfd
982.61
KB
-rwxr-xr-x
ld.gold
5.11
MB
-rwxr-xr-x
ldd
5.18
KB
-rwxr-xr-x
less
154.53
KB
-rwxr-xr-x
lessecho
11.11
KB
-rwxr-xr-x
lesskey
16.66
KB
-rwxr-xr-x
lesspipe.sh
2.24
KB
-rwxr-xr-x
lex
318.07
KB
-rwxr-xr-x
lexgrog
85.09
KB
-rwxr-xr-x
libgcrypt-config
3.78
KB
-rwxr-xr-x
libmcrypt-config
1.38
KB
-rwxr-xr-x
libnetcfg
15.36
KB
-rwxr-xr-x
libpng-config
2.38
KB
-rwxr-xr-x
libpng15-config
2.38
KB
-rwxr-xr-x
link
28.3
KB
-rwxr-xr-x
links
4.37
MB
-rwxr-xr-x
links2
4.37
MB
-rwxr-xr-x
linux-boot-prober
5.85
KB
-rwxr-xr-x
linux32
15.27
KB
-rwxr-xr-x
linux64
15.27
KB
-rwxr-xr-x
ln
57.22
KB
-rwxr-xr-x
loadkeys
110.48
KB
-rwxr-xr-x
loadunimap
23.88
KB
-rwxr-xr-x
locale
37.11
KB
-rwxr-xr-x
localectl
326.16
KB
-rwxr-xr-x
localedef
318.31
KB
-rwxr-xr-x
locate
39.57
KB
-rwx--s--x
lockfile
19.36
KB
-rwxr-sr-x
logger
28.62
KB
-rwxr-xr-x
login
36.38
KB
-rwxr-xr-x
loginctl
489.62
KB
-rwxr-xr-x
logname
28.31
KB
-rwxr-xr-x
look
11.27
KB
-rwxr-xr-x
ls
114.85
KB
-rwxr-xr-x
lsattr
11.25
KB
-rwxr-xr-x
lsblk
79.17
KB
-rwxr-xr-x
lscpu
60.75
KB
-rwxr-xr-x
lsinitrd
6.26
KB
-rwxr-xr-x
lsipc
60.95
KB
-rwxr-xr-x
lslocks
41.01
KB
-rwxr-xr-x
lslogins
52.88
KB
-rwxr-xr-x
lsmem
40.78
KB
-rwxr-xr-x
lsns
36.43
KB
-rwxr-xr-x
lsscsi
56.48
KB
-rwxr-xr-x
lua
15.47
KB
-rwxr-xr-x
luac
119.03
KB
-rwxr-xr-x
lwp-download
8.43
KB
-rwxr-xr-x
lwp-dump
2.73
KB
-rwxr-xr-x
lwp-mirror
2.42
KB
-rwxr-xr-x
lwp-request
14.71
KB
-rwxr-xr-x
lynis
50.57
KB
-rwxr-xr-x
lz4
105.84
KB
-rwxr-xr-x
lz4c
105.84
KB
-rwxr-xr-x
lz4cat
105.84
KB
-rwxr-xr-x
lzop
69.32
KB
-rwxr-xr-x
m4
151.17
KB
-rwxr-xr-x
machinectl
533.95
KB
-rwxr-xr-x
magnet-link
71.57
KB
-rwxr-xr-x
mail
383.67
KB
-rwxr-xr-x
mailq
322.16
KB
-rwxr-xr-x
mailq.postfix
322.16
KB
-rwxr-xr-x
mailstat
5.72
KB
-rwxr-xr-x
mailx
383.67
KB
-rwxr-xr-x
make
178.47
KB
-rwxr-xr-x
makeconv
40.51
KB
-rwxr-xr-x
makedb
18.11
KB
-rwxr-xr-x
man
100.44
KB
-rwxr-xr-x
mandb
122.25
KB
-rwxr-xr-x
manpath
32.55
KB
-rwxr-xr-x
mapscrn
19.78
KB
-rwxr-xr-x
mariadb
4.33
MB
-rwxr-xr-x
mariadb-access
109.33
KB
-rwxr-xr-x
mariadb-admin
3.85
MB
-rwxr-xr-x
mariadb-binlog
4.11
MB
-rwxr-xr-x
mariadb-check
3.85
MB
-rwxr-xr-x
mariadb-convert-table-format
4.12
KB
-rwxr-xr-x
mariadb-dump
3.94
MB
-rwxr-xr-x
mariadb-dumpslow
8.05
KB
-rwxr-xr-x
mariadb-embedded
21.82
MB
-rwxr-xr-x
mariadb-find-rows
3.21
KB
-rwxr-xr-x
mariadb-fix-extensions
1.22
KB
-rwxr-xr-x
mariadb-hotcopy
34.14
KB
-rwxr-xr-x
mariadb-import
3.84
MB
-rwxr-xr-x
mariadb-install-db
21.57
KB
-rwxr-xr-x
mariadb-plugin
3.54
MB
-rwxr-xr-x
mariadb-secure-installation
13.37
KB
-rwxr-xr-x
mariadb-service-convert
2.45
KB
-rwxr-xr-x
mariadb-setpermission
17.13
KB
-rwxr-xr-x
mariadb-show
3.84
MB
-rwxr-xr-x
mariadb-slap
3.86
MB
-rwxr-xr-x
mariadb-tzinfo-to-sql
3.54
MB
-rwxr-xr-x
mariadb-upgrade
3.63
MB
-rwxr-xr-x
mariadb-waitpid
3.53
MB
-rwxr-xr-x
mariadb_config
11.57
KB
-rwxr-xr-x
mariadbd-multi
26.69
KB
-rwxr-xr-x
mariadbd-safe
30.39
KB
-rwxr-xr-x
mariadbd-safe-helper
3.5
MB
-rwxr-xr-x
mcookie
15.44
KB
-rwxr-xr-x
md5sum
40.53
KB
-rwxr-xr-x
mdig
44.2
KB
-rwxr-xr-x
melt
23.82
KB
-rwxr-xr-x
memaslap
65.37
KB
-rwxr-xr-x
memcached
108.77
KB
-rwxr-xr-x
memcached-tool
4.18
KB
-rwxr-xr-x
memcapable
57.71
KB
-rwxr-xr-x
memcat
19.99
KB
-rwxr-xr-x
memcp
20.19
KB
-rwxr-xr-x
memdump
15.81
KB
-rwxr-xr-x
memerror
15.46
KB
-rwxr-xr-x
memexist
15.72
KB
-rwxr-xr-x
memflush
15.73
KB
-rwxr-xr-x
memparse
11.06
KB
-rwxr-xr-x
memping
15.84
KB
-rwxr-xr-x
memrm
15.78
KB
-rwxr-xr-x
memslap
24.55
KB
-rwxr-xr-x
memstat
20.17
KB
-rwxr-xr-x
memtouch
15.8
KB
-rwxr-xr-x
mesg
10.98
KB
-rwxr-xr-x
mimedump
2.29
KB
-rwxr-xr-x
mimeencode
849
B
-rwxr-xr-x
mimeexplode
3.28
KB
-rwxr-xr-x
mimepostcard
2.68
KB
-rwxr-xr-x
mimesend
3.06
KB
-rwxr-xr-x
mixartloader
15.38
KB
-rwxr-xr-x
mkdir
77.9
KB
-rwxr-xr-x
mkfifo
61.59
KB
-rwxr-xr-x
mkfontdir
65
B
-rwxr-xr-x
mkfontscale
32.48
KB
-rwxr-xr-x
mkinitrd
2.94
KB
-rwxr-xr-x
mknod
65.61
KB
-rwxr-xr-x
mktemp
40.66
KB
-rwxr-xr-x
modutil
165.78
KB
-rwxr-xr-x
mogrify
7.04
KB
-rwxr-xr-x
montage
7.04
KB
-rwxr-xr-x
more
40.15
KB
-rwxr-xr-x
mount
43.23
KB
-rwsr-xr-x
mountpoint
15.32
KB
-rwxr-xr-x
mpstat
52.53
KB
-rwxr-xr-x
msgattrib
23.36
KB
-rwxr-xr-x
msgcat
23.34
KB
-rwxr-xr-x
msgcmp
23.59
KB
-rwxr-xr-x
msgcomm
19.31
KB
-rwxr-xr-x
msgconv
19.3
KB
-rwxr-xr-x
msgen
19.3
KB
-rwxr-xr-x
msgexec
15.33
KB
-rwxr-xr-x
msgfilter
27.56
KB
-rwxr-xr-x
msgfmt
77.05
KB
-rwxr-xr-x
msggrep
35.97
KB
-rwxr-xr-x
msghack
12.45
KB
-rwxr-xr-x
msginit
44.38
KB
-rwxr-xr-x
msgmerge
52.6
KB
-rwxr-xr-x
msgunfmt
31.7
KB
-rwxr-xr-x
msguniq
19.31
KB
-rwxr-xr-x
msql2mysql
1.41
KB
-rwxr-xr-x
mv
127.3
KB
-rwxr-xr-x
my_print_defaults
3.53
MB
-rwxr-xr-x
myisam_ftdump
3.89
MB
-rwxr-xr-x
myisamchk
4.01
MB
-rwxr-xr-x
myisamlog
3.87
MB
-rwxr-xr-x
myisampack
3.91
MB
-rwxr-xr-x
mysql
4.33
MB
-rwxr-xr-x
mysql_config
4.58
KB
-rwxr-xr-x
mysql_convert_table_format
4.12
KB
-rwxr-xr-x
mysql_embedded
21.82
MB
-rwxr-xr-x
mysql_find_rows
3.21
KB
-rwxr-xr-x
mysql_fix_extensions
1.22
KB
-rwxr-xr-x
mysql_install_db
21.57
KB
-rwxr-xr-x
mysql_plugin
3.54
MB
-rwxr-xr-x
mysql_secure_installation
13.37
KB
-rwxr-xr-x
mysql_setpermission
17.13
KB
-rwxr-xr-x
mysql_tzinfo_to_sql
3.54
MB
-rwxr-xr-x
mysql_upgrade
3.63
MB
-rwxr-xr-x
mysql_waitpid
3.53
MB
-rwxr-xr-x
mysqlaccess
109.33
KB
-rwxr-xr-x
mysqladmin
3.85
MB
-rwxr-xr-x
mysqlbinlog
4.11
MB
-rwxr-xr-x
mysqlcheck
3.85
MB
-rwxr-xr-x
mysqld_multi
26.69
KB
-rwxr-xr-x
mysqld_safe
30.39
KB
-rwxr-xr-x
mysqld_safe_helper
3.5
MB
-rwxr-xr-x
mysqldump
3.94
MB
-rwxr-xr-x
mysqldumpslow
8.05
KB
-rwxr-xr-x
mysqlhotcopy
34.14
KB
-rwxr-xr-x
mysqlimport
3.84
MB
-rwxr-xr-x
mysqlshow
3.84
MB
-rwxr-xr-x
mysqlslap
3.86
MB
-rwxr-xr-x
nail
383.67
KB
-rwxr-xr-x
named-rrchecker
15.32
KB
-rwxr-xr-x
namei
27.95
KB
-rwxr-xr-x
nano
201.08
KB
-rwxr-xr-x
ncurses5-config
5.68
KB
-rwxr-xr-x
ncursesw5-config
5.68
KB
-rwxr-xr-x
ndptool
23.63
KB
-rwxr-xr-x
needs-restarting
8.17
KB
-rwxr-xr-x
neqn
271
B
-rwxr-xr-x
net-server
3.34
KB
-rwxr-xr-x
net-snmp-config
1.3
KB
-rwxr-xr-x
net-snmp-config-x86_64
29.46
KB
-rwxr-xr-x
net-snmp-create-v3-user
2.98
KB
-rwxr-xr-x
netstat
151.38
KB
-rwxr-xr-x
nettle-hash
11.33
KB
-rwxr-xr-x
nettle-lfib-stream
7.05
KB
-rwxr-xr-x
newaliases
322.16
KB
-rwxr-xr-x
newaliases.postfix
322.16
KB
-rwxr-xr-x
newgidmap
38.09
KB
-rwxr-xr-x
newgrp
40.95
KB
-rwsr-xr-x
newuidmap
38.06
KB
-rwxr-xr-x
nf-ct-add
11.8
KB
-rwxr-xr-x
nf-ct-list
15.84
KB
-rwxr-xr-x
nf-exp-add
16.21
KB
-rwxr-xr-x
nf-exp-delete
15.99
KB
-rwxr-xr-x
nf-exp-list
11.8
KB
-rwxr-xr-x
nf-log
11.23
KB
-rwxr-xr-x
nf-monitor
11.18
KB
-rwxr-xr-x
nf-queue
11.27
KB
-rwxr-xr-x
nfsiostat-sysstat
52.52
KB
-rwxr-xr-x
ngettext
35.95
KB
-rwxr-xr-x
nice
32.32
KB
-rwxr-xr-x
nisdomainname
15.41
KB
-rwxr-xr-x
nl
40.6
KB
-rwxr-xr-x
nl-addr-add
11.65
KB
-rwxr-xr-x
nl-addr-delete
11.73
KB
-rwxr-xr-x
nl-addr-list
15.88
KB
-rwxr-xr-x
nl-class-add
11.7
KB
-rwxr-xr-x
nl-class-delete
11.55
KB
-rwxr-xr-x
nl-class-list
11.48
KB
-rwxr-xr-x
nl-classid-lookup
11.29
KB
-rwxr-xr-x
nl-cls-add
11.76
KB
-rwxr-xr-x
nl-cls-delete
11.68
KB
-rwxr-xr-x
nl-cls-list
11.58
KB
-rwxr-xr-x
nl-fib-lookup
11.41
KB
-rwxr-xr-x
nl-link-enslave
7.05
KB
-rwxr-xr-x
nl-link-ifindex2name
7.06
KB
-rwxr-xr-x
nl-link-list
11.52
KB
-rwxr-xr-x
nl-link-name2ifindex
7.05
KB
-rwxr-xr-x
nl-link-release
7.05
KB
-rwxr-xr-x
nl-link-set
11.64
KB
-rwxr-xr-x
nl-link-stats
11.39
KB
-rwxr-xr-x
nl-list-caches
11.08
KB
-rwxr-xr-x
nl-list-sockets
7.06
KB
-rwxr-xr-x
nl-monitor
11.2
KB
-rwxr-xr-x
nl-neigh-add
11.51
KB
-rwxr-xr-x
nl-neigh-delete
11.57
KB
-rwxr-xr-x
nl-neigh-list
11.46
KB
-rwxr-xr-x
nl-neightbl-list
11.27
KB
-rwxr-xr-x
nl-pktloc-lookup
11.36
KB
-rwxr-xr-x
nl-qdisc-add
11.6
KB
-rwxr-xr-x
nl-qdisc-delete
11.54
KB
-rwxr-xr-x
nl-qdisc-list
11.63
KB
-rwxr-xr-x
nl-route-add
11.73
KB
-rwxr-xr-x
nl-route-delete
15.86
KB
-rwxr-xr-x
nl-route-get
11.18
KB
-rwxr-xr-x
nl-route-list
11.77
KB
-rwxr-xr-x
nl-rule-list
11.3
KB
-rwxr-xr-x
nl-tctree-list
11.53
KB
-rwxr-xr-x
nl-util-addr
7.03
KB
-rwxr-xr-x
nm
45.43
KB
-rwxr-xr-x
nm-online
15.16
KB
-rwxr-xr-x
nmcli
809.16
KB
-rwxr-xr-x
nmtui
646.77
KB
-rwxr-xr-x
nmtui-connect
646.77
KB
-rwxr-xr-x
nmtui-edit
646.77
KB
-rwxr-xr-x
nmtui-hostname
646.77
KB
-rwxr-xr-x
nohup
32.42
KB
-rwxr-xr-x
nomarch
19.6
KB
-rwxr-xr-x
nproc
32.37
KB
-rwxr-xr-x
nroff
3.31
KB
-rwxr-xr-x
nsenter
28.22
KB
-rwxr-xr-x
nslookup
130.93
KB
-rwxr-xr-x
nss-policy-check
15.26
KB
-rwxr-xr-x
nsupdate
65.2
KB
-rwxr-xr-x
numfmt
64.71
KB
-rwxr-xr-x
objcopy
227.34
KB
-rwxr-xr-x
objdump
357.74
KB
-rwxr-xr-x
od
64.81
KB
-rwxr-xr-x
offlineimap
926
B
-rwxr-xr-x
oldfind
186.41
KB
-rwxr-xr-x
onig-config
1.31
KB
-rwxr-xr-x
opax
110.53
KB
-rwxr-xr-x
open
19.48
KB
-rwxr-xr-x
openssl
542.27
KB
-rwxr-xr-x
openvt
19.48
KB
-rwxr-xr-x
os-prober
5.51
KB
-rwxr-xr-x
p11-kit
32.18
KB
-rwxr-xr-x
package-cleanup
17.39
KB
-rwxr-xr-x
package-stash-conflicts
487
B
-rwxr-xr-x
page_owner_sort
10.2
KB
-rwxr-xr-x
pango-list
11.1
KB
-rwxr-xr-x
pango-querymodules-64
28.26
KB
-rwxr-xr-x
pango-view
49.47
KB
-rwxr-xr-x
paperconf
11.23
KB
-rwxr-xr-x
passwd
27.2
KB
-rwsr-xr-x
paste
32.34
KB
-rwxr-xr-x
pathchk
32.31
KB
-rwxr-xr-x
pax
110.53
KB
-rwxr-xr-x
pchrt
3.93
KB
-rwxr-xr-x
pcre-config
2.09
KB
-rwxr-xr-x
perl
11.14
KB
-rwxr-xr-x
perl5.16.3
11.14
KB
-rwxr-xr-x
perlbug
43.61
KB
-rwxr-xr-x
perldoc
203
B
-rwxr-xr-x
perlivp
10.52
KB
-rwxr-xr-x
perlthanks
43.61
KB
-rwxr-xr-x
perror
3.72
MB
-rwxr-xr-x
pflags
2.06
KB
-rwxr-xr-x
pg_config
28
KB
-rwxr-xr-x
pg_dump
305.78
KB
-rwxr-xr-x
pg_dumpall
73.89
KB
-rwxr-xr-x
pg_restore
126.79
KB
-rwxr-xr-x
pgawk
418.63
KB
-rwxr-xr-x
pgrep
27.67
KB
-rwxr-xr-x
php
41.44
MB
-rwxr-xr-x
pic
180.41
KB
-rwxr-xr-x
piconv
7.99
KB
-rwxr-xr-x
pidstat
68.89
KB
-rwxr-xr-x
pinentry
2.54
KB
-rwxr-xr-x
pinentry-curses
49.19
KB
-rwxr-xr-x
ping
64.63
KB
-rwxr-xr-x
ping6
64.63
KB
-rwxr-xr-x
pinky
36.57
KB
-rwxr-xr-x
pip-3
407
B
-rwxr-xr-x
pip-3.6
407
B
-rwxr-xr-x
pip3
407
B
-rwxr-xr-x
pip3.6
407
B
-rwxr-xr-x
pk12util
103.22
KB
-rwxr-xr-x
pkaction
15
KB
-rwxr-xr-x
pkcheck
23.03
KB
-rwxr-xr-x
pkcs1-conv
15.52
KB
-rwxr-xr-x
pkexec
27.02
KB
-rwsr-xr-x
pkg-config
44.38
KB
-rwxr-xr-x
pkgdata
36.7
KB
-rwxr-xr-x
pkill
27.67
KB
-rwxr-xr-x
pkla-admin-identities
19.23
KB
-rwxr-xr-x
pkla-check-authorization
27.3
KB
-rwxr-xr-x
pkttyagent
18.98
KB
-rwxr-xr-x
pl2pm
4.42
KB
-rwxr-xr-x
pldd
14.11
KB
-rwxr-xr-x
plymouth
39.77
KB
-rwxr-xr-x
pmap
27.61
KB
-rwxr-xr-x
pod2html
4
KB
-rwxr-xr-x
pod2man
13.26
KB
-rwxr-xr-x
pod2text
10.75
KB
-rwxr-xr-x
pod2usage
3.67
KB
-rwxr-xr-x
post-grohtml
187.55
KB
-rwxr-xr-x
powernow-k8-decode
6.15
KB
-rwxr-xr-x
pr
65.11
KB
-rwxr-xr-x
pre-grohtml
86.24
KB
-rwxr-xr-x
precat
5.52
KB
-rwxr-xr-x
preconv
40.88
KB
-rwxr-xr-x
preunzip
5.52
KB
-rwxr-xr-x
prezip
5.52
KB
-rwxr-xr-x
prezip-bin
11.05
KB
-rwxr-xr-x
printenv
28.28
KB
-rwxr-xr-x
printf
48.61
KB
-rwxr-xr-x
prlimit
41.2
KB
-rwxr-xr-x
procan
76.99
KB
-rwxr-xr-x
procmail
105.45
KB
-rwxr-xr-x
prove
13.13
KB
-rwxr-xr-x
ps
97.77
KB
-rwxr-xr-x
psed
52.08
KB
-rwxr-xr-x
psfaddtable
19.48
KB
-rwxr-xr-x
psfgettable
19.48
KB
-rwxr-xr-x
psfstriptable
19.48
KB
-rwxr-xr-x
psfxtable
19.48
KB
-rwxr-xr-x
pspell-config
384
B
-rwxr-xr-x
psql
438.74
KB
-rwxr-xr-x
pstruct
35.75
KB
-rwxr-xr-x
pt-align
39.89
KB
-rwxr-xr-x
pt-archiver
255.74
KB
-rwxr-xr-x
pt-config-diff
164.27
KB
-rwxr-xr-x
pt-deadlock-logger
161.56
KB
-rwxr-xr-x
pt-diskstats
160.3
KB
-rwxr-xr-x
pt-duplicate-key-checker
164.22
KB
-rwxr-xr-x
pt-fifo-split
48.11
KB
-rwxr-xr-x
pt-find
145.46
KB
-rwxr-xr-x
pt-fingerprint
64.85
KB
-rwxr-xr-x
pt-fk-error-logger
129.3
KB
-rwxr-xr-x
pt-heartbeat
186.97
KB
-rwxr-xr-x
pt-index-usage
219.97
KB
-rwxr-xr-x
pt-ioprofile
31.59
KB
-rwxr-xr-x
pt-kill
242.13
KB
-rwxr-xr-x
pt-mext
21.24
KB
-rwxr-xr-x
pt-mysql-summary
98.62
KB
-rwxr-xr-x
pt-online-schema-change
374.96
KB
-rwxr-xr-x
pt-pmp
24.02
KB
-rwxr-xr-x
pt-query-digest
505.41
KB
-rwxr-xr-x
pt-show-grants
70.84
KB
-rwxr-xr-x
pt-sift
36.84
KB
-rwxr-xr-x
pt-slave-delay
141.38
KB
-rwxr-xr-x
pt-slave-find
124
KB
-rwxr-xr-x
pt-slave-restart
174.58
KB
-rwxr-xr-x
pt-stalk
67.93
KB
-rwxr-xr-x
pt-summary
87.76
KB
-rwxr-xr-x
pt-table-checksum
408.52
KB
-rwxr-xr-x
pt-table-sync
386.36
KB
-rwxr-xr-x
pt-table-usage
217.38
KB
-rwxr-xr-x
pt-upgrade
322.26
KB
-rwxr-xr-x
pt-variable-advisor
172.12
KB
-rwxr-xr-x
pt-visual-explain
99.27
KB
-rwxr-xr-x
ptar
3.43
KB
-rwxr-xr-x
ptardiff
2.41
KB
-rwxr-xr-x
ptargrep
4.13
KB
-rwxr-xr-x
ptaskset
3.8
KB
-rwxr-xr-x
ptx
65.08
KB
-rwxr-xr-x
pure-ftpwho
6.95
KB
-rwxr-xr-x
pure-pw
39.5
KB
-rwxr-xr-x
pure-pwconvert
10.95
KB
-rwxr-xr-x
pure-statsdecode
10.95
KB
-rwxr-xr-x
pwd
32.45
KB
-rwxr-xr-x
pwdx
11.27
KB
-rwxr-xr-x
pwmake
11.13
KB
-rwxr-xr-x
pwscore
11.13
KB
-rwxr-xr-x
pydoc
78
B
-rwxr-xr-x
pydoc3
78
B
-rwxr-xr-x
pydoc3.6
78
B
-rwxr-xr-x
python
6.98
KB
-rwxr-xr-x
python2
6.98
KB
-rwxr-xr-x
python2.7
6.98
KB
-rwxr-xr-x
python3
11.07
KB
-rwxr-xr-x
python3.6
11.07
KB
-rwxr-xr-x
python3.6m
11.07
KB
-rwxr-xr-x
pyvenv
435
B
-rwxr-xr-x
pyvenv-3.6
435
B
-rwxr-xr-x
qemu-ga
267.8
KB
-rwxr-xr-x
quota
83.31
KB
-rwxr-xr-x
quotasync
70.84
KB
-rwxr-xr-x
ranlib
61.22
KB
-rwxr-xr-x
raw
15.27
KB
-rwxr-xr-x
razor-admin
905
B
-rwxr-xr-x
razor-check
907
B
-rwxr-xr-x
razor-client
624
B
-rwxr-xr-x
razor-report
911
B
-rwxr-xr-x
razor-revoke
911
B
-rwxr-xr-x
read
28
B
-rwxr-xr-x
readelf
509.83
KB
-rwxr-xr-x
readlink
40.82
KB
-rwxr-xr-x
realpath
61.23
KB
-rwxr-xr-x
rearj
60.17
KB
-rwxr-xr-x
recode
39.87
KB
-rwxr-xr-x
recode-sr-latin
15.29
KB
-rwxr-xr-x
redis-benchmark
1.28
MB
-rwxr-xr-x
redis-check-aof
2.79
MB
-rwxr-xr-x
redis-check-rdb
2.79
MB
-rwxr-xr-x
redis-cli
926.3
KB
-rwxr-xr-x
redis-sentinel
2.79
MB
-rwxr-xr-x
redis-server
2.79
MB
-rwxr-xr-x
reindexdb
57.27
KB
-rwxr-xr-x
rename
11.26
KB
-rwxr-xr-x
renice
11.21
KB
-rwxr-xr-x
replace
3.51
MB
-rwxr-xr-x
repo-graph
4.09
KB
-rwxr-xr-x
repo-rss
10.07
KB
-rwxr-xr-x
repoclosure
11.42
KB
-rwxr-xr-x
repodiff
13.97
KB
-rwxr-xr-x
repomanage
6.88
KB
-rwxr-xr-x
repoquery
55.68
KB
-rwxr-xr-x
reposync
14.14
KB
-rwxr-xr-x
repotrack
9.86
KB
-rwxr-xr-x
rescan-scsi-bus.sh
33.81
KB
-rwxr-xr-x
reset
19.6
KB
-rwxr-xr-x
resizecons
19.63
KB
-rwxr-xr-x
resolve_stack_dump
3.53
MB
-rwxr-xr-x
resolveip
3.53
MB
-rwxr-xr-x
rev
11.26
KB
-rwxr-xr-x
rhash
71.57
KB
-rwxr-xr-x
rkhunter
562.04
KB
-rwxr-xr-x
rm
61.4
KB
-rwxr-xr-x
rmail
262
B
-rwxr-xr-x
rmail.postfix
262
B
-rwxr-xr-x
rmdir
44.46
KB
-rwxr-xr-x
rnano
201.08
KB
-rwxr-xr-x
rpcgen
90.45
KB
-rwxr-xr-x
rpm
15.75
KB
-rwxr-xr-x
rpm2cpio
11.16
KB
-rwxr-xr-x
rpmdb
11.73
KB
-rwxr-xr-x
rpmgraph
15.63
KB
-rwxr-xr-x
rpmkeys
11.73
KB
-rwxr-xr-x
rpmquery
15.75
KB
-rwxr-xr-x
rpmverify
15.75
KB
-rwxr-xr-x
rrdcached
52.98
KB
-rwxr-xr-x
rrdcgi
27.81
KB
-rwxr-xr-x
rrdcreate
89.35
KB
-rwxr-xr-x
rrdinfo
89.35
KB
-rwxr-xr-x
rrdtool
27.49
KB
-rwxr-xr-x
rrdupdate
89.35
KB
-rwxr-xr-x
rsync
488.38
KB
-rwxr-xr-x
rsyslog-recover-qi.pl
5.96
KB
-rwxr-xr-x
run-parts
2.04
KB
-rwxr-xr-x
run-with-aspell
85
B
-rwxr-xr-x
runcon
32.47
KB
-rwxr-xr-x
rvi
906.45
KB
-rwxr-xr-x
rview
906.45
KB
-rwxr-xr-x
s2p
52.08
KB
-rwxr-xr-x
sa-awl
4.91
KB
-rwxr-xr-x
sa-check_spamd
14.45
KB
-rwxr-xr-x
sa-compile
21.62
KB
-rwxr-xr-x
sa-learn
44.5
KB
-rwxr-xr-x
sa-update
68.06
KB
-rwxr-xr-x
sadf
168.45
KB
-rwxr-xr-x
sandbox
17.52
KB
-rwxr-xr-x
sar
95.38
KB
-rwxr-xr-x
sasl2-sample-client
19.27
KB
-rwxr-xr-x
sasl2-sample-server
19.1
KB
-rwxr-xr-x
scp
89.23
KB
-rwxr-xr-x
screen
464.1
KB
-rwxr-sr-x
script
19.61
KB
-rwxr-xr-x
scriptreplay
15.29
KB
-rwxr-xr-x
scsi-rescan
33.81
KB
-rwxr-xr-x
scsi_logging_level
7.72
KB
-rwxr-xr-x
scsi_mandat
3.55
KB
-rwxr-xr-x
scsi_readcap
1.3
KB
-rwxr-xr-x
scsi_ready
1.09
KB
-rwxr-xr-x
scsi_satl
3.76
KB
-rwxr-xr-x
scsi_start
1.25
KB
-rwxr-xr-x
scsi_stop
1.44
KB
-rwxr-xr-x
scsi_temperature
936
B
-rwxr-xr-x
sdiff
48.41
KB
-rwxr-xr-x
secon
24.06
KB
-rwxr-xr-x
sed
74.29
KB
-rwxr-xr-x
sedismod
249.42
KB
-rwxr-xr-x
sedispol
176.32
KB
-rwxr-xr-x
semodule_package
15.3
KB
-rwxr-xr-x
seq
48.48
KB
-rwxr-xr-x
sessreg
11.24
KB
-rwxr-xr-x
setarch
15.27
KB
-rwxr-xr-x
setfacl
36.73
KB
-rwxr-xr-x
setfont
40.38
KB
-rwxr-xr-x
setkeycodes
11.16
KB
-rwxr-xr-x
setleds
11.16
KB
-rwxr-xr-x
setmetamode
11.21
KB
-rwxr-xr-x
setpriv
36.06
KB
-rwxr-xr-x
setsid
11.23
KB
-rwxr-xr-x
setterm
27.48
KB
-rwxr-xr-x
setup-nsssysinit
1.5
KB
-rwxr-xr-x
setup-nsssysinit.sh
1.5
KB
-rwxr-xr-x
setvtrgb
11.34
KB
-rwxr-xr-x
sexp-conv
23.63
KB
-rwxr-xr-x
sftp
142.01
KB
-rwxr-xr-x
sfv-hash
71.57
KB
-rwxr-xr-x
sg
40.95
KB
-rwsr-xr-x
sg_compare_and_write
15.82
KB
-rwxr-xr-x
sg_copy_results
20.02
KB
-rwxr-xr-x
sg_dd
43.63
KB
-rwxr-xr-x
sg_decode_sense
15.49
KB
-rwxr-xr-x
sg_emc_trespass
11.09
KB
-rwxr-xr-x
sg_format
24.05
KB
-rwxr-xr-x
sg_get_config
28.22
KB
-rwxr-xr-x
sg_get_lba_status
15.5
KB
-rwxr-xr-x
sg_ident
15.46
KB
-rwxr-xr-x
sg_inq
83.68
KB
-rwxr-xr-x
sg_logs
92.48
KB
-rwxr-xr-x
sg_luns
19.65
KB
-rwxr-xr-x
sg_map
15.23
KB
-rwxr-xr-x
sg_map26
23.77
KB
-rwxr-xr-x
sg_modes
29.3
KB
-rwxr-xr-x
sg_opcodes
23.88
KB
-rwxr-xr-x
sg_persist
28.34
KB
-rwxr-xr-x
sg_prevent
11.29
KB
-rwxr-xr-x
sg_raw
19.78
KB
-rwxr-xr-x
sg_rbuf
19.66
KB
-rwxr-xr-x
sg_rdac
15.13
KB
-rwxr-xr-x
sg_read
23.33
KB
-rwxr-xr-x
sg_read_block_limits
11.31
KB
-rwxr-xr-x
sg_read_buffer
15.53
KB
-rwxr-xr-x
sg_read_long
15.55
KB
-rwxr-xr-x
sg_readcap
19.66
KB
-rwxr-xr-x
sg_reassign
15.54
KB
-rwxr-xr-x
sg_referrals
15.48
KB
-rwxr-xr-x
sg_requests
15.58
KB
-rwxr-xr-x
sg_reset
11.46
KB
-rwxr-xr-x
sg_rmsn
11.32
KB
-rwxr-xr-x
sg_rtpg
15.39
KB
-rwxr-xr-x
sg_safte
19.59
KB
-rwxr-xr-x
sg_sanitize
19.88
KB
-rwxr-xr-x
sg_sat_identify
15.55
KB
-rwxr-xr-x
sg_sat_phy_event
15.87
KB
-rwxr-xr-x
sg_sat_set_features
15.41
KB
-rwxr-xr-x
sg_scan
15.34
KB
-rwxr-xr-x
sg_senddiag
20.02
KB
-rwxr-xr-x
sg_ses
67.55
KB
-rwxr-xr-x
sg_start
19.7
KB
-rwxr-xr-x
sg_stpg
19.61
KB
-rwxr-xr-x
sg_sync
15.52
KB
-rwxr-xr-x
sg_test_rwbuf
15.6
KB
-rwxr-xr-x
sg_turs
15.48
KB
-rwxr-xr-x
sg_unmap
15.5
KB
-rwxr-xr-x
sg_verify
15.7
KB
-rwxr-xr-x
sg_vpd
77.67
KB
-rwxr-xr-x
sg_wr_mode
19.55
KB
-rwxr-xr-x
sg_write_buffer
15.66
KB
-rwxr-xr-x
sg_write_long
15.55
KB
-rwxr-xr-x
sg_write_same
19.9
KB
-rwxr-xr-x
sg_xcopy
35.61
KB
-rwxr-xr-x
sginfo
65.8
KB
-rwxr-xr-x
sgm_dd
31.52
KB
-rwxr-xr-x
sgp_dd
35.83
KB
-rwxr-xr-x
sh
941.93
KB
-rwxr-xr-x
sha1sum
36.57
KB
-rwxr-xr-x
sha224sum
40.63
KB
-rwxr-xr-x
sha256sum
40.63
KB
-rwxr-xr-x
sha384sum
40.65
KB
-rwxr-xr-x
sha512sum
40.65
KB
-rwxr-xr-x
shasum
8.4
KB
-rwxr-xr-x
show-changed-rco
10.13
KB
-rwxr-xr-x
show-installed
16.18
KB
-rwxr-xr-x
showconsolefont
15.47
KB
-rwxr-xr-x
showkey
15.23
KB
-rwxr-xr-x
showrgb
7.08
KB
-rwxr-xr-x
shred
52.94
KB
-rwxr-xr-x
shuf
49.13
KB
-rwxr-xr-x
sieve-dump
23.05
KB
-rwxr-xr-x
sieve-filter
27.06
KB
-rwxr-xr-x
sieve-test
27.13
KB
-rwxr-xr-x
sievec
23.06
KB
-rwxr-xr-x
signver
102.6
KB
-rwxr-xr-x
sigtool
207.89
KB
-rwxr-xr-x
sim_client
14.97
KB
-rwxr-xr-x
size
32.35
KB
-rwxr-xr-x
skill
23.62
KB
-rwxr-xr-x
slabinfo
34.96
KB
-rwxr-xr-x
slabtop
19.52
KB
-rwxr-xr-x
sleep
32.35
KB
-rwxr-xr-x
slogin
756.4
KB
-rwxr-xr-x
snice
23.62
KB
-rwxr-xr-x
snmpconf
25.52
KB
-rwxr-xr-x
socat
380.43
KB
-rwxr-xr-x
soelim
32.59
KB
-rwxr-xr-x
sort
114.94
KB
-rwxr-xr-x
sotruss
4.24
KB
-rwxr-xr-x
spamassassin
29.22
KB
-rwxr-xr-x
spamc
45.19
KB
-rwxr-xr-x
spamd
125.25
KB
-rwxr-xr-x
spell
122
B
-rwxr-xr-x
spfquery
4.49
KB
-rwxr-xr-x
splain
18.03
KB
-rwxr-xr-x
split
69.47
KB
-rwxr-xr-x
sprof
22.1
KB
-rwxr-xr-x
sqlite3
54.95
KB
-rwxr-xr-x
ssh
756.4
KB
-rwxr-xr-x
ssh-add
352.46
KB
-rwxr-xr-x
ssh-agent
373.25
KB
---x--s--x
ssh-copy-id
10.22
KB
-rwxr-xr-x
ssh-keygen
409.38
KB
-rwxr-xr-x
ssh-keyscan
430.7
KB
-rwxr-xr-x
sshpass
15.37
KB
-rwxr-xr-x
ssltap
118.41
KB
-rwxr-xr-x
stat
77.19
KB
-rwxr-xr-x
statist
11.18
KB
-rwxr-xr-x
stdbuf
64.88
KB
-rwxr-xr-x
stream
7.04
KB
-rwxr-xr-x
strings
32.55
KB
-rwxr-xr-x
strip
227.34
KB
-rwxr-xr-x
stty
68.61
KB
-rwxr-xr-x
su
31.38
KB
-rwsr-xr-x
sudo
147.88
KB
---s--x--x
sudoedit
147.88
KB
---s--x--x
sudoreplay
56.11
KB
---x--x--x
sum
36.55
KB
-rwxr-xr-x
svn
232.45
KB
-rwxr-xr-x
svnadmin
67.4
KB
-rwxr-xr-x
svndumpfilter
35.32
KB
-rwxr-xr-x
svnlook
67.45
KB
-rwxr-xr-x
svnrdump
51.54
KB
-rwxr-xr-x
svnserve
83.95
KB
-rwxr-xr-x
svnsync
51.59
KB
-rwxr-xr-x
svnversion
15.15
KB
-rwxr-xr-x
sxpm
19.83
KB
-rwxr-xr-x
sync
28.33
KB
-rwxr-xr-x
systemctl
704.8
KB
-rwxr-xr-x
systemd-analyze
1.49
MB
-rwxr-xr-x
systemd-ask-password
60.38
KB
-rwxr-xr-x
systemd-cat
39.98
KB
-rwxr-xr-x
systemd-cgls
326.29
KB
-rwxr-xr-x
systemd-cgtop
85.09
KB
-rwxr-xr-x
systemd-coredumpctl
154.52
KB
-rwxr-xr-x
systemd-delta
76.84
KB
-rwxr-xr-x
systemd-detect-virt
39.97
KB
-rwxr-xr-x
systemd-escape
48.2
KB
-rwxr-xr-x
systemd-firstboot
101.52
KB
-rwxr-xr-x
systemd-hwdb
85.31
KB
-rwxr-xr-x
systemd-inhibit
309.83
KB
-rwxr-xr-x
systemd-loginctl
489.62
KB
-rwxr-xr-x
systemd-machine-id-setup
52.23
KB
-rwxr-xr-x
systemd-notify
48.13
KB
-rwxr-xr-x
systemd-nspawn
545.88
KB
-rwxr-xr-x
systemd-path
52.16
KB
-rwxr-xr-x
systemd-run
387.05
KB
-rwxr-xr-x
systemd-stdio-bridge
305.77
KB
-rwxr-xr-x
systemd-sysv-convert
3.89
KB
-rwxr-xr-x
systemd-tmpfiles
146.13
KB
-rwxr-xr-x
systemd-tty-ask-password-agent
84.75
KB
-rwxr-xr-x
tabs
15.31
KB
-rwxr-xr-x
tac
32.48
KB
-rwxr-xr-x
tail
65.25
KB
-rwxr-xr-x
tailf
23.88
KB
-rwxr-xr-x
tapestat
52.55
KB
-rwxr-xr-x
tar
338.02
KB
-rwxr-xr-x
taskset
32.22
KB
-rwxr-xr-x
tbl
115.96
KB
-rwxr-xr-x
tcamgr
23.47
KB
-rwxr-xr-x
tcamttest
19.37
KB
-rwxr-xr-x
tcatest
52.78
KB
-rwxr-xr-x
tcbmgr
27.66
KB
-rwxr-xr-x
tcbmttest
47.96
KB
-rwxr-xr-x
tcbtest
64.47
KB
-rwxr-xr-x
tcfmgr
19.5
KB
-rwxr-xr-x
tcfmttest
31.79
KB
-rwxr-xr-x
tcftest
43.86
KB
-rwxr-xr-x
tchmgr
23.52
KB
-rwxr-xr-x
tchmttest
43.87
KB
-rwxr-xr-x
tchtest
52.29
KB
-rwxr-xr-x
tctmgr
31.82
KB
-rwxr-xr-x
tctmttest
39.72
KB
-rwxr-xr-x
tcttest
51.9
KB
-rwxr-xr-x
tcucodec
31.75
KB
-rwxr-xr-x
tcumttest
19.52
KB
-rwxr-xr-x
tcutest
65.61
KB
-rwxr-xr-x
teamd
155.09
KB
-rwxr-xr-x
teamdctl
28.98
KB
-rwxr-xr-x
teamnl
19.09
KB
-rwxr-xr-x
tee
32.38
KB
-rwxr-xr-x
test
36.46
KB
-rwxr-xr-x
testgdbm
29.77
KB
-rwxr-xr-x
tic
64.26
KB
-rwxr-xr-x
tiger-hash
71.57
KB
-rwxr-xr-x
timedatectl
330.22
KB
-rwxr-xr-x
timeout
53.31
KB
-rwxr-xr-x
tload
15.38
KB
-rwxr-xr-x
tmon
31.11
KB
-rwxr-xr-x
toe
15.43
KB
-rwxr-xr-x
top
104.38
KB
-rwxr-xr-x
touch
61.02
KB
-rwxr-xr-x
tput
15.41
KB
-rwxr-xr-x
tr
44.61
KB
-rwxr-xr-x
tracepath
15.05
KB
-rwxr-xr-x
tracepath6
15.05
KB
-rwxr-xr-x
troff
512.96
KB
-rwxr-xr-x
true
28.26
KB
-rwxr-xr-x
truncate
52.68
KB
-rwxr-xr-x
trust
179.08
KB
-rwxr-xr-x
tset
19.6
KB
-rwxr-xr-x
tsort
36.47
KB
-rwxr-xr-x
tth-hash
71.57
KB
-rwxr-xr-x
tty
28.29
KB
-rwxr-xr-x
turbostat
113.15
KB
-rwxr-xr-x
type99
4.57
KB
-rwxr-xr-x
tzselect
7.17
KB
-rwxr-xr-x
uconv
52.57
KB
-rwxr-xr-x
ucs2any
19.47
KB
-rwxr-xr-x
udevadm
414.27
KB
-rwxr-xr-x
ul
19.47
KB
-rwxr-xr-x
umask
29
B
-rwxr-xr-x
umount
31.23
KB
-rwsr-xr-x
unalias
31
B
-rwxr-xr-x
uname
32.3
KB
-rwxr-xr-x
unarj
74
B
-rwxr-xr-x
unexpand
32.45
KB
-rwxr-xr-x
unfreeze
23.82
KB
-rwxr-xr-x
unicode_start
2.5
KB
-rwxr-xr-x
unicode_stop
363
B
-rwxr-xr-x
uniq
44.71
KB
-rwxr-xr-x
unlink
28.3
KB
-rwxr-xr-x
unlz4
105.84
KB
-rwxr-xr-x
unshare
15.45
KB
-rwxr-xr-x
unxz
73.52
KB
-rwxr-xr-x
unzip
185.16
KB
-rwxr-xr-x
unzipsfx
88.66
KB
-rwxr-xr-x
unzoo
27.67
KB
-rwxr-xr-x
update-ca-trust
1.03
KB
-rwxr-xr-x
update-mime-database
52.82
KB
-rwxr-xr-x
updatedb
47.65
KB
-rwxr-xr-x
uptime
11.22
KB
-rwxr-xr-x
urlgrabber
12.17
KB
-rwxr-xr-x
users
32.42
KB
-rwxr-xr-x
usleep
10.95
KB
-rwxr-xr-x
usx2yloader
15.41
KB
-rwxr-xr-x
utmpdump
15.45
KB
-rwxr-xr-x
uuclient
14.97
KB
-rwxr-xr-x
uuidgen
11.21
KB
-rwxr-xr-x
vacuumdb
57.35
KB
-rwxr-xr-x
varnishadm
124.63
KB
-rwxr-xr-x
varnishhist
55.02
KB
-rwxr-xr-x
varnishlog
30.09
KB
-rwxr-xr-x
varnishncsa
98.75
KB
-rwxr-xr-x
varnishstat
88.88
KB
-rwxr-xr-x
varnishtest
1.19
MB
-rwxr-xr-x
varnishtop
61.65
KB
-rwxr-xr-x
vdir
114.85
KB
-rwxr-xr-x
verifytree
10.79
KB
-rwxr-xr-x
vi
906.45
KB
-rwxr-xr-x
view
906.45
KB
-rwxr-xr-x
vlock
15.73
KB
-rwxr-xr-x
vmstat
31.48
KB
-rwxr-xr-x
vxloader
15.38
KB
-rwxr-xr-x
w
19.45
KB
-rwxr-xr-x
wait
28
B
-rwxr-xr-x
wall
14.98
KB
-r-xr-sr-x
watch
24.14
KB
-rwxr-xr-x
watchgnupg
15.35
KB
-rwxr-xr-x
wc
40.67
KB
-rwxr-xr-x
wdctl
40.7
KB
-rwxr-xr-x
wget
408.96
KB
-rwxr-xr-x
whatis
45.49
KB
-rwxr-xr-x
whereis
20.2
KB
-rwxr-xr-x
which
23.77
KB
-rwxr-xr-x
whiptail
27.84
KB
-rwxr-xr-x
whirlpool-hash
71.57
KB
-rwxr-xr-x
who
48.7
KB
-rwxr-xr-x
whoami
28.3
KB
-rwxr-xr-x
word-list-compress
11.03
KB
-rwxr-xr-x
write
19.09
KB
-rwxr-sr-x
wsrep_sst_backup
2.95
KB
-rwxr-xr-x
wsrep_sst_common
54.08
KB
-rw-r--r--
wsrep_sst_mariabackup
50.86
KB
-rwxr-xr-x
wsrep_sst_mysqldump
7.7
KB
-rwxr-xr-x
wsrep_sst_rsync
32.2
KB
-rwxr-xr-x
wsrep_sst_rsync_wan
32.2
KB
-rwxr-xr-x
x86_64
15.27
KB
-rwxr-xr-x
x86_64-redhat-linux-c++
754.59
KB
-rwxr-xr-x
x86_64-redhat-linux-g++
754.59
KB
-rwxr-xr-x
x86_64-redhat-linux-gcc
750.59
KB
-rwxr-xr-x
x86_energy_perf_policy
10.23
KB
-rwxr-xr-x
xargs
60.91
KB
-rwxr-xr-x
xgamma
11.15
KB
-rwxr-xr-x
xgettext
265.35
KB
-rwxr-xr-x
xhost
15.38
KB
-rwxr-xr-x
xinput
52.81
KB
-rwxr-xr-x
xkill
15.27
KB
-rwxr-xr-x
xml2-config
1.68
KB
-rwxr-xr-x
xmlcatalog
15.3
KB
-rwxr-xr-x
xmllint
61.94
KB
-rwxr-xr-x
xmlwf
24
KB
-rwxr-xr-x
xmodmap
32.28
KB
-rwxr-xr-x
xorg-x11-fonts-update-dirs
1.29
KB
-rwxr--r--
xrandr
60.06
KB
-rwxr-xr-x
xrdb
27.78
KB
-rwxr-xr-x
xrefresh
11.16
KB
-rwxr-xr-x
xset
31.72
KB
-rwxr-xr-x
xsetmode
11.1
KB
-rwxr-xr-x
xsetpointer
11.13
KB
-rwxr-xr-x
xsetroot
19.38
KB
-rwxr-xr-x
xslt-config
2.36
KB
-rwxr-xr-x
xsltproc
23.51
KB
-rwxr-xr-x
xstdcmap
15.77
KB
-rwxr-xr-x
xsubpp
4.45
KB
-rwxr-xr-x
xz
73.52
KB
-rwxr-xr-x
xzcat
73.52
KB
-rwxr-xr-x
xzcmp
6.48
KB
-rwxr-xr-x
xzdec
11.21
KB
-rwxr-xr-x
xzdiff
6.48
KB
-rwxr-xr-x
xzegrep
5.76
KB
-rwxr-xr-x
xzfgrep
5.76
KB
-rwxr-xr-x
xzgrep
5.76
KB
-rwxr-xr-x
xzless
1.76
KB
-rwxr-xr-x
xzmore
2.11
KB
-rwxr-xr-x
yes
28.3
KB
-rwxr-xr-x
ypdomainname
15.41
KB
-rwxr-xr-x
yum
801
B
-rwxr-xr-x
yum-builddep
9.95
KB
-rwxr-xr-x
yum-config-manager
9.35
KB
-rwxr-xr-x
yum-debug-dump
8.34
KB
-rwxr-xr-x
yum-debug-restore
7.72
KB
-rwxr-xr-x
yum-groups-manager
10.77
KB
-rwxr-xr-x
yumdownloader
10.85
KB
-rwxr-xr-x
zcat
1.9
KB
-rwxr-xr-x
zcmp
1.72
KB
-rwxr-xr-x
zdiff
5.63
KB
-rwxr-xr-x
zegrep
123
B
-rwxr-xr-x
zfgrep
123
B
-rwxr-xr-x
zforce
2.09
KB
-rwxr-xr-x
zgrep
5.98
KB
-rwxr-xr-x
zip
210.78
KB
-rwxr-xr-x
zipcloak
98.1
KB
-rwxr-xr-x
zipdetails
47.32
KB
-rwxr-xr-x
zipgrep
2.88
KB
-rwxr-xr-x
zipinfo
185.16
KB
-rwxr-xr-x
zipnote
93.73
KB
-rwxr-xr-x
zipsplit
97.75
KB
-rwxr-xr-x
zless
1.99
KB
-rwxr-xr-x
zmore
2.79
KB
-rwxr-xr-x
znew
5.22
KB
-rwxr-xr-x
zsoelim
32.59
KB
-rwxr-xr-x
Delete
Unzip
Zip
${this.title}
Close
Code Editor : sa-update
#!/usr/bin/perl -T -w eval 'exec /usr/bin/perl -T -w -S $0 ${1+"$@"}' if 0; # not running under some shell # <@LICENSE> # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to you under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at: # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # </@LICENSE> use strict; use warnings; use re 'taint'; my $VERSION = 'svnunknown'; if ('$Id: sa-update.raw 1475932 2013-04-25 19:56:34Z mmartinec $' =~ ':') { # Subversion keyword "$Id: sa-update.raw 1475932 2013-04-25 19:56:34Z mmartinec $" has been successfully expanded. # Doesn't happen with automated launchpad builds: # https://bugs.launchpad.net/launchpad/+bug/780916 $VERSION = 'svn' . (split(/\s+/, '$Id: sa-update.raw 1475932 2013-04-25 19:56:34Z mmartinec $'))[2]; } my $PREFIX = '/usr'; # substituted at 'make' time my $DEF_RULES_DIR = '/usr/share/spamassassin'; # substituted at 'make' time my $LOCAL_RULES_DIR = '/etc/mail/spamassassin'; # substituted at 'make' time my $LOCAL_STATE_DIR = '/var/lib/spamassassin'; # substituted at 'make' time use lib '/usr/share/perl5/vendor_perl'; # substituted at 'make' time # We want to do a small amount of macro processing during channel installs, # based on the values as passed in via 'make' my %MACRO_VALUES = ( 'VERSION' => '3.004000', 'CONTACT_ADDRESS' => 'the administrator of that system', 'PREFIX' => '/usr', 'DEF_RULES_DIR' => '/usr/share/spamassassin', 'LOCAL_RULES_DIR' => '/etc/mail/spamassassin', 'LOCAL_STATE_DIR' => '/var/lib/spamassassin', 'INSTALLSITELIB' => '/usr/share/perl5/vendor_perl', ); # Standard perl modules use Errno qw(ENOENT EACCES); use IO::File qw(O_RDONLY O_WRONLY O_RDWR O_CREAT O_EXCL); use File::Spec; use File::Path; use Getopt::Long; use Pod::Usage; use Config; BEGIN { # see comments in "spamassassin.raw" for doco my @bin = File::Spec->splitpath($0); my $bin = ($bin[0] ? File::Spec->catpath(@bin[0..1]) : $bin[1]) || File::Spec->curdir; if (-e $bin.'/lib/Mail/SpamAssassin.pm' || !-e '/usr/share/perl5/vendor_perl/Mail/SpamAssassin.pm' ) { my $searchrelative; if ($searchrelative && $bin eq '../' && -e '../blib/lib/Mail/SpamAssassin.pm') { unshift ( @INC, '../blib/lib' ); } else { foreach ( qw(lib ../lib/site_perl ../lib/spamassassin ../share/spamassassin/lib)) { my $dir = File::Spec->catdir( $bin, split ( '/', $_ ) ); if ( -f File::Spec->catfile( $dir, "Mail", "SpamAssassin.pm" ) ) { unshift ( @INC, $dir ); last; } } } } } # These are the non-standard required modules use Net::DNS; use HTTP::Date qw(time2str); use Archive::Tar 1.23; use IO::Zlib 1.04; use vars qw($have_lwp $io_socket_module_name $have_inet4 $have_inet6 $have_sha256 $have_sha512); BEGIN { # Deal with optional modules eval { require Digest::SHA; import Digest::SHA qw(sha1_hex sha256_hex sha512_hex); 1 } and do { $have_sha256=1; $have_sha512=1 } or die "Unable to verify file hashes! You must install a modern version of Digest::SHA."; $have_lwp = eval { require LWP::UserAgent; }; if (eval { require IO::Socket::IP }) { # handles IPv6 and IPv4 $io_socket_module_name = 'IO::Socket::IP'; } elsif (eval { require IO::Socket::INET6 }) { # handles IPv6 and IPv4 $io_socket_module_name = 'IO::Socket::INET6'; } elsif (eval { require IO::Socket::INET }) { # IPv4 only $io_socket_module_name = 'IO::Socket::INET'; } $have_inet4 = # can we create a PF_INET socket? defined $io_socket_module_name && eval { my $sock = $io_socket_module_name->new(LocalAddr => '0.0.0.0', Proto => 'tcp'); $sock->close or die "error closing socket: $!" if $sock; $sock ? 1 : undef; }; $have_inet6 = # can we create a PF_INET6 socket? defined $io_socket_module_name && $io_socket_module_name ne 'IO::Socket::INET' && eval { my $sock = $io_socket_module_name->new(LocalAddr => '::', Proto => 'tcp'); $sock->close or die "error closing socket: $!" if $sock; $sock ? 1 : undef; }; } # These should already be available use Mail::SpamAssassin; use Mail::SpamAssassin::Util qw(untaint_var untaint_file_path proc_status_ok exit_status_str am_running_on_windows secure_tmpfile secure_tmpdir); # Make the main dbg() accessible in our package w/o an extra function *dbg=\&Mail::SpamAssassin::dbg; sub dbg; $| = 1; # autoflushing STDOUT makes verbose output consistent with warnings # Clean up PATH appropriately Mail::SpamAssassin::Util::clean_path_in_taint_mode(); ############################################################################## # Default list of GPG keys allowed to sign update releases # # pub 4096R/5244EC45 2005-12-20 # Key fingerprint = 5E54 1DC9 59CB 8BAC 7C78 DFDC 4056 A61A 5244 EC45 # uid updates.spamassassin.org Signing Key <release@spamassassin.org> # sub 4096R/24F434CE 2005-12-20 # # note for gpg newbs: these are "long" gpg keyids. It's common to also # use the last 8 hex digits as a shorter keyid string. # my %valid_GPG = ( '0C2B1D7175B852C64B3CDC716C55397824F434CE' => 1, '5E541DC959CB8BAC7C78DFDC4056A61A5244EC45' => 1, ); # Default list of channels to update against # my @channels = ( 'updates.spamassassin.org' ); my $IGNORE_MIRBY_OLDER_THAN = (24 * 60 * 60 * 7); # 1 week ############################################################################## my %opt; @{$opt{'gpgkey'}} = (); @{$opt{'channel'}} = (); my $GPG_ENABLED = 1; $opt{'gpghomedir'} = File::Spec->catfile($LOCAL_RULES_DIR, 'sa-update-keys'); Getopt::Long::Configure( qw(bundling no_getopt_compat no_auto_abbrev no_ignore_case)); GetOptions( 'debug|D:s' => \$opt{'debug'}, 'version|V' => \$opt{'version'}, 'help|h|?' => \$opt{'help'}, 'verbose|v+' => \$opt{'verbose'}, 'checkonly' => \$opt{'checkonly'}, 'allowplugins' => \$opt{'allowplugins'}, 'refreshmirrors' => \$opt{'refreshmirrors'}, # allow multiple of these on the commandline 'gpgkey=s' => $opt{'gpgkey'}, 'gpghomedir=s' => \$opt{'gpghomedir'}, 'channel=s' => $opt{'channel'}, 'install=s' => \$opt{'install'}, 'import=s' => \$opt{'import'}, 'gpgkeyfile=s' => \$opt{'gpgkeyfile'}, 'channelfile=s' => \$opt{'channelfile'}, 'updatedir=s' => \$opt{'updatedir'}, 'gpg!' => \$GPG_ENABLED, '4' => sub { $opt{'force_pf'} = 'inet' }, '6' => sub { $opt{'force_pf'} = 'inet6' }, # backward compatibility 'usegpg' => \$GPG_ENABLED, ) or print_usage_and_exit(); if ( defined $opt{'help'} ) { print_usage_and_exit("For more information read the sa-update man page.\n", 0); } if ( defined $opt{'version'} ) { print_version(); exit(0); } if ( $opt{'force_pf'} && $opt{'force_pf'} eq 'inet' && !$have_inet4 ) { warn "Option -4 specified but support for the ". "INET protocol family is not available.\n"; } if ( $opt{'force_pf'} && $opt{'force_pf'} eq 'inet6' && !$have_inet6 ) { warn "Option -6 specified but support for the ". "INET6 protocol family is not available.\n"; } # Figure out what version of SpamAssassin we're using, and also figure out the # reverse of it for the DNS query. Handle x.yyyzzz as well as x.yz. my $SAVersion = $Mail::SpamAssassin::VERSION; if ($SAVersion =~ /^(\d+)\.(\d{3})(\d{3})$/) { $SAVersion = join(".", $1+0, $2+0, $3+0); } elsif ($SAVersion =~ /^(\d)\.(\d)(\d)$/) { $SAVersion = "$1.$2.$3"; } else { die "fatal: SpamAssassin version number '$SAVersion' is in an unknown format!\n"; } my $RevSAVersion = join(".", reverse split(/\./, $SAVersion)); # set debug areas, if any specified (only useful for command-line tools) $SAVersion =~ /^(\d+\.\d+)/; if ($1+0 > 3.0) { $opt{'debug'} ||= 'all' if (defined $opt{'debug'}); } else { $opt{'debug'} = defined $opt{'debug'}; } # Find the default site rule directory, also setup debugging and other M::SA bits my $SA = Mail::SpamAssassin->new({ debug => $opt{'debug'}, local_tests_only => 1, dont_copy_prefs => 1, PREFIX => $PREFIX, DEF_RULES_DIR => $DEF_RULES_DIR, LOCAL_RULES_DIR => $LOCAL_RULES_DIR, LOCAL_STATE_DIR => $LOCAL_STATE_DIR, }); if (defined $opt{'updatedir'}) { $opt{'updatedir'} = untaint_file_path($opt{'updatedir'}); } else { $opt{'updatedir'} = $SA->sed_path('__local_state_dir__/__version__'); } # check only disabled gpg # https://issues.apache.org/SpamAssassin/show_bug.cgi?id=5854 if ( defined $opt{'checkonly'}) { $GPG_ENABLED=0; dbg("gpg: Disabling gpg requirement due to checkonly flag."); } dbg("generic: sa-update version $VERSION"); dbg("generic: using update directory: $opt{'updatedir'}"); # doesn't really display useful things for this script, but we do want # a module/version listing, etc. sa-update may be used for older versions # of SA that don't include this function, so eval around it. eval { $SA->debug_diagnostics(); 1; }; $SA->finish(); # untaint the command-line args; since the root user supplied these, and # we're not a setuid script, we trust them foreach my $optkey (keys %opt) { next if ref $opt{$optkey}; untaint_var(\$opt{$optkey}); } ############################################################################## # Deal with gpg-related options if (@{$opt{'gpgkey'}}) { $GPG_ENABLED = 1; foreach my $key (@{$opt{'gpgkey'}}) { unless (is_valid_gpg_key_id($key)) { dbg("gpg: invalid gpgkey parameter $key"); next; } $key = uc $key; dbg("gpg: adding key id $key"); $valid_GPG{$key} = 1; } } if (defined $opt{'gpgkeyfile'}) { $GPG_ENABLED = 1; open(GPG, $opt{'gpgkeyfile'}) or die "cannot open $opt{'gpgkeyfile'} for reading: $!\n"; dbg("gpg: reading in gpgfile ".$opt{'gpgkeyfile'}); while(my $key = <GPG>) { chomp $key; $key =~ s/#.*$//; # remove comments $key =~ s/^\s+//; # remove leading whitespace $key =~ s/\s+$//; # remove tailing whitespace next if $key eq ''; # skip empty lines unless (is_valid_gpg_key_id($key)) { dbg("gpg: invalid key id $key"); next; } $key = uc $key; dbg("gpg: adding key id $key"); $valid_GPG{$key} = 1; } close(GPG) or die "cannot close $opt{'gpgkeyfile'}: $!"; } # At this point, we need to know where GPG is ... my $GPGPath; if ($GPG_ENABLED || $opt{'import'}) { # find GPG in the PATH # bug 4958: for *NIX it's "gpg", in Windows it's "gpg.exe" $GPGPath = 'gpg' . $Config{_exe}; dbg("gpg: Searching for '$GPGPath'"); if ($GPGPath = Mail::SpamAssassin::Util::find_executable_in_env_path($GPGPath)) { dbg("gpg: found $GPGPath"); # bug 5030: if GPGPath has a space, put it in quotes if ($GPGPath =~ / /) { $GPGPath =~ s/"/\\"/g; $GPGPath = qq/"$GPGPath"/; dbg("gpg: path changed to $GPGPath"); } } else { die "error: gpg required but not found! It is not recommended, but you can use \"sa-update\" with the --no-gpg to skip the verification. \n"; } # GPG was found, and we've been asked to import a key only if ( $opt{'import'} ) { my $ex = import_gpg_key($opt{'import'}); exit $ex; } # does the sa-update keyring exist? if not, import it if(!-f File::Spec->catfile($opt{'gpghomedir'}, "secring.gpg")) { import_default_keyring(); # attempt to continue even if this fails, anyway } # specify which keys are trusted dbg("gpg: release trusted key id list: ".join(" ", keys %valid_GPG)); # convert fingerprint gpg ids to keyids foreach (keys %valid_GPG) { my $id = substr $_, -8; $valid_GPG{$id} = 1; } } ############################################################################## # Deal with channel-related options if (defined $opt{'channel'} && scalar @{$opt{'channel'}} > 0) { @channels = @{$opt{'channel'}}; } if (defined $opt{'channelfile'}) { open(CHAN, $opt{'channelfile'}) or die "cannot open $opt{'channelfile'} for reading: $!\n"; dbg("channel: reading in channelfile ".$opt{'channelfile'}); @channels = (); while(my $chan = <CHAN>) { chomp $chan; $chan =~ s/#.*$//; # remove comments $chan =~ s/^\s+//; # remove leading whitespace $chan =~ s/\s+$//; # remove tailing whitespace next if $chan eq ''; # skip empty lines $chan = lc $chan; dbg("channel: adding $chan"); push(@channels, $chan); } close(CHAN) or die "cannot close $opt{'channelfile'}: $!"; } # untaint the channel listing for(my $ind = 0; $ind < @channels; $ind++) { local($1); # bug 5061: prevent random taint flagging of $1 if ($channels[$ind] =~ /^([a-zA-Z0-9._-]+)$/) { untaint_var(\$channels[$ind]); } else { dbg("channel: skipping invalid channel: $channels[$ind]"); splice @channels, $ind, 1; $ind--; # the next element takes the place of the deleted one } } my ($res, $ua); if ($opt{'install'}) { if (scalar @channels > 1) { die "fatal: --install cannot be used with multiple --channel switches.\n"; } } else { $res = Net::DNS::Resolver->new(); $res->force_v4(1) if $have_inet4 && $opt{'force_pf'} && $opt{'force_pf'} eq 'inet'; } # Generate a temporary file to put channel content in for later use ... my ($content_file, $tfh) = secure_tmpfile(); $tfh or die "fatal: could not create temporary channel content file: $!\n"; close $tfh or die "cannot close temporary channel content file $content_file: $!"; undef $tfh; my $lint_failures = 0; my $channel_failures = 0; my $channel_successes = 0; # Use a temporary directory for all update channels my $UPDTmp; # we only need to lint the site pre files once my $site_pre_linted = 0; # Go ahead and loop through all of the channels foreach my $channel (@channels) { dbg("channel: attempting channel $channel"); my %preserve_files; # Convert the channel to a nice-for-filesystem version my $nicechannel = $channel; $nicechannel =~ tr/A-Za-z0-9-/_/cs; my $UPDDir = File::Spec->catfile($opt{'updatedir'}, $nicechannel); my $CFFile = "$UPDDir.cf"; my $PREFile = "$UPDDir.pre"; if (-d $UPDDir) { dbg("channel: using existing directory $UPDDir"); } else { # create the dir, if it doesn't exist dbg("channel: creating directory $UPDDir"); mkpath([$UPDDir], 0, 0777) or die "channel: cannot create channel directory $UPDDir: $!\n"; } dbg("channel: channel cf file $CFFile"); dbg("channel: channel pre file $PREFile"); my $instfile; if ($opt{'install'}) { $instfile = $opt{'install'}; dbg("channel: installing from file $instfile"); } my($mirby, $mirby_force_reload, $mirby_file_is_ok); my $mirby_path = File::Spec->catfile($UPDDir, "MIRRORED.BY"); # try to read metadata from channel.cf file my $currentV = -1; if (!open(CF, $CFFile)) { dbg("channel: error opening file %s: %s", $CFFile, $!) unless $! == ENOENT; } else { while(<CF>) { local($1,$2); last unless /^# UPDATE\s+([A-Za-z]+)\s+(\S+)/; my($type, $value) = (lc $1,$2); dbg("channel: metadata $type = $value, from file $CFFile"); if ($type eq 'version') { $value =~ /^(\d+)/; $currentV = $1; } } close(CF) or die "cannot close $CFFile: $!"; } # obtain a version number which should be installed my $newV; if ($instfile) { # the /.*/ ensures we use the 3-digit string nearest to the end of string, # otherwise we might pick up something from the middle of the directory path local($1); if ($instfile !~ /(?:.*\D|^)(\d{3,})/) { # this is a requirement die "channel: $channel: --install file $instfile does not contain a 3-digit version number!\n"; } $newV = $1; if ( defined $opt{'checkonly'} ) { dbg("channel: $channel: --install and --checkonly, claiming update available"); next; } } else { # not an install file, get the latest version number from network # Setup the channel version DNS query my $DNSQ = "$RevSAVersion.$channel"; my $dnsV = join(' ', do_dns_query($DNSQ)); local($1); if (defined $dnsV && $dnsV =~ /^(\d+)/) { $newV = untaint_var($1) if (!defined $newV || $1 > $newV); dbg("dns: $DNSQ => $dnsV, parsed as $1"); } # Not getting a response isn't a failure, there may just not be any updates # for this SA version yet. if (!defined $newV) { my @mirs = do_dns_query("mirrors.$channel"); if (defined shift @mirs) { dbg("channel: no updates available, skipping channel"); } else { channel_failed("channel: no 'mirrors.$channel' record found"); } next; } # If this channel hasn't been installed before, or it's out of date, # keep going. Otherwise, skip it. if ($currentV >= $newV) { dbg("channel: current version is $currentV, new version is $newV, ". "skipping channel"); next; } print "Update available for channel $channel: $currentV -> $newV\n" if $opt{'verbose'}; # If we are only checking for update availability, exit now if ( defined $opt{'checkonly'} ) { dbg("channel: $channel: update available, not downloading ". "in checkonly mode"); next; } } # we need a directory we control that we can use to avoid loading any rules # when we lint the site pre files, we might as well use the channel temp dir dbg("channel: preparing temp directory for new channel"); if (!$UPDTmp) { $UPDTmp = secure_tmpdir(); dbg("channel: created tmp directory $UPDTmp"); } else { dbg("channel: using existing tmp directory $UPDTmp"); if (!clean_update_dir($UPDTmp)) { die "channel: attempt to clean update temp dir failed, aborting"; } } # lint the site pre files (that will be used when lint checking the channel) # before downloading the channel update unless ($site_pre_linted) { dbg("generic: lint checking site pre files once before attempting channel updates"); unless (lint_check_dir(File::Spec->catfile($UPDTmp, "doesnotexist"))) { dbg("generic: lint of site pre files failed, cannot continue"); print "Lint of site pre files failed, cannot continue\n" if $opt{'verbose'}; $lint_failures++; last; } dbg("generic: lint check of site pre files succeeded, continuing with channel updates"); $site_pre_linted = 1; } my $content; my $SHA1; my $SHA512; my $SHA256; my $GPG; if ($instfile) { dbg("channel: using --install files $instfile\{,.sha1,.sha256,.sha512,.asc\}"); $content = read_install_file($instfile); if ( -s "$instfile.sha512" ) { $SHA512 = read_install_file($instfile.".sha512"); } if ( -s "$instfile.sha256" ) { $SHA256 = read_install_file($instfile.".sha256"); } if ( -s "$instfile.sha1" ) { $SHA1 = read_install_file($instfile.".sha1"); } $GPG = read_install_file($instfile.".asc") if $GPG_ENABLED; } else { # not an install file, obtain fresh rules from network dbg("channel: protocol family available: %s%s", join(',', $have_inet4 ? 'inet' : (), $have_inet6 ? 'inet6' : ()), $opt{'force_pf'} ? '; force '.$opt{'force_pf'} : '' ); # test if the MIRRORED.BY file for this channel exists, # is nonempty, and is reasonably fresh my(@mirr_stat_list) = stat($mirby_path); if (!@mirr_stat_list) { if ($! == ENOENT) { dbg("channel: no mirror file %s, will fetch it", $mirby_path); } else { # protection error, misconfiguration, file system error, ... warn "error: error accessing mirrors file $mirby_path: $!\n"; channel_failed("channel: error accessing mirrors file $mirby_path: $!"); next; } } elsif (-z _) { dbg("channel: file %s is empty, refreshing mirrors file", $mirby_path); $mirby_force_reload = 1; } elsif ($opt{'refreshmirrors'}) { dbg("channel: --refreshmirrors used, forcing mirrors file refresh ". "on channel $channel"); $mirby_force_reload = 1; } elsif (time - $mirr_stat_list[9] > $IGNORE_MIRBY_OLDER_THAN) { dbg("channel: file %s is too old, refreshing mirrors file", $mirby_path); $mirby_file_is_ok = 1; # mirrors file seems fine, but is old $mirby_force_reload = 1; } else { # mirror file $mirby_path exists, is nonempty, and is reasonably fresh $mirby_file_is_ok = 1; } if (!$mirby_file_is_ok || $mirby_force_reload) { # fetch a fresh list of mirrors dbg("channel: DNS lookup on mirrors.$channel"); my @mirrors = do_dns_query("mirrors.$channel"); unless (@mirrors) { warn "error: no mirror data available for channel $channel\n"; channel_failed("channel: MIRRORED.BY file URL was not in DNS"); next; } foreach my $mirror (@mirrors) { my $result_fname; ($mirby, $result_fname) = http_get($mirror, $UPDDir, $mirby_path, $mirby_force_reload); if ($mirby) { dbg("channel: MIRRORED.BY file for channel %s retrieved", $channel); $mirby_file_is_ok = 1; $mirby_force_reload = 0; $preserve_files{$mirby_path} = 1; # set file creation time to now, otherwise we'll keep refreshing # (N.B.: curl preserves time of a downloaded file) my $now = time; utime($now, $now, $mirby_path) or warn "error: error setting creation time of $mirby_path: $!\n"; last; } dbg("channel: no mirror data available for channel %s from %s", $channel, $mirror); } if ($mirby_force_reload) { # not refreshed? warn "error: unable to refresh mirrors file for channel $channel, ". "using old file\n"; } } if (!$mirby_file_is_ok) { warn "error: no mirror data available for channel $channel\n"; channel_failed("channel: MIRRORED.BY file contents were missing"); next; } elsif ($mirby) { # file contents already in memory, no need to read it from a file } elsif (!open(MIRBY, $mirby_path)) { warn "error: error opening mirrors file $mirby_path: $!\n"; channel_failed("channel: error opening mirrors file $mirby_path: $!"); next; } else { dbg("channel: reading MIRRORED.BY file %s", $mirby_path); { local $/ = undef; $mirby = <MIRBY> } close(MIRBY) or die "cannot close $mirby_path: $!"; $preserve_files{$mirby_path} = 1; } # Parse the list of mirrors dbg("channel: parsing MIRRORED.BY file for channel %s", $channel); my %mirrors; my @mirrors = split(/^/, $mirby); while(my $mirror = shift @mirrors) { chomp $mirror; $mirror =~ s/#.*$//; # remove comments $mirror =~ s/^\s+//; # remove leading whitespace $mirror =~ s/\s+$//; # remove tailing whitespace next if $mirror eq ''; # skip empty lines # We only support HTTP (and HTTPS) right now if ($mirror !~ m{^https?://}i) { dbg("channel: skipping non-HTTP mirror: $mirror"); next; } dbg("channel: found mirror $mirror"); my @data; ($mirror,@data) = split(/\s+/, $mirror); $mirror =~ s{/+\z}{}; # http://example.com/updates/ -> .../updates $mirrors{$mirror}->{weight} = 1; foreach (@data) { my($k,$v) = split(/=/, $_, 2); $mirrors{$mirror}->{$k} = $v; } } unless (%mirrors) { warn "error: no mirrors available for channel $channel\n"; channel_failed("channel: no mirrors available"); next; } # Now that we've laid the foundation, go grab the appropriate files # my $path_content = File::Spec->catfile($UPDDir, "$newV.tar.gz"); my $path_sha512 = File::Spec->catfile($UPDDir, "$newV.tar.gz.sha512"); my $path_sha256 = File::Spec->catfile($UPDDir, "$newV.tar.gz.sha256"); my $path_asc = File::Spec->catfile($UPDDir, "$newV.tar.gz.asc"); # Loop through all available mirrors, choose from them randomly # if any get fails, choose another mirror to retry _all_ files again # sleep few seconds on retries my $download_ok = 0; while (my $mirror = choose_mirror(\%mirrors)) { my $result_fname; # Grab the data hash for this mirror, then remove it from the list my $mirror_info = $mirrors{$mirror}; delete $mirrors{$mirror}; # Make sure we start without files from existing tries unlink($path_content); unlink($path_sha512); unlink($path_sha256); unlink($path_asc); my $sleep_sec = 2; dbg("channel: selected mirror $mirror"); # Actual archive file ($content, $result_fname) = http_get("$mirror/$newV.tar.gz", $UPDDir); if (!$content) { dbg("channel: failed to get $newV.tar.gz from mirror $mirror, %s", %mirrors ? "sleeping $sleep_sec sec and trying next" : 'no mirrors left'); sleep($sleep_sec) if %mirrors; next; } # SHA512 of the archive file ($SHA512, $result_fname) = http_get("$mirror/$newV.tar.gz.sha512", $UPDDir); if (!$SHA512) { # If not found, try SHA256 instead ($SHA256, $result_fname) = http_get("$mirror/$newV.tar.gz.sha256", $UPDDir); if (!$SHA256) { # If not found, try SHA1 instead ($SHA1, $result_fname) = http_get("$mirror/$newV.tar.gz.sha1", $UPDDir); if (!$SHA1) { dbg("channel: No sha512 or sha256 file available from $mirror, %s", %mirrors ? "sleeping $sleep_sec sec and trying next" : 'no mirrors left'); sleep($sleep_sec) if %mirrors; next; } } } # if GPG is enabled, the GPG detached signature of the archive file if ($GPG_ENABLED) { ($GPG, $result_fname) = http_get("$mirror/$newV.tar.gz.asc", $UPDDir); if (!$GPG) { dbg("channel: No GPG/asc file available from $mirror, %s", %mirrors ? "sleeping $sleep_sec sec and trying next" : 'no mirrors left'); sleep($sleep_sec) if %mirrors; next; } } $download_ok = 1; last; } if ($download_ok) { if ($content) { $preserve_files{$path_content} = 1; } if ($SHA512) { $preserve_files{$path_sha512} = 1; } if ($SHA256) { $preserve_files{$path_sha256} = 1; } if ($GPG) { $preserve_files{$path_asc} = 1; } } } unless ($content && ($SHA512 || $SHA256 || $SHA1) && (!$GPG_ENABLED || $GPG)) { channel_failed("channel: could not find working mirror"); next; } if ( $SHA512 ) { # Validate the SHA512 signature { local($1); $SHA512 =~ /^([a-fA-F0-9]{128})\b/; $SHA512 = defined $1 ? lc($1) : 'INVALID'; } my $digest = sha512_hex($content); dbg("sha512: verification wanted: $SHA512"); dbg("sha512: verification result: $digest"); unless ($digest eq $SHA512) { channel_failed("channel '$channel': SHA512 verification failed"); next; } } if ( $SHA256 ) { # Validate the SHA256 signature { local($1); $SHA256 =~ /^([a-fA-F0-9]{64})\b/; $SHA256 = defined $1 ? lc($1) : 'INVALID'; } my $digest = sha256_hex($content); dbg("sha256: verification wanted: $SHA256"); dbg("sha256: verification result: $digest"); unless ($digest eq $SHA256) { channel_failed("channel '$channel': SHA256 verification failed"); next; } } if ($SHA1) { # Validate the SHA1 signature { local($1); $SHA1 =~ /^([a-fA-F0-9]{40})\b/; $SHA1 = defined $1 ? lc($1) : 'INVALID'; } my $digest = sha1_hex($content); dbg("sha1: verification wanted: $SHA1"); dbg("sha1: verification result: $digest"); unless ($digest eq $SHA1) { channel_failed("channel '$channel': SHA1 verification failed"); next; } } # Write the content out to a temp file for GPG/Archive::Tar interaction dbg("channel: populating temp content file %s", $content_file); open(TMP, ">$content_file") or die "fatal: cannot create content temp file $content_file: $!\n"; binmode TMP or die "fatal: cannot set binmode on content temp file $content_file: $!\n"; print TMP $content or die "fatal: cannot write to content temp file $content_file: $!\n"; close TMP or die "fatal: cannot close content temp file $content_file: $!\n"; # to sign : gpg -bas file # to verify: gpg --verify --batch --no-tty --status-fd=1 -q --logger-fd=1 file.asc file # look for : [GNUPG:] GOODSIG 6C55397824F434CE updates.spamassassin.org [...] # [GNUPG:] VALIDSIG 0C2B1D7175B852C64B3CDC716C55397824F434CE [...] # [GNUPG:] NO_PUBKEY 6C55397824F434CE if ($GPG) { dbg("gpg: populating temp signature file"); my $sig_file; ($sig_file, $tfh) = secure_tmpfile(); $tfh or die "fatal: couldn't create temp file for GPG signature: $!\n"; binmode $tfh or die "fatal: cannot set binmode on temp file for GPG signature: $!\n"; print $tfh $GPG or die "fatal: cannot write temp file for GPG signature: $!\n"; close $tfh or die "fatal: cannot close temp file for GPG signature: $!\n"; undef $tfh; dbg("gpg: calling gpg"); my $gpghome = interpolate_gpghomedir(); # TODO: we could also use "--keyserver pgp.mit.edu" or similar, # to autodownload missing keys... my $CMD = "$GPGPath $gpghome --verify --batch ". "--no-tty --status-fd=1 -q --logger-fd=1"; unless (open(CMD, "$CMD $sig_file $content_file|")) { unlink $sig_file or warn "error: cannot unlink $sig_file: $!\n"; die "fatal: couldn't execute $GPGPath: $!\n"; } # Determine the fate of the signature my $signer = ''; my $missingkeys = ''; while(my $GNUPG = <CMD>) { chop $GNUPG; dbg ("gpg: $GNUPG"); if ($GNUPG =~ /^gpg: fatal:/) { warn $GNUPG."\n"; # report bad news } local($1); if ($GNUPG =~ /^\Q[GNUPG:]\E NO_PUBKEY \S+(\S{8})$/) { $missingkeys .= $1." "; } next unless ($GNUPG =~ /^\Q[GNUPG:]\E (?:VALID|GOOD)SIG (\S{8,40})/); my $key = $1; # we want either a keyid (8) or a fingerprint (40) if (length $key > 8 && length $key < 40) { substr($key, 8) = ''; } # use the longest match we can find $signer = $key if (length $key > length $signer); } my $errno = 0; close CMD or $errno = $!; proc_status_ok($?,$errno) or warn("gpg: process '$GPGPath' finished: ". exit_status_str($?,$errno)."\n"); unlink $sig_file or warn "cannot unlink $sig_file: $!\n"; if ($signer) { my $keyid = substr $signer, -8; dbg("gpg: found signature made by key $signer"); if (exists $valid_GPG{$signer}) { dbg("gpg: key id $signer is release trusted"); } elsif (exists $valid_GPG{$keyid}) { dbg("gpg: key id $keyid is release trusted"); } else { dbg("gpg: key id $keyid is not release trusted"); $signer = undef; } } unless ($signer) { warn "error: GPG validation failed!\n"; if ($missingkeys) { warn <<ENDOFVALIDATIONERR; The update downloaded successfully, but it was not signed with a trusted GPG key. Instead, it was signed with the following keys: $missingkeys Perhaps you need to import the channel's GPG key? For example: wget http://spamassassin.apache.org/updates/GPG.KEY sa-update --import GPG.KEY ENDOFVALIDATIONERR } else { warn <<ENDOFVALIDATIONERR; The update downloaded successfully, but the GPG signature verification failed. ENDOFVALIDATIONERR } channel_failed("channel: GPG validation failed"); next; } } # OK, we're all validated at this point, install the new version dbg("channel: file verification passed, testing update"); dbg("channel: extracting archive"); if (!taint_safe_archive_extract($UPDTmp, $content_file)) { channel_failed("channel: archive extraction failed"); next; } # check --lint if (!lint_check_dir($UPDTmp)) { channel_failed("channel: lint check of update failed"); next; } dbg("channel: lint check succeeded, extracting archive to $UPDDir..."); my @totry = ( { 'try' => sub { if (-d $UPDDir) { # ok that worked, too late to stop now! At this stage, if there are # errors, we have to attempt to carry on regardless, since we've already # blown away the old ruleset. dbg("channel: point of no return for existing $UPDDir"); # clean out the previous channel files, if they exist if (-f $PREFile && ! unlink $PREFile ) { warn("channel: attempt to rm channel pre file failed, attempting to continue anyway: $!"); } if (-f $CFFile && ! unlink $CFFile ) { warn("channel: attempt to rm channel cf file failed, attempting to continue anyway: $!"); } if (!clean_update_dir($UPDDir, \%preserve_files)) { warn("channel: attempt to rm channel directory failed, attempting to continue anyway"); } } else { # create the dir, if it doesn't exist dbg("channel: creating $UPDDir"); mkpath([$UPDDir], 0, 0777) or die "channel: cannot create channel directory $UPDDir: $!\n"; # ok, that test worked. it's now likely that the .cf's will # similarly be ok to rename, too. Too late to stop from here on dbg("channel: point of no return for new $UPDDir"); } return 1; }, 'rollback' => sub { dbg("channel: attempting to remove the channel and update directories"); # bug 4941: try to get rid of the empty directories to avoid leaving SA # with no rules. rmdir $UPDDir or dbg("channel: error removing dir %s: %s", $UPDDir, $!); rmdir $opt{'updatedir'} or dbg("channel: error removing dir %s: %s", $opt{'updatedir'}, $!); }, }, { 'try' => sub { # extract the files again for the last time if (!taint_safe_archive_extract($UPDDir, $content_file)) { channel_failed("channel: archive extraction failed"); return 0; } return 1; }, 'rollback' => sub { dbg("channel: attempting to clean out the channel update directory"); # bug 4941: try to get rid of the empty directories to avoid leaving SA # with no rules. if (!clean_update_dir($UPDDir, \%preserve_files)) { warn "channel: attempt to clean up failed extraction also failed!\n"; } }, }, { 'try' => sub { if ($instfile) { dbg("channel: not creating MIRRORED.BY file due to --install"); return 1; } # The $mirby_path file should have already been created by http_get # and preserved past clean_update_dir() # # # Write out the mirby file, not fatal if it doesn't work # dbg("channel: creating MIRRORED.BY file"); # open(MBY, ">$mirby_path") # or die "cannot create a new MIRRORED.BY file: $!\n"; # print MBY $mirby or die "error writing to $mirby_path: $!"; # close(MBY) or die "cannot close $mirby_path: $!"; return 1; }, 'rollback' => sub { }, }, { 'try' => sub { # the last step is to create the .cf and .pre files to include the # channel files my @CF; my @PRE; dbg("channel: creating update cf/pre files"); # Put in whatever metadata we need push(@CF, "# UPDATE version $newV\n"); # Find all of the cf and pre files opendir(DIR, $UPDDir) or die "fatal: cannot access $UPDDir: $!\n"; my @files; while(my $file = readdir(DIR)) { next if $file eq '.' || $file eq '..'; untaint_var(\$file); my $path = File::Spec->catfile($UPDDir, $file); next unless (-f $path); # shouldn't ever happen push(@files, $file); } # bug 5371: ensure files are sorted foreach my $file ( sort @files ) { if ($file =~ /\.cf$/) { push(@CF, "include $nicechannel/$file\n"); } elsif ($file =~ /\.pre$/) { push(@PRE, "include $nicechannel/$file\n"); } else { next; } dbg("channel: adding $file"); } closedir(DIR) or die "cannot close directory $UPDDir: $!"; # Finally, write out the files to include the update files if (!write_channel_file($PREFile, \@PRE)) { channel_failed("channel: writing of $PREFile failed"); return 0; } if (!write_channel_file($CFFile, \@CF)) { channel_failed("channel: writing of $CFFile failed"); return 0; } # if all went fine, remove the .tar.gz, .sha* and .asc files delete_files( grep(!m{/\QMIRRORED.BY\E\z}, keys %preserve_files) ); $channel_successes++; dbg("channel: update complete"); return 1; }, 'rollback' => sub { }, }, ); my $error; my $eval_stat; for(my $elem = 0; $elem <= $#totry; $elem++) { my $success; eval { $success = &{$totry[$elem]->{'try'}}(); 1; } or do { $eval_stat = $@ ne '' ? $@ : "errno=$!"; chomp $eval_stat; }; if (!$success) { $error = $elem; $eval_stat = "step $elem unsuccessful" if !defined $eval_stat; last; } } if (defined $error) { dbg("channel: channel failed, attempting rollback: %s", $eval_stat); for(my $elem = $error; $elem >= 0; $elem--) { &{$totry[$elem]->{'rollback'}}(); } } } ############################################################################## # clean out the temp dir if ($UPDTmp) { dbg("generic: cleaning up temporary directory/files"); if (!clean_update_dir($UPDTmp)) { warn "error: unable to clean out the files in $UPDTmp\n"; } } # clear out the temp files if they still exist foreach ( $content_file, $UPDTmp ) { next unless defined $_; my $stat_errn = stat($_) ? 0 : 0+$!; next if $stat_errn == ENOENT; if ($stat_errn != 0) { warn "error: cannot access $_: $!\n"; } elsif (-d _) { rmdir $_ or warn "error: cannot remove directory $_: $!\n"; } elsif (-f _) { unlink $_ or warn "error: cannot remove file $_: $!\n"; } else { warn "error: '$_' isn't a file nor a directory, skipping\n"; } } my $exit; if ($lint_failures) { # 2: lint of site pre files failed, cannot continue $exit = 2; } elsif (!$channel_failures) { # 0: updates found and successfully applied # 1: no updates were needed (success with nothing to do) $exit = $channel_successes ? 0 : 1; } else { # at least some failures # 3: some failures, but at least one channel suceeded # 4 or higher means all channels failed $exit = $channel_successes ? 3 : 4; } dbg("diag: updates complete, exiting with code $exit"); if ($opt{'verbose'}) { if (!$exit) { if (defined $opt{'checkonly'}) { print "Update was available, but not installed in checkonly mode\n"; } else { print "Update was available, and was downloaded and installed successfully\n"; } } elsif ($exit == 1) { print "Update finished, no fresh updates were available\n"; } elsif ($exit == 3) { print "Update of at least one channel finished, other updates failed\n"; } else { print "Update failed, exiting with code $exit\n"; } } exit $exit; ############################################################################## sub read_install_file { my ($file) = @_; open (IN, "<$file") or die "cannot open $file\n"; my $all; { local $/ = undef; $all = <IN> } close IN or die "cannot close $file: $!"; return $all; } ############################################################################## sub write_channel_file { my ($filename, $contents) = @_; return 1 unless @{$contents}; if (open(FILE, ">$filename")) { print FILE @{$contents} or die "cannot write to $filename: $!"; close FILE or return 0; return 1; } return 0; } ############################################################################## sub channel_failed { my $reason = shift; warn("$reason, channel failed\n"); $channel_failures++; } ############################################################################## sub taint_safe_archive_extract { my $todir = shift; my $input = shift; my $tfh = IO::Zlib->new($input, "rb"); $tfh or die "fatal: couldn't read content tmpfile $content_file: $!\n"; my $tar = Archive::Tar->new($tfh); $tar or die "fatal: couldn't open tar archive!\n"; # stupid Archive::Tar is not natively taint-safe! duh. # return $tar->extract(); # instead, get the file list, untaint, and extract one-by-one. my @files = $tar->list_files(); foreach my $file (@files) { next if ($file =~ /^\/$/); # ignore dirs local($1); $file =~ /^([-\.\,\/a-zA-Z0-9_]+)$/; my $outfname = $1; $outfname =~ s/\.\.\//__\//gs; # avoid "../" dir traversal attacks $outfname = File::Spec->catfile($todir, $outfname); dbg "extracting: $outfname"; if (!open OUT, ">".$outfname) { warn "error: failed to create $outfname: $!"; goto failed; } else { my $content = $tar->get_content($file); if ($outfname =~ /\.(?:pre|cf)$/) { # replace macros in the update files if it's a .pre or .cf local($1); $content =~ s/\@\@([^\@]+)\@\@/$MACRO_VALUES{$1} || "\@\@$1\@\@"/ge; # also, if --allowplugins is not specified, comment out # all loadplugin or tryplugin lines if ( !$opt{'allowplugins'} ) { $content =~ s{^\s*((?:load|try)plugin|bayes_store_module|auto_whitelist_factory)\b} {#(commented by sa-update, no --allowplugins switch specified)# $1}gmx; } } print OUT $content or do { warn "error writing to $outfname: $!"; goto failed }; close OUT or do { warn "error: write failed to $outfname: $!"; goto failed } } } return @files; failed: return; # undef = failure } ############################################################################## # Do a generic DNS query sub do_dns_query { my($query, $rr_type) = @_; $rr_type = 'TXT' if !defined $rr_type; my $RR = $res->query($query, $rr_type); my @result; # NOTE: $rr->rdatastr returns the result encoded in a DNS zone file # format, i.e. enclosed in double quotes if a result contains whitespace # (or other funny characters), and may use \DDD encoding or \X quoting as # per RFC 1035. Using $rr->txtdata instead avoids this unnecessary encoding # step and a need for decoding by a caller, returning an unmodified string. # Caveat: in case of multiple RDATA <character-string> fields contained # in a resource record (TXT, SPF, HINFO), starting with Net::DNS 0.69 # the $rr->txtdata in a list context returns these strings as a list. # The $rr->txtdata in a scalar context always returns a single string # with <character-string> fields joined by a single space character as # a separator. The $rr->txtdata in Net::DNS 0.68 and older returned # such joined space-separated string even in a list context. # # From Net::DNS maintainers (Willem Toorop, NLnet Labs): # I encourage you to use txtdata for getting the values of # <version>.updates.spamassassin.org and mirros.updates.spamassassin.org. # As those records have only a single rdata field, txtdata would return # the same value since Net::DNS 0.34. # if ($RR) { foreach my $rr ($RR->answer) { next if !$rr; # no answer records, only rcode next if $rr->type ne $rr_type; # scalar context! my $text = $rr->UNIVERSAL::can('txtdata') ? $rr->txtdata : $rr->rdatastr; push(@result,$text) if defined $text && $text ne ''; } printf("DNS %s query: %s -> %s\n", $rr_type, $query, join(", ",@result)) if $opt{'verbose'} && $opt{'verbose'} > 1; } else { dbg("dns: query failed: $query => " . $res->errorstring); printf("DNS %s query %s failed: %s\n", $rr_type, $query, $res->errorstring) if $opt{'verbose'} && $opt{'verbose'} > 1; } return @result; } ############################################################################## sub init_lwp { if ($have_inet6 && (!$opt{'force_pf'} || $opt{'force_pf'} eq 'inet6') && ($io_socket_module_name eq 'IO::Socket::IP' || $io_socket_module_name eq 'IO::Socket::INET6') ) { # LWP module has no support for IPv6. Use hotpatching, # copying IO::Socket::IP or IO::Socket::INET6 to IO::Socket::INET. # 'Borrowed' from Net::INET6Glue::INET_is_INET6 : printf("http: (lwp) hotpatching IO::Socket::INET by module %s\n", $io_socket_module_name) if $opt{'verbose'}; my $io_socket_module_hash_name = $io_socket_module_name . '::'; my $io_socket_module_path = $io_socket_module_name . '.pm'; $io_socket_module_path =~ s{::}{/}g; $INC{'IO/Socket/INET.pm'} = $INC{$io_socket_module_path}; no strict 'refs'; no warnings 'redefine'; for ( keys %{$io_socket_module_hash_name} ) { ref(my $v = $io_socket_module_hash_name->{$_}) and next; *{ 'IO::Socket::INET::'.$_ } = \&{ $io_socket_module_hash_name . $_ } if *{$v}{CODE}; } } my $ua = LWP::UserAgent->new(); $ua->agent("sa-update/$VERSION/$SAVersion"); $ua->timeout(60); # a good long timeout; 10 is too short for Coral! $ua->env_proxy; # if ($opt{'force_pf'}) { # # No longer needed and can be harmful as we don't know which address family # # will be picked by the IO::Socket::* module in case of multihomed servers. # # The IO::Socket::IP should choose the right protocol family automatically. # if ($have_inet4 && $opt{'force_pf'} eq 'inet') { # $ua->local_address('0.0.0.0'); # } elsif ($have_inet6 && $opt{'force_pf'} eq 'inet6') { # $ua->local_address('::'); # } # } return $ua; } # Do a GET request via HTTP for a certain URL # Use the optional time_t value to do an IMS GET sub http_get_lwp { my($url, $ims, $dir) = @_; $have_lwp or die "http_get_lwp: module LWP not available"; $ua = init_lwp() if !$ua; my $response; my $text; # retry 3 times; this works better with Coral foreach my $retries (1 .. 3) { my $request = HTTP::Request->new("GET"); $request->url($url); if (defined $ims) { my $str = time2str($ims); $request->header('If-Modified-Since', $str); dbg("http: IMS GET request, $url, $str"); } else { dbg("http: GET request, $url"); } $response = $ua->request($request); printf("http: (lwp) %sGET %s, %s\n", defined $ims ? 'IMS ' : '', $url, !$response ? '(no response)' : $response->status_line ) if $opt{'verbose'}; if ($response->is_success) { return $response->content; } # could be a "304 not modified" or similar. # TODO: should use a special return type for "not modified" here # instead of overloading the failure return type if ($ims && $response->status_line =~ /^3/) { return; } if ($response->status_line =~ /^[45]/) { # client error or server error, makes no sense retrying return; } # include the text in the debug output; it's useful in some cases, # e.g. proxies that require authentication, diagnosing fascist # filtering false positives, etc. $text = $response->content; $text ||= "(no body)"; $text =~ s/\s+/ /gs; dbg ("http: GET $url request failed, retrying: " . $response->status_line.": ".$text); } # this should be a user-readable warning without --debug warn "http: GET $url request failed: " . $response->status_line.": ".$text."\n"; return; } # Do a GET request via HTTP for a given URL using an external program, # or fall back to LWP if no external downloading program is available. # Use the optional time_t value to do an IMS GET sub http_get { my($url, $dir, $suggested_out_fname, $force_reload) = @_; my $content; my $out_fname; if (defined $suggested_out_fname) { $out_fname = $suggested_out_fname; } else { local $1; $url =~ m{([^/]*)\z}s; my $url_fname = $1; $out_fname = File::Spec->catfile($dir, $url_fname); } $out_fname = untaint_var($out_fname); # construct a short filename, relative to a current working directory $dir my $out_fname_short = $out_fname; $out_fname_short =~ s{^\Q$dir\E/*}{}; printf("fetching %s\n", $url) if $opt{'verbose'} && $opt{'verbose'} > 1; dbg("http: url: %s", $url); my $out_fname_exists = -e $out_fname; dbg("http: downloading to: %s, %s", $out_fname, !$out_fname_exists ? 'new' : $force_reload ? 'replace' : 'update'); my($ext_prog, $cmd, @args); foreach my $try_prog ('curl', 'wget', 'fetch') { $cmd = Mail::SpamAssassin::Util::find_executable_in_env_path($try_prog); if (defined $cmd && $cmd ne '') { $ext_prog = $try_prog; last } } if (defined $ext_prog && $ext_prog eq 'curl') { push(@args, qw(-s -L -O --remote-time -g --max-redirs 2 --connect-timeout 30 --max-time 300 --fail -o), $out_fname_short); push(@args, '-z', $out_fname_short) if $out_fname_exists && !$force_reload; } elsif (defined $ext_prog && $ext_prog eq 'wget') { push(@args, qw(-q -N --max-redirect=2 --tries=3 --dns-timeout=20 --connect-timeout=30 --read-timeout=300 -o), $out_fname_short); #*** ??? if $out_fname_exists && !$force_reload; } elsif (defined $ext_prog && $ext_prog eq 'fetch') { push(@args, qw(-q -n -a -w 20 -m -o), $out_fname_short); push(@args, '-m') if $out_fname_exists && !$force_reload; } elsif ($have_lwp) { dbg("http: no external tool for download, fallback to using LWP"); my $ims; if ($out_fname_exists && !$force_reload) { my @out_fname_stat = stat($out_fname); my $size = $out_fname_stat[7]; $ims = $out_fname_stat[9] if $size; # only if nonempty } my $out_fh = IO::File->new; $out_fh->open($out_fname,'>',0640) or die "Cannot create a file $out_fname: $!"; binmode($out_fh) or die "Can't set binmode on $out_fname: $!"; $content = http_get_lwp($url, $ims, $dir); if (!defined $content) { dbg("http: (lwp) no content downloaded from %s", $url); } else { $out_fh->print($content) or die "Error writing to $out_fname: $!"; } $out_fh->close or die "Error closing file $out_fname: $!"; return ($content, $out_fname); } else { die "http: no downloading tool available"; } # only reached if invoking an external program is needed (not lwp) if ($opt{'force_pf'}) { if ($opt{'force_pf'} eq 'inet') { push(@args, '-4') } elsif ($opt{'force_pf'} eq 'inet6') { push(@args, '-6') } } push(@args, '--', untaint_var($url)); dbg("http: %s", join(' ',$cmd,@args)); # avoid a system() call, use fork/exec to make sure we avoid invoking a shell my $pid; eval { # use eval, the fork() sometimes signals an error # instead of returning a failure status $pid = fork(); 1; } or do { $@ = "errno=$!" if $@ eq ''; chomp $@; die "http fork: $@" }; defined $pid or die "spawning $cmd failed: $!"; if (!$pid) { # child chdir($dir) or die "Can't chdir to $dir: $!"; $cmd = untaint_file_path($cmd); exec {$cmd} ($cmd,@args); die "failed to exec $cmd: $!"; } # parent waitpid($pid,0); my $child_stat = $?; dbg("http: process [%s], exit status: %s", $pid, $child_stat); if (!$opt{'verbose'}) { # silent } elsif ($child_stat == 0) { printf("http: (%s) GET %s, success\n", $ext_prog, $url); } else { printf("http: (%s) GET %s, FAILED, status: %s\n", $ext_prog, $url, $child_stat); } if ($child_stat == 0) { my $inp = IO::File->new; $inp->open($out_fname,'<') or die "Cannot open file $out_fname: $!"; my($nbytes,$buff); $content = ''; while (($nbytes=$inp->read($buff,16384)) > 0) { $content .= $buff } defined $nbytes or die "Error reading from file $out_fname: $!"; $inp->close or die "Error closing $out_fname: $!"; } return ($content, $out_fname); } ############################################################################## # choose a random integer between 0 and the total weight of all mirrors # loop through the mirrors from largest to smallest weight # if random number is < largest weight, use it # otherwise, random number -= largest, remove mirror from list, try again # eventually, there'll just be 1 mirror left in $mirrors[0] and it'll be used # sub choose_mirror { my($mirror_list) = @_; # Sort the mirror list by reverse weight (largest first) my @mirrors = sort { $mirror_list->{$b}->{weight} <=> $mirror_list->{$a}->{weight} } keys %{$mirror_list}; return unless @mirrors; if (keys %{$mirror_list} > 1) { # Figure out the total weight my $weight_total = 0; foreach (@mirrors) { $weight_total += $mirror_list->{$_}->{weight}; } # Pick a random int my $value = int(rand($weight_total)); # loop until we find the right mirror, or there's only 1 left while (@mirrors > 1) { if ($value < $mirror_list->{$mirrors[0]}->{weight}) { last; } $value -= $mirror_list->{$mirrors[0]}->{weight}; shift @mirrors; } } return $mirrors[0]; } ############################################################################## sub print_version { print "sa-update version $VERSION\n" . " running on Perl version " . join(".", map { $_||=0; $_*1 } ($] =~ /(\d)\.(\d{3})(\d{3})?/ )) . "\n"; } ############################################################################## sub print_usage_and_exit { my ( $message, $exitval ) = @_; $exitval ||= 64; if ($exitval == 0) { print_version(); print("\n"); } pod2usage( -verbose => 0, -message => $message, -exitval => $exitval, ); } ############################################################################## sub usage { my ( $verbose, $message ) = @_; print "sa-update version $VERSION\n"; pod2usage( -verbose => $verbose, -message => $message, -exitval => 64 ); } ############################################################################## sub interpolate_gpghomedir { my $gpghome = ''; if ($opt{'gpghomedir'}) { $gpghome = $opt{'gpghomedir'}; if (am_running_on_windows()) { # windows is single-quote-phobic; bug 4958 cmt 7 $gpghome =~ s/\"/\\\"/gs; $gpghome = "--homedir=\"$gpghome\""; } else { $gpghome =~ s/\'/\\\'/gs; $gpghome = "--homedir='$gpghome'"; } } return $gpghome; } ############################################################################## sub import_gpg_key { my $keyfile = shift; my $gpghome = interpolate_gpghomedir(); my $CMD = "$GPGPath $gpghome --batch ". "--no-tty --status-fd=1 -q --logger-fd=1 --import"; unless (open(CMD, "$CMD $keyfile|")) { die "fatal: couldn't execute $GPGPath: $!\n"; } # Determine the fate of the signature while(my $GNUPG = <CMD>) { chop $GNUPG; dbg ("gpg: $GNUPG"); if ($GNUPG =~ /^gpg: /) { warn $GNUPG."\n"; # report bad news } if ($GNUPG =~ /^IMPORTED /) { dbg("gpg: gpg key imported successfully"); } } my $errno = 0; close CMD or $errno = $!; proc_status_ok($?,$errno) or warn("gpg: process '$CMD' finished: ".exit_status_str($?,$errno)."\n"); return ($? >> 8); } ############################################################################## sub import_default_keyring { my $defkey = File::Spec->catfile ($DEF_RULES_DIR, "sa-update-pubkey.txt"); unless (-f $defkey) { dbg("gpg: import of default keyring failed, couldn't find sa-update-pubkey.txt"); return; } dbg("gpg: importing default keyring to ".$opt{gpghomedir}); unless (-d $opt{gpghomedir}) { # use 0700 to avoid "unsafe permissions" warning mkpath([$opt{'gpghomedir'}], 0, 0700) or die "cannot mkpath $opt{gpghomedir}: $!"; } import_gpg_key($defkey); } ############################################################################## sub is_valid_gpg_key_id { # either a keyid (8 bytes) or a fingerprint (40 bytes) return ($_[0] =~ /^[a-fA-F0-9]+$/ && (length $_[0] == 8 || length $_[0] == 40)); } ############################################################################## sub clean_update_dir { my($dir, $preserve_files_ref) = @_; dbg("generic: cleaning directory %s", $dir); unless (opendir(DIR, $dir)) { warn "error: cannot opendir $dir: $!\n"; dbg("generic: attempt to opendir ($dir) failed"); return; } while(my $file = readdir(DIR)) { next if $file eq '.' || $file eq '..'; my $path = File::Spec->catfile($dir, $file); if ($preserve_files_ref && $preserve_files_ref->{$path}) { dbg("generic: preserving $file"); next; } untaint_var(\$path); next unless -f $path; dbg("generic: unlinking $file"); if (!unlink $path) { warn "error: cannot remove file $path: $!\n"; closedir(DIR) or die "cannot close directory $dir: $!"; return; } } closedir(DIR) or die "cannot close directory $dir: $!"; return 1; } sub delete_files { my(@filenames) = @_; foreach my $path (@filenames) { dbg("generic: unlinking $path"); unlink $path or warn "error: cannot unlink file $path: $!\n"; } return 1; } ############################################################################## sub lint_check_dir { my $dir = shift; # due to the Logger module's globalness (all M::SA objects share the same # Logger setup), we can't change the debug level here to only include # "config" or otherwise be more terse. :( my $spamtest = new Mail::SpamAssassin( { rules_filename => $dir, site_rules_filename => $LOCAL_RULES_DIR, ignore_site_cf_files => 1, userprefs_filename => File::Spec->catfile($dir, "doesnotexist"), local_tests_only => 1, dont_copy_prefs => 1, PREFIX => $PREFIX, DEF_RULES_DIR => $DEF_RULES_DIR, LOCAL_RULES_DIR => $LOCAL_RULES_DIR, LOCAL_STATE_DIR => $LOCAL_STATE_DIR, }); # need to kluge disabling bayes since it may try to expire the DB, and # without the proper config it's not going to be good. $spamtest->{conf}->{use_bayes} = 0; my $res = $spamtest->lint_rules(); $spamtest->finish(); return $res == 0; } ############################################################################## =head1 NAME sa-update - automate SpamAssassin rule updates =head1 SYNOPSIS B<sa-update> [options] Options: --channel channel Retrieve updates from this channel Use multiple times for multiple channels --channelfile file Retrieve updates from the channels in the file --checkonly Check for update availability, do not install --install filename Install updates directly from this file. Signature verification will use "file.asc", "file.sha512", "file.sha256" and "file.sha1" --allowplugins Allow updates to load plugin code --gpgkey key Trust the key id to sign releases Use multiple times for multiple keys --gpgkeyfile file Trust the key ids in the file to sign releases --gpghomedir path Store the GPG keyring in this directory --gpg and --nogpg Use (or do not use) GPG to verify updates (--gpg is assumed by use of the above --gpgkey and --gpgkeyfile options) --import file Import GPG key(s) from file into sa-update's keyring. Use multiple times for multiple files --updatedir path Directory to place updates, defaults to the SpamAssassin site rules directory (default: /var/lib/spamassassin/3.004000) --refreshmirrors Force the MIRRORED.BY file to be updated -D, --debug [area=n,...] Print debugging messages -v, --verbose Be verbose, like print updated channel names; For more verbosity specify multiple times -V, --version Print version -h, --help Print usage message -4 Force using the inet protocol (IPv4), not inet6 -6 Force using the inet6 protocol (IPv6), not inet =head1 DESCRIPTION sa-update automates the process of downloading and installing new rules and configuration, based on channels. The default channel is I<updates.spamassassin.org>, which has updated rules since the previous release. Update archives are verified using SHA512, SHA256 and SHA1 hashes and GPG signatures, by default. Note that C<sa-update> will not restart C<spamd> or otherwise cause a scanner to reload the now-updated ruleset automatically. Instead, C<sa-update> is typically used in something like the following manner: sa-update && /etc/init.d/spamassassin reload This works because C<sa-update> only returns an exit status of C<0> if it has successfully downloaded and installed an updated ruleset. The program sa-update uses the underlying operating system umask for the updated rule files it installs. You may wish to run sa-update from a script that sets the umask prior to calling sa-update. For example: #!/bin/sh umask 022 sa-update =head1 OPTIONS =over 4 =item B<--channel> sa-update can update multiple channels at the same time. By default, it will only access "updates.spamassassin.org", but more channels can be specified via this option. If there are multiple additional channels, use the option multiple times, once per channel. i.e.: sa-update --channel foo.example.com --channel bar.example.com =item B<--channelfile> Similar to the B<--channel> option, except specify the additional channels in a file instead of on the commandline. This is useful when there are a lot of additional channels. =item B<--checkonly> Only check if an update is available, don't actually download and install it. The exit code will be C<0> or C<1> as described below. =item B<--install> Install updates "offline", from the named tar.gz file, instead of performing DNS lookups and HTTP invocations. Files named B<file>.sha512, B<file>.sha256, B<file>.sha1 and B<file>.asc will be used for the SHA512, SHA256 and SHA1 hashes and GPG signature, respectively. The filename provided must contain a version number of at least 3 digits, which will be used as the channel's update version number. Multiple B<--channel> switches cannot be used with B<--install>. To install multiple channels from tarballs, run C<sa-update> multiple times with different B<--channel> and B<--install> switches, e.g.: sa-update --channel foo.example.com --install foo-34958.tgz sa-update --channel bar.example.com --install bar-938455.tgz =item B<--allowplugins> Allow downloaded updates to activate plugins. The default is not to activate plugins; any C<loadplugin> or C<tryplugin> lines will be commented in the downloaded update rules files. =item B<--gpg>, B<--nogpg> sa-update by default will verify update archives by use of SHA512, SHA256 and SHA1 checksums and GPG signature. SHA* hashes can verify whether or not the downloaded archive has been corrupted, but it does not offer any form of security regarding whether or not the downloaded archive is legitimate (aka: non-modifed by evildoers). GPG verification of the archive is used to solve that problem. If you wish to skip GPG verification, you can use the B<--nogpg> option to disable its use. Use of the following gpgkey-related options will override B<--nogpg> and keep GPG verification enabled. Note: Currently, only GPG itself is supported (ie: not PGP). v1.2 has been tested, although later versions ought to work as well. =item B<--gpgkey> sa-update has the concept of "release trusted" GPG keys. When an archive is downloaded and the signature verified, sa-update requires that the signature be from one of these "release trusted" keys or else verification fails. This prevents third parties from manipulating the files on a mirror, for instance, and signing with their own key. By default, sa-update trusts key ids C<24F434CE> and C<5244EC45>, which are the standard SpamAssassin release key and its sub-key. Use this option to trust additional keys. See the B<--import> option for how to add keys to sa-update's keyring. For sa-update to use a key it must be in sa-update's keyring and trusted. For multiple keys, use the option multiple times. i.e.: sa-update --gpgkey E580B363 --gpgkey 298BC7D0 Note: use of this option automatically enables GPG verification. =item B<--gpgkeyfile> Similar to the B<--gpgkey> option, except specify the additional keys in a file instead of on the commandline. This is extremely useful when there are a lot of additional keys that you wish to trust. =item B<--gpghomedir> Specify a directory path to use as a storage area for the C<sa-update> GPG keyring. By default, this is /etc/mail/spamassassin/sa-update-keys =item B<--import> Use to import GPG key(s) from a file into the sa-update keyring which is located in the directory specified by B<--gpghomedir>. Before using channels from third party sources, you should use this option to import the GPG key(s) used by those channels. You must still use the B<--gpgkey> or B<--gpgkeyfile> options above to get sa-update to trust imported keys. To import multiple keys, use the option multiple times. i.e.: sa-update --import channel1-GPG.KEY --import channel2-GPG.KEY Note: use of this option automatically enables GPG verification. =item B<--refreshmirrors> Force the list of sa-update mirrors for each channel, stored in the MIRRORED.BY file, to be updated. By default, the MIRRORED.BY file will be cached for up to 7 days after each time it is downloaded. =item B<--updatedir> By default, C<sa-update> will use the system-wide rules update directory: /var/lib/spamassassin/3.004000 If the updates should be stored in another location, specify it here. Note that use of this option is not recommended; if you're just using sa-update to download updated rulesets for a scanner, and sa-update is placing updates in the wrong directory, you probably need to rebuild SpamAssassin with different C<Makefile.PL> arguments, instead of overriding sa-update's runtime behaviour. =item B<-D> [I<area,...>], B<--debug> [I<area,...>] Produce debugging output. If no areas are listed, all debugging information is printed. Diagnostic output can also be enabled for each area individually; I<area> is the area of the code to instrument. For example, to produce diagnostic output on channel, gpg, and http, use: sa-update -D channel,gpg,http For more information about which areas (also known as channels) are available, please see the documentation at L<http://wiki.apache.org/spamassassin/DebugChannels>. =item B<-h>, B<--help> Print help message and exit. =item B<-V>, B<--version> Print sa-update version and exit. =back =head1 EXIT CODES An exit code of C<0> means an update was available, and was downloaded and installed successfully if --checkonly was not specified. An exit code of C<1> means no fresh updates were available. An exit code of C<2> means that at least one update is available but that a lint check of the site pre files failed. The site pre files must pass a lint check before any updates are attempted. An exit code of C<3> means that at least one update succeeded while other channels failed. If using sa-compile, you should proceed with it. An exit code of C<4> or higher, indicates that errors occurred while attempting to download and extract updates, and no channels were updated. =head1 SEE ALSO Mail::SpamAssassin(3) Mail::SpamAssassin::Conf(3) spamassassin(1) spamd(1) <http://wiki.apache.org/spamassassin/RuleUpdates> =head1 PREREQUESITES C<Mail::SpamAssassin> =head1 BUGS See <http://issues.apache.org/SpamAssassin/> =head1 AUTHORS The Apache SpamAssassin(tm) Project <http://spamassassin.apache.org/> =head1 COPYRIGHT SpamAssassin is distributed under the Apache License, Version 2.0, as described in the file C<LICENSE> included with the distribution. =cut
Close