Linux iad1-shared-b7-18 6.6.49-grsec-jammy+ #10 SMP Thu Sep 12 23:23:08 UTC 2024 x86_64
Apache
: 67.205.6.31 | : 216.73.216.47
Cant Read [ /etc/named.conf ]
8.2.29
fernandoquevedo
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
README
+ Create Folder
+ Create File
/
usr /
bin /
[ HOME SHELL ]
Name
Size
Permission
Action
X11
[ DIR ]
drwxr-xr-x
mh
[ DIR ]
drwxr-xr-x
411toppm
18.02
KB
-rwxr-xr-x
AutoSearch
66.17
KB
-rwxr-xr-x
GET
15.82
KB
-rwxr-xr-x
HEAD
15.82
KB
-rwxr-xr-x
Mail
110.4
KB
-rwxr-xr-x
NF
963
B
-rwxr-xr-x
POST
15.82
KB
-rwxr-xr-x
SOAPsh
2.75
KB
-rwxr-xr-x
VGAuthService
134.54
KB
-rwxr-xr-x
WebSearch
11.78
KB
-rwxr-xr-x
X
274
B
-rwxr-xr-x
Xorg
274
B
-rwxr-xr-x
[
50.44
KB
-rwxr-xr-x
aa-enabled
34.52
KB
-rwxr-xr-x
aa-exec
34.52
KB
-rwxr-xr-x
aa-features-abi
30.52
KB
-rwxr-xr-x
ab
58.43
KB
-rwxr-xr-x
ac
30.95
KB
-rwxr-xr-x
ack
72.86
KB
-rwxr-xr-x
aclocal
35.18
KB
-rwxr-xr-x
aclocal-1.16
35.18
KB
-rwxr-xr-x
acorn
62
B
-rwxr-xr-x
add-apt-repository
14.14
KB
-rwxr-xr-x
add-patch
8.14
KB
-rwxr-xr-x
addftinfo
26.46
KB
-rwxr-xr-x
addpart
14.38
KB
-rwxr-xr-x
addr2line
26.7
KB
-rwxr-xr-x
addr2name
50
B
-rwxr-xr-x
afm2pl
38.53
KB
-rwxr-xr-x
afm2tfm
52.56
KB
-rwxr-xr-x
afmtodit
161.91
KB
-rwxr-xr-x
agentxtrap
26.38
KB
-rwxr-xr-x
aleph
523.81
KB
-rwxr-xr-x
alpine
6.53
MB
-rwxr-xr-x
alpinef
6.53
MB
-rwxr-xr-x
analog
443.84
KB
-rwxr-xr-x
animate
14.15
KB
-rwxr-xr-x
animate-im6
14.15
KB
-rwxr-xr-x
animate-im6.q16
14.15
KB
-rwxr-xr-x
annotate
14.15
KB
-rwxr-xr-x
annotate-output
2.19
KB
-rwxr-xr-x
anytopnm
5.55
KB
-rwxr-xr-x
appletviewer
14.32
KB
-rwxr-xr-x
apport-bug
2.51
KB
-rwxr-xr-x
apport-cli
13.05
KB
-rwxr-xr-x
apport-collect
2.51
KB
-rwxr-xr-x
apport-unpack
2.02
KB
-rwxr-xr-x
appres
14.3
KB
-rwxr-xr-x
apropos
47.28
KB
-rwxr-xr-x
apt
18.38
KB
-rwxr-xr-x
apt-add-repository
14.14
KB
-rwxr-xr-x
apt-cache
82.47
KB
-rwxr-xr-x
apt-cdrom
26.47
KB
-rwxr-xr-x
apt-config
26.39
KB
-rwxr-xr-x
apt-extracttemplates
22.47
KB
-rwxr-xr-x
apt-ftparchive
230.48
KB
-rwxr-xr-x
apt-get
50.47
KB
-rwxr-xr-x
apt-key
27.51
KB
-rwxr-xr-x
apt-mark
50.47
KB
-rwxr-xr-x
apt-sortpkgs
38.4
KB
-rwxr-xr-x
aptitude
3.36
MB
-rwxr-xr-x
aptitude-changelog-parser
522
B
-rwxr-xr-x
aptitude-create-state-bundle
1.89
KB
-rwxr-xr-x
aptitude-curses
3.36
MB
-rwxr-xr-x
aptitude-run-state-bundle
2.78
KB
-rwxr-xr-x
ar
54.48
KB
-rwxr-xr-x
arch
30.51
KB
-rwxr-xr-x
archpath
1.24
KB
-rwxr-xr-x
as
456.4
KB
-rwxr-xr-x
asciitopgm
14.02
KB
-rwxr-xr-x
aspell
142.48
KB
-rwxr-xr-x
aspell-import
2
KB
-rwxr-xr-x
at
54.32
KB
-rwsr-sr-x
atktopbm
14.02
KB
-rwxr-xr-x
atq
54.32
KB
-rwsr-sr-x
atrm
54.32
KB
-rwsr-sr-x
attr
14.3
KB
-rwxr-xr-x
autoconf
14.85
KB
-rwxr-xr-x
autoexpect
7.53
KB
-rwxr-xr-x
autoheader
8.82
KB
-rwxr-xr-x
autom4te
32.69
KB
-rwxr-xr-x
automake
255.91
KB
-rwxr-xr-x
automake-1.16
255.91
KB
-rwxr-xr-x
autopasswd
378
B
-rwxr-xr-x
autoreconf
26.3
KB
-rwxr-xr-x
autoscan
16.77
KB
-rwxr-xr-x
autosp
46.32
KB
-rwxr-xr-x
autoupdate
33.22
KB
-rwxr-xr-x
awk
688.46
KB
-rwxr-xr-x
aws
815
B
-rwxr-xr-x
aws_completer
1.11
KB
-rwxr-xr-x
axohelp
78.39
KB
-rwxr-xr-x
b2sum
50.52
KB
-rwxr-xr-x
base32
34.51
KB
-rwxr-xr-x
base64
34.51
KB
-rwxr-xr-x
basename
34.51
KB
-rwxr-xr-x
basenc
46.51
KB
-rwxr-xr-x
bash
1.33
MB
-rwxr-xr-x
bashbug
6.66
KB
-rwxr-xr-x
batch
152
B
-rwxr-xr-x
bc
90.82
KB
-rwxr-xr-x
bdf2gdfont
4.58
KB
-rwxr-xr-x
bdftogd
3.9
KB
-rwxr-xr-x
benchmark
584
B
-rwxr-xr-x
bibtex
114.38
KB
-rwxr-xr-x
bibtex.original
114.38
KB
-rwxr-xr-x
bibtex8
138.95
KB
-rwxr-xr-x
bibtexu
146.91
KB
-rwxr-xr-x
bioradtopgm
14.02
KB
-rwxr-xr-x
bison
492.8
KB
-rwxr-xr-x
bison.yacc
4.12
KB
-rwxr-xr-x
bmptopnm
18.05
KB
-rwxr-xr-x
bmptoppm
18.05
KB
-rwxr-xr-x
boltctl
122.98
KB
-rwxr-xr-x
bootctl
70.49
KB
-rwxr-xr-x
botti
613.23
KB
-rwxr-xr-x
browse
25.46
KB
-rwxr-xr-x
browserslist
4.06
KB
-rwxr-xr-x
brushtopbm
14.02
KB
-rwxr-xr-x
bsd-mailx
110.4
KB
-rwxr-xr-x
btrfs
844.13
KB
-rwxr-xr-x
btrfs-convert
483.25
KB
-rwxr-xr-x
btrfs-find-root
439.33
KB
-rwxr-xr-x
btrfs-image
467.25
KB
-rwxr-xr-x
btrfs-map-logical
439.25
KB
-rwxr-xr-x
btrfs-select-super
439.25
KB
-rwxr-xr-x
btrfsck
844.13
KB
-rwxr-xr-x
btrfstune
443.26
KB
-rwxr-xr-x
bts
139.68
KB
-rwxr-xr-x
build-rdeps
16.68
KB
-rwxr-xr-x
buildhash
46.7
KB
-rwxr-xr-x
bundle
560
B
-rwxr-xr-x
bundle3.0
529
B
-rwxr-xr-x
bundler
562
B
-rwxr-xr-x
bundler3.0
531
B
-rwxr-xr-x
bunzip2
38.38
KB
-rwxr-xr-x
busctl
90.49
KB
-rwxr-xr-x
busybox
2.09
MB
-rwxr-xr-x
byebug
539
B
-rwxr-xr-x
byobu
8.17
KB
-rwxr-xr-x
byobu-config
996
B
-rwxr-xr-x
byobu-ctrl-a
4.66
KB
-rwxr-xr-x
byobu-disable
1.26
KB
-rwxr-xr-x
byobu-disable-prompt
1.31
KB
-rwxr-xr-x
byobu-enable
1.15
KB
-rwxr-xr-x
byobu-enable-prompt
1.42
KB
-rwxr-xr-x
byobu-export
1.32
KB
-rwxr-xr-x
byobu-janitor
6.29
KB
-rwxr-xr-x
byobu-keybindings
1.47
KB
-rwxr-xr-x
byobu-launch
3.25
KB
-rwxr-xr-x
byobu-launcher
1.87
KB
-rwxr-xr-x
byobu-launcher-install
2.4
KB
-rwxr-xr-x
byobu-launcher-uninstall
1.52
KB
-rwxr-xr-x
byobu-layout
3.27
KB
-rwxr-xr-x
byobu-prompt
1.13
KB
-rwxr-xr-x
byobu-quiet
1.38
KB
-rwxr-xr-x
byobu-reconnect-sockets
3.22
KB
-rwxr-xr-x
byobu-screen
8.17
KB
-rwxr-xr-x
byobu-select-backend
1.42
KB
-rwxr-xr-x
byobu-select-profile
5
KB
-rwxr-xr-x
byobu-select-session
1012
B
-rwxr-xr-x
byobu-shell
1.56
KB
-rwxr-xr-x
byobu-silent
1.28
KB
-rwxr-xr-x
byobu-status
5.87
KB
-rwxr-xr-x
byobu-status-detail
1.18
KB
-rwxr-xr-x
byobu-tmux
8.17
KB
-rwxr-xr-x
byobu-ugraph
4.56
KB
-rwxr-xr-x
byobu-ulevel
11.71
KB
-rwxr-xr-x
bzcat
38.38
KB
-rwxr-xr-x
bzcmp
2.17
KB
-rwxr-xr-x
bzdiff
2.17
KB
-rwxr-xr-x
bzegrep
3.69
KB
-rwxr-xr-x
bzexe
4.78
KB
-rwxr-xr-x
bzfgrep
3.69
KB
-rwxr-xr-x
bzgrep
3.69
KB
-rwxr-xr-x
bzip2
38.38
KB
-rwxr-xr-x
bzip2recover
14.3
KB
-rwxr-xr-x
bzless
1.27
KB
-rwxr-xr-x
bzmore
1.27
KB
-rwxr-xr-x
c++
910.82
KB
-rwxr-xr-x
c++filt
22.27
KB
-rwxr-xr-x
c89
428
B
-rwxr-xr-x
c89-gcc
428
B
-rwxr-xr-x
c99
454
B
-rwxr-xr-x
c99-gcc
454
B
-rwxr-xr-x
c_rehash
6.8
KB
-rwxr-xr-x
cal
36.95
KB
-rwxr-xr-x
calc_tickadj
2.78
KB
-rwxr-xr-x
captoinfo
86.41
KB
-rwxr-xr-x
cat
34.46
KB
-rwxr-xr-x
catman
34.76
KB
-rwxr-xr-x
cautious-launcher
853
B
-rwxr-xr-x
cc
906.82
KB
-rwxr-xr-x
ccache-swig
54.23
KB
-rwxr-xr-x
ccache-swig4.0
54.23
KB
-rwxr-xr-x
ccze
47.52
KB
-rwxr-xr-x
ccze-cssdump
18.88
KB
-rwxr-xr-x
cgclassify
14.45
KB
-rwxr-xr-x
cgcreate
14.57
KB
-rwxr-xr-x
cgdelete
14.38
KB
-rwxr-xr-x
cgexec
14.41
KB
-rwxr-xr-x
cgget
22.38
KB
-rwxr-xr-x
cgset
14.38
KB
-rwxr-xr-x
cgsnapshot
22.54
KB
-rwxr-xr-x
chacl
22.3
KB
-rwxr-xr-x
chage
70.49
KB
-rwxr-sr-x
chardet
965
B
-rwxr-xr-x
chardetect
965
B
-rwxr-xr-x
chartex
5.68
KB
-rwxr-xr-x
chattr
14.31
KB
-rwxr-xr-x
chcon
58.51
KB
-rwxr-xr-x
chdist
20.69
KB
-rwxr-xr-x
checkbashisms
31.56
KB
-rwxr-xr-x
checkgid
14.3
KB
-rwxr-xr-x
chem
28.49
KB
-rwxr-xr-x
chfn
71.01
KB
-rwsr-xr-x
chg
34.38
KB
-rwxr-xr-x
chgrp
54.51
KB
-rwxr-xr-x
chkdvifont
30.38
KB
-rwxr-xr-x
chmod
54.51
KB
-rwxr-xr-x
choom
22.38
KB
-rwxr-xr-x
chown
58.51
KB
-rwxr-xr-x
chpst
30.43
KB
-rwxr-xr-x
chrt
26.38
KB
-rwxr-xr-x
chsh
43.76
KB
-rwsr-xr-x
chvt
14.23
KB
-rwxr-xr-x
ci
807
B
-rwxr-xr-x
cifsiostat
22.45
KB
-rwxr-xr-x
cjpeg
54.21
KB
-rwxr-xr-x
ckbcomp
146.31
KB
-rwxr-xr-x
cksum
34.41
KB
-rwxr-xr-x
clear
14.31
KB
-rwxr-xr-x
clear_console
14.23
KB
-rwxr-xr-x
clhsdb
14.34
KB
-rwxr-xr-x
clusterdb
9.21
KB
-rwxr-xr-x
cmp
42.39
KB
-rwxr-xr-x
cmuwmtopbm
14.02
KB
-rwxr-xr-x
co
807
B
-rwxr-xr-x
codepage
14.15
KB
-rwxr-xr-x
col
22.38
KB
-rwxr-xr-x
col1
963
B
-rwxr-xr-x
col2
963
B
-rwxr-xr-x
col3
963
B
-rwxr-xr-x
col4
963
B
-rwxr-xr-x
col5
963
B
-rwxr-xr-x
col6
963
B
-rwxr-xr-x
col7
963
B
-rwxr-xr-x
col8
963
B
-rwxr-xr-x
col9
963
B
-rwxr-xr-x
colcrt
14.38
KB
-rwxr-xr-x
colorit
4.06
KB
-rwxr-xr-x
colrm
14.38
KB
-rwxr-xr-x
column
34.38
KB
-rwxr-xr-x
combinediff
50.89
KB
-rwxr-xr-x
comm
34.52
KB
-rwxr-xr-x
compare
14.15
KB
-rwxr-xr-x
compare-im6
14.15
KB
-rwxr-xr-x
compare-im6.q16
14.15
KB
-rwxr-xr-x
compile_et
1.32
KB
-rwxr-xr-x
compose
18.06
KB
-rwxr-xr-x
composite
14.15
KB
-rwxr-xr-x
composite-im6
14.15
KB
-rwxr-xr-x
composite-im6.q16
14.15
KB
-rwxr-xr-x
config_data
6.97
KB
-rwxr-xr-x
conjure
14.15
KB
-rwxr-xr-x
conjure-im6
14.15
KB
-rwxr-xr-x
conjure-im6.q16
14.15
KB
-rwxr-xr-x
convert
14.15
KB
-rwxr-xr-x
convert-im6
14.15
KB
-rwxr-xr-x
convert-im6.q16
14.15
KB
-rwxr-xr-x
corelist
15.01
KB
-rwxr-xr-x
cover
20.96
KB
-rwxr-xr-x
cowpoke
16.34
KB
-rwxr-xr-x
cp
138.51
KB
-rwxr-xr-x
cpan
8.16
KB
-rwxr-xr-x
cpan5.34-x86_64-linux-gnu
8.18
KB
-rwxr-xr-x
cpancover
5.49
KB
-rwxr-xr-x
cpanel_json_xs
9.76
KB
-rwxr-xr-x
cpio
141.64
KB
-rwxr-xr-x
cpp
906.82
KB
-rwxr-xr-x
cpp-11
906.82
KB
-rwxr-xr-x
cpp-12
1.32
MB
-rwxr-xr-x
crc32
1.04
KB
-rwxr-xr-x
createdb
9.21
KB
-rwxr-xr-x
createlang
9.21
KB
-rwxr-xr-x
createuser
9.21
KB
-rwxr-xr-x
crontab
38.64
KB
-rwxr-sr-x
cryptdir
1.44
KB
-rwxr-xr-x
csh
425.4
KB
-rwxr-xr-x
csplit
106.51
KB
-rwxr-xr-x
ctags
301.78
KB
-rwxr-xr-x
ctags-exuberant
301.78
KB
-rwxr-xr-x
ctags.emacs
155.2
KB
-rwxr-xr-x
ctail
960
B
-rwxr-xr-x
ctangle
50.91
KB
-rwxr-xr-x
ctie
18.4
KB
-rwxr-xr-x
ctstat
22.66
KB
-rwxr-xr-x
ctwill
99
KB
-rwxr-xr-x
ctwill-refsort
14.3
KB
-rwxr-xr-x
ctwill-twinx
14.3
KB
-rwxr-xr-x
curl
254.23
KB
-rwxr-xr-x
curl-config
6.52
KB
-rwxr-xr-x
cut
38.51
KB
-rwxr-xr-x
cvs
829.46
KB
-rwxr-xr-x
cvs-debc
11.8
KB
-rwxr-xr-x
cvs-debi
11.8
KB
-rwxr-xr-x
cvs-debrelease
11.95
KB
-rwxr-xr-x
cvs-debuild
6.84
KB
-rwxr-xr-x
cvs-switchroot
2.47
KB
-rwxr-xr-x
cvsps
82.29
KB
-rwxr-xr-x
cvtsudoers
296.4
KB
-rwxr-xr-x
cweave
95
KB
-rwxr-xr-x
daemon
121.3
KB
-rwxr-xr-x
darcs
22.52
MB
-rwxr-xr-x
dash
122.74
KB
-rwxr-xr-x
date
102.51
KB
-rwxr-xr-x
db5.3_archive
14.02
KB
-rwxr-xr-x
db5.3_checkpoint
14.02
KB
-rwxr-xr-x
db5.3_deadlock
14.02
KB
-rwxr-xr-x
db5.3_dump
18.02
KB
-rwxr-xr-x
db5.3_hotbackup
18.02
KB
-rwxr-xr-x
db5.3_load
26.02
KB
-rwxr-xr-x
db5.3_log_verify
14.02
KB
-rwxr-xr-x
db5.3_printlog
34.02
KB
-rwxr-xr-x
db5.3_recover
14.02
KB
-rwxr-xr-x
db5.3_replicate
14.02
KB
-rwxr-xr-x
db5.3_stat
18.02
KB
-rwxr-xr-x
db5.3_upgrade
14.02
KB
-rwxr-xr-x
db5.3_verify
14.02
KB
-rwxr-xr-x
db_archive
14.02
KB
-rwxr-xr-x
db_checkpoint
14.02
KB
-rwxr-xr-x
db_deadlock
14.02
KB
-rwxr-xr-x
db_dump
18.02
KB
-rwxr-xr-x
db_hotbackup
18.02
KB
-rwxr-xr-x
db_load
26.02
KB
-rwxr-xr-x
db_log_verify
14.02
KB
-rwxr-xr-x
db_printlog
34.02
KB
-rwxr-xr-x
db_recover
14.02
KB
-rwxr-xr-x
db_replicate
14.02
KB
-rwxr-xr-x
db_stat
18.02
KB
-rwxr-xr-x
db_upgrade
14.02
KB
-rwxr-xr-x
db_verify
14.02
KB
-rwxr-xr-x
dbilogstrip
1.35
KB
-rwxr-xr-x
dbiprof
6.06
KB
-rwxr-xr-x
dbiproxy
5.27
KB
-rwxr-xr-x
dbus-cleanup-sockets
14.29
KB
-rwxr-xr-x
dbus-daemon
227.32
KB
-rwxr-xr-x
dbus-monitor
26.29
KB
-rwxr-xr-x
dbus-run-session
14.29
KB
-rwxr-xr-x
dbus-send
26.29
KB
-rwxr-xr-x
dbus-update-activation-environ...
14.29
KB
-rwxr-xr-x
dbus-uuidgen
14.29
KB
-rwxr-xr-x
dc
46.24
KB
-rwxr-xr-x
dch
65.04
KB
-rwxr-xr-x
dcmd
9.94
KB
-rwxr-xr-x
dd
66.52
KB
-rwxr-xr-x
dd-list
9.39
KB
-rwxr-xr-x
deallocvt
14.23
KB
-rwxr-xr-x
deb-janitor
4.51
KB
-rwxr-xr-x
deb-reversion
5.79
KB
-rwxr-xr-x
deb-systemd-helper
20.89
KB
-rwxr-xr-x
deb-systemd-invoke
6.01
KB
-rwxr-xr-x
deb-why-removed
6.47
KB
-rwxr-xr-x
debbisect
44.19
KB
-rwxr-xr-x
debc
16.59
KB
-rwxr-xr-x
debchange
65.04
KB
-rwxr-xr-x
debcheckout
45.11
KB
-rwxr-xr-x
debclean
5.96
KB
-rwxr-xr-x
debcommit
30.16
KB
-rwxr-xr-x
debconf
2.79
KB
-rwxr-xr-x
debconf-apt-progress
11.27
KB
-rwxr-xr-x
debconf-communicate
608
B
-rwxr-xr-x
debconf-copydb
1.68
KB
-rwxr-xr-x
debconf-escape
647
B
-rwxr-xr-x
debconf-set-selections
2.92
KB
-rwxr-xr-x
debconf-show
1.78
KB
-rwxr-xr-x
debdiff
40.86
KB
-rwxr-xr-x
debdiff-apply
12.29
KB
-rwxr-xr-x
debi
16.59
KB
-rwxr-xr-x
debian-distro-info
22.95
KB
-rwxr-xr-x
debootsnap
23.37
KB
-rwxr-xr-x
debpkg
18.15
KB
-rwxr-xr-x
debrebuild
23.72
KB
-rwxr-xr-x
debrelease
10.75
KB
-rwxr-xr-x
debrepro
6.08
KB
-rwxr-xr-x
debrsign
9.06
KB
-rwxr-xr-x
debsign
23.46
KB
-rwxr-xr-x
debsnap
12.98
KB
-rwxr-xr-x
debsums
24.81
KB
-rwxr-xr-x
debuild
41.63
KB
-rwxr-xr-x
decodemail
34.77
KB
-rwxr-xr-x
decryptdir
1.44
KB
-rwxr-xr-x
defmt-c
14.3
KB
-rwxr-xr-x
defmt-sh
14.3
KB
-rwxr-xr-x
dehtmldiff
1.32
KB
-rwxr-xr-x
delpart
14.38
KB
-rwxr-xr-x
delv
45.32
KB
-rwxr-xr-x
dep3changelog
5.47
KB
-rwxr-xr-x
derb
26.88
KB
-rwxr-xr-x
desktop2menu
12.57
KB
-rwxr-xr-x
detex
58.32
KB
-rwxr-xr-x
devnag
43.34
KB
-rwxr-xr-x
df
83.08
KB
-rwxr-xr-x
dget
23.94
KB
-rwxr-xr-x
dh_autotools-dev_restoreconfig
1.79
KB
-rwxr-xr-x
dh_autotools-dev_updateconfig
1.81
KB
-rwxr-xr-x
dh_bash-completion
4.31
KB
-rwxr-xr-x
dh_dkms
4.2
KB
-rwxr-xr-x
dh_installtex
17.96
KB
-rwxr-xr-x
dh_installxmlcatalogs
9.22
KB
-rwxr-xr-x
dh_numpy3
1.94
KB
-rwxr-xr-x
dh_perl_dbi
1.17
KB
-rwxr-xr-x
dh_perl_openssl
1.5
KB
-rwxr-xr-x
dh_sphinxdoc
17.29
KB
-rwxr-xr-x
dhwp
940
B
-rwxr-xr-x
dict
71.52
KB
-rwxr-xr-x
dict_lookup
4.35
KB
-rwxr-xr-x
dictl
1.93
KB
-rwxr-xr-x
diff
130.55
KB
-rwxr-xr-x
diff2patches
2.86
KB
-rwxr-xr-x
diff3
54.52
KB
-rwxr-xr-x
dig
150.83
KB
-rwxr-xr-x
dir
134.98
KB
-rwxr-xr-x
dircolors
38.52
KB
-rwxr-xr-x
dirmngr
433.02
KB
-rwxr-xr-x
dirmngr-client
54.92
KB
-rwxr-xr-x
dirname
30.38
KB
-rwxr-xr-x
disdvi
22.31
KB
-rwxr-xr-x
dislocate
7.75
KB
-rwxr-xr-x
display
14.15
KB
-rwxr-xr-x
display-im6
14.15
KB
-rwxr-xr-x
display-im6.q16
14.15
KB
-rwxr-xr-x
distro-info
22.89
KB
-rwxr-xr-x
django-admin
968
B
-rwxr-xr-x
djpeg
42.21
KB
-rwxr-xr-x
dmesg
70.61
KB
-rwxr-xr-x
dnsdomainname
22.23
KB
-rwxr-xr-x
dnssort
1.82
KB
-rwxr-xr-x
do-release-upgrade
10.42
KB
-rwxr-xr-x
domainname
22.23
KB
-rwxr-xr-x
dos2unix
54.34
KB
-rwxr-xr-x
dotlock
15.14
KB
-rwxr-sr-x
dotlock.mailutils
15.14
KB
-rwxr-sr-x
dotlockfile
22.15
KB
-rwxr-sr-x
dpkg
310.69
KB
-rwxr-xr-x
dpkg-architecture
13.51
KB
-rwxr-xr-x
dpkg-awk
949
B
-rwxr-xr-x
dpkg-buildflags
7.39
KB
-rwxr-xr-x
dpkg-buildpackage
31.67
KB
-rwxr-xr-x
dpkg-checkbuilddeps
7.45
KB
-rwxr-xr-x
dpkg-deb
134.49
KB
-rwxr-xr-x
dpkg-depcheck
18.49
KB
-rwxr-xr-x
dpkg-distaddfile
2.72
KB
-rwxr-xr-x
dpkg-divert
118.49
KB
-rwxr-xr-x
dpkg-genbuilddeps
1005
B
-rwxr-xr-x
dpkg-genbuildinfo
16.71
KB
-rwxr-xr-x
dpkg-genchanges
17.27
KB
-rwxr-xr-x
dpkg-gencontrol
14.24
KB
-rwxr-xr-x
dpkg-gensymbols
10.65
KB
-rwxr-xr-x
dpkg-maintscript-helper
20.71
KB
-rwxr-xr-x
dpkg-mergechangelogs
8.69
KB
-rwxr-xr-x
dpkg-name
6.63
KB
-rwxr-xr-x
dpkg-parsechangelog
4.83
KB
-rwxr-xr-x
dpkg-query
138.52
KB
-rwxr-xr-x
dpkg-realpath
4.09
KB
-rwxr-xr-x
dpkg-scanpackages
8.5
KB
-rwxr-xr-x
dpkg-scansources
8.96
KB
-rwxr-xr-x
dpkg-shlibdeps
30.96
KB
-rwxr-xr-x
dpkg-source
22.56
KB
-rwxr-xr-x
dpkg-split
98.51
KB
-rwxr-xr-x
dpkg-statoverride
46.26
KB
-rwxr-xr-x
dpkg-trigger
42.41
KB
-rwxr-xr-x
dpkg-vendor
3.19
KB
-rwxr-xr-x
dropdb
9.21
KB
-rwxr-xr-x
droplang
9.21
KB
-rwxr-xr-x
dropuser
9.21
KB
-rwxr-xr-x
dscextract
4.16
KB
-rwxr-xr-x
dscverify
13.9
KB
-rwxr-xr-x
dselect
226.59
KB
-rwxr-xr-x
dt2dv
40.49
KB
-rwxr-xr-x
du
146.51
KB
-rwxr-xr-x
duck
16.02
KB
-rwxr-xr-x
dump_index
1.4
KB
-rwxr-xr-x
dumpkeys
158.71
KB
-rwxr-xr-x
duplicity
5.21
KB
-rwxr-xr-x
dv2dt
23.87
KB
-rwxr-xr-x
dvi2tty
58.69
KB
-rwxr-xr-x
dvibook
30.5
KB
-rwxr-xr-x
dviconcat
22.6
KB
-rwxr-xr-x
dvicopy
54.4
KB
-rwxr-xr-x
dvihp
4.38
KB
-rwxr-xr-x
dvilj
54.82
KB
-rwxr-xr-x
dvilj2p
54.82
KB
-rwxr-xr-x
dvilj4
62.83
KB
-rwxr-xr-x
dvilj4l
62.83
KB
-rwxr-xr-x
dvilj6
62.83
KB
-rwxr-xr-x
dvilualatex
6.64
MB
-rwxr-xr-x
dviluatex
6.64
MB
-rwxr-xr-x
dvipdf
1007
B
-rwxr-xr-x
dvipdfm
835.77
KB
-rwxr-xr-x
dvipdfmx
835.77
KB
-rwxr-xr-x
dvipdft
2.63
KB
-rwxr-xr-x
dvipos
50.79
KB
-rwxr-xr-x
dvips
219.32
KB
-rwxr-xr-x
dviselect
22.5
KB
-rwxr-xr-x
dvispc
47.52
KB
-rwxr-xr-x
dvitodvi
34.5
KB
-rwxr-xr-x
dvitomp
800
KB
-rwxr-xr-x
dvitype
46.42
KB
-rwxr-xr-x
dwp
1.82
MB
-rwxr-xr-x
eatmydata
2.74
KB
-rwxr-xr-x
ebb
835.77
KB
-rwxr-xr-x
ebrowse
46.27
KB
-rwxr-xr-x
ebrowse.emacs
46.27
KB
-rwxr-xr-x
ec2metadata
8.38
KB
-rwxr-xr-x
echo
34.3
KB
-rwxr-xr-x
ed
54.49
KB
-rwxr-xr-x
edit
18.06
KB
-rwxr-xr-x
edit-patch
8.14
KB
-rwxr-xr-x
editdiff
2.02
KB
-rwxr-xr-x
editor
729.83
KB
-rwxr-xr-x
editres
72.69
KB
-rwxr-xr-x
egrep
28
B
-rwxr-xr-x
eject
42.23
KB
-rwxr-xr-x
elfedit
34.72
KB
-rwxr-xr-x
elvis-tiny
101.49
KB
-rwxr-xr-x
emacs
6.01
MB
-rwxr-xr-x
emacs-gtk
6.01
MB
-rwxr-xr-x
emacsclient
30.23
KB
-rwxr-xr-x
emacsclient.emacs
30.23
KB
-rwxr-xr-x
enc2xs
40.84
KB
-rwxr-xr-x
encguess
3.01
KB
-rwxr-xr-x
encode_keychange
22.3
KB
-rwxr-xr-x
env
42.95
KB
-rwxr-xr-x
envdir
21.98
KB
-rwxr-xr-x
envsubst
34.38
KB
-rwxr-xr-x
envuidgid
21.98
KB
-rwxr-xr-x
eps2eps
639
B
-rwxr-xr-x
eptex
544.22
KB
-rwxr-xr-x
eqn
188.45
KB
-rwxr-xr-x
eqn2graph
3.16
KB
-rwxr-xr-x
erb
507
B
-rwxr-xr-x
erb3.0
507
B
-rwxr-xr-x
erubis
158
B
-rwxr-xr-x
espdiff
1.53
KB
-rwxr-xr-x
etags
151.01
KB
-rwxr-xr-x
etags.emacs
151.01
KB
-rwxr-xr-x
etex
1.72
MB
-rwxr-xr-x
euptex
554.86
KB
-rwxr-xr-x
ex
3.61
MB
-rwxr-xr-x
exifautotran
1.11
KB
-rwxr-xr-x
exiftool
302.54
KB
-rwxr-xr-x
expand
34.53
KB
-rwxr-xr-x
expect
14.15
KB
-rwxr-xr-x
expect_autoexpect
7.53
KB
-rwxr-xr-x
expect_autopasswd
378
B
-rwxr-xr-x
expect_cryptdir
1.44
KB
-rwxr-xr-x
expect_decryptdir
1.44
KB
-rwxr-xr-x
expect_dislocate
7.75
KB
-rwxr-xr-x
expect_ftp-rfc
686
B
-rwxr-xr-x
expect_kibitz
10.63
KB
-rwxr-xr-x
expect_lpunlock
2.56
KB
-rwxr-xr-x
expect_mkpasswd
5.26
KB
-rwxr-xr-x
expect_multixterm
29.85
KB
-rwxr-xr-x
expect_passmass
4.45
KB
-rwxr-xr-x
expect_rftp
8.68
KB
-rwxr-xr-x
expect_rlogin-cwd
504
B
-rwxr-xr-x
expect_timed-read
306
B
-rwxr-xr-x
expect_timed-run
280
B
-rwxr-xr-x
expect_tknewsbiff
11.24
KB
-rwxr-xr-x
expect_tkpasswd
16.3
KB
-rwxr-xr-x
expect_unbuffer
643
B
-rwxr-xr-x
expect_weather
2.03
KB
-rwxr-xr-x
expect_xkibitz
4.75
KB
-rwxr-xr-x
expect_xpstat
6.59
KB
-rwxr-xr-x
expiry
22.59
KB
-rwxr-sr-x
expr
102.41
KB
-rwxr-xr-x
extcheck
14.32
KB
-rwxr-xr-x
extractbb
835.77
KB
-rwxr-xr-x
eyuvtoppm
18.02
KB
-rwxr-xr-x
f2py3
957
B
-rwxr-xr-x
f2py3.10
960
B
-rwxr-xr-x
factor
70.51
KB
-rwxr-xr-x
fail2ban-client
1.39
KB
-rwxr-xr-x
fail2ban-python
5.66
MB
-rwxr-xr-x
fail2ban-regex
1.25
KB
-rwxr-xr-x
fail2ban-server
1.38
KB
-rwxr-xr-x
fail2ban-testcases
2.23
KB
-rwxr-xr-x
faillog
22.59
KB
-rwxr-xr-x
faked-sysv
30.39
KB
-rwxr-xr-x
faked-tcp
30.38
KB
-rwxr-xr-x
fakeroot
3.9
KB
-rwxr-xr-x
fakeroot-sysv
3.9
KB
-rwxr-xr-x
fakeroot-tcp
3.9
KB
-rwxr-xr-x
fallocate
22.38
KB
-rwxr-xr-x
false
26.3
KB
-rwxr-xr-x
fc-cache
22.23
KB
-rwxr-xr-x
fc-cat
18.23
KB
-rwxr-xr-x
fc-conflist
14.23
KB
-rwxr-xr-x
fc-list
14.23
KB
-rwxr-xr-x
fc-match
14.23
KB
-rwxr-xr-x
fc-pattern
14.23
KB
-rwxr-xr-x
fc-query
14.23
KB
-rwxr-xr-x
fc-scan
14.23
KB
-rwxr-xr-x
fc-validate
14.23
KB
-rwxr-xr-x
fcgistarter
14.3
KB
-rwxr-xr-x
ffmpeg
294.48
KB
-rwxr-xr-x
ffplay
146.47
KB
-rwxr-xr-x
ffprobe
174.64
KB
-rwxr-xr-x
fgconsole
14.23
KB
-rwxr-xr-x
fghack
21.98
KB
-rwxr-xr-x
fgrep
28
B
-rwxr-xr-x
fiascotopnm
118.6
KB
-rwxr-xr-x
figlet
26.68
KB
-rwxr-xr-x
figlet-toilet
26.68
KB
-rwxr-xr-x
filan
46.48
KB
-rwxr-xr-x
file
26.56
KB
-rwxr-xr-x
filterdiff
55.48
KB
-rwxr-xr-x
finalrd
2.06
KB
-rwxr-xr-x
fincore
22.42
KB
-rwxr-xr-x
find
275.48
KB
-rwxr-xr-x
findaffix
11.74
KB
-rwxr-xr-x
findmnt
63.61
KB
-rwxr-xr-x
fitstopnm
18.02
KB
-rwxr-xr-x
fixcvsdiff
1.83
KB
-rwxr-xr-x
fixproc
15.16
KB
-rwxr-xr-x
flex
405.18
KB
-rwxr-xr-x
flex++
405.18
KB
-rwxr-xr-x
flickr_dump_stored_config
2.01
KB
-rwxr-xr-x
flickr_make_stored_config
10.35
KB
-rwxr-xr-x
flickr_make_test_values
4.48
KB
-rwxr-xr-x
flipdiff
50.89
KB
-rwxr-xr-x
flock
22.48
KB
-rwxr-xr-x
fmt
38.51
KB
-rwxr-xr-x
fmtutil
53.83
KB
-rwxr-xr-x
fmtutil-sys
929
B
-rwxr-xr-x
fmtutil-user
926
B
-rwxr-xr-x
fold
34.51
KB
-rwxr-xr-x
formail
46.3
KB
-rwxr-xr-x
fping
50.87
KB
-rwxr-xr-x
fping6
50.87
KB
-rwxr-xr-x
free
26.23
KB
-rwxr-xr-x
frm
27.29
KB
-rwxr-xr-x
frm.mailutils
27.29
KB
-rwxr-xr-x
from
26.82
KB
-rwxr-xr-x
from.mailutils
26.82
KB
-rwxr-xr-x
fromdos
18.17
KB
-rwxr-xr-x
fsfs-access-map
18.3
KB
-rwxr-xr-x
fsfs-stats
65
B
-rwxr-xr-x
fstopgm
14.02
KB
-rwxr-xr-x
ftp
178.9
KB
-rwxr-xr-x
ftp-rfc
686
B
-rwxr-xr-x
ftpcount
23.66
KB
-rwxr-xr-x
ftpdctl
98.36
KB
-rwxr-xr-x
ftptop
27.33
KB
-rwxr-xr-x
ftpwho
43.8
KB
-rwxr-xr-x
funzip
22.3
KB
-rwxr-xr-x
fuser
39.31
KB
-rwxr-xr-x
fusermount
34.38
KB
-rwsr-xr-x
fusermount3
34.38
KB
-rwsr-xr-x
futurize
960
B
-rwxr-xr-x
g++
910.82
KB
-rwxr-xr-x
g++-11
910.82
KB
-rwxr-xr-x
g3topbm
17.13
KB
-rwxr-xr-x
gapplication
22.38
KB
-rwxr-xr-x
gawk
688.46
KB
-rwxr-xr-x
gcc
906.82
KB
-rwxr-xr-x
gcc-11
906.82
KB
-rwxr-xr-x
gcc-12
1.32
MB
-rwxr-xr-x
gcc-ar
26.54
KB
-rwxr-xr-x
gcc-ar-11
26.54
KB
-rwxr-xr-x
gcc-ar-12
34.63
KB
-rwxr-xr-x
gcc-nm
26.54
KB
-rwxr-xr-x
gcc-nm-11
26.54
KB
-rwxr-xr-x
gcc-nm-12
34.63
KB
-rwxr-xr-x
gcc-ranlib
26.54
KB
-rwxr-xr-x
gcc-ranlib-11
26.54
KB
-rwxr-xr-x
gcc-ranlib-12
34.63
KB
-rwxr-xr-x
gcore
3.4
KB
-rwxr-xr-x
gcov
400.01
KB
-rwxr-xr-x
gcov-11
400.01
KB
-rwxr-xr-x
gcov-12
736.26
KB
-rwxr-xr-x
gcov-dump
251.84
KB
-rwxr-xr-x
gcov-dump-11
251.84
KB
-rwxr-xr-x
gcov-dump-12
576.13
KB
-rwxr-xr-x
gcov-tool
275.93
KB
-rwxr-xr-x
gcov-tool-11
275.93
KB
-rwxr-xr-x
gcov-tool-12
600.22
KB
-rwxr-xr-x
gcov2perl
5.67
KB
-rwxr-xr-x
gd2copypal
14.15
KB
-rwxr-xr-x
gd2togif
14.15
KB
-rwxr-xr-x
gd2topng
14.15
KB
-rwxr-xr-x
gdb
9.8
MB
-rwxr-xr-x
gdb-add-index
4.52
KB
-rwxr-xr-x
gdbtui
126
B
-rwxr-xr-x
gdbus
50.38
KB
-rwxr-xr-x
gdcmpgif
14.15
KB
-rwxr-xr-x
gdiffmk
7.51
KB
-rwxr-xr-x
gdparttopng
14.15
KB
-rwxr-xr-x
gdtopng
14.15
KB
-rwxr-xr-x
gem
254
B
-rwxr-xr-x
gem3.0
545
B
-rwxr-xr-x
gemtopbm
14.02
KB
-rwxr-xr-x
gemtopnm
14.02
KB
-rwxr-xr-x
genbrk
14.78
KB
-rwxr-xr-x
gencat
26.37
KB
-rwxr-xr-x
gencfu
14.73
KB
-rwxr-xr-x
gencnval
26.61
KB
-rwxr-xr-x
gendict
26.78
KB
-rwxr-xr-x
genrb
147.91
KB
-rwxr-xr-x
geqn
188.45
KB
-rwxr-xr-x
get_root_domain
2.12
KB
-rwxr-xr-x
getbuildlog
4.71
KB
-rwxr-xr-x
getconf
34.29
KB
-rwxr-xr-x
getent
38.65
KB
-rwxr-xr-x
getfacl
30.81
KB
-rwxr-xr-x
getfattr
22.76
KB
-rwxr-xr-x
getkeycodes
14.23
KB
-rwxr-xr-x
getopt
22.38
KB
-rwxr-xr-x
gettext
34.38
KB
-rwxr-xr-x
gettext.sh
5.07
KB
-rwxr-xr-x
gettextize
41.28
KB
-rwxr-xr-x
gftodvi
46.39
KB
-rwxr-xr-x
gftopk
26.38
KB
-rwxr-xr-x
gftype
26.39
KB
-rwxr-xr-x
ghostscript
14.15
KB
-rwxr-xr-x
giftogd2
14.15
KB
-rwxr-xr-x
giftopnm
22.02
KB
-rwxr-xr-x
ginstall-info
103.23
KB
-rwxr-xr-x
gio
90.4
KB
-rwxr-xr-x
gio-querymodules
14.3
KB
-rwxr-xr-x
git
3.54
MB
-rwxr-xr-x
git-deborig
8.82
KB
-rwxr-xr-x
git-receive-pack
3.54
MB
-rwxr-xr-x
git-shell
552.58
KB
-rwxr-xr-x
git-upload-archive
3.54
MB
-rwxr-xr-x
git-upload-pack
3.54
MB
-rwxr-xr-x
gitdiff
1.72
KB
-rwxr-xr-x
gitdiffview
814
B
-rwxr-xr-x
glib-compile-schemas
50.3
KB
-rwxr-xr-x
glilypond
18.19
KB
-rwxr-xr-x
gmake
249.7
KB
-rwxr-xr-x
gnuplot
1.93
MB
-rwxr-xr-x
gnuplot-qt
1.93
MB
-rwxr-xr-x
gold
3.04
MB
-rwxr-xr-x
google-authenticator
34.79
KB
-rwxr-xr-x
googlism
767
B
-rwxr-xr-x
gouldtoppm
14.02
KB
-rwxr-xr-x
gpasswd
70.38
KB
-rwsr-xr-x
gperl
6.87
KB
-rwxr-xr-x
gpg
1
MB
-rwxr-xr-x
gpg-agent
312.96
KB
-rwxr-xr-x
gpg-connect-agent
82.99
KB
-rwxr-xr-x
gpg-wks-server
115.05
KB
-rwxr-xr-x
gpg-zip
3.43
KB
-rwxr-xr-x
gpg1
889.02
KB
-rwxr-xr-x
gpgcompose
496.48
KB
-rwxr-xr-x
gpgconf
126.73
KB
-rwxr-xr-x
gpgmailtunl
6.29
KB
-rwxr-xr-x
gpgparsemail
34.38
KB
-rwxr-xr-x
gpgsm
418.9
KB
-rwxr-xr-x
gpgsplit
26.55
KB
-rwxr-xr-x
gpgtar
63.39
KB
-rwxr-xr-x
gpgv
271.04
KB
-rwxr-xr-x
gpic
200.04
KB
-rwxr-xr-x
gpinyin
5.28
KB
-rwxr-xr-x
gprof
111.79
KB
-rwxr-xr-x
grap2graph
3.08
KB
-rwxr-xr-x
gregorio
674.84
KB
-rwxr-xr-x
grep
178.45
KB
-rwxr-xr-x
grep-aptavail
48.08
KB
-rwxr-xr-x
grep-available
48.08
KB
-rwxr-xr-x
grep-dctrl
48.08
KB
-rwxr-xr-x
grep-debtags
48.08
KB
-rwxr-xr-x
grep-excuses
12.45
KB
-rwxr-xr-x
grep-status
48.08
KB
-rwxr-xr-x
grepdiff
55.48
KB
-rwxr-xr-x
gresource
22.3
KB
-rwxr-xr-x
grn
86.84
KB
-rwxr-xr-x
grodvi
118.49
KB
-rwxr-xr-x
groff
94.5
KB
-rwxr-xr-x
groffer
8.04
KB
-rwxr-xr-x
grog
2.71
KB
-rwxr-xr-x
grolbp
122.8
KB
-rwxr-xr-x
grolj4
114.5
KB
-rwxr-xr-x
gropdf
70.69
KB
-rwxr-xr-x
grops
162.55
KB
-rwxr-xr-x
grotty
118.52
KB
-rwxr-xr-x
groups
34.51
KB
-rwxr-xr-x
growpart
26.22
KB
-rwxr-xr-x
grub-editenv
376.95
KB
-rwxr-xr-x
grub-file
816.45
KB
-rwxr-xr-x
grub-fstest
937.92
KB
-rwxr-xr-x
grub-glue-efi
247.86
KB
-rwxr-xr-x
grub-kbdcomp
1.64
KB
-rwxr-xr-x
grub-menulst2cfg
228.13
KB
-rwxr-xr-x
grub-mkfont
272.42
KB
-rwxr-xr-x
grub-mkimage
361.05
KB
-rwxr-xr-x
grub-mklayout
252.17
KB
-rwxr-xr-x
grub-mknetdir
417.66
KB
-rwxr-xr-x
grub-mkpasswd-pbkdf2
256.2
KB
-rwxr-xr-x
grub-mkrelpath
247.58
KB
-rwxr-xr-x
grub-mkrescue
998.47
KB
-rwxr-xr-x
grub-mkstandalone
493.95
KB
-rwxr-xr-x
grub-mount
760.84
KB
-rwxr-xr-x
grub-ntldr-img
38.24
KB
-rwxr-xr-x
grub-render-label
828.83
KB
-rwxr-xr-x
grub-script-check
275.7
KB
-rwxr-xr-x
grub-syslinux2cfg
781.34
KB
-rwxr-xr-x
gs
14.15
KB
-rwxr-xr-x
gsbj
350
B
-rwxr-xr-x
gsdj
352
B
-rwxr-xr-x
gsdj500
352
B
-rwxr-xr-x
gsettings
30.3
KB
-rwxr-xr-x
gsftopk
34.49
KB
-rwxr-xr-x
gslj
353
B
-rwxr-xr-x
gslp
350
B
-rwxr-xr-x
gsnd
277
B
-rwxr-xr-x
gtbl
126.48
KB
-rwxr-xr-x
gtf
18.31
KB
-rwxr-xr-x
gtk-update-icon-cache
38.57
KB
-rwxr-xr-x
gunzip
2.29
KB
-rwxr-xr-x
gxditview
133.69
KB
-rwxr-xr-x
gzexe
6.3
KB
-rwxr-xr-x
gzip
91.23
KB
-rwxr-xr-x
h2ph
28.54
KB
-rwxr-xr-x
h2xs
59.51
KB
-rwxr-xr-x
hardening-check
19.09
KB
-rwxr-xr-x
hardlink
34.43
KB
-rwxr-xr-x
hd
50.39
KB
-rwxr-xr-x
head
42.51
KB
-rwxr-xr-x
helpztags
2.46
KB
-rwxr-xr-x
hexdump
50.39
KB
-rwxr-xr-x
hexedit
46.16
KB
-rwxr-xr-x
hg
1.78
KB
-rwxr-xr-x
hg-ssh
3.49
KB
-rwxr-xr-x
highlight
858.41
KB
-rwxr-xr-x
hipstopgm
14.02
KB
-rwxr-xr-x
host
118.82
KB
-rwxr-xr-x
hostid
30.51
KB
-rwxr-xr-x
hostname
22.23
KB
-rwxr-xr-x
hostnamectl
30.38
KB
-rwxr-xr-x
hpftodit
250.45
KB
-rwxr-xr-x
hsdb
14.34
KB
-rwxr-xr-x
htcacheclean
38.31
KB
-rwxr-xr-x
htdbm
26.3
KB
-rwxr-xr-x
htdigest
14.3
KB
-rwxr-xr-x
html2text
218.32
KB
-rwxr-xr-x
htmlclean
3.21
KB
-rwxr-xr-x
htop
277.19
KB
-rwxr-xr-x
htpasswd
26.3
KB
-rwxr-xr-x
hwe-support-status
10.58
KB
-rwxr-xr-x
i386
26.65
KB
-rwxr-xr-x
icombine
38.7
KB
-rwxr-xr-x
icontopbm
14.02
KB
-rwxr-xr-x
iconv
66.41
KB
-rwxr-xr-x
icuexportdata
30.98
KB
-rwxr-xr-x
icuinfo
14.62
KB
-rwxr-xr-x
id
38.51
KB
-rwxr-xr-x
ident
26.45
KB
-rwxr-xr-x
identify
14.15
KB
-rwxr-xr-x
identify-im6
14.15
KB
-rwxr-xr-x
identify-im6.q16
14.15
KB
-rwxr-xr-x
idlj
14.32
KB
-rwxr-xr-x
ifnames
4.08
KB
-rwxr-xr-x
ijoin
18.34
KB
-rwxr-xr-x
ilbmtoppm
66.1
KB
-rwxr-xr-x
imagetops
1.21
KB
-rwxr-xr-x
imgsize
4.57
KB
-rwxr-xr-x
imgtoppm
14.02
KB
-rwxr-xr-x
import
14.15
KB
-rwxr-xr-x
import-im6
14.15
KB
-rwxr-xr-x
import-im6.q16
14.15
KB
-rwxr-xr-x
indent
99.91
KB
-rwxr-xr-x
indxbib
46.51
KB
-rwxr-xr-x
info
301.74
KB
-rwxr-xr-x
infobrowser
301.74
KB
-rwxr-xr-x
infocmp
62.38
KB
-rwxr-xr-x
infotocap
86.41
KB
-rwxr-xr-x
inimf
391.94
KB
-rwxr-xr-x
initex
399.97
KB
-rwxr-xr-x
install
142.52
KB
-rwxr-xr-x
install-info
103.23
KB
-rwxr-xr-x
instmodsh
4.27
KB
-rwxr-xr-x
interdiff
50.89
KB
-rwxr-xr-x
ionice
18.38
KB
-rwxr-xr-x
iostat
54.44
KB
-rwxr-xr-x
ip
702.05
KB
-rwxr-xr-x
ipcalc
31.91
KB
-rwxr-xr-x
ipcmk
22.45
KB
-rwxr-xr-x
ipcrm
18.38
KB
-rwxr-xr-x
ipcs
38.38
KB
-rwxr-xr-x
ipmi_sim
153.26
KB
-rwxr-xr-x
ipmi_ui
14.23
KB
-rwxr-xr-x
ipmicmd
26.16
KB
-rwxr-xr-x
ipmilan
22.45
KB
-rwxr-xr-x
ipmish
38.8
KB
-rwxr-xr-x
ipmitool
914.03
KB
-rwxr-xr-x
iptables-xml
96.95
KB
-rwxr-xr-x
irb
507
B
-rwxr-xr-x
irb3.0
507
B
-rwxr-xr-x
irc
532.29
KB
-rwxr-xr-x
ircII
532.29
KB
-rwxr-xr-x
irssi
1.21
MB
-rwxr-xr-x
ischroot
14.2
KB
-rwxr-xr-x
iscsiadm
398.46
KB
-rwxr-xr-x
ispell
102.77
KB
-rwxr-xr-x
ispell-wrapper
7.05
KB
-rwxr-xr-x
jar
14.32
KB
-rwxr-xr-x
jarsigner
14.32
KB
-rwxr-xr-x
java
14.29
KB
-rwxr-xr-x
javac
14.32
KB
-rwxr-xr-x
javadoc
14.32
KB
-rwxr-xr-x
javah
14.32
KB
-rwxr-xr-x
javap
14.32
KB
-rwxr-xr-x
jcmd
14.32
KB
-rwxr-xr-x
jconsole
14.34
KB
-rwxr-xr-x
jdb
14.34
KB
-rwxr-xr-x
jdeps
14.32
KB
-rwxr-xr-x
jed
373.49
KB
-rwxr-xr-x
jed-script
373.49
KB
-rwxr-xr-x
jfr
14.32
KB
-rwxr-xr-x
jhat
14.32
KB
-rwxr-xr-x
jhead
78.9
KB
-rwxr-xr-x
jinfo
14.37
KB
-rwxr-xr-x
jjs
14.32
KB
-rwxr-xr-x
jmacs
729.83
KB
-rwxr-xr-x
jmap
14.37
KB
-rwxr-xr-x
joe
729.83
KB
-rwxr-xr-x
join
46.55
KB
-rwxr-xr-x
join-dctrl
34.83
KB
-rwxr-xr-x
journalctl
78.39
KB
-rwxr-xr-x
jpegexiforient
14.14
KB
-rwxr-xr-x
jpegtopnm
30.09
KB
-rwxr-xr-x
jpegtran
46.14
KB
-rwxr-xr-x
jpico
729.83
KB
-rwxr-xr-x
jps
14.32
KB
-rwxr-xr-x
jrunscript
14.32
KB
-rwxr-xr-x
js
26.08
KB
-rwxr-xr-x
jsadebugd
14.34
KB
-rwxr-xr-x
json-patch-jsondiff
1004
B
-rwxr-xr-x
json5
2.83
KB
-rwxr-xr-x
json_pp
4.88
KB
-rwxr-xr-x
jsondiff
1004
B
-rwxr-xr-x
jsonpatch
3.77
KB
-rwxr-xr-x
jsonpointer
1.79
KB
-rwxr-xr-x
jsonschema
397
B
-rwxr-xr-x
jstack
14.37
KB
-rwxr-xr-x
jstar
729.83
KB
-rwxr-xr-x
jstat
14.32
KB
-rwxr-xr-x
jstatd
14.32
KB
-rwxr-xr-x
kbd_mode
14.52
KB
-rwxr-xr-x
kbdinfo
18.23
KB
-rwxr-xr-x
kbxutil
62.83
KB
-rwxr-xr-x
keep-one-running
3.51
KB
-rwxr-xr-x
kernel-install
4.79
KB
-rwxr-xr-x
keyctl
46.38
KB
-rwxr-xr-x
keyring
961
B
-rwxr-xr-x
keytool
14.32
KB
-rwxr-xr-x
kibitz
10.63
KB
-rwxr-xr-x
kill
30.23
KB
-rwxr-xr-x
killall
31.34
KB
-rwxr-xr-x
kmod
166.36
KB
-rwxr-xr-x
kmodsign
18.45
KB
-rwxr-xr-x
kpseaccess
14.3
KB
-rwxr-xr-x
kpsereadlink
14.3
KB
-rwxr-xr-x
kpsestat
14.3
KB
-rwxr-xr-x
kpsewhich
27.3
KB
-rwxr-xr-x
krb5-config
6.78
KB
-rwxr-xr-x
krb5-config.mit
6.78
KB
-rwxr-xr-x
ksh
1.36
MB
-rwxr-xr-x
ksh93
1.36
MB
-rwxr-xr-x
l4p-tmpl
1.8
KB
-rwxr-xr-x
last
34.38
KB
-rwxr-xr-x
lastb
34.38
KB
-rwxr-xr-x
lastcomm
30.75
KB
-rwxr-xr-x
lastlog
27.63
KB
-rwxr-xr-x
latex
1.72
MB
-rwxr-xr-x
lcf
7.6
KB
-rwxr-xr-x
ld
1.66
MB
-rwxr-xr-x
ld.bfd
1.66
MB
-rwxr-xr-x
ld.gold
3.04
MB
-rwxr-xr-x
ldd
5.32
KB
-rwxr-xr-x
leaftoppm
14.02
KB
-rwxr-xr-x
less
194.38
KB
-rwxr-xr-x
lessecho
14.31
KB
-rwxr-xr-x
lessfile
8.83
KB
-rwxr-xr-x
lesskey
23.7
KB
-rwxr-xr-x
lesspipe
8.83
KB
-rwxr-xr-x
lex
405.18
KB
-rwxr-xr-x
lexgrog
99.75
KB
-rwxr-xr-x
lft
2.43
KB
-rwxr-xr-x
lft.db
2.43
KB
-rwxr-xr-x
lftp
1.64
MB
-rwxr-xr-x
lftpget
1.27
KB
-rwxr-xr-x
libnetcfg
15.41
KB
-rwxr-xr-x
libpng-config
2.41
KB
-rwxr-xr-x
libpng16-config
2.41
KB
-rwxr-xr-x
libtoolize
128.26
KB
-rwxr-xr-x
link
30.51
KB
-rwxr-xr-x
links
2.22
MB
-rwxr-xr-x
linux-check-removal
3.99
KB
-rwxr-xr-x
linux-update-symlinks
6.17
KB
-rwxr-xr-x
linux-version
2.63
KB
-rwxr-xr-x
linux32
26.65
KB
-rwxr-xr-x
linux64
26.65
KB
-rwxr-xr-x
lispmtopgm
14.02
KB
-rwxr-xr-x
list-unreleased
1.92
KB
-rwxr-xr-x
listen
539
B
-rwxr-xr-x
listres
14.73
KB
-rwxr-xr-x
lkbib
54.49
KB
-rwxr-xr-x
ln
58.51
KB
-rwxr-xr-x
lnstat
22.66
KB
-rwxr-xr-x
loadkeys
198.76
KB
-rwxr-xr-x
loadunimap
30.32
KB
-rwxr-xr-x
locale
57.56
KB
-rwxr-xr-x
locale-check
14.15
KB
-rwxr-xr-x
localectl
26.37
KB
-rwxr-xr-x
localedef
326.96
KB
-rwxr-xr-x
lockfile
18.02
KB
-rwxr-sr-x
lockfile-check
14.16
KB
-rwxr-xr-x
lockfile-create
14.16
KB
-rwxr-xr-x
lockfile-remove
14.16
KB
-rwxr-xr-x
lockfile-touch
14.16
KB
-rwxr-xr-x
lockmail
22.15
KB
-rwxr-sr-x
lockmail.maildrop
22.15
KB
-rwxr-sr-x
logger
34.97
KB
-rwxr-xr-x
login
51.73
KB
-rwxr-xr-x
loginctl
58.48
KB
-rwxr-xr-x
logname
30.51
KB
-rwxr-xr-x
logresolve
14.31
KB
-rwxr-xr-x
look
18.38
KB
-rwxr-xr-x
lookbib
50.49
KB
-rwxr-xr-x
lowntfs-3g
114.98
KB
-rwxr-xr-x
lpunlock
2.56
KB
-rwxr-xr-x
ls
134.98
KB
-rwxr-xr-x
lsattr
14.31
KB
-rwxr-xr-x
lsb_release
3.55
KB
-rwxr-xr-x
lsblk
122.38
KB
-rwxr-xr-x
lscgroup
14.41
KB
-rwxr-xr-x
lscpu
98.38
KB
-rwxr-xr-x
lsdev
1.56
KB
-rwxr-xr-x
lsdiff
55.48
KB
-rwxr-xr-x
lshw
901.2
KB
-rwxr-xr-x
lsinitramfs
706
B
-rwxr-xr-x
lsipc
50.38
KB
-rwxr-xr-x
lslocks
30.7
KB
-rwxr-xr-x
lslogins
50.38
KB
-rwxr-xr-x
lsmem
34.38
KB
-rwxr-xr-x
lsmod
166.36
KB
-rwxr-xr-x
lsns
38.38
KB
-rwxr-xr-x
lsof
163.62
KB
-rwxr-xr-x
lspci
92.08
KB
-rwxr-xr-x
lspgpot
1.06
KB
-rwxr-xr-x
lssubsys
14.51
KB
-rwxr-xr-x
lsusb
246.52
KB
-rwxr-xr-x
ltnu
2.47
KB
-rwxr-xr-x
lto-dump-11
23.73
MB
-rwxr-xr-x
lto-dump-12
31.05
MB
-rwxr-xr-x
ltrace
269.2
KB
-rwxr-xr-x
luahbtex
6.68
MB
-rwxr-xr-x
luajithbtex
6.57
MB
-rwxr-xr-x
luajittex
6.54
MB
-rwxr-xr-x
lualatex
6.68
MB
-rwxr-xr-x
luatex
6.64
MB
-rwxr-xr-x
luit
48.44
KB
-rwxr-xr-x
lwp-download
10.05
KB
-rwxr-xr-x
lwp-dump
2.65
KB
-rwxr-xr-x
lwp-mirror
2.36
KB
-rwxr-xr-x
lwp-request
15.82
KB
-rwxr-xr-x
lynx
1.89
MB
-rwxr-xr-x
lzcat
82.52
KB
-rwxr-xr-x
lzcmp
6.86
KB
-rwxr-xr-x
lzdiff
6.86
KB
-rwxr-xr-x
lzegrep
5.87
KB
-rwxr-xr-x
lzfgrep
5.87
KB
-rwxr-xr-x
lzgrep
5.87
KB
-rwxr-xr-x
lzless
1.76
KB
-rwxr-xr-x
lzma
82.52
KB
-rwxr-xr-x
lzmainfo
14.23
KB
-rwxr-xr-x
lzmore
2.11
KB
-rwxr-xr-x
m17n-db
3.65
KB
-rwxr-xr-x
m4
154.37
KB
-rwxr-xr-x
mac2unix
54.34
KB
-rwxr-xr-x
macptopbm
14.02
KB
-rwxr-xr-x
mag
14.31
KB
-rwxr-xr-x
mail
110.4
KB
-rwxr-xr-x
mail-lock
14.16
KB
-rwxr-sr-x
mail-touchlock
14.16
KB
-rwxr-sr-x
mail-unlock
14.16
KB
-rwxr-sr-x
mail.mailutils
229.38
KB
-rwxr-xr-x
mailbot
106.27
KB
-rwxr-xr-x
maildirmake
42.23
KB
-rwxr-xr-x
maildirmake.maildrop
42.23
KB
-rwxr-xr-x
maildrop
210.44
KB
-rwxr-sr-x
mailq
30.45
KB
-rwxr-xr-x
mailstat
5.72
KB
-rwxr-xr-x
mailx
110.4
KB
-rwxr-xr-x
make
249.7
KB
-rwxr-xr-x
make-first-existing-target
4.79
KB
-rwxr-xr-x
make_method
21.64
KB
-rwxr-xr-x
makeconv
50.89
KB
-rwxr-xr-x
makedat
2.13
KB
-rwxr-xr-x
makedat.maildrop
2.13
KB
-rwxr-xr-x
makedatprog
14.15
KB
-rwxr-xr-x
makeindex
84.7
KB
-rwxr-xr-x
makejvf
46.31
KB
-rwxr-xr-x
makemime
34.15
KB
-rwxr-xr-x
man
117.68
KB
-rwxr-xr-x
man-recode
35.68
KB
-rwxr-xr-x
mandb
139.94
KB
-rwxr-xr-x
manifest
1.9
KB
-rwxr-xr-x
manpage-alert
4.61
KB
-rwxr-xr-x
manpath
30.78
KB
-rwxr-xr-x
mapscrn
30.32
KB
-rwxr-xr-x
marcdump
5.31
KB
-rwxr-xr-x
mass-bug
17.06
KB
-rwxr-xr-x
mawk
154.79
KB
-rwxr-xr-x
mc
1.05
MB
-rwxr-xr-x
mcdiff
1.05
MB
-rwxr-xr-x
mcedit
1.05
MB
-rwxr-xr-x
mcookie
26.45
KB
-rwxr-xr-x
mcview
1.05
MB
-rwxr-xr-x
md5sum
42.41
KB
-rwxr-xr-x
md5sum.textutils
42.41
KB
-rwxr-xr-x
mdatopbm
14.02
KB
-rwxr-xr-x
mdig
50.4
KB
-rwxr-xr-x
mech-dump
4.75
KB
-rwxr-xr-x
mediainfo
46.24
KB
-rwxr-xr-x
mendex
113.22
KB
-rwxr-xr-x
merge
30.45
KB
-rwxr-xr-x
mergechanges
11.16
KB
-rwxr-xr-x
mesg
14.38
KB
-rwxr-xr-x
messages
14.67
KB
-rwxr-xr-x
messages.mailutils
14.67
KB
-rwxr-xr-x
mf
391.94
KB
-rwxr-xr-x
mf-nowin
383.58
KB
-rwxr-xr-x
mflua
1.37
MB
-rwxr-xr-x
mflua-nowin
1.37
MB
-rwxr-xr-x
mfluajit
1.37
MB
-rwxr-xr-x
mfluajit-nowin
1.37
MB
-rwxr-xr-x
mfplain
800
KB
-rwxr-xr-x
mft
46.41
KB
-rwxr-xr-x
mgrtopbm
14.02
KB
-rwxr-xr-x
migrate-pubring-from-classic-g...
2.99
KB
-rwxr-xr-x
mimeview
19.35
KB
-rwxr-xr-x
mk-build-deps
19.31
KB
-rwxr-xr-x
mk-origtargz
6.92
KB
-rwxr-xr-x
mk_modmap
15.78
KB
-rwxr-xr-x
mkdir
66.51
KB
-rwxr-xr-x
mkfifo
38.51
KB
-rwxr-xr-x
mkindex
1.03
KB
-rwxr-xr-x
mknod
42.51
KB
-rwxr-xr-x
mkocp
171
B
-rwxr-xr-x
mkofm
85
B
-rwxr-xr-x
mkpasswd
26.38
KB
-rwxr-xr-x
mktemp
38.51
KB
-rwxr-xr-x
mktexfmt
53.83
KB
-rwxr-xr-x
mktexlsr
8.03
KB
-rwxr-xr-x
mktexmf
3.91
KB
-rwxr-xr-x
mktexpk
9.66
KB
-rwxr-xr-x
mktextfm
5.77
KB
-rwxr-xr-x
mlock
14.15
KB
-rwxr-sr-x
mlogc
42.2
KB
-rwxr-xr-x
mmroff
3.75
KB
-rwxr-xr-x
mogrify
14.15
KB
-rwxr-xr-x
mogrify-im6
14.15
KB
-rwxr-xr-x
mogrify-im6.q16
14.15
KB
-rwxr-xr-x
mokutil
59.48
KB
-rwxr-xr-x
montage
14.15
KB
-rwxr-xr-x
montage-im6
14.15
KB
-rwxr-xr-x
montage-im6.q16
14.15
KB
-rwxr-xr-x
more
42.38
KB
-rwxr-xr-x
mount
46.38
KB
-rwsr-xr-x
mountpoint
18.38
KB
-rwxr-xr-x
movemail
40.26
KB
-rwxr-xr-x
movemail.mailutils
40.26
KB
-rwxr-xr-x
mp3-decoder
155.63
KB
-rwxr-xr-x
mpack
26.47
KB
-rwxr-xr-x
mpg123
155.63
KB
-rwxr-xr-x
mpg123-alsa
50
B
-rwxr-xr-x
mpg123-id3dump
22.63
KB
-rwxr-xr-x
mpg123-jack
50
B
-rwxr-xr-x
mpg123-nas
49
B
-rwxr-xr-x
mpg123-openal
52
B
-rwxr-xr-x
mpg123-oss
49
B
-rwxr-xr-x
mpg123-portaudio
55
B
-rwxr-xr-x
mpg123-pulse
51
B
-rwxr-xr-x
mpg123-strip
14.58
KB
-rwxr-xr-x
mpg123.bin
155.63
KB
-rwxr-xr-x
mpost
800
KB
-rwxr-xr-x
mpstat
50.45
KB
-rwxr-xr-x
mptopdf
4.37
KB
-rwxr-xr-x
msgattrib
26.38
KB
-rwxr-xr-x
msgcat
26.38
KB
-rwxr-xr-x
msgcmp
26.38
KB
-rwxr-xr-x
msgcomm
26.38
KB
-rwxr-xr-x
msgconv
22.38
KB
-rwxr-xr-x
msgen
22.38
KB
-rwxr-xr-x
msgexec
22.38
KB
-rwxr-xr-x
msgfilter
34.38
KB
-rwxr-xr-x
msgfmt
82.59
KB
-rwxr-xr-x
msggrep
114.46
KB
-rwxr-xr-x
msginit
66.39
KB
-rwxr-xr-x
msgmerge
74.41
KB
-rwxr-xr-x
msgunfmt
34.39
KB
-rwxr-xr-x
msguniq
22.38
KB
-rwxr-xr-x
msxlint
18.33
KB
-rwxr-xr-x
mt
66.73
KB
-rwxr-xr-x
mt-gnu
66.73
KB
-rwxr-xr-x
mtr
114.01
KB
-rwxr-xr-x
mtr-packet
38.3
KB
-rwxr-xr-x
mtvtoppm
14.02
KB
-rwxr-xr-x
multilog
30.09
KB
-rwxr-xr-x
multitail
266.06
KB
-rwxr-xr-x
multixterm
29.85
KB
-rwxr-xr-x
munchlist
31.23
KB
-rwxr-xr-x
munpack
46.38
KB
-rwxr-xr-x
mutt
1.22
MB
-rwxr-xr-x
mutt_dotlock
14.3
KB
-rwxr-sr-x
mv
134.52
KB
-rwxr-xr-x
myisam_ftdump
6.35
MB
-rwxr-xr-x
mysql
6.65
MB
-rwxr-xr-x
mysql_config
4.97
KB
-rwxr-xr-x
mysql_config_editor
157.03
KB
-rwxr-xr-x
mysqladmin
6.49
MB
-rwxr-xr-x
mysqlanalyze
6.49
MB
-rwxr-xr-x
mysqlcheck
6.49
MB
-rwxr-xr-x
mysqldump
6.57
MB
-rwxr-xr-x
mysqldumpslow
7.54
KB
-rwxr-xr-x
mysqlimport
6.48
MB
-rwxr-xr-x
mysqloptimize
6.49
MB
-rwxr-xr-x
mysqlpump
6.85
MB
-rwxr-xr-x
mysqlrepair
6.49
MB
-rwxr-xr-x
mysqlreport
38.1
KB
-rwxr-xr-x
mysqlshow
6.49
MB
-rwxr-xr-x
mysqlslap
6.5
MB
-rwxr-xr-x
name2addr
14.38
KB
-rwxr-xr-x
namecheck
5.18
KB
-rwxr-xr-x
namei
22.38
KB
-rwxr-xr-x
nano
276.52
KB
-rwxr-xr-x
native2ascii
14.32
KB
-rwxr-xr-x
nawk
688.46
KB
-rwxr-xr-x
nc
38.63
KB
-rwxr-xr-x
nc.openbsd
38.63
KB
-rwxr-xr-x
ncal
36.95
KB
-rwxr-xr-x
ncftp
314.39
KB
-rwxr-xr-x
ncftp3
314.39
KB
-rwxr-xr-x
ncftpbatch
214.42
KB
-rwxr-xr-x
ncftpbookmarks
151.23
KB
-rwxr-xr-x
ncftpget
214.45
KB
-rwxr-xr-x
ncftpls
178.45
KB
-rwxr-xr-x
ncftpput
210.45
KB
-rwxr-xr-x
ncftpspooler
214.42
KB
-rwxr-xr-x
ncurses5-config
8.21
KB
-rwxr-xr-x
ncurses6-config
8.21
KB
-rwxr-xr-x
ncursesw5-config
8.21
KB
-rwxr-xr-x
ncursesw6-config
8.21
KB
-rwxr-xr-x
ndisc6
18.38
KB
-rwsr-xr-x
neotoppm
14.02
KB
-rwxr-xr-x
neqn
913
B
-rwxr-xr-x
net-server
3.34
KB
-rwxr-xr-x
netcat
38.63
KB
-rwxr-xr-x
netstat
154.59
KB
-rwxr-xr-x
networkctl
102.38
KB
-rwxr-xr-x
networkd-dispatcher
19.71
KB
-rwxr-xr-x
newaliases
30.45
KB
-rwxr-xr-x
newgrp
39.55
KB
-rwsr-xr-x
ngettext
34.38
KB
-rwxr-xr-x
nice
34.51
KB
-rwxr-xr-x
nisdomainname
22.23
KB
-rwxr-xr-x
nl
98.57
KB
-rwxr-xr-x
nm
43.63
KB
-rwxr-xr-x
nmudiff
12.79
KB
-rwxr-xr-x
nn
337.52
KB
-rwxr-xr-x
nnadmin
337.52
KB
-rwxr-xr-x
nnbatch
337.52
KB
-rwxr-xr-x
nncheck
337.52
KB
-rwxr-xr-x
nngoback
337.52
KB
-rwxr-xr-x
nngrab
943
B
-rwxr-xr-x
nngrep
337.52
KB
-rwxr-xr-x
nnpost
337.52
KB
-rwxr-xr-x
nnstats
3.2
KB
-rwxr-xr-x
nntidy
337.52
KB
-rwxr-xr-x
nnusage
1.31
KB
-rwxr-xr-x
nnview
337.52
KB
-rwxr-xr-x
node
26.08
KB
-rwxr-xr-x
nodejs
26.08
KB
-rwxr-xr-x
nohup
34.41
KB
-rwxr-xr-x
nokogiri
551
B
-rwxr-xr-x
nproc
34.51
KB
-rwxr-xr-x
nroff
3.22
KB
-rwxr-xr-x
nsenter
26.6
KB
-rwxr-xr-x
nslookup
118.82
KB
-rwxr-xr-x
nstat
30.38
KB
-rwxr-xr-x
nsupdate
74.55
KB
-rwxr-xr-x
ntfs-3g
159.01
KB
-rwxr-xr-x
ntfs-3g.probe
14.38
KB
-rwxr-xr-x
ntfscat
26.38
KB
-rwxr-xr-x
ntfscluster
38.38
KB
-rwxr-xr-x
ntfscmp
30.38
KB
-rwxr-xr-x
ntfsdecrypt
42.38
KB
-rwxr-xr-x
ntfsfallocate
26.38
KB
-rwxr-xr-x
ntfsfix
34.38
KB
-rwxr-xr-x
ntfsinfo
54.38
KB
-rwxr-xr-x
ntfsls
27.45
KB
-rwxr-xr-x
ntfsmove
30.38
KB
-rwxr-xr-x
ntfsrecover
106.38
KB
-rwxr-xr-x
ntfssecaudit
78.86
KB
-rwxr-xr-x
ntfstruncate
26.3
KB
-rwxr-xr-x
ntfsusermap
18.3
KB
-rwxr-xr-x
ntfswipe
42.91
KB
-rwxr-xr-x
ntpdc
150.27
KB
-rwxr-xr-x
ntpq
188.3
KB
-rwxr-xr-x
ntpsweep
7.79
KB
-rwxr-xr-x
ntptrace
3.48
KB
-rwxr-xr-x
numfmt
54.54
KB
-rwxr-xr-x
objcopy
162.54
KB
-rwxr-xr-x
objdump
365.13
KB
-rwxr-xr-x
od
66.51
KB
-rwxr-xr-x
odvicopy
54.4
KB
-rwxr-xr-x
odvitype
46.42
KB
-rwxr-xr-x
oem-getlogs
8.59
KB
-rwxr-xr-x
ofm2opl
107.65
KB
-rwxr-xr-x
omfonts
107.65
KB
-rwxr-xr-x
on_ac_power
3.7
KB
-rwxr-xr-x
open
25.46
KB
-rwxr-xr-x
openipmi_eventd
30.23
KB
-rwxr-xr-x
openipmicmd
26.16
KB
-rwxr-xr-x
openipmish
38.8
KB
-rwxr-xr-x
openssl
977.8
KB
-rwxr-xr-x
openvt
22.59
KB
-rwxr-xr-x
opl2ofm
107.65
KB
-rwxr-xr-x
orbd
14.38
KB
-rwxr-xr-x
origtargz
12.69
KB
-rwxr-xr-x
otangle
38.39
KB
-rwxr-xr-x
otp2ocp
30.31
KB
-rwxr-xr-x
out123
69.48
KB
-rwxr-xr-x
outocp
14.38
KB
-rwxr-xr-x
ovf2ovp
107.65
KB
-rwxr-xr-x
ovp2ovf
107.65
KB
-rwxr-xr-x
pack200
14.32
KB
-rwxr-xr-x
pager
194.38
KB
-rwxr-xr-x
palmtopnm
22.02
KB
-rwxr-xr-x
pamcut
18.02
KB
-rwxr-xr-x
pamdeinterlace
14.02
KB
-rwxr-xr-x
pamdice
14.02
KB
-rwxr-xr-x
pamfile
14.02
KB
-rwxr-xr-x
pamoil
14.02
KB
-rwxr-xr-x
pamstack
14.02
KB
-rwxr-xr-x
pamstretch
14.02
KB
-rwxr-xr-x
pamstretch-gen
1.31
KB
-rwxr-xr-x
paperconf
14.15
KB
-rwxr-xr-x
partx
58.38
KB
-rwxr-xr-x
passenger
1.64
KB
-rwxr-xr-x
passenger-config
1.5
KB
-rwxr-xr-x
passmass
4.45
KB
-rwxr-xr-x
passwd
58.57
KB
-rwsr-xr-x
paste
34.41
KB
-rwxr-xr-x
pastebinit
16.12
KB
-rwxr-xr-x
pasteurize
964
B
-rwxr-xr-x
patch
186.52
KB
-rwxr-xr-x
patchview
55.48
KB
-rwxr-xr-x
patgen
34.38
KB
-rwxr-xr-x
pathchk
34.51
KB
-rwxr-xr-x
pbget
2.51
KB
-rwxr-xr-x
pbibtex
110.39
KB
-rwxr-xr-x
pbmclean
14.02
KB
-rwxr-xr-x
pbmlife
14.02
KB
-rwxr-xr-x
pbmmake
14.02
KB
-rwxr-xr-x
pbmmask
14.02
KB
-rwxr-xr-x
pbmpage
14.02
KB
-rwxr-xr-x
pbmpscale
14.13
KB
-rwxr-xr-x
pbmreduce
14.02
KB
-rwxr-xr-x
pbmtext
14.02
KB
-rwxr-xr-x
pbmtextps
14.02
KB
-rwxr-xr-x
pbmto10x
14.02
KB
-rwxr-xr-x
pbmtoascii
14.29
KB
-rwxr-xr-x
pbmtoatk
14.02
KB
-rwxr-xr-x
pbmtobbnbg
14.02
KB
-rwxr-xr-x
pbmtocmuwm
14.02
KB
-rwxr-xr-x
pbmtoepsi
14.02
KB
-rwxr-xr-x
pbmtoepson
14.02
KB
-rwxr-xr-x
pbmtog3
17.13
KB
-rwxr-xr-x
pbmtogem
14.02
KB
-rwxr-xr-x
pbmtogo
14.02
KB
-rwxr-xr-x
pbmtoicon
14.02
KB
-rwxr-xr-x
pbmtolj
18.03
KB
-rwxr-xr-x
pbmtomacp
14.02
KB
-rwxr-xr-x
pbmtomda
14.02
KB
-rwxr-xr-x
pbmtomgr
14.02
KB
-rwxr-xr-x
pbmtonokia
14.02
KB
-rwxr-xr-x
pbmtopgm
14.02
KB
-rwxr-xr-x
pbmtopi3
14.02
KB
-rwxr-xr-x
pbmtoplot
14.02
KB
-rwxr-xr-x
pbmtoppa
30.03
KB
-rwxr-xr-x
pbmtopsg3
15.66
KB
-rwxr-xr-x
pbmtoptx
14.02
KB
-rwxr-xr-x
pbmtowbmp
14.02
KB
-rwxr-xr-x
pbmtox10bm
14.02
KB
-rwxr-xr-x
pbmtoxbm
14.02
KB
-rwxr-xr-x
pbmtoybm
14.02
KB
-rwxr-xr-x
pbmtozinc
14.02
KB
-rwxr-xr-x
pbmupc
22.02
KB
-rwxr-xr-x
pbput
2.51
KB
-rwxr-xr-x
pbputs
2.51
KB
-rwxr-xr-x
pchrt
4.51
KB
-rwxr-xr-x
pcxtoppm
22.02
KB
-rwxr-xr-x
pdb3
61.74
KB
-rwxr-xr-x
pdb3.10
61.74
KB
-rwxr-xr-x
pdf2dsc
698
B
-rwxr-xr-x
pdf2ps
909
B
-rwxr-xr-x
pdfattach
18.38
KB
-rwxr-xr-x
pdfclose
14.3
KB
-rwxr-xr-x
pdfdetach
22.49
KB
-rwxr-xr-x
pdfetex
1.72
MB
-rwxr-xr-x
pdffonts
22.52
KB
-rwxr-xr-x
pdfimages
38.52
KB
-rwxr-xr-x
pdfinfo
58.52
KB
-rwxr-xr-x
pdflatex
1.72
MB
-rwxr-xr-x
pdfmom
3.03
KB
-rwxr-xr-x
pdfopen
26.38
KB
-rwxr-xr-x
pdfroff
20.96
KB
-rwxr-xr-x
pdfseparate
22.38
KB
-rwxr-xr-x
pdfsig
34.77
KB
-rwxr-xr-x
pdftex
1.72
MB
-rwxr-xr-x
pdftocairo
134.48
KB
-rwxr-xr-x
pdftohtml
106.41
KB
-rwxr-xr-x
pdftoppm
34.41
KB
-rwxr-xr-x
pdftops
34.53
KB
-rwxr-xr-x
pdftosrc
809.88
KB
-rwxr-xr-x
pdftotext
42.52
KB
-rwxr-xr-x
pdfunite
30.38
KB
-rwxr-xr-x
pdvitomp
804.04
KB
-rwxr-xr-x
pdvitype
58.43
KB
-rwxr-xr-x
peekfd
14.3
KB
-rwxr-xr-x
perl
3.63
MB
-rwxr-xr-x
perl5.34-x86_64-linux-gnu
14.3
KB
-rwxr-xr-x
perl5.34.0
3.63
MB
-rwxr-xr-x
perlbug
44.12
KB
-rwxr-xr-x
perldoc
262
B
-rwxr-xr-x
perldoc.stub
125
B
-rwxr-xr-x
perlivp
10.61
KB
-rwxr-xr-x
perlsh
11.76
KB
-rwxr-xr-x
perlthanks
44.12
KB
-rwxr-xr-x
pf2afm
498
B
-rwxr-xr-x
pfb2pfa
14.3
KB
-rwxr-xr-x
pfbtopfa
516
B
-rwxr-xr-x
pfbtops
26.38
KB
-rwxr-xr-x
pg_basebackup
9.21
KB
-rwxr-xr-x
pg_dump
9.21
KB
-rwxr-xr-x
pg_dumpall
9.21
KB
-rwxr-xr-x
pg_isready
9.21
KB
-rwxr-xr-x
pg_receivewal
9.21
KB
-rwxr-xr-x
pg_receivexlog
9.21
KB
-rwxr-xr-x
pg_recvlogical
9.21
KB
-rwxr-xr-x
pg_restore
9.21
KB
-rwxr-xr-x
pgbench
9.21
KB
-rwxr-xr-x
pgmbentley
14.02
KB
-rwxr-xr-x
pgmcrater
18.05
KB
-rwxr-xr-x
pgmedge
14.02
KB
-rwxr-xr-x
pgmenhance
14.02
KB
-rwxr-xr-x
pgmhist
14.02
KB
-rwxr-xr-x
pgmkernel
14.02
KB
-rwxr-xr-x
pgmnoise
14.02
KB
-rwxr-xr-x
pgmnorm
14.02
KB
-rwxr-xr-x
pgmoil
14.02
KB
-rwxr-xr-x
pgmramp
14.02
KB
-rwxr-xr-x
pgmslice
14.02
KB
-rwxr-xr-x
pgmtexture
30.02
KB
-rwxr-xr-x
pgmtofs
14.02
KB
-rwxr-xr-x
pgmtolispm
14.02
KB
-rwxr-xr-x
pgmtopbm
20.45
KB
-rwxr-xr-x
pgmtoppm
14.02
KB
-rwxr-xr-x
pgrep
30.24
KB
-rwxr-xr-x
pgrphack
21.99
KB
-rwxr-xr-x
php
12.01
MB
-rwxr-xr-x
pi1toppm
14.02
KB
-rwxr-xr-x
pi3topbm
14.02
KB
-rwxr-xr-x
pic
200.04
KB
-rwxr-xr-x
pic2graph
3.66
KB
-rwxr-xr-x
pico
276.52
KB
-rwxr-xr-x
piconv
8.16
KB
-rwxr-xr-x
pidof
30.38
KB
-rwxr-xr-x
pidstat
50.45
KB
-rwxr-xr-x
pidwait
30.24
KB
-rwxr-xr-x
pinentry
58.65
KB
-rwxr-xr-x
pinentry-curses
58.65
KB
-rwxr-xr-x
ping
74.88
KB
-rwxr-xr-x
ping4
74.88
KB
-rwxr-xr-x
ping6
74.88
KB
-rwxr-xr-x
pinky
34.41
KB
-rwxr-xr-x
pip
221
B
-rwxr-xr-x
pip3
221
B
-rwxr-xr-x
pip3.10
221
B
-rwxr-xr-x
pjtoppm
18.03
KB
-rwxr-xr-x
pk2bm
18.3
KB
-rwxr-xr-x
pkaction
18.3
KB
-rwxr-xr-x
pkcheck
22.3
KB
-rwxr-xr-x
pkcon
58.3
KB
-rwxr-xr-x
pkexec
30.15
KB
-rwsr-xr-x
pkg-config
50.28
KB
-rwxr-xr-x
pkgdata
43.53
KB
-rwxr-xr-x
pkill
30.24
KB
-rwxr-xr-x
pkmon
22.3
KB
-rwxr-xr-x
pktogf
22.38
KB
-rwxr-xr-x
pkttyagent
18.3
KB
-rwxr-xr-x
pktype
18.38
KB
-rwxr-xr-x
pl2pm
4.43
KB
-rwxr-xr-x
pldd
22.37
KB
-rwxr-xr-x
plotchangelog
13.42
KB
-rwxr-xr-x
pltotf
46.38
KB
-rwxr-xr-x
plymouth
46.3
KB
-rwxr-xr-x
pmap
34.24
KB
-rwxr-xr-x
pmpost
804.04
KB
-rwxr-xr-x
pmxab
618.03
KB
-rwxr-xr-x
pngtogd
14.15
KB
-rwxr-xr-x
pngtogd2
14.15
KB
-rwxr-xr-x
pngtopnm
26.11
KB
-rwxr-xr-x
pnmalias
18.02
KB
-rwxr-xr-x
pnmarith
14.02
KB
-rwxr-xr-x
pnmcat
14.02
KB
-rwxr-xr-x
pnmcolormap
18.02
KB
-rwxr-xr-x
pnmcomp
14.02
KB
-rwxr-xr-x
pnmconvol
42.02
KB
-rwxr-xr-x
pnmcrop
14.02
KB
-rwxr-xr-x
pnmcut
14.02
KB
-rwxr-xr-x
pnmdepth
14.02
KB
-rwxr-xr-x
pnmenlarge
14.02
KB
-rwxr-xr-x
pnmfile
14.02
KB
-rwxr-xr-x
pnmflip
14.02
KB
-rwxr-xr-x
pnmgamma
18.02
KB
-rwxr-xr-x
pnmhisteq
18.02
KB
-rwxr-xr-x
pnmhistmap
14.02
KB
-rwxr-xr-x
pnmindex
4.49
KB
-rwxr-xr-x
pnminterp
14.02
KB
-rwxr-xr-x
pnminterp-gen
1.31
KB
-rwxr-xr-x
pnminvert
14.02
KB
-rwxr-xr-x
pnmmargin
1.73
KB
-rwxr-xr-x
pnmmontage
18.03
KB
-rwxr-xr-x
pnmnlfilt
22.09
KB
-rwxr-xr-x
pnmnoraw
14.02
KB
-rwxr-xr-x
pnmnorm
14.02
KB
-rwxr-xr-x
pnmpad
14.02
KB
-rwxr-xr-x
pnmpaste
14.02
KB
-rwxr-xr-x
pnmpsnr
14.02
KB
-rwxr-xr-x
pnmquant
3.13
KB
-rwxr-xr-x
pnmremap
18.02
KB
-rwxr-xr-x
pnmrotate
18.02
KB
-rwxr-xr-x
pnmscale
22.02
KB
-rwxr-xr-x
pnmscalefixed
18.02
KB
-rwxr-xr-x
pnmshear
14.02
KB
-rwxr-xr-x
pnmsmooth
14.02
KB
-rwxr-xr-x
pnmsplit
14.02
KB
-rwxr-xr-x
pnmtile
14.02
KB
-rwxr-xr-x
pnmtoddif
18.02
KB
-rwxr-xr-x
pnmtofiasco
208.05
KB
-rwxr-xr-x
pnmtofits
14.02
KB
-rwxr-xr-x
pnmtojpeg
22.02
KB
-rwxr-xr-x
pnmtopalm
22.02
KB
-rwxr-xr-x
pnmtoplainpnm
14.02
KB
-rwxr-xr-x
pnmtopng
38.09
KB
-rwxr-xr-x
pnmtops
18.02
KB
-rwxr-xr-x
pnmtorast
14.02
KB
-rwxr-xr-x
pnmtorle
42.3
KB
-rwxr-xr-x
pnmtosgi
18.02
KB
-rwxr-xr-x
pnmtosir
14.02
KB
-rwxr-xr-x
pnmtotiff
18.02
KB
-rwxr-xr-x
pnmtotiffcmyk
22.02
KB
-rwxr-xr-x
pnmtoxwd
14.02
KB
-rwxr-xr-x
pod2html
4.04
KB
-rwxr-xr-x
pod2man
14.68
KB
-rwxr-xr-x
pod2text
10.55
KB
-rwxr-xr-x
pod2usage
4.01
KB
-rwxr-xr-x
podchecker
3.57
KB
-rwxr-xr-x
policytool
14.32
KB
-rwxr-xr-x
pollinate
8.54
KB
-rwxr-xr-x
pooltype
14.37
KB
-rwxr-xr-x
post-grohtml
198.51
KB
-rwxr-xr-x
pphs
404
B
-rwxr-xr-x
ppltotf
62.39
KB
-rwxr-xr-x
ppm3d
18.02
KB
-rwxr-xr-x
ppmbrighten
14.02
KB
-rwxr-xr-x
ppmchange
14.02
KB
-rwxr-xr-x
ppmcie
26.19
KB
-rwxr-xr-x
ppmcolormask
14.02
KB
-rwxr-xr-x
ppmcolors
14.02
KB
-rwxr-xr-x
ppmdim
14.02
KB
-rwxr-xr-x
ppmdist
14.02
KB
-rwxr-xr-x
ppmdither
14.02
KB
-rwxr-xr-x
ppmfade
11.39
KB
-rwxr-xr-x
ppmflash
14.02
KB
-rwxr-xr-x
ppmforge
22.03
KB
-rwxr-xr-x
ppmhist
14.02
KB
-rwxr-xr-x
ppmlabel
14.02
KB
-rwxr-xr-x
ppmmake
14.02
KB
-rwxr-xr-x
ppmmix
14.02
KB
-rwxr-xr-x
ppmnorm
14.02
KB
-rwxr-xr-x
ppmntsc
18.02
KB
-rwxr-xr-x
ppmpat
26.02
KB
-rwxr-xr-x
ppmquant
18.02
KB
-rwxr-xr-x
ppmquantall
2.02
KB
-rwxr-xr-x
ppmqvga
18.02
KB
-rwxr-xr-x
ppmrainbow
1.67
KB
-rwxr-xr-x
ppmrelief
14.02
KB
-rwxr-xr-x
ppmshadow
6.67
KB
-rwxr-xr-x
ppmshift
14.02
KB
-rwxr-xr-x
ppmspread
14.02
KB
-rwxr-xr-x
ppmtoacad
18.88
KB
-rwxr-xr-x
ppmtobmp
18.07
KB
-rwxr-xr-x
ppmtoeyuv
14.02
KB
-rwxr-xr-x
ppmtogif
22.03
KB
-rwxr-xr-x
ppmtoicr
14.02
KB
-rwxr-xr-x
ppmtoilbm
46.11
KB
-rwxr-xr-x
ppmtojpeg
22.02
KB
-rwxr-xr-x
ppmtoleaf
14.02
KB
-rwxr-xr-x
ppmtolj
14.02
KB
-rwxr-xr-x
ppmtomap
81
B
-rwxr-xr-x
ppmtomitsu
22.02
KB
-rwxr-xr-x
ppmtompeg
541.94
KB
-rwxr-xr-x
ppmtoneo
14.02
KB
-rwxr-xr-x
ppmtopcx
18.02
KB
-rwxr-xr-x
ppmtopgm
18.02
KB
-rwxr-xr-x
ppmtopi1
14.02
KB
-rwxr-xr-x
ppmtopict
14.02
KB
-rwxr-xr-x
ppmtopj
14.09
KB
-rwxr-xr-x
ppmtopuzz
14.02
KB
-rwxr-xr-x
ppmtorgb3
14.02
KB
-rwxr-xr-x
ppmtosixel
14.02
KB
-rwxr-xr-x
ppmtotga
18.02
KB
-rwxr-xr-x
ppmtouil
14.02
KB
-rwxr-xr-x
ppmtowinicon
18.05
KB
-rwxr-xr-x
ppmtoxpm
18.02
KB
-rwxr-xr-x
ppmtoyuv
14.02
KB
-rwxr-xr-x
ppmtoyuvsplit
14.02
KB
-rwxr-xr-x
ppmtv
14.02
KB
-rwxr-xr-x
pr
66.58
KB
-rwxr-xr-x
pre-grohtml
90.52
KB
-rwxr-xr-x
precat
5.52
KB
-rwxr-xr-x
preconv
54.48
KB
-rwxr-xr-x
prepmx
131.63
KB
-rwxr-xr-x
preunzip
5.52
KB
-rwxr-xr-x
prezip
5.52
KB
-rwxr-xr-x
prezip-bin
14.3
KB
-rwxr-xr-x
print
18.06
KB
-rwxr-xr-x
printafm
395
B
-rwxr-xr-x
printenv
30.38
KB
-rwxr-xr-x
printf
50.44
KB
-rwxr-xr-x
prlimit
26.89
KB
-rwxr-xr-x
pro
1003
B
-rwxr-xr-x
procan
30.4
KB
-rwxr-xr-x
procinfo
106.2
KB
-rwxr-xr-x
procmail
106.52
KB
-rwsr-sr-x
prove
13.34
KB
-rwxr-xr-x
prtstat
22.38
KB
-rwxr-xr-x
ps
138.45
KB
-rwxr-xr-x
ps2ascii
631
B
-rwxr-xr-x
ps2epsi
1.23
KB
-rwxr-xr-x
ps2pdf
272
B
-rwxr-xr-x
ps2pdf12
215
B
-rwxr-xr-x
ps2pdf13
215
B
-rwxr-xr-x
ps2pdf14
215
B
-rwxr-xr-x
ps2pdfwr
1.05
KB
-rwxr-xr-x
ps2pk
129.27
KB
-rwxr-xr-x
ps2ps
647
B
-rwxr-xr-x
ps2ps2
669
B
-rwxr-xr-x
ps2txt
631
B
-rwxr-xr-x
psfaddtable
26.23
KB
-rwxr-xr-x
psfgettable
26.23
KB
-rwxr-xr-x
psfstriptable
26.23
KB
-rwxr-xr-x
psfxtable
26.23
KB
-rwxr-xr-x
psidtopgm
14.02
KB
-rwxr-xr-x
pslog
14.3
KB
-rwxr-xr-x
psql
9.21
KB
-rwxr-xr-x
pstopnm
18.02
KB
-rwxr-xr-x
pstree
35.32
KB
-rwxr-xr-x
pstree.x11
35.32
KB
-rwxr-xr-x
ptar
3.48
KB
-rwxr-xr-x
ptardiff
2.58
KB
-rwxr-xr-x
ptargrep
4.29
KB
-rwxr-xr-x
ptaskset
4.46
KB
-rwxr-xr-x
ptex
456.16
KB
-rwxr-xr-x
ptftopl
46.41
KB
-rwxr-xr-x
pth-config
3.93
KB
-rwxr-xr-x
pts-subscribe
4.66
KB
-rwxr-xr-x
pts-unsubscribe
4.66
KB
-rwxr-xr-x
ptx
126.55
KB
-rwxr-xr-x
puma
527
B
-rwxr-xr-x
pumactl
533
B
-rwxr-xr-x
purge-old-kernels
1.12
KB
-rwxr-xr-x
pwd
34.51
KB
-rwxr-xr-x
pwdx
14.23
KB
-rwxr-xr-x
py3clean
7.63
KB
-rwxr-xr-x
py3compile
12.88
KB
-rwxr-xr-x
py3rsa-decrypt
952
B
-rwxr-xr-x
py3rsa-encrypt
952
B
-rwxr-xr-x
py3rsa-keygen
950
B
-rwxr-xr-x
py3rsa-priv2pub
954
B
-rwxr-xr-x
py3rsa-sign
946
B
-rwxr-xr-x
py3rsa-verify
950
B
-rwxr-xr-x
py3versions
11.63
KB
-rwxr-xr-x
pybabel
953
B
-rwxr-xr-x
pybabel-python3
953
B
-rwxr-xr-x
pydoc3
79
B
-rwxr-xr-x
pydoc3.10
79
B
-rwxr-xr-x
pygettext3
23.67
KB
-rwxr-xr-x
pygettext3.10
23.67
KB
-rwxr-xr-x
pygmentize
970
B
-rwxr-xr-x
pyserial-miniterm
975
B
-rwxr-xr-x
pyserial-ports
969
B
-rwxr-xr-x
python
5.66
MB
-rwxr-xr-x
python2.7
3.43
MB
-rwxr-xr-x
python3
5.66
MB
-rwxr-xr-x
python3-config
3.05
KB
-rwxr-xr-x
python3-futurize
960
B
-rwxr-xr-x
python3-pasteurize
964
B
-rwxr-xr-x
python3.10
5.66
MB
-rwxr-xr-x
python3.10-config
3.05
KB
-rwxr-xr-x
pzstd
702.47
KB
-rwxr-xr-x
qrttoppm
14.02
KB
-rwxr-xr-x
qsexec
18.15
KB
-rwxr-xr-x
qsfilter2
54.16
KB
-rwxr-xr-x
qsgrep
18.15
KB
-rwxr-xr-x
qslog
58.16
KB
-rwxr-xr-x
qslogger
22.23
KB
-rwxr-xr-x
qspng
35.59
KB
-rwxr-xr-x
qsrotate
30.18
KB
-rwxr-xr-x
qssign
30.25
KB
-rwxr-xr-x
qstail
14.15
KB
-rwxr-xr-x
qt-faststart
18.3
KB
-rwxr-xr-x
r-mpost
800
KB
-rwxr-xr-x
r-pmpost
804.04
KB
-rwxr-xr-x
r-upmpost
808.04
KB
-rwxr-xr-x
racc
8.28
KB
-rwxr-xr-x
racc2y
4.53
KB
-rwxr-xr-x
racc3.0
586
B
-rwxr-xr-x
rackup
531
B
-rwxr-xr-x
rails
545
B
-rwxr-xr-x
rake
527
B
-rwxr-xr-x
rake3.0
530
B
-rwxr-xr-x
ranlib
54.48
KB
-rwxr-xr-x
rasttopnm
18.02
KB
-rwxr-xr-x
rawtopgm
14.02
KB
-rwxr-xr-x
rawtoppm
14.02
KB
-rwxr-xr-x
rbash
1.33
MB
-rwxr-xr-x
rbs3.0
524
B
-rwxr-xr-x
rc-alert
15.01
KB
-rwxr-xr-x
rcp
130.59
KB
-rwxr-xr-x
rcs
194.88
KB
-rwxr-xr-x
rcsclean
825
B
-rwxr-xr-x
rcsdiff
822
B
-rwxr-xr-x
rcsmerge
825
B
-rwxr-xr-x
rdebsums
2.61
KB
-rwxr-xr-x
rdiffdir
8.91
KB
-rwxr-xr-x
rdisc6
26.38
KB
-rwsr-xr-x
rdjpgcom
14.14
KB
-rwxr-xr-x
rdma
98.52
KB
-rwxr-xr-x
rdoc
513
B
-rwxr-xr-x
rdoc3.0
513
B
-rwxr-xr-x
readelf
758.44
KB
-rwxr-xr-x
readlink
38.41
KB
-rwxr-xr-x
readmsg
35.91
KB
-rwxr-xr-x
readmsg.mailutils
35.91
KB
-rwxr-xr-x
readproctitle
13.94
KB
-rwxr-xr-x
realpath
38.41
KB
-rwxr-xr-x
recode
38.23
KB
-rwxr-xr-x
recode-sr-latin
14.38
KB
-rwxr-xr-x
recountdiff
3.37
KB
-rwxr-xr-x
red
89
B
-rwxr-xr-x
redcloth
551
B
-rwxr-xr-x
rediff
30.42
KB
-rwxr-xr-x
refer
134.52
KB
-rwxr-xr-x
reformail
58.25
KB
-rwxr-xr-x
reformime
86.27
KB
-rwxr-xr-x
reindexdb
9.21
KB
-rwxr-xr-x
renice
14.38
KB
-rwxr-xr-x
reproducible-check
7.97
KB
-rwxr-xr-x
rescan-scsi-bus.sh
38.05
KB
-rwxr-xr-x
reset
26.31
KB
-rwxr-xr-x
resizecons
26.32
KB
-rwxr-xr-x
resizepart
22.38
KB
-rwxr-xr-x
resolvectl
130.52
KB
-rwxr-xr-x
rev
14.38
KB
-rwxr-xr-x
rgb3toppm
14.02
KB
-rwxr-xr-x
rgrep
30
B
-rwxr-xr-x
ri
509
B
-rwxr-xr-x
ri3.0
509
B
-rwxr-xr-x
rimraf
1.83
KB
-rwxr-xr-x
rjoe
729.83
KB
-rwxr-xr-x
rksh
1.36
MB
-rwxr-xr-x
rksh93
1.36
MB
-rwxr-xr-x
rletopnm
42.27
KB
-rwxr-xr-x
rlog
813
B
-rwxr-xr-x
rlogin
827.04
KB
-rwxr-xr-x
rlogin-cwd
504
B
-rwxr-xr-x
rltraceroute6
34.45
KB
-rwsr-xr-x
rm
58.51
KB
-rwxr-xr-x
rmadison
12.55
KB
-rwxr-xr-x
rmail
18.3
KB
-rwxr-xr-x
rmcp_ping
14.16
KB
-rwxr-xr-x
rmdir
42.41
KB
-rwxr-xr-x
rmic
14.32
KB
-rwxr-xr-x
rmid
14.32
KB
-rwxr-xr-x
rmiregistry
14.32
KB
-rwxr-xr-x
rnano
276.52
KB
-rwxr-xr-x
roff2dvi
5.58
KB
-rwxr-xr-x
roff2html
5.58
KB
-rwxr-xr-x
roff2pdf
5.58
KB
-rwxr-xr-x
roff2ps
5.58
KB
-rwxr-xr-x
roff2text
5.58
KB
-rwxr-xr-x
roff2x
5.58
KB
-rwxr-xr-x
rotatelogs
26.38
KB
-rwxr-xr-x
routef
208
B
-rwxr-xr-x
routel
1.62
KB
-rwxr-xr-x
rpcgen
94.59
KB
-rwxr-xr-x
rpcinfo
34.48
KB
-rwxr-xr-x
rpdump
996.76
KB
-rwxr-xr-x
rpload
1008.76
KB
-rwxr-xr-x
rrdcgi
34.3
KB
-rwxr-xr-x
rrdcreate
126.58
KB
-rwxr-xr-x
rrdinfo
126.58
KB
-rwxr-xr-x
rrdtool
34.3
KB
-rwxr-xr-x
rrdupdate
126.58
KB
-rwxr-xr-x
rrsync
12.34
KB
-rwxr-xr-x
rsh
827.04
KB
-rwxr-xr-x
rst-buildhtml
10.58
KB
-rwxr-xr-x
rst2html
594
B
-rwxr-xr-x
rst2html4
714
B
-rwxr-xr-x
rst2html5
1.06
KB
-rwxr-xr-x
rst2latex
791
B
-rwxr-xr-x
rst2man
599
B
-rwxr-xr-x
rst2odt
764
B
-rwxr-xr-x
rst2odt_prepstyles
2.28
KB
-rwxr-xr-x
rst2pseudoxml
601
B
-rwxr-xr-x
rst2s5
637
B
-rwxr-xr-x
rst2xetex
871
B
-rwxr-xr-x
rst2xml
602
B
-rwxr-xr-x
rstpep2html
670
B
-rwxr-xr-x
rsync
506.13
KB
-rwxr-xr-x
rsync-ssl
5.02
KB
-rwxr-xr-x
rtin
1
MB
-rwxr-xr-x
rtstat
22.66
KB
-rwxr-xr-x
ruby
14.15
KB
-rwxr-xr-x
ruby3.0
14.15
KB
-rwxr-xr-x
run-mailcap
18.06
KB
-rwxr-xr-x
run-one
3.51
KB
-rwxr-xr-x
run-one-constantly
3.51
KB
-rwxr-xr-x
run-one-until-failure
3.51
KB
-rwxr-xr-x
run-one-until-success
3.51
KB
-rwxr-xr-x
run-parts
26.54
KB
-rwxr-xr-x
run-this-one
3.51
KB
-rwxr-xr-x
run-with-aspell
57
B
-rwxr-xr-x
runcon
34.51
KB
-rwxr-xr-x
rungs
901
B
-rwxr-xr-x
runsv
30.34
KB
-rwxr-xr-x
runsvdir
26.34
KB
-rwxr-xr-x
rushlast
75.19
KB
-rwxr-xr-x
rushwho
75.03
KB
-rwxr-xr-x
rview
3.61
MB
-rwxr-xr-x
rvim
3.61
MB
-rwxr-xr-x
rzsh
989.58
KB
-rwxr-xr-x
s3cmd
148.18
KB
-rwxr-xr-x
sadf
390.24
KB
-rwxr-xr-x
sadt
18.29
KB
-rwxr-xr-x
safecat
22.16
KB
-rwxr-xr-x
salsa
22.04
KB
-rwxr-xr-x
sar
133.45
KB
-rwxr-xr-x
sar.sysstat
133.45
KB
-rwxr-xr-x
sass
527
B
-rwxr-xr-x
sass-convert
543
B
-rwxr-xr-x
savelog
10.24
KB
-rwxr-xr-x
sbattach
26.54
KB
-rwxr-xr-x
sbigtopgm
14.12
KB
-rwxr-xr-x
sbkeysync
34.74
KB
-rwxr-xr-x
sbsiglist
14.6
KB
-rwxr-xr-x
sbsign
34.7
KB
-rwxr-xr-x
sbvarsign
22.73
KB
-rwxr-xr-x
sbverify
34.61
KB
-rwxr-xr-x
scandeps
6.45
KB
-rwxr-xr-x
schedtool
22.22
KB
-rwxr-xr-x
schemagen
14.32
KB
-rwxr-xr-x
scor2prt
80.57
KB
-rwxr-xr-x
scp
130.59
KB
-rwxr-xr-x
screen
466.24
KB
-rwxr-xr-x
screendump
14.15
KB
-rwxr-xr-x
script
50.38
KB
-rwxr-xr-x
scriptlive
42.38
KB
-rwxr-xr-x
scriptreplay
34.38
KB
-rwxr-xr-x
scsi_logging_level
8.38
KB
-rwxr-xr-x
scsi_mandat
3.52
KB
-rwxr-xr-x
scsi_readcap
1.3
KB
-rwxr-xr-x
scsi_ready
1.09
KB
-rwxr-xr-x
scsi_satl
3.74
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
scss
527
B
-rwxr-xr-x
sdiff
46.39
KB
-rwxr-xr-x
sdrcomp
65.82
KB
-rwxr-xr-x
sed
110.57
KB
-rwxr-xr-x
see
18.06
KB
-rwxr-xr-x
select-default-iwrap
474
B
-rwxr-xr-x
select-editor
2.39
KB
-rwxr-xr-x
semver
4.26
KB
-rwxr-xr-x
sensible-browser
1.26
KB
-rwxr-xr-x
sensible-editor
1.24
KB
-rwxr-xr-x
sensible-pager
565
B
-rwxr-xr-x
seq
46.51
KB
-rwxr-xr-x
serialver
14.32
KB
-rwxr-xr-x
servertool
14.32
KB
-rwxr-xr-x
setarch
26.65
KB
-rwxr-xr-x
setfacl
42.91
KB
-rwxr-xr-x
setfattr
18.59
KB
-rwxr-xr-x
setfont
50.32
KB
-rwxr-xr-x
setkeycodes
14.23
KB
-rwxr-xr-x
setleds
18.21
KB
-rwxr-xr-x
setlock
22.02
KB
-rwxr-xr-x
setlogcons
14.23
KB
-rwxr-xr-x
setmetamode
14.26
KB
-rwxr-xr-x
setpci
30.38
KB
-rwxr-xr-x
setpriv
38.38
KB
-rwxr-xr-x
setsid
14.38
KB
-rwxr-xr-x
setterm
34.38
KB
-rwxr-xr-x
setuidgid
21.99
KB
-rwxr-xr-x
setupcon
38.31
KB
-rwxr-xr-x
setxkbmap
26.7
KB
-rwxr-xr-x
sftp
142.66
KB
-rwxr-xr-x
sg
39.55
KB
-rwsr-xr-x
sg_bg_ctl
14.51
KB
-rwxr-xr-x
sg_compare_and_write
26.91
KB
-rwxr-xr-x
sg_copy_results
23.3
KB
-rwxr-xr-x
sg_dd
54.33
KB
-rwxr-xr-x
sg_decode_sense
14.76
KB
-rwxr-xr-x
sg_emc_trespass
14.3
KB
-rwxr-xr-x
sg_format
39.35
KB
-rwxr-xr-x
sg_get_config
35.39
KB
-rwxr-xr-x
sg_get_elem_status
26.79
KB
-rwxr-xr-x
sg_get_lba_status
22.95
KB
-rwxr-xr-x
sg_ident
14.6
KB
-rwxr-xr-x
sg_inq
119.61
KB
-rwxr-xr-x
sg_logs
150.93
KB
-rwxr-xr-x
sg_luns
22.79
KB
-rwxr-xr-x
sg_map
18.3
KB
-rwxr-xr-x
sg_map26
26.7
KB
-rwxr-xr-x
sg_modes
46.08
KB
-rwxr-xr-x
sg_opcodes
35.01
KB
-rwxr-xr-x
sg_persist
36.08
KB
-rwxr-xr-x
sg_prevent
14.51
KB
-rwxr-xr-x
sg_raw
26.91
KB
-rwxr-xr-x
sg_rbuf
22.73
KB
-rwxr-xr-x
sg_rdac
14.3
KB
-rwxr-xr-x
sg_read
26.31
KB
-rwxr-xr-x
sg_read_attr
36.65
KB
-rwxr-xr-x
sg_read_block_limits
14.54
KB
-rwxr-xr-x
sg_read_buffer
27.56
KB
-rwxr-xr-x
sg_read_long
14.7
KB
-rwxr-xr-x
sg_readcap
22.79
KB
-rwxr-xr-x
sg_reassign
14.66
KB
-rwxr-xr-x
sg_referrals
14.66
KB
-rwxr-xr-x
sg_rep_pip
14.57
KB
-rwxr-xr-x
sg_rep_zones
26.8
KB
-rwxr-xr-x
sg_requests
22.76
KB
-rwxr-xr-x
sg_reset
14.66
KB
-rwxr-xr-x
sg_reset_wp
14.6
KB
-rwxr-xr-x
sg_rmsn
14.51
KB
-rwxr-xr-x
sg_rtpg
14.6
KB
-rwxr-xr-x
sg_safte
22.7
KB
-rwxr-xr-x
sg_sanitize
27.01
KB
-rwxr-xr-x
sg_sat_identify
18.73
KB
-rwxr-xr-x
sg_sat_phy_event
19.01
KB
-rwxr-xr-x
sg_sat_read_gplog
18.73
KB
-rwxr-xr-x
sg_sat_set_features
18.7
KB
-rwxr-xr-x
sg_scan
18.3
KB
-rwxr-xr-x
sg_seek
18.88
KB
-rwxr-xr-x
sg_senddiag
27.2
KB
-rwxr-xr-x
sg_ses
119.97
KB
-rwxr-xr-x
sg_ses_microcode
27.36
KB
-rwxr-xr-x
sg_start
18.85
KB
-rwxr-xr-x
sg_stpg
22.73
KB
-rwxr-xr-x
sg_stream_ctl
18.7
KB
-rwxr-xr-x
sg_sync
14.66
KB
-rwxr-xr-x
sg_test_rwbuf
18.6
KB
-rwxr-xr-x
sg_timestamp
18.83
KB
-rwxr-xr-x
sg_turs
26.7
KB
-rwxr-xr-x
sg_unmap
22.76
KB
-rwxr-xr-x
sg_verify
18.91
KB
-rwxr-xr-x
sg_vpd
114.42
KB
-rwxr-xr-x
sg_wr_mode
22.73
KB
-rwxr-xr-x
sg_write_buffer
27.23
KB
-rwxr-xr-x
sg_write_long
14.76
KB
-rwxr-xr-x
sg_write_same
26.95
KB
-rwxr-xr-x
sg_write_verify
26.79
KB
-rwxr-xr-x
sg_write_x
55.6
KB
-rwxr-xr-x
sg_xcopy
42.32
KB
-rwxr-xr-x
sg_zone
14.86
KB
-rwxr-xr-x
sginfo
72.01
KB
-rwxr-xr-x
sgitopnm
18.02
KB
-rwxr-xr-x
sgm_dd
38.31
KB
-rwxr-xr-x
sgp_dd
46.31
KB
-rwxr-xr-x
sh
1.33
MB
-rwxr-xr-x
sha1sum
42.41
KB
-rwxr-xr-x
sha224sum
50.41
KB
-rwxr-xr-x
sha256sum
50.41
KB
-rwxr-xr-x
sha384sum
58.41
KB
-rwxr-xr-x
sha3sum
9.41
KB
-rwxr-xr-x
sha512sum
58.41
KB
-rwxr-xr-x
shar
137.28
KB
-rwxr-xr-x
shasum
9.75
KB
-rwxr-xr-x
shcomp
1.35
MB
-rwxr-xr-x
shcomp93
1.35
MB
-rwxr-xr-x
showconsolefont
18.23
KB
-rwxr-xr-x
showkey
18.23
KB
-rwxr-xr-x
showtable
29.66
KB
-rwxr-xr-x
shred
50.51
KB
-rwxr-xr-x
shuf
46.51
KB
-rwxr-xr-x
sieve
32.05
KB
-rwxr-xr-x
simpdftex
21.57
KB
-rwxr-xr-x
sirtopnm
14.02
KB
-rwxr-xr-x
size
30.45
KB
-rwxr-xr-x
skill
30.23
KB
-rwxr-xr-x
slabtop
22.23
KB
-rwxr-xr-x
sldtoppm
18.09
KB
-rwxr-xr-x
sleep
34.51
KB
-rwxr-xr-x
slogin
827.04
KB
-rwxr-xr-x
slrn
466.3
KB
-rwxr-xr-x
slsh
39.75
KB
-rwxr-xr-x
smime_keys
30.31
KB
-rwxr-xr-x
snice
30.23
KB
-rwxr-xr-x
snmp-bridge-mib
29.96
KB
-rwxr-xr-x
snmpbulkget
14.3
KB
-rwxr-xr-x
snmpbulkwalk
14.3
KB
-rwxr-xr-x
snmpcheck
32.91
KB
-rwxr-xr-x
snmpconf
25.44
KB
-rwxr-xr-x
snmpdelta
22.4
KB
-rwxr-xr-x
snmpdf
18.3
KB
-rwxr-xr-x
snmpget
14.3
KB
-rwxr-xr-x
snmpgetnext
14.3
KB
-rwxr-xr-x
snmpinform
14.57
KB
-rwxr-xr-x
snmpnetstat
68.29
KB
-rwxr-xr-x
snmpping
22.3
KB
-rwxr-xr-x
snmpset
14.3
KB
-rwxr-xr-x
snmpstatus
15.13
KB
-rwxr-xr-x
snmptable
26.33
KB
-rwxr-xr-x
snmptest
22.3
KB
-rwxr-xr-x
snmptls
18.3
KB
-rwxr-xr-x
snmptranslate
22.3
KB
-rwxr-xr-x
snmptrap
14.57
KB
-rwxr-xr-x
snmpusm
42.51
KB
-rwxr-xr-x
snmpvacm
31.39
KB
-rwxr-xr-x
snmpwalk
18.3
KB
-rwxr-xr-x
socat
383.62
KB
-rwxr-xr-x
socklist
3.32
KB
-rwxr-xr-x
soelim
30.48
KB
-rwxr-xr-x
softlimit
22.02
KB
-rwxr-xr-x
solterm
26.23
KB
-rwxr-xr-x
sort
98.8
KB
-rwxr-xr-x
sort-dctrl
34.64
KB
-rwxr-xr-x
sos
612
B
-rwxr-xr-x
sos-collector
1.04
KB
-rwxr-xr-x
sosreport
1.03
KB
-rwxr-xr-x
spctoppm
14.02
KB
-rwxr-xr-x
sphinx-apidoc
967
B
-rwxr-xr-x
sphinx-autogen
969
B
-rwxr-xr-x
sphinx-build
965
B
-rwxr-xr-x
sphinx-quickstart
975
B
-rwxr-xr-x
splain
18.96
KB
-rwxr-xr-x
split
50.97
KB
-rwxr-xr-x
splitdiff
3.38
KB
-rwxr-xr-x
splitfont
14.15
KB
-rwxr-xr-x
spring
539
B
-rwxr-xr-x
sprockets
2.08
KB
-rwxr-xr-x
sputoppm
14.02
KB
-rwxr-xr-x
sqlite
35.41
KB
-rwxr-xr-x
sqlite3
1.56
MB
-rwxr-xr-x
ss
125.07
KB
-rwxr-xr-x
ssh
827.04
KB
-rwxr-xr-x
ssh-add
166.42
KB
-rwxr-xr-x
ssh-agent
286.43
KB
-rwxr-sr-x
ssh-argv0
1.42
KB
-rwxr-xr-x
ssh-copy-id
12.38
KB
-rwxr-xr-x
ssh-import-id
985
B
-rwxr-xr-x
ssh-import-id-gh
785
B
-rwxr-xr-x
ssh-import-id-lp
785
B
-rwxr-xr-x
ssh-keygen
446.44
KB
-rwxr-xr-x
ssh-keyscan
190.44
KB
-rwxr-xr-x
st4topgm
14.02
KB
-rwxr-xr-x
stat
78.52
KB
-rwxr-xr-x
static-sh
2.09
MB
-rwxr-xr-x
stdbuf
42.51
KB
-rwxr-xr-x
strace
1.88
MB
-rwxr-xr-x
strace-log-merge
1.78
KB
-rwxr-xr-x
stream
14.15
KB
-rwxr-xr-x
stream-im6
14.15
KB
-rwxr-xr-x
stream-im6.q16
14.15
KB
-rwxr-xr-x
streamzip
7.75
KB
-rwxr-xr-x
strfile
18.15
KB
-rwxr-xr-x
strings
30.61
KB
-rwxr-xr-x
strip
162.57
KB
-rwxr-xr-x
stty
74.51
KB
-rwxr-xr-x
stubmaker
3.34
KB
-rwxr-xr-x
stunnel
219.96
KB
-rwxr-xr-x
stunnel3
2.72
KB
-rwxr-xr-x
stunnel4
219.96
KB
-rwxr-xr-x
su
54.38
KB
-rwsr-xr-x
sudo
226.97
KB
-rwsr-xr-x
sudoedit
226.97
KB
-rwsr-xr-x
sudoreplay
87.64
KB
-rwxr-xr-x
sum
34.41
KB
-rwxr-xr-x
supervise
26.07
KB
-rwxr-xr-x
suspicious-source
5.39
KB
-rwxr-xr-x
sv
26.38
KB
-rwxr-xr-x
svc
22.04
KB
-rwxr-xr-x
svlogd
46.38
KB
-rwxr-xr-x
svn
442.44
KB
-rwxr-xr-x
svn-backup-dumps
23.93
KB
-rwxr-xr-x
svn-bisect
4.31
KB
-rwxr-xr-x
svn-clean
6.43
KB
-rwxr-xr-x
svn-hot-backup
11.46
KB
-rwxr-xr-x
svn-mergeinfo-normalizer
82.38
KB
-rwxr-xr-x
svn-populate-node-origins-inde...
14.3
KB
-rwxr-xr-x
svn-vendor
46.9
KB
-rwxr-xr-x
svn_apply_autoprops
5.41
KB
-rwxr-xr-x
svn_load_dirs
65.8
KB
-rwxr-xr-x
svnadmin
134.38
KB
-rwxr-xr-x
svnauthz
34.38
KB
-rwxr-xr-x
svnauthz-validate
34.38
KB
-rwxr-xr-x
svnbench
74.38
KB
-rwxr-xr-x
svndiff
807
B
-rwxr-xr-x
svndiffview
814
B
-rwxr-xr-x
svndumpfilter
42.48
KB
-rwxr-xr-x
svnfsfs
42.38
KB
-rwxr-xr-x
svnlook
90.38
KB
-rwxr-xr-x
svnmucc
34.38
KB
-rwxr-xr-x
svnpath
2.4
KB
-rwxr-xr-x
svnraisetreeconflict
18.38
KB
-rwxr-xr-x
svnrdump
54.38
KB
-rwxr-xr-x
svnserve
110.44
KB
-rwxr-xr-x
svnsync
66.38
KB
-rwxr-xr-x
svnversion
14.38
KB
-rwxr-xr-x
svnwrap
894
B
-rwxr-xr-x
svok
13.98
KB
-rwxr-xr-x
svscan
21.98
KB
-rwxr-xr-x
svscanboot
743
B
-rwxr-xr-x
svstat
22.04
KB
-rwxr-xr-x
swig
1.88
MB
-rwxr-xr-x
swig4.0
1.88
MB
-rwxr-xr-x
sync
34.41
KB
-rwxr-xr-x
synctex
34.3
KB
-rwxr-xr-x
systemctl
1.06
MB
-rwxr-xr-x
systemd
1.76
MB
-rwxr-xr-x
systemd-analyze
1.73
MB
-rwxr-xr-x
systemd-ask-password
18.48
KB
-rwxr-xr-x
systemd-cat
18.38
KB
-rwxr-xr-x
systemd-cgls
22.48
KB
-rwxr-xr-x
systemd-cgtop
38.39
KB
-rwxr-xr-x
systemd-cryptenroll
50.53
KB
-rwxr-xr-x
systemd-delta
26.37
KB
-rwxr-xr-x
systemd-detect-virt
18.37
KB
-rwxr-xr-x
systemd-escape
22.37
KB
-rwxr-xr-x
systemd-hwdb
118.66
KB
-rwxr-xr-x
systemd-id128
26.37
KB
-rwxr-xr-x
systemd-inhibit
22.39
KB
-rwxr-xr-x
systemd-machine-id-setup
18.48
KB
-rwxr-xr-x
systemd-mount
50.59
KB
-rwxr-xr-x
systemd-notify
22.38
KB
-rwxr-xr-x
systemd-path
18.37
KB
-rwxr-xr-x
systemd-run
62.57
KB
-rwxr-xr-x
systemd-socket-activate
26.37
KB
-rwxr-xr-x
systemd-stdio-bridge
22.38
KB
-rwxr-xr-x
systemd-sysext
46.49
KB
-rwxr-xr-x
systemd-sysusers
62.68
KB
-rwxr-xr-x
systemd-tmpfiles
98.57
KB
-rwxr-xr-x
systemd-tty-ask-password-agent
34.37
KB
-rwxr-xr-x
systemd-umount
50.59
KB
-rwxr-xr-x
t1ascii
38.52
KB
-rwxr-xr-x
t1asm
39.55
KB
-rwxr-xr-x
t1binary
38.51
KB
-rwxr-xr-x
t1disasm
42.47
KB
-rwxr-xr-x
t1mac
46.6
KB
-rwxr-xr-x
t1unmac
38.67
KB
-rwxr-xr-x
t4ht
34.38
KB
-rwxr-xr-x
tabs
18.3
KB
-rwxr-xr-x
tac
98.41
KB
-rwxr-xr-x
tagpending
12.06
KB
-rwxr-xr-x
tai64n
14.02
KB
-rwxr-xr-x
tai64nlocal
14.08
KB
-rwxr-xr-x
tail
66.52
KB
-rwxr-xr-x
tangle
46.47
KB
-rwxr-xr-x
tapestat
26.44
KB
-rwxr-xr-x
tar
505.81
KB
-rwxr-xr-x
tasksel
26.82
KB
-rwxr-xr-x
taskset
22.38
KB
-rwxr-xr-x
tbl
126.48
KB
-rwxr-xr-x
tbl-dctrl
38.73
KB
-rwxr-xr-x
tclsh
14.15
KB
-rwxr-xr-x
tclsh8.6
14.15
KB
-rwxr-xr-x
tcpdump
1.27
MB
-rwxr-xr-x
tcpspray.ndisc6
22.38
KB
-rwxr-xr-x
tcpspray6
56
B
-rwxr-xr-x
tcptraceroute6
14.38
KB
-rwxr-xr-x
tcsh
425.4
KB
-rwxr-xr-x
tee
34.51
KB
-rwxr-xr-x
telnet
107.56
KB
-rwxr-xr-x
telnet.netkit
107.56
KB
-rwxr-xr-x
tempfile
14.02
KB
-rwxr-xr-x
test
42.44
KB
-rwxr-xr-x
tex
399.97
KB
-rwxr-xr-x
tex2aspc
18.42
KB
-rwxr-xr-x
tex4ht
102.44
KB
-rwxr-xr-x
texdoc
1.35
KB
-rwxr-xr-x
texdoctk
60.77
KB
-rwxr-xr-x
texhash
8.03
KB
-rwxr-xr-x
texlua
6.64
MB
-rwxr-xr-x
texluac
6.64
MB
-rwxr-xr-x
texluajit
6.54
MB
-rwxr-xr-x
texluajitc
6.54
MB
-rwxr-xr-x
tfmtodit
42.6
KB
-rwxr-xr-x
tftopl
38.41
KB
-rwxr-xr-x
tgatoppm
18.02
KB
-rwxr-xr-x
thinkjettopbm
22.03
KB
-rwxr-xr-x
thor
510
B
-rwxr-xr-x
tic
86.41
KB
-rwxr-xr-x
tidy
42.23
KB
-rwxr-xr-x
tie
18.3
KB
-rwxr-xr-x
tifftopnm
26.02
KB
-rwxr-xr-x
tilt
3.38
KB
-rwxr-xr-x
time
26.52
KB
-rwxr-xr-x
timed-read
306
B
-rwxr-xr-x
timed-run
280
B
-rwxr-xr-x
timedatectl
46.37
KB
-rwxr-xr-x
timeout
38.95
KB
-rwxr-xr-x
tin
1
MB
-rwxr-xr-x
tknewsbiff
11.24
KB
-rwxr-xr-x
tkpasswd
16.3
KB
-rwxr-xr-x
tl-paper
4.46
KB
-rwxr-xr-x
tlmgr
339.11
KB
-rwxr-xr-x
tload
18.24
KB
-rwxr-xr-x
tmux
948.55
KB
-rwxr-xr-x
tnameserv
14.38
KB
-rwxr-xr-x
tnftp
178.9
KB
-rwxr-xr-x
todos
18.17
KB
-rwxr-xr-x
toe
22.3
KB
-rwxr-xr-x
toilet
26.68
KB
-rwxr-xr-x
top
130.06
KB
-rwxr-xr-x
touch
90.51
KB
-rwxr-xr-x
tpage
8.86
KB
-rwxr-xr-x
tpic2pdftex
12.29
KB
-rwxr-xr-x
tput
26.34
KB
-rwxr-xr-x
tr
46.51
KB
-rwxr-xr-x
trac-admin
955
B
-rwxr-xr-x
tracd
945
B
-rwxr-xr-x
tracepath
18.15
KB
-rwxr-xr-x
traceproto
2.82
KB
-rwxr-xr-x
traceproto.db
2.82
KB
-rwxr-xr-x
traceroute
67.16
KB
-rwxr-xr-x
traceroute-nanog
1.58
KB
-rwxr-xr-x
traceroute.db
67.16
KB
-rwxr-xr-x
traceroute6
34.45
KB
-rwsr-xr-x
traceroute6.db
67.16
KB
-rwxr-xr-x
tracert6
54
B
-rwxr-xr-x
transform-fdt
1.13
KB
-rwxr-xr-x
transition-check
6.35
KB
-rwxr-xr-x
tree
79.38
KB
-rwxr-xr-x
troff
718.61
KB
-rwxr-xr-x
true
26.3
KB
-rwxr-xr-x
truncate
34.51
KB
-rwxr-xr-x
tryaffix
4.8
KB
-rwxr-xr-x
tset
26.31
KB
-rwxr-xr-x
tsort
46.51
KB
-rwxr-xr-x
ttf2afm
46.4
KB
-rwxr-xr-x
ttf2pk
88.22
KB
-rwxr-xr-x
ttf2tfm
138.38
KB
-rwxr-xr-x
ttfdump
103.5
KB
-rwxr-xr-x
ttree
38.23
KB
-rwxr-xr-x
tty
30.51
KB
-rwxr-xr-x
typeprof3.0
554
B
-rwxr-xr-x
tzselect
15.02
KB
-rwxr-xr-x
ua
1003
B
-rwxr-xr-x
ubuntu-advantage
1003
B
-rwxr-xr-x
ubuntu-bug
2.51
KB
-rwxr-xr-x
ubuntu-distro-info
22.89
KB
-rwxr-xr-x
ubuntu-security-status
22.25
KB
-rwxr-xr-x
ucf
40.9
KB
-rwxr-xr-x
ucfq
18.91
KB
-rwxr-xr-x
ucfr
10.47
KB
-rwxr-xr-x
uclampset
26.38
KB
-rwxr-xr-x
uconv
54.83
KB
-rwxr-xr-x
udevadm
1.08
MB
-rwxr-xr-x
ujconv
4.59
KB
-rwxr-xr-x
ujguess
3.59
KB
-rwxr-xr-x
ul
22.38
KB
-rwxr-xr-x
umap
6.52
KB
-rwxr-xr-x
umount
34.38
KB
-rwsr-xr-x
uname
34.51
KB
-rwxr-xr-x
unattended-upgrade
97.21
KB
-rwxr-xr-x
unattended-upgrades
97.21
KB
-rwxr-xr-x
unbuffer
643
B
-rwxr-xr-x
uncompress
2.29
KB
-rwxr-xr-x
unexpand
34.53
KB
-rwxr-xr-x
unicode_start
2.7
KB
-rwxr-xr-x
unicode_stop
530
B
-rwxr-xr-x
uniq
42.51
KB
-rwxr-xr-x
unix2dos
54.34
KB
-rwxr-xr-x
unix2mac
54.34
KB
-rwxr-xr-x
unlink
30.51
KB
-rwxr-xr-x
unlzma
82.52
KB
-rwxr-xr-x
unmkinitramfs
3.69
KB
-rwxr-xr-x
unpack200
109.12
KB
-rwxr-xr-x
unrtf
90.17
KB
-rwxr-xr-x
unshar
80.78
KB
-rwxr-xr-x
unshare
30.6
KB
-rwxr-xr-x
unstr
14.15
KB
-rwxr-xr-x
unwrapdiff
5.8
KB
-rwxr-xr-x
unxz
82.52
KB
-rwxr-xr-x
unzip
170.42
KB
-rwxr-xr-x
unzipsfx
78.42
KB
-rwxr-xr-x
unzstd
854.59
KB
-rwxr-xr-x
upbibtex
117.05
KB
-rwxr-xr-x
update-alternatives
58.24
KB
-rwxr-xr-x
update-leap
11.73
KB
-rwxr-xr-x
update-mime-database
58.23
KB
-rwxr-xr-x
update-perl-sax-parsers
6.03
KB
-rwxr-xr-x
update_rubygems
593
B
-rwxr-xr-x
updmap
86.25
KB
-rwxr-xr-x
updmap-sys
925
B
-rwxr-xr-x
updmap-user
922
B
-rwxr-xr-x
updvitomp
808.04
KB
-rwxr-xr-x
updvitype
58.43
KB
-rwxr-xr-x
upmendex
134.98
KB
-rwxr-xr-x
upmpost
808.04
KB
-rwxr-xr-x
upower
22.3
KB
-rwxr-xr-x
uppltotf
62.39
KB
-rwxr-xr-x
uptex
466.8
KB
-rwxr-xr-x
uptftopl
50.41
KB
-rwxr-xr-x
uptime
14.23
KB
-rwxr-xr-x
usb-devices
4.33
KB
-rwxr-xr-x
usbhid-dump
30.38
KB
-rwxr-xr-x
usbreset
14.3
KB
-rwxr-xr-x
uscan
74.67
KB
-rwxr-xr-x
users
34.51
KB
-rwxr-xr-x
utmpdump
22.38
KB
-rwxr-xr-x
uudecode
84.34
KB
-rwxr-xr-x
uuencode
80.34
KB
-rwxr-xr-x
uuidgen
18.38
KB
-rwxr-xr-x
uuidparse
22.38
KB
-rwxr-xr-x
uupdate
37.36
KB
-rwxr-xr-x
vacuumdb
9.21
KB
-rwxr-xr-x
vacuumlo
9.21
KB
-rwxr-xr-x
vcs-run
6.75
KB
-rwxr-xr-x
vdir
134.98
KB
-rwxr-xr-x
vector
123.5
MB
-rwxr-xr-x
vftovp
54.41
KB
-rwxr-xr-x
vi
3.61
MB
-rwxr-xr-x
view
3.61
MB
-rwxr-xr-x
viewres
31.23
KB
-rwxr-xr-x
vigpg
2.58
KB
-rwxr-xr-x
vim
3.61
MB
-rwxr-xr-x
vim.basic
3.61
MB
-rwxr-xr-x
vim.tiny
1.45
MB
-rwxr-xr-x
vimdiff
3.61
MB
-rwxr-xr-x
vimtutor
2.1
KB
-rwxr-xr-x
virtualenv
239
B
-rwxr-xr-x
vlna
18.45
KB
-rwxr-xr-x
vm-support
9.83
KB
-rwxr-xr-x
vmhgfs-fuse
46.73
KB
-rwxr-xr-x
vmstat
38.24
KB
-rwxr-xr-x
vmtoolsd
74.56
KB
-rwxr-xr-x
vmware-alias-import
42.52
KB
-rwxr-xr-x
vmware-checkvm
14.38
KB
-rwxr-xr-x
vmware-hgfsclient
14.38
KB
-rwxr-xr-x
vmware-namespace-cmd
22.3
KB
-rwxr-xr-x
vmware-rpctool
18.3
KB
-rwxr-xr-x
vmware-toolbox-cmd
58.59
KB
-rwxr-xr-x
vmware-vgauth-cmd
18.3
KB
-rwxr-xr-x
vmware-vmblock-fuse
18.78
KB
-rwxr-xr-x
vmware-xferlogs
32.33
KB
-rwxr-xr-x
vptovf
62.39
KB
-rwxr-xr-x
w
22.23
KB
-rwxr-xr-x
w3m
1.44
MB
-rwxr-xr-x
w3mman
1.24
KB
-rwxr-xr-x
wall
22.38
KB
-rwxr-xr-x
watch
26.6
KB
-rwxr-xr-x
watchgnupg
18.3
KB
-rwxr-xr-x
wbmptopbm
14.02
KB
-rwxr-xr-x
wc
42.42
KB
-rwxr-xr-x
wdctl
30.4
KB
-rwxr-xr-x
wdiff
34.23
KB
-rwxr-xr-x
weave
62.39
KB
-rwxr-xr-x
webpack
4.16
KB
-rwxr-xr-x
webpng
14.15
KB
-rwxr-xr-x
wget
459.02
KB
-rwxr-xr-x
what-patch
3.36
KB
-rwxr-xr-x
whatis
47.28
KB
-rwxr-xr-x
whereis
30.84
KB
-rwxr-xr-x
which
946
B
-rwxr-xr-x
which.debianutils
946
B
-rwxr-xr-x
whiptail
30.16
KB
-rwxr-xr-x
who
50.52
KB
-rwxr-xr-x
who-permits-upload
9.68
KB
-rwxr-xr-x
who-uploads
8.22
KB
-rwxr-xr-x
whoami
30.51
KB
-rwxr-xr-x
whodepends
1.54
KB
-rwxr-xr-x
whois
155.66
KB
-rwxr-xr-x
whowatch
50.91
KB
-rwxr-xr-x
wifi-status
2.06
KB
-rwxr-xr-x
winicontoppm
22.02
KB
-rwxr-xr-x
wkhtmltoimage
254.55
KB
-rwxr-xr-x
wkhtmltopdf
334.55
KB
-rwxr-xr-x
wnpp-alert
4.91
KB
-rwxr-xr-x
wnpp-check
3
KB
-rwxr-xr-x
wofm2opl
50.41
KB
-rwxr-xr-x
wopl2ofm
114.38
KB
-rwxr-xr-x
word-list-compress
14.3
KB
-rwxr-xr-x
wovf2ovp
66.41
KB
-rwxr-xr-x
wovp2ovf
130.39
KB
-rwxr-xr-x
wp
1.6
KB
-rwxr-xr-x
wrap-and-sort
11.5
KB
-rwxr-xr-x
write
22.38
KB
-rwxr-xr-x
write.ul
22.38
KB
-rwxr-xr-x
wrjpgcom
14.14
KB
-rwxr-xr-x
wsgen
14.32
KB
-rwxr-xr-x
wsimport
14.32
KB
-rwxr-xr-x
www-browser
2.22
MB
-rwxr-xr-x
x86_64
26.65
KB
-rwxr-xr-x
x86_64-linux-gnu-addr2line
26.7
KB
-rwxr-xr-x
x86_64-linux-gnu-ar
54.48
KB
-rwxr-xr-x
x86_64-linux-gnu-as
456.4
KB
-rwxr-xr-x
x86_64-linux-gnu-c++filt
22.27
KB
-rwxr-xr-x
x86_64-linux-gnu-cpp
906.82
KB
-rwxr-xr-x
x86_64-linux-gnu-cpp-11
906.82
KB
-rwxr-xr-x
x86_64-linux-gnu-cpp-12
1.32
MB
-rwxr-xr-x
x86_64-linux-gnu-dwp
1.82
MB
-rwxr-xr-x
x86_64-linux-gnu-elfedit
34.72
KB
-rwxr-xr-x
x86_64-linux-gnu-g++
910.82
KB
-rwxr-xr-x
x86_64-linux-gnu-g++-11
910.82
KB
-rwxr-xr-x
x86_64-linux-gnu-gcc
906.82
KB
-rwxr-xr-x
x86_64-linux-gnu-gcc-11
906.82
KB
-rwxr-xr-x
x86_64-linux-gnu-gcc-12
1.32
MB
-rwxr-xr-x
x86_64-linux-gnu-gcc-ar
26.54
KB
-rwxr-xr-x
x86_64-linux-gnu-gcc-ar-11
26.54
KB
-rwxr-xr-x
x86_64-linux-gnu-gcc-ar-12
34.63
KB
-rwxr-xr-x
x86_64-linux-gnu-gcc-nm
26.54
KB
-rwxr-xr-x
x86_64-linux-gnu-gcc-nm-11
26.54
KB
-rwxr-xr-x
x86_64-linux-gnu-gcc-nm-12
34.63
KB
-rwxr-xr-x
x86_64-linux-gnu-gcc-ranlib
26.54
KB
-rwxr-xr-x
x86_64-linux-gnu-gcc-ranlib-11
26.54
KB
-rwxr-xr-x
x86_64-linux-gnu-gcc-ranlib-12
34.63
KB
-rwxr-xr-x
x86_64-linux-gnu-gcov
400.01
KB
-rwxr-xr-x
x86_64-linux-gnu-gcov-11
400.01
KB
-rwxr-xr-x
x86_64-linux-gnu-gcov-12
736.26
KB
-rwxr-xr-x
x86_64-linux-gnu-gcov-dump
251.84
KB
-rwxr-xr-x
x86_64-linux-gnu-gcov-dump-11
251.84
KB
-rwxr-xr-x
x86_64-linux-gnu-gcov-dump-12
576.13
KB
-rwxr-xr-x
x86_64-linux-gnu-gcov-tool
275.93
KB
-rwxr-xr-x
x86_64-linux-gnu-gcov-tool-11
275.93
KB
-rwxr-xr-x
x86_64-linux-gnu-gcov-tool-12
600.22
KB
-rwxr-xr-x
x86_64-linux-gnu-gold
3.04
MB
-rwxr-xr-x
x86_64-linux-gnu-gprof
111.79
KB
-rwxr-xr-x
x86_64-linux-gnu-ld
1.66
MB
-rwxr-xr-x
x86_64-linux-gnu-ld.bfd
1.66
MB
-rwxr-xr-x
x86_64-linux-gnu-ld.gold
3.04
MB
-rwxr-xr-x
x86_64-linux-gnu-lto-dump-11
23.73
MB
-rwxr-xr-x
x86_64-linux-gnu-lto-dump-12
31.05
MB
-rwxr-xr-x
x86_64-linux-gnu-nm
43.63
KB
-rwxr-xr-x
x86_64-linux-gnu-objcopy
162.54
KB
-rwxr-xr-x
x86_64-linux-gnu-objdump
365.13
KB
-rwxr-xr-x
x86_64-linux-gnu-pkg-config
2.18
KB
-rwxr-xr-x
x86_64-linux-gnu-python3-confi...
3.05
KB
-rwxr-xr-x
x86_64-linux-gnu-python3.10-co...
3.05
KB
-rwxr-xr-x
x86_64-linux-gnu-ranlib
54.48
KB
-rwxr-xr-x
x86_64-linux-gnu-readelf
758.44
KB
-rwxr-xr-x
x86_64-linux-gnu-size
30.45
KB
-rwxr-xr-x
x86_64-linux-gnu-strings
30.61
KB
-rwxr-xr-x
x86_64-linux-gnu-strip
162.57
KB
-rwxr-xr-x
x86_64-pc-linux-gnu-pkg-config
50.28
KB
-rwxr-xr-x
xargs
62.41
KB
-rwxr-xr-x
xauth
54.96
KB
-rwxr-xr-x
xbmtopbm
14.02
KB
-rwxr-xr-x
xdg-desktop-icon
20.16
KB
-rwxr-xr-x
xdg-desktop-menu
42.27
KB
-rwxr-xr-x
xdg-email
26.3
KB
-rwxr-xr-x
xdg-icon-resource
29.33
KB
-rwxr-xr-x
xdg-mime
41.14
KB
-rwxr-xr-x
xdg-open
25.46
KB
-rwxr-xr-x
xdg-screensaver
37.11
KB
-rwxr-xr-x
xdg-settings
37.52
KB
-rwxr-xr-x
xdg-user-dir
234
B
-rwxr-xr-x
xdg-user-dirs-update
26.23
KB
-rwxr-xr-x
xdpyinfo
39.05
KB
-rwxr-xr-x
xdriinfo
14.3
KB
-rwxr-xr-x
xdvi
2.96
KB
-rwxr-xr-x
xdvi-xaw
749.48
KB
-rwxr-xr-x
xdvi.bin
749.48
KB
-rwxr-xr-x
xdvipdfmx
835.77
KB
-rwxr-xr-x
xetex
708.38
KB
-rwxr-xr-x
xev
34.63
KB
-rwxr-xr-x
xfd
40.01
KB
-rwxr-xr-x
xfontsel
43.85
KB
-rwxr-xr-x
xgettext
297.01
KB
-rwxr-xr-x
xgettext.pl
6.41
KB
-rwxr-xr-x
ximtoppm
14.02
KB
-rwxr-xr-x
xjc
14.32
KB
-rwxr-xr-x
xkbbell
14.32
KB
-rwxr-xr-x
xkbcomp
212.1
KB
-rwxr-xr-x
xkbevd
42.38
KB
-rwxr-xr-x
xkbprint
90.34
KB
-rwxr-xr-x
xkbvleds
23.1
KB
-rwxr-xr-x
xkbwatch
23.16
KB
-rwxr-xr-x
xkibitz
4.75
KB
-rwxr-xr-x
xkill
14.3
KB
-rwxr-xr-x
xlsatoms
14.3
KB
-rwxr-xr-x
xlsclients
18.31
KB
-rwxr-xr-x
xlsfonts
26.4
KB
-rwxr-xr-x
xmessage
23.12
KB
-rwxr-xr-x
xml2-config
1.4
KB
-rwxr-xr-x
xml2pmx
126.4
KB
-rwxr-xr-x
xpath
4.74
KB
-rwxr-xr-x
xpmtoppm
18.08
KB
-rwxr-xr-x
xprop
48.61
KB
-rwxr-xr-x
xpstat
6.59
KB
-rwxr-xr-x
xslt-config
2.1
KB
-rwxr-xr-x
xsltproc
30.15
KB
-rwxr-xr-x
xsubpp
5.05
KB
-rwxr-xr-x
xtotroff
90.44
KB
-rwxr-xr-x
xvinfo
18.3
KB
-rwxr-xr-x
xvminitoppm
14.02
KB
-rwxr-xr-x
xwdtopnm
22.02
KB
-rwxr-xr-x
xwininfo
50.38
KB
-rwxr-xr-x
xxd
18.28
KB
-rwxr-xr-x
xz
82.52
KB
-rwxr-xr-x
xzcat
82.52
KB
-rwxr-xr-x
xzcmp
6.86
KB
-rwxr-xr-x
xzdiff
6.86
KB
-rwxr-xr-x
xzegrep
5.87
KB
-rwxr-xr-x
xzfgrep
5.87
KB
-rwxr-xr-x
xzgrep
5.87
KB
-rwxr-xr-x
xzless
1.76
KB
-rwxr-xr-x
xzmore
2.11
KB
-rwxr-xr-x
y2racc
7.35
KB
-rwxr-xr-x
yacc
4.12
KB
-rwxr-xr-x
yahooquote
2.13
KB
-rwxr-xr-x
ybmtopbm
14.02
KB
-rwxr-xr-x
yes
30.38
KB
-rwxr-xr-x
ypdomainname
22.23
KB
-rwxr-xr-x
yuvsplittoppm
14.02
KB
-rwxr-xr-x
yuvtoppm
14.02
KB
-rwxr-xr-x
zabbix_get
171.84
KB
-rwxr-xr-x
zabbix_sender
329.63
KB
-rwxr-xr-x
zcat
1.94
KB
-rwxr-xr-x
zcmp
1.64
KB
-rwxr-xr-x
zdiff
5.76
KB
-rwxr-xr-x
zdump
26.21
KB
-rwxr-xr-x
zegrep
29
B
-rwxr-xr-x
zeisstopnm
14.02
KB
-rwxr-xr-x
zfgrep
29
B
-rwxr-xr-x
zforce
2.03
KB
-rwxr-xr-x
zgrep
7.91
KB
-rwxr-xr-x
zip
198.99
KB
-rwxr-xr-x
zipcloak
70.4
KB
-rwxr-xr-x
zipdetails
58.66
KB
-rwxr-xr-x
zipgrep
2.89
KB
-rwxr-xr-x
zipinfo
170.42
KB
-rwxr-xr-x
zipnote
62.4
KB
-rwxr-xr-x
zipsplit
58.4
KB
-rwxr-xr-x
zless
2.15
KB
-rwxr-xr-x
zmore
1.8
KB
-rwxr-xr-x
znew
4.47
KB
-rwxr-xr-x
zsh
989.58
KB
-rwxr-xr-x
zsh5
852
B
-rwxr-xr-x
zstd
854.59
KB
-rwxr-xr-x
zstdcat
854.59
KB
-rwxr-xr-x
zstdgrep
3.78
KB
-rwxr-xr-x
zstdless
30
B
-rwxr-xr-x
zstdmt
854.59
KB
-rwxr-xr-x
Delete
Unzip
Zip
${this.title}
Close
Code Editor : bts
#!/usr/bin/perl # bts: This program provides a convenient interface to the Debian # Bug Tracking System. # # Written by Joey Hess <joeyh@debian.org> # Modifications by Julian Gilbey <jdg@debian.org> # Modifications by Josh Triplett <josh@freedesktop.org> # Copyright 2001-2003 Joey Hess <joeyh@debian.org> # Modifications Copyright 2001-2003 Julian Gilbey <jdg@debian.org> # Modifications Copyright 2007 Josh Triplett <josh@freedesktop.org> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <https://www.gnu.org/licenses/>. # Use our own subclass of Pod::Text to # a) Strip the POD markup before displaying it via "bts help" # b) Automatically display the text which is supposed to be replaced by the # user between <>, as per convention. package Pod::BTS; use strict; use base qw(Pod::Text); sub cmd_i { return '<' . $_[2] . '>' } package main; =head1 NAME bts - developers' command line interface to the Debian Bug Tracking System =cut use 5.010; # for defined-or use strict; use warnings; use File::Basename; use File::Copy; use File::HomeDir; use File::Path qw(make_path rmtree); use File::Spec; use File::Temp qw/tempfile/; use Net::SMTP; use Cwd; use IO::File; use IO::Handle; use Devscripts::DB_File_Lock; use Devscripts::Debbugs; use Fcntl qw(O_RDWR O_RDONLY O_CREAT F_SETFD); use Getopt::Long; use Encode; # Need support for ; as query param separator use URI 1.37; use URI::QueryParam; use Scalar::Util qw(looks_like_number); use POSIX qw(locale_h strftime); setlocale(LC_TIME, "C"); # so that strftime is locale independent # Funny UTF-8 warning messages from HTML::Parse should be ignorable (#292671) $SIG{'__WARN__'} = sub { warn $_[0] unless $_[0] =~ /^Parsing of undecoded UTF-8 will give garbage when decoding entities/; }; my $it = undef; my $last_user = ''; my $lwp_broken = undef; my $smtps_broken = undef; my $authen_sasl_broken; my $ua; sub have_lwp() { return ($lwp_broken ? 0 : 1) if defined $lwp_broken; eval { require LWP; require LWP::UserAgent; require HTTP::Status; require HTTP::Date; }; if ($@) { if ($@ =~ m%^Can\'t locate LWP%) { $lwp_broken = "the libwww-perl package is not installed"; } else { $lwp_broken = "couldn't load LWP::UserAgent: $@"; } } else { $lwp_broken = ''; } return $lwp_broken ? 0 : 1; } sub have_smtps() { return ($smtps_broken ? 0 : 1) if defined $smtps_broken; eval { require Net::SMTPS; }; if ($@) { if ($@ =~ m%^Can\'t locate Net/SMTPS%) { $smtps_broken = "the libnet-smtps-perl package is not installed"; } else { $smtps_broken = "couldn't load Net::SMTPS: $@"; } } else { $smtps_broken = ''; } return $smtps_broken ? 0 : 1; } sub have_authen_sasl() { return ($authen_sasl_broken ? 0 : 1) if defined $authen_sasl_broken; eval { require Authen::SASL; }; if ($@) { if ($@ =~ m%^Can't locate Authen/SASL%) { $authen_sasl_broken = 'the libauthen-sasl-perl package is not installed'; } else { $authen_sasl_broken = "couldn't load Authen::SASL: $@"; } } else { $authen_sasl_broken = ''; } return $authen_sasl_broken ? 0 : 1; } # Constants sub MIRROR_ERROR { 0; } sub MIRROR_DOWNLOADED { 1; } sub MIRROR_UP_TO_DATE { 2; } my $NONPRINT = "\\x00-\\x1F\\x7F-\\xFF"; # we need this later for MIME stuff my $progname = basename($0); my $modified_conf_msg; my $debug = (exists $ENV{'DEBUG'} and $ENV{'DEBUG'}) ? 1 : 0; # Program version handling # The BTS changed its format :/ Pages downloaded using old versions # of bts won't look very good, so we force updating if the last cached # version was downloaded by a devscripts version less than # $new_cache_format_version my $version = '2.22.1ubuntu1'; $version = '2.9.6' if $version =~ /\#/; # for testing unconfigured version my $new_cache_format_version = '2.9.6'; # The official list is mirrored # bugs-mirror.debian.org:/srv/bugs.debian.org/etc/config # in the variable @gTags; we copy it verbatim here. # # Note that it is also in the POD documentation in the bts_tag # function below, look for "potato". our (@gTags, @valid_tags, %valid_tags); #<<< This variable definition should be kept verbatim from the BTS config @gTags = ( "patch", "wontfix", "moreinfo", "unreproducible", "help", "security", "upstream", "pending", "confirmed", "ipv6", "lfs", "d-i", "l10n", "newcomer", "a11y", "ftbfs", "fixed-upstream", "fixed", "fixed-in-experimental", "sid", "experimental", "potato", "woody", "sarge", "sarge-ignore", "etch", "etch-ignore", "lenny", "lenny-ignore", "squeeze", "squeeze-ignore", "wheezy", "wheezy-ignore", "jessie", "jessie-ignore", "stretch", "stretch-ignore", "buster", "buster-ignore", "bullseye", "bullseye-ignore","bookworm","bookworm-ignore", "trixie","trixie-ignore", ); #>>> *valid_tags = \@gTags; %valid_tags = map { $_ => 1 } @valid_tags; my @valid_severities = qw(wishlist minor normal important serious grave critical); my $browser; # Will set if necessary $ENV{HOME} = File::HomeDir->my_home; my $cachedir = $ENV{XDG_CACHE_HOME} || File::Spec->catdir($ENV{HOME}, '.cache'); $cachedir = File::Spec->catdir($cachedir, 'devscripts', 'bts'); my $timestampdb = File::Spec->catfile($cachedir, 'bts_timestamps.db'); my $prunestamp = File::Spec->catfile($cachedir, 'bts_prune.timestamp'); my %timestamp; END { # This works even if we haven't tied it untie %timestamp; } my %clonedbugs = (); my %ccpackages = (); my %ccsubmitters = (); =head1 SYNOPSIS B<bts> [I<options>] I<command> [I<args>] [B<#>I<comment>] [B<.>|B<,> I<command> [I<args>] [B<#>I<comment>]] ... =head1 DESCRIPTION This is a command line interface to the Debian Bug Tracking System (BTS), intended mainly for use by developers. It lets the BTS be manipulated using simple commands that can be run at the prompt or in a script, does various sanity checks on the input, and constructs and sends a mail to the BTS control address for you. A local cache of web pages and e-mails from the BTS may also be created and updated. In general, the command line interface is the same as what you would write in a mail to control@bugs.debian.org, just prefixed with "bts". For example: % bts severity 69042 normal % bts merge 69042 43233 % bts retitle 69042 blah blah A few additional commands have been added for your convenience, and this program is less strict about what constitutes a valid bug number. For example, "severity Bug#85942 normal" is understood, as is "severity #85942 normal". (Of course, your shell may regard "#" as a comment character though, so you may need to quote it!) Also, for your convenience, this program allows you to abbreviate commands to the shortest unique substring (similar to how cvs lets you abbreviate commands). So it understands things like "bts cl 85942". It is also possible to include a comment in the mail sent to the BTS. If your shell does not strip out the comment in a command like "bts severity 30321 normal #inflated severity", then this program is smart enough to figure out where the comment is, and include it in the email. Note that most shells do strip out such comments before they get to the program, unless the comment is quoted. (Something like "bts severity #85942 normal" will not be treated as a comment!) You can specify multiple commands by separating them with a single dot, rather like B<update-rc.d>; a single comma may also be used; all the commands will then be sent in a single mail. It is important the dot/comma is surrounded by whitespace so it is not mistaken for part of a command. For example (quoting where necessary so that B<bts> sees the comment): % bts severity 95672 normal , merge 95672 95673 \#they are the same! The abbreviation "it" may be used to refer to the last mentioned bug number, so you could write: % bts severity 95672 wishlist , retitle it "bts: please add a --foo option" Please use this program responsibly, and do take our users into consideration. =head1 OPTIONS B<bts> examines the B<devscripts> configuration files as described below. Command line options override the configuration file settings, though. =over 4 =item B<-o>, B<--offline> Make B<bts> use cached bugs for the B<show> and B<bugs> commands, if a cache is available for the requested data. See the B<cache> command, below for information on setting up a cache. =item B<--online>, B<--no-offline> Opposite of B<--offline>; overrides any configuration file directive to work offline. =item B<-n>, B<--no-action> Do not send emails but print them to standard output. =item B<--cache>, B<--no-cache> Should we attempt to cache new versions of BTS pages when performing B<show>/B<bugs> commands? Default is to cache. =item B<--cache-mode=>{B<min>|B<mbox>|B<full>} When running a B<bts cache> command, should we only mirror the basic bug (B<min>), or should we also mirror the mbox version (B<mbox>), or should we mirror the whole thing, including the mbox and the boring attachments to the BTS bug pages and the acknowledgement emails (B<full>)? Default is B<min>. =item B<--cache-delay=>I<seconds> Time in seconds to delay between each download, to avoid hammering the BTS web server. Default is 5 seconds. =item B<--mbox> Open a mail reader to read the mbox corresponding to a given bug number for B<show> and B<bugs> commands. =item B<--mailreader=>I<READER> Specify the command to read the mbox. Must contain a "B<%s>" string (unquoted!), which will be replaced by the name of the mbox file. The command will be split on white space and will not be passed to a shell. Default is 'B<mutt -f %s>'. (Also, B<%%> will be substituted by a single B<%> if this is needed.) =item B<--cc-addr=>I<CC_EMAIL_ADDRESS> Send carbon copies to a list of users. I<CC_EMAIL_ADDRESS> should be a comma-separated list of email addresses. Multiple options add more CCs. =item B<--use-default-cc> Add the addresses specified in the configuration file option B<BTS_DEFAULT_CC> to the list specified using B<--cc-addr>. This is the default. =item B<--no-use-default-cc> Do not add addresses specified in B<BTS_DEFAULT_CC> to the carbon copy list. =item B<--sendmail=>I<SENDMAILCMD> Specify the B<sendmail> command. The command will be split on white space and will not be passed to a shell. Default is F</usr/sbin/sendmail>. The B<-t> option will be automatically added if the command is F</usr/sbin/sendmail> or F</usr/sbin/exim*>. For other mailers, if they require a B<-t> option, this must be included in the I<SENDMAILCMD>, for example: B<--sendmail="/usr/sbin/mymailer -t">. =item B<--mutt> Use B<mutt> for sending of mails. Default is not to use B<mutt>, except for some commands. Note that one of B<$DEBEMAIL> or B<$EMAIL> must be set in the environment in order to use B<mutt> to send emails. =item B<--no-mutt> Don't use B<mutt> for sending of mails. =item B<--soap-timeout=>I<SECONDS> Specify a timeout for SOAP calls as used by the B<select> and B<status> commands. =item B<--smtp-host=>I<SMTPHOST> Specify an SMTP host. If given, B<bts> will send mail by talking directly to this SMTP host rather than by invoking a B<sendmail> command. The host name may be followed by a colon (":") and a port number in order to use a port other than the default. It may also begin with "ssmtp://" or "smtps://" to indicate that SMTPS should be used. If SMTPS not specified, B<bts> will still try to use STARTTLS if it's advertised by the SMTP host. Note that one of B<$DEBEMAIL> or B<$EMAIL> must be set in the environment in order to use direct SMTP connections to send emails. Note that when sending directly via an SMTP host, specifying addresses in B<--cc-addr> or B<BTS_DEFAULT_CC> that the SMTP host will not relay will cause the SMTP host to reject the entire mail. Note also that the use of the B<reassign> command may, when either B<--mutt> or B<--force-interactive> mode is enabled, lead to the automatic addition of a Cc to I<$newpackage>@packages.debian.org. In these cases, the note above regarding relaying applies. The submission interface (port 587) on reportbug.debian.org does not support relaying and, as such, should not be used as an SMTP server for B<bts> under the circumstances described in this paragraph. =item B<--smtp-username=>I<USERNAME>, B<--smtp-password=>I<PASSWORD> Specify the credentials to use when connecting to the SMTP server specified by B<--smtp-host>. If the server does not require authentication then these options should not be used. If a username is specified but not a password, B<bts> will prompt for the password before sending the mail. =item B<--smtp-helo=>I<HELO> Specify the name to use in the I<HELO> command when connecting to the SMTP server; defaults to the contents of the file F</etc/mailname>, if it exists. Note that some SMTP servers may reject the use of a I<HELO> which either does not resolve or does not appear to belong to the host using it. =item B<--bts-server> Use a debbugs server other than https://bugs.debian.org. =item B<-f>, B<--force-refresh> Download a bug report again, even if it does not appear to have changed since the last B<cache> command. Useful if a B<--cache-mode=full> is requested for the first time (otherwise unchanged bug reports will not be downloaded again, even if the boring bits have not been downloaded). =item B<--no-force-refresh> Suppress any configuration file B<--force-refresh> option. =item B<--only-new> Download only new bugs when caching. Do not check for updates in bugs we already have. =item B<--include-resolved> When caching bug reports, include those that are marked as resolved. This is the default behaviour. =item B<--no-include-resolved> Reverse the behaviour of the previous option. That is, do not cache bugs that are marked as resolved. =item B<--no-ack> Suppress acknowledgment mails from the BTS. Note that this will only affect the copies of messages CCed to bugs, not those sent to the control bot. =item B<--ack> Do not suppress acknowledgement mails. This is the default behaviour. =item B<-i>, B<--interactive> Before sending an e-mail to the control bot, display the content and allow it to be edited, or the sending cancelled. =item B<--force-interactive> Similar to B<--interactive>, with the exception that an editor is spawned before prompting for confirmation of the message to be sent. =item B<--no-interactive> Send control e-mails without confirmation. This is the default behaviour. =item B<-q>, B<--quiet> When running B<bts cache>, only display information about newly cached pages, not messages saying already cached. If this option is specified twice, only output error messages (to stderr). =item B<--no-conf>, B<--noconf> Do not read any configuration files. This can only be used as the first option given on the command-line. =back =cut # Start by setting default values my $offlinemode = 0; my $caching = 1; my $cachemode = 'min'; my $cachemode_re = '^(full|mbox|min)$'; my $refreshmode = 0; my $updatemode = 0; my $mailreader = 'mutt -f %s'; my $muttcmd = 'mutt -H %s'; my $sendmailcmd = '/usr/sbin/sendmail'; my $smtphost = ''; my $smtpuser = ''; my $smtppass = ''; my $smtphelo = ''; my $noaction = 0; # regexp for mailers which require a -t option my $sendmail_t = '^/usr/sbin/sendmail$|^/usr/sbin/exim'; my $includeresolved = 1; my $requestack = 1; my $interactive_re = '^(force|no|yes)$'; my $interactive = 'no'; my @ccemails = (); my $toolname = ""; my $btsserver = 'https://bugs.debian.org'; my $use_mutt = 0; # Next, read read configuration files and then command line # The next stuff is boilerplate if (@ARGV and $ARGV[0] =~ /^--no-?conf$/) { $modified_conf_msg = " (no configuration files read)"; shift; } else { my @config_files = ('/etc/devscripts.conf', '~/.devscripts'); my %config_vars = ( 'BTS_OFFLINE' => 'no', 'BTS_CACHE' => 'yes', 'BTS_CACHE_MODE' => 'min', 'BTS_FORCE_REFRESH' => 'no', 'BTS_ONLY_NEW' => 'no', 'BTS_MAIL_READER' => 'mutt -f %s', 'BTS_SENDMAIL_COMMAND' => '/usr/sbin/sendmail', 'BTS_INCLUDE_RESOLVED' => 'yes', 'BTS_SMTP_HOST' => '', 'BTS_SMTP_AUTH_USERNAME' => '', 'BTS_SMTP_AUTH_PASSWORD' => '', 'BTS_SMTP_HELO' => '', 'BTS_SUPPRESS_ACKS' => 'no', 'BTS_INTERACTIVE' => 'no', 'BTS_DEFAULT_CC' => '', 'BTS_SERVER' => $btsserver, ); my %config_default = %config_vars; my $shell_cmd; # Set defaults foreach my $var (keys %config_vars) { $shell_cmd .= qq[$var="$config_vars{$var}";\n]; } $shell_cmd .= 'for file in ' . join(" ", @config_files) . "; do\n"; $shell_cmd .= '[ -f $file ] && . $file; done;' . "\n"; # Read back values foreach my $var (keys %config_vars) { $shell_cmd .= "echo \$$var;\n" } my $shell_out = `/bin/bash -c '$shell_cmd'`; @config_vars{ keys %config_vars } = split /\n/, $shell_out, -1; # Check validity $config_vars{'BTS_OFFLINE'} =~ /^(yes|no)$/ or $config_vars{'BTS_OFFLINE'} = 'no'; $config_vars{'BTS_CACHE'} =~ /^(yes|no)$/ or $config_vars{'BTS_CACHE'} = 'yes'; $config_vars{'BTS_CACHE_MODE'} =~ $cachemode_re or $config_vars{'BTS_CACHE_MODE'} = 'min'; $config_vars{'BTS_FORCE_REFRESH'} =~ /^(yes|no)$/ or $config_vars{'BTS_FORCE_REFRESH'} = 'no'; $config_vars{'BTS_ONLY_NEW'} =~ /^(yes|no)$/ or $config_vars{'BTS_ONLY_NEW'} = 'no'; $config_vars{'BTS_MAIL_READER'} =~ /\%s/ or $config_vars{'BTS_MAIL_READER'} = 'mutt -f %s'; $config_vars{'BTS_SENDMAIL_COMMAND'} =~ /./ or $config_vars{'BTS_SENDMAIL_COMMAND'} = '/usr/sbin/sendmail'; $config_vars{'BTS_INCLUDE_RESOLVED'} =~ /^(yes|no)$/ or $config_vars{'BTS_INCLUDE_RESOLVED'} = 'yes'; $config_vars{'BTS_SUPPRESS_ACKS'} =~ /^(yes|no)$/ or $config_vars{'BTS_SUPPRESS_ACKS'} = 'no'; $config_vars{'BTS_INTERACTIVE'} =~ $interactive_re or $config_vars{'BTS_INTERACTIVE'} = 'no'; if (!length $config_vars{'BTS_SMTP_HOST'} and $config_vars{'BTS_SENDMAIL_COMMAND'} ne '/usr/sbin/sendmail') { my $cmd = (split ' ', $config_vars{'BTS_SENDMAIL_COMMAND'})[0]; unless ($cmd =~ /^~?[A-Za-z0-9_\-\+\.\/]*$/) { die "BTS_SENDMAIL_COMMAND contained funny characters: $cmd\nPlease fix the configuration file.\n"; } elsif (system("command -v $cmd >/dev/null 2>&1") != 0) { die "BTS_SENDMAIL_COMMAND $cmd could not be executed.\nPlease fix the configuration file.\n"; } } foreach my $var (sort keys %config_vars) { if ($config_vars{$var} ne $config_default{$var}) { $modified_conf_msg .= " $var=$config_vars{$var}\n"; } } $modified_conf_msg ||= " (none)\n"; chomp $modified_conf_msg; $offlinemode = $config_vars{'BTS_OFFLINE'} eq 'yes' ? 1 : 0; $caching = $config_vars{'BTS_CACHE'} eq 'no' ? 0 : 1; $cachemode = $config_vars{'BTS_CACHE_MODE'}; $refreshmode = $config_vars{'BTS_FORCE_REFRESH'} eq 'yes' ? 1 : 0; $updatemode = $config_vars{'BTS_ONLY_NEW'} eq 'yes' ? 1 : 0; $mailreader = $config_vars{'BTS_MAIL_READER'}; $sendmailcmd = $config_vars{'BTS_SENDMAIL_COMMAND'}; $smtphost = $config_vars{'BTS_SMTP_HOST'}; $smtpuser = $config_vars{'BTS_SMTP_AUTH_USERNAME'}; $smtppass = $config_vars{'BTS_SMTP_AUTH_PASSWORD'}; $smtphelo = $config_vars{'BTS_SMTP_HELO'}; $includeresolved = $config_vars{'BTS_INCLUDE_RESOLVED'} eq 'yes' ? 1 : 0; $requestack = $config_vars{'BTS_SUPPRESS_ACKS'} eq 'no' ? 1 : 0; $interactive = $config_vars{'BTS_INTERACTIVE'}; push @ccemails, $config_vars{'BTS_DEFAULT_CC'} || (); $btsserver = $config_vars{'BTS_SERVER'}; } if (exists $ENV{'BUGSOFFLINE'}) { warn "BUGSOFFLINE environment variable deprecated: please use ~/.devscripts\nor --offline/-o option instead! (See bts(1) for details.)\n"; } my ($opt_help, $opt_version, $opt_noconf); my ($opt_cachemode, $opt_mailreader, $opt_sendmail, $opt_smtphost); my ($opt_smtpuser, $opt_smtppass, $opt_smtphelo); my $opt_cachedelay = 5; my $opt_mutt; my $opt_soap_timeout; my $mboxmode = 0; my $quiet = 0; my @opt_ccemails = (); my $use_default_cc = 1; my $ccsecurity = ""; Getopt::Long::Configure(qw(gnu_compat bundling require_order)); GetOptions( "help|h" => \$opt_help, "version" => \$opt_version, "o" => \$offlinemode, "offline!" => \$offlinemode, "online" => sub { $offlinemode = 0; }, "cache!" => \$caching, "cache-mode|cachemode=s" => \$opt_cachemode, "cache-delay=i" => \$opt_cachedelay, "m|mbox" => \$mboxmode, "mailreader|mail-reader=s" => \$opt_mailreader, "cc-addr=s" => \@opt_ccemails, "sendmail=s" => \$opt_sendmail, "smtp-host|smtphost=s" => \$opt_smtphost, "smtp-user|smtp-username=s" => \$opt_smtpuser, "smtp-pass|smtp-password=s" => \$opt_smtppass, "smtp-helo=s" => \$opt_smtphelo, "f" => \$refreshmode, "force-refresh!" => \$refreshmode, "only-new!" => \$updatemode, "n|no-action" => \$noaction, "q|quiet+" => \$quiet, "noconf|no-conf" => \$opt_noconf, "include-resolved!" => \$includeresolved, "ack!" => \$requestack, "i|interactive" => sub { $interactive = 'yes'; }, "no-interactive" => sub { $interactive = 'no'; }, "force-interactive" => sub { $interactive = 'force'; }, "use-default-cc!" => \$use_default_cc, "toolname=s" => \$toolname, "bts-server=s" => \$btsserver, "mutt!" => \$opt_mutt, "soap-timeout:i" => \$opt_soap_timeout, ) or die "Usage: $progname [options]\nRun $progname --help for more details\n"; if ($opt_noconf) { die "$progname: --no-conf is only acceptable as the first command-line option!\n"; } if ($opt_help) { bts_help(); exit 0; } if ($opt_version) { bts_version(); exit 0; } if (!$use_default_cc) { @ccemails = (); } if (@opt_ccemails) { push @ccemails, @opt_ccemails; } if ($opt_mailreader) { if ($opt_mailreader =~ /\%s/) { $mailreader = $opt_mailreader; } else { warn "$progname: ignoring invalid --mailreader option: invalid mail command following it.\n"; } } if ($opt_mutt) { $use_mutt = 1; } if ($opt_soap_timeout) { Devscripts::Debbugs::soap_timeout($opt_soap_timeout); } if ($opt_sendmail and $opt_smtphost) { die "$progname: --sendmail and --smtp-host mutually exclusive\n"; } elsif ($opt_mutt and $opt_sendmail) { die "$progname: --sendmail and --mutt mutually exclusive\n"; } elsif ($opt_mutt and $opt_smtphost) { die "$progname: --smtp-host and --mutt mutually exclusive\n"; } $smtphost = $opt_smtphost if $opt_smtphost; $smtpuser = $opt_smtpuser if $opt_smtpuser; $smtppass = $opt_smtppass if $opt_smtppass; $smtphelo = $opt_smtphelo if $opt_smtphelo; if ($opt_sendmail) { if ( $opt_sendmail ne '/usr/sbin/sendmail' and $opt_sendmail ne $sendmailcmd) { my $cmd = (split ' ', $opt_sendmail)[0]; unless ($cmd =~ /^~?[A-Za-z0-9_\-\+\.\/]*$/) { die "--sendmail command contained funny characters: $cmd\n"; } elsif (system("command -v $cmd >/dev/null 2>&1") != 0) { die "--sendmail command $cmd could not be executed.\n"; } } } if ($opt_sendmail) { $sendmailcmd = $opt_sendmail; $smtphost = ''; } else { if (length $smtphost and !length $smtphelo) { if (-e "/etc/mailname") { if (open MAILNAME, '<', "/etc/mailname") { $smtphelo = <MAILNAME>; chomp $smtphelo; close MAILNAME; } else { warn "Unable to open /etc/mailname: $!\nUsing default HELO for SMTP\n"; } } } } if ($opt_cachemode) { if ($opt_cachemode =~ $cachemode_re) { $cachemode = $opt_cachemode; } else { warn "$progname: ignoring invalid --cache-mode; must be one of min, mbox, full.\n"; } } if ($toolname) { $toolname = " (using $toolname)"; } my $btsurl; if ($btsserver =~ m%^https?://(.*)/?$%) { $btsurl = $btsserver . '/'; $btsserver = $1; } else { $btsurl = "http://$btsserver/"; } $btsurl =~ s%//$%/%; my $btscgiurl = $btsurl . 'cgi-bin/'; if ($btsserver =~ /^debbugs\.gnu\.org/) { $btscgiurl = $btsurl . 'cgi/'; } my $btscgipkgurl = $btscgiurl . 'pkgreport.cgi'; my $btscgibugurl = $btscgiurl . 'bugreport.cgi'; my $btscgispamurl = $btscgiurl . 'bugspam.cgi'; my $btsemail = 'control@' . $btsserver; my $packagesserver = ''; if ($btsserver =~ /^bugs(-[\w-]+)?\.debian\.org/i) { $packagesserver = 'packages.debian.org'; $btscgispamurl =~ s|$btsurl|http://bugs-master.debian.org/|; } no warnings 'once'; $Devscripts::Debbugs::btsurl = $btsurl; use warnings 'once'; if (@ARGV == 0) { bts_help(); exit 0; } # Otherwise, parse the arguments my @command; my @args; our @comment = (''); my $ncommand = 0; my $iscommand = 1; while (@ARGV) { $_ = shift @ARGV; if ($_ =~ /^[\.,]$/) { next if $iscommand; # ". ." in command line - oops! $ncommand++; $iscommand = 1; $comment[$ncommand] = ''; } elsif ($iscommand) { push @command, $_; $iscommand = 0; } elsif ($comment[$ncommand]) { $comment[$ncommand] .= " $_"; } elsif (/^\#/ and not /^\#\d+$/) { $comment[$ncommand] = $_; } else { push @{ $args[$ncommand] }, $_; } } $ncommand-- if $iscommand; # Grub through the symbol table to find matching commands. my $subject = ''; my $body = ''; our $index; for $index (0 .. $ncommand) { no strict 'refs'; if (exists $::{"bts_$command[$index]"}) { "bts_$command[$index]"->(@{ $args[$index] }); } elsif ($command[$index] =~ /^#/) { mailbts('', $command[$index]); } else { my @matches = grep /^bts_\Q$command[$index]\E/, keys %::; if (@matches != 1) { die "$progname: Couldn't find a unique match for the command $command[$index]!\nRun $progname --help for a list of valid commands.\n"; } # Replace the abbreviated command with its expanded equivalent $command[$index] = $matches[0]; $command[$index] =~ s/^bts_//; $matches[0]->(@{ $args[$index] }); } } # Send all cached commands. mailbtsall($subject, $body) if length $body; # Unnecessary, but we'll do this for clarity exit 0; =head1 COMMANDS For full details about the commands, see the BTS documentation. L<https://www.debian.org/Bugs/server-control> =over 4 =item B<show> [I<options>] [I<bug number> | I<package> | I<maintainer> | B<:> ] [I<opt>B<=>I<val> ...] =item B<show> [I<options>] [B<src:>I<package> | B<from:>I<submitter>] [I<opt>B<=>I<val> ...] =item B<show> [I<options>] [B<tag:>I<tag> | B<usertag:>I<tag> ] [I<opt>B<=>I<val> ...] =item B<show> [B<release-critical> | B<release-critical/>... | B<RC>] This is a synonym for B<bts bugs>. =cut sub bts_show { goto &bts_bugs; } =item B<bugs> [I<options>] [I<bug_number> | I<package> | I<maintainer> | B<:> ] [I<opt>B<=>I<val> ...] =item B<bugs> [I<options>] [B<src:>I<package> | B<from:>I<submitter>] [I<opt>B<=>I<val> ...] =item B<bugs> [I<options>] [B<tag:>I<tag> | B<usertag:>I<tag> ] [I<opt>B<=>I<val> ...] =item B<bugs> [B<release-critical> | B<release-critical/>... | B<RC>] Display the page listing the requested bugs in a web browser using sensible-browser(1). Options may be specified after the B<bugs> command in addition to or instead of options at the start of the command line: recognised options at this point are: B<-o>/B<--offline>/B<--online>, B<-m>/B<--mbox>, B<--mailreader> and B<-->[B<no->]B<cache>. These are described earlier in this manpage. If either the B<-o> or B<--offline> option is used, or there is already an up-to-date copy in the local cache, the cached version will be used. The meanings of the possible arguments are as follows: =over 8 =item (none) If nothing is specified, B<bts bugs> will display your bugs, assuming that either B<DEBEMAIL> or B<EMAIL> (examined in that order) is set to the appropriate email address. =item I<bug_number> Display bug number I<bug_number>. =item I<package> Display the bugs for the package I<package>. =item B<src:>I<package> Display the bugs for the source package I<package>. =item I<maintainer> Display the bugs for the maintainer email address I<maintainer>. =item B<from:>I<submitter> Display the bugs for the submitter email address I<submitter>. =item B<tag:>I<tag> Display the bugs which are tagged with I<tag>. =item B<usertag:>I<tag> Display the bugs which are tagged with usertag I<tag>. See the BTS documentation for more information on usertags. This will require the use of a B<users=>I<email> option. =item B<:> Details of the bug tracking system itself, along with a bug-request page with more options than this script, can be found on https://bugs.debian.org/. This page itself will be opened if the command 'bts bugs :' is used. =item B<release-critical>, B<RC> Display the front page of the release-critical pages on the BTS. This is a synonym for https://bugs.debian.org/release-critical/index.html. It is also possible to say release-critical/debian/main.html and the like. RC is a synonym for release-critical/other/all.html. =back After the argument specifying what to display, you can optionally specify options to use to format the page or change what it displayed. These are passed to the BTS in the URL downloaded. For example, pass dist=stable to see bugs affecting the stable version of a package, version=1.0 to see bugs affecting that version of a package, or reverse=yes to display newest messages first in a bug log. If caching has been enabled (that is, B<--no-cache> has not been used, and B<BTS_CACHE> has not been set to B<no>), then any page requested by B<bts show> will automatically be cached, and be available offline thereafter. Pages which are automatically cached in this way will be deleted on subsequent "B<bts show>|B<bugs>|B<cache>" invocations if they have not been accessed in 30 days. Warning: on a filesystem mounted with the "noatime" option, running "B<bts show>|B<bugs>" does not update the cache files' access times; a cached bug will then be subject to auto-cleaning 30 days after its initial download, even if it has been accessed in the meantime. Any other B<bts> commands following this on the command line will be executed after the browser has been exited. The desired browser can be specified and configured by setting the B<BROWSER> environment variable. The conventions follow those defined by Eric Raymond at http://www.catb.org/~esr/BROWSER/; we here reproduce the relevant part. The value of B<BROWSER> may consist of a colon-separated series of browser command parts. These should be tried in order until one succeeds. Each command part may optionally contain the string B<%s>; if it does, the URL to be viewed is substituted there. If a command part does not contain B<%s>, the browser is to be launched as if the URL had been supplied as its first argument. The string B<%%> must be substituted as a single %. Rationale: We need to be able to specify multiple browser commands so programs obeying this convention can do the right thing in either X or console environments, trying X first. Specifying multiple commands may also be useful for people who share files like F<.profile> across multiple systems. We need B<%s> because some popular browsers have remote-invocation syntax that requires it. Unless B<%%> reduces to %, it won't be possible to have a literal B<%s> in the string. For example, on most Linux systems a good thing to do would be: BROWSER='mozilla -raise -remote "openURL(%s,new-window)":links' =cut sub bts_bugs { @ARGV = @_; # needed for GetOptions my ($sub_offlinemode, $sub_caching, $sub_mboxmode, $sub_mailreader); GetOptions( "o" => \$sub_offlinemode, "offline!" => \$sub_offlinemode, "online" => sub { $sub_offlinemode = 0; }, "cache!" => \$sub_caching, "m|mbox" => \$sub_mboxmode, "mailreader|mail-reader=s" => \$sub_mailreader, ) or die "$progname: unknown options for bugs command\n"; @_ = @ARGV; # whatever's left if (defined $sub_offlinemode) { ($offlinemode, $sub_offlinemode) = ($sub_offlinemode, $offlinemode); } if (defined $sub_caching) { ($caching, $sub_caching) = ($sub_caching, $caching); } if (defined $sub_mboxmode) { ($mboxmode, $sub_mboxmode) = ($sub_mboxmode, $mboxmode); } if (defined $sub_mailreader) { if ($sub_mailreader =~ /\%s/) { ($mailreader, $sub_mailreader) = ($sub_mailreader, $mailreader); } else { warn "$progname: ignoring invalid --mailreader $sub_mailreader option:\ninvalid mail command following it.\n"; $sub_mailreader = undef; } } my $url = sanitizething(shift); if (!$url) { if (defined $ENV{'DEBEMAIL'}) { $url = $ENV{'DEBEMAIL'}; } else { if (defined $ENV{'EMAIL'}) { $url = $ENV{'EMAIL'}; } else { die "bts bugs: Please set DEBEMAIL or EMAIL to your Debian email address.\n"; } } } if ($url =~ /^.*\s<(.*)>\s*$/) { $url = $1; } $url =~ s/^:$//; # Are there any options? my $urlopts = ''; if (@_) { $urlopts = join(";", '', @_); # so it'll be ";opt1=val1;opt2=val2" $urlopts =~ s/:/=/g; $urlopts =~ s/;tag=/;include=/; } browse($url, $urlopts); # revert options if (defined $sub_offlinemode) { $offlinemode = $sub_offlinemode; } if (defined $sub_caching) { $caching = $sub_caching; } if (defined $sub_mboxmode) { $mboxmode = $sub_mboxmode; } if (defined $sub_mailreader) { $mailreader = $sub_mailreader; } } =item B<select> [I<key>B<:>I<value> ...] Uses the SOAP interface to output a list of bugs which match the given selection requirements. The following keys are allowed, and may be given multiple times. =over 8 =item B<package> Binary package name. =item B<source> Source package name. =item B<maintainer> E-mail address of the maintainer. =item B<submitter> E-mail address of the submitter. =item B<severity> Bug severity. =item B<status> Status of the bug. One of B<open>, B<done>, or B<forwarded>. =item B<tag> Tags applied to the bug. If B<users> is specified, may include usertags in addition to the standard tags. =item B<owner> Bug's owner. =item B<correspondent> Address of someone who sent mail to the log. =item B<affects> Bugs which affect this package. =item B<bugs> List of bugs to search within. =item B<users> Users to use when looking up usertags. =item B<archive> Whether to search archived bugs or normal bugs; defaults to B<0> (i.e. only search normal bugs). As a special case, if archive is B<both>, both archived and unarchived bugs are returned. =back For example, to select the set of bugs submitted by jrandomdeveloper@example.com and tagged B<wontfix>, one would use bts select submitter:jrandomdeveloper@example.com tag:wontfix If a key is used multiple times then the set of bugs selected includes those matching any of the supplied values; for example bts select package:foo severity:wishlist severity:minor returns all bugs of package foo with either wishlist or minor severity. =cut sub bts_select { my @args = @_; my $bugs = Devscripts::Debbugs::select(@args); if (not defined $bugs) { die "Error while retrieving bugs from SOAP server"; } print map { qq($_\n) } @{$bugs}; } =item B<status> [I<bug> | B<file:>I<file> | B<fields:>I<field>[B<,>I<field> ...] | B<verbose>] ... Uses the SOAP interface to output status information for the given bugs (or as read from the listed files -- use B<-> to indicate STDIN). By default, all populated fields for a bug are displayed. If B<verbose> is given, empty fields will also be displayed. If B<fields> is given, only those fields will be displayed. No validity checking is performed on any specified fields. =cut sub bts_status { my @args = @_; my @bugs; my $showempty = 0; my %field; for my $bug (@args) { if (looks_like_number($bug)) { push @bugs, $bug; } elsif ($bug =~ m{^file:(.+)}) { my $file = $1; my $fh; if ($file eq '-') { $fh = \*STDIN; } else { $fh = IO::File->new($file, 'r') or die "Unable to open $file for reading: $!"; } while (<$fh>) { chomp; next if /^\s*\#/; s/\s//g; next unless looks_like_number($_); push @bugs, $_; } } elsif ($bug =~ m{^fields:(.+)}) { my $fields = $1; for my $field (split /,/, $fields) { $field{ lc $field } = 1; } $showempty = 1; } elsif ($bug =~ m{^verbose$}) { $showempty = 1; } } my $bugs = Devscripts::Debbugs::status(map { [bug => $_, indicatesource => 1] } @bugs); return if ($bugs eq ""); my $first = 1; for my $bug (keys %{$bugs}) { print "\n" if not $first; $first = 0; my @keys = grep { $_ ne 'bug_num' } keys %{ $bugs->{$bug} }; for my $key ('bug_num', @keys) { if (%field) { next unless exists $field{$key}; } my $out; if (ref($bugs->{$bug}{$key}) eq 'ARRAY') { $out .= join(',', @{ $bugs->{$bug}{$key} }); } elsif (ref($bugs->{$bug}{$key}) eq 'HASH') { $out .= join(',', map { $_ . ' => ' . ($bugs->{$bug}{$key}{$_} || '') } keys %{ $bugs->{$bug}{$key} }); } else { $out .= $bugs->{$bug}{$key} || ''; } if ($out || $showempty) { print "$key\t$out\n"; } } } } =item B<clone> I<bug> I<new_ID> [I<new_ID> ...] The B<clone> control command allows you to duplicate a I<bug> report. It is useful in the case where a single report actually indicates that multiple distinct bugs have occurred. "New IDs" are negative numbers, separated by spaces, which may be used in subsequent control commands to refer to the newly duplicated bugs. A new report is generated for each new ID. =cut sub bts_clone { my $bug = checkbug(shift) or die "bts clone: clone what bug?\n"; @_ or die "bts clone: must specify at least one new ID\n"; foreach (@_) { $_ =~ /^-\d+$/ or die "bts clone: new IDs must be negative numbers\n"; $clonedbugs{$_} = 1; } mailbts("cloning $bug", "clone $bug " . join(" ", @_)); } sub common_close { my $bug = checkbug(shift) or die "bts $command[$index]: close what bug?\n"; my $version = shift; $version = "" unless defined $version; opts_done(@_); mailbts("closing $bug", "close $bug $version"); return $bug; } # Do not include this in the manpage - it's deprecated # # =item B<close> I<bug> I<version> # # Close a I<bug>. Remember that using this to close a bug is often bad manners, # sending an informative mail to nnnnn-done@bugs.debian.org is much better. # You should specify which I<version> of the package closed the I<bug>, if # possible. # # =cut sub bts_close { my ($bug) = common_close(@_); warn <<"EOT"; $progname: Closing $bug as you requested. Please note that the "$progname close" command is deprecated! It is usually better to email nnnnnn-done\@$btsserver with an informative mail. Please remember to email $bug-submitter\@$btsserver with an explanation of why you have closed this bug. Thank you! EOT } =item B<done> I<bug> [I<version>] Mark a I<bug> as Done. This forces interactive mode since done messages should include an explanation why the bug is being closed. You should specify which I<version> of the package closed the bug, if possible. =cut sub bts_done { my ($bug) = common_close(@_); # Force interactive mode since done mails shouldn't be sent without an # explanation if (not $use_mutt) { $interactive = 'force'; } # Include the submitter in the email, so we act like a mail to -done $ccsubmitters{"$bug-submitter"} = 1; } =item B<reopen> I<bug> [I<submitter>] Reopen a I<bug>, with optional I<submitter>. =cut sub bts_reopen { my $bug = checkbug(shift) or die "bts reopen: reopen what bug?\n"; my $submitter = shift || ''; # optional opts_done(@_); mailbts("reopening $bug", "reopen $bug $submitter"); } =item B<archive> I<bug> Archive a I<bug> that has previously been archived but is currently not. The I<bug> must fulfill all of the requirements for archiving with the exception of those that are time-based. =cut sub bts_archive { my $bug = checkbug(shift) or die "bts archive: archive what bug?\n"; opts_done(@_); mailbts("archiving $bug", "archive $bug"); } =item B<unarchive> I<bug> Unarchive a I<bug> that is currently archived. =cut sub bts_unarchive { my $bug = checkbug(shift) or die "bts unarchive: unarchive what bug?\n"; opts_done(@_); mailbts("unarchiving $bug", "unarchive $bug"); } =item B<retitle> I<bug> I<title> Change the I<title> of the I<bug>. =cut sub bts_retitle { my $bug = checkbug(shift) or die "bts retitle: retitle what bug?\n"; my $title = join(" ", @_); if (!length $title) { die "bts retitle: set title of $bug to what?\n"; } mailbts("retitle $bug to $title", "retitle $bug $title"); } =item B<summary> I<bug> [I<messagenum>] Select a message number that should be used as the summary of a I<bug>. If no message number is given, the summary is cleared. =cut sub bts_summary { my $bug = checkbug(shift) or die "bts summary: change summary of what bug?\n"; my $msg = shift || ''; mailbts("summary $bug $msg", "summary $bug $msg"); } =item B<submitter> I<bug> [I<bug> ...] I<submitter-email> Change the submitter address of a I<bug> or a number of bugs, with B<!> meaning `use the address on the current email as the new submitter address'. =cut sub bts_submitter { @_ or die "bts submitter: change submitter of what bug?\n"; my $submitter = checkemail(pop, 1); if (!defined $submitter) { die "bts submitter: change submitter to what?\n"; } foreach (@_) { my $bug = checkbug($_) or die "bts submitter: $_ is not a bug number\n"; mailbts("submitter $bug", "submitter $bug $submitter"); } } =item B<reassign> I<bug> [I<bug> ...] I<package> [I<version>] Reassign a I<bug> or a number of bugs to a different I<package>. The I<version> field is optional; see the explanation at L<https://www.debian.org/Bugs/server-control>. =cut sub bts_reassign { my ($bug, @bugs); while ($_ = shift) { $bug = checkbug($_, 1) or last; push @bugs, $bug; } @bugs or die "bts reassign: reassign what bug(s)?\n"; my $package = $_ or die "bts reassign: reassign bug(s) to what package?\n"; my $version = shift; $version = "" unless defined $version; if (length $version and $version !~ /\d/) { die "bts reassign: version number $version contains no digits!\n"; } opts_done(@_); foreach $bug (@bugs) { mailbts("reassign $bug to $package", "reassign $bug $package $version"); } foreach my $packagename (split /,/, $package) { $packagename =~ s/^src://; $ccpackages{$packagename} = 1; } } =item B<found> I<bug> [I<version>] Indicate that a I<bug> was found to exist in a particular package version. Without I<version>, the list of fixed versions is cleared and the bug is reopened. =cut sub bts_found { my $bug = checkbug(shift) or die "bts found: found what bug?\n"; my $version = shift; if (!defined $version) { warn "$progname: found has no version number, but sending to the BTS anyway\n"; $version = ""; } opts_done(@_); mailbts("found $bug in $version", "found $bug $version"); } =item B<notfound> I<bug> I<version> Remove the record that I<bug> was encountered in the given version of the package to which it is assigned. =cut sub bts_notfound { my $bug = checkbug(shift) or die "bts notfound: what bug?\n"; my $version = shift or die "bts notfound: remove record \#$bug from which version?\n"; opts_done(@_); mailbts("notfound $bug in $version", "notfound $bug $version"); } =item B<fixed> I<bug> I<version> Indicate that a I<bug> was fixed in a particular package version, without affecting the I<bug>'s open/closed status. =cut sub bts_fixed { my $bug = checkbug(shift) or die "bts fixed: what bug?\n"; my $version = shift or die "bts fixed: \#$bug fixed in which version?\n"; opts_done(@_); mailbts("fixed $bug in $version", "fixed $bug $version"); } =item B<notfixed> I<bug> I<version> Remove the record that a I<bug> was fixed in the given version of the package to which it is assigned. This is equivalent to the sequence of commands "B<found> I<bug> I<version>", "B<notfound> I<bug> I<version>". =cut sub bts_notfixed { my $bug = checkbug(shift) or die "bts notfixed: what bug?\n"; my $version = shift or die "bts notfixed: remove record \#$bug from which version?\n"; opts_done(@_); mailbts("notfixed $bug in $version", "notfixed $bug $version"); } =item B<block> I<bug> B<by>|B<with> I<bug> [I<bug> ...] Note that a I<bug> is blocked from being fixed by a set of other bugs. =cut sub bts_block { my $bug = checkbug(shift) or die "bts block: what bug is blocked?\n"; my $word = shift; if (defined $word && $word ne 'by' && $word ne 'with') { unshift @_, $word; } @_ or die "bts block: need to specify at least two bug numbers\n"; my @blockers; foreach (@_) { my $blocker = checkbug($_) or die "bts block: some blocking bug number(s) not valid\n"; push @blockers, $blocker; } mailbts("block $bug with @blockers", "block $bug with @blockers"); } =item B<unblock> I<bug> B<by>|B<with> I<bug> [I<bug> ...] Note that a I<bug> is no longer blocked from being fixed by a set of other bugs. =cut sub bts_unblock { my $bug = checkbug(shift) or die "bts unblock: what bug is blocked?\n"; my $word = shift; if (defined $word && $word ne 'by' && $word ne 'with') { unshift @_, $word; } @_ or die "bts unblock: need to specify at least two bug numbers\n"; my @blockers; foreach (@_) { my $blocker = checkbug($_) or die "bts unblock: some blocking bug number(s) not valid\n"; push @blockers, $blocker; } mailbts("unblock $bug with @blockers", "unblock $bug with @blockers"); } =item B<merge> I<bug> I<bug> [I<bug> ...] Merge a set of bugs together. =cut sub bts_merge { my @bugs; foreach (@_) { my $bug = checkbug($_) or die "bts merge: some bug number(s) not valid\n"; push @bugs, $bug; } @bugs > 1 or die "bts merge: at least two bug numbers to be merged must be specified\n"; mailbts("merging @bugs", "merge @bugs"); } =item B<forcemerge> I<bug> I<bug> [I<bug> ...] Forcibly merge a set of bugs together. The first I<bug> listed is the master bug, and its settings (those which must be equal in a normal B<merge>) are assigned to the bugs listed next. =cut sub bts_forcemerge { my @bugs; foreach (@_) { my $bug = checkbug($_) or die "bts forcemerge: some bug number(s) not valid\n"; push @bugs, $bug; } @bugs > 1 or die "bts forcemerge: at least two bug numbers to be merged must be specified\n"; mailbts("forcibly merging @bugs", "forcemerge @bugs"); } =item B<unmerge> I<bug> Unmerge a I<bug>. =cut sub bts_unmerge { my $bug = checkbug(shift) or die "bts unmerge: unmerge what bug?\n"; opts_done(@_); mailbts("unmerging $bug", "unmerge $bug"); } =item B<tag> I<bug> [B<+>|B<->|B<=>] I<tag> [I<tag> ...] =item B<tags> I<bug> [B<+>|B<->|B<=>] I<tag> [I<tag> ...] Set or unset a I<tag> on a I<bug>. The tag may either be the exact tag name or it may be abbreviated to any unique tag substring. (So using B<fixed> will set the tag B<fixed>, not B<fixed-upstream>, for example, but B<fix> would not be acceptable.) Multiple tags may be specified as well. The two commands (tag and tags) are identical. At least one tag must be specified, unless the B<=> flag is used, where the command bts tags <bug> = will remove all tags from the specified I<bug>. Adding/removing the B<security> tag will add "team\@security.debian.org" to the Cc list of the control email. The list of valid tags and their significance is available at L<https://www.debian.org/Bugs/Developer#tags>. The current valid tags are: patch, wontfix, moreinfo, unreproducible, fixed, help, security, upstream, pending, d-i, confirmed, ipv6, lfs, fixed-upstream, l10n, newcomer, a11y, ftbfs There is also a tag for each release of Debian since "potato". Note that this list may be out of date, see the website for the most up to date source. =cut # note that the tag list is also in the @gtag variable, look for # "potato" above. sub bts_tags { my $bug = checkbug(shift) or die "bts tags: tag what bug?\n"; if (!@_) { die "bts tags: set what tag?\n"; } # Parse the rest of the command line. my $base_command = "tags $bug"; my $commands = []; my $curop; foreach my $tag (@_) { if ($tag =~ s/^([-+=])//) { my $op = $1; if ($op eq '=') { $curop = '='; $commands = []; $ccsecurity = ''; } elsif (!$curop || $curop ne $op) { $curop = $op; } next unless $tag; } if (!$curop) { $curop = '+'; } if ($tag eq 'gift') { my $gift_flag = $curop; if ($gift_flag eq '=') { $gift_flag = '+'; } # Backward compatibility: do both gift usertagging and newcomer # tagging. Gifting should be removed after a suitable migration # time. See https://wiki.debian.org/qa.debian.org/GiftTag header # for more info. mailbts("tagging $bug", "tags $bug + newcomer"); mailbts( "gifting $bug", "user debian-qa\@lists.debian.org\nusertag $bug $gift_flag gift" ); next; } if (!exists $valid_tags{$tag}) { # Try prefixes my @matches = grep /^\Q$tag\E/, @valid_tags; if (@matches != 1) { die "bts tags: \"$tag\" is not a " . (@matches > 1 ? "unique" : "valid") . " tag prefix. Choose from: " . join(" ", @valid_tags) . "\n"; } $tag = $matches[0]; } if (!@$commands || $curop ne $commands->[-1]{op}) { push(@$commands, { op => $curop, tags => [] }); } push(@{ $commands->[-1]{tags} }, $tag); if ($tag eq "security") { $ccsecurity = "team\@security.debian.org"; } } my $command = ''; foreach my $cmd (@$commands) { if ($cmd->{op} ne '=' && !@{ $cmd->{tags} }) { die "bts tags: set what tag?\n"; } $command .= " $cmd->{op} " . join(' ', @{ $cmd->{tags} }); } if (!$command && $curop eq '=') { $command = " $curop"; } if ($command) { mailbts("tagging $bug", $base_command . $command); } } =item B<affects> I<bug> [B<+>|B<->|B<=>] I<package> [I<package> ...] Indicates that a I<bug> affects a I<package> other than that against which it is filed, causing the I<bug> to be listed by default in the I<package> list of the other I<package>. This should generally be used where the I<bug> is severe enough to cause multiple reports from users to be assigned to the wrong package. At least one I<package> must be specified, unless the B<=> flag is used, where the command bts affects <bug> = will remove all indications that I<bug> affects other packages. =cut sub bts_affects { my $bug = checkbug(shift) or die "bts affects: mark what bug as affecting another package?\n"; if (!@_) { die "bts affects: mark which package as affected?\n"; } # Parse the rest of the command line. my $command = "affects $bug"; my $flag = ""; if ($_[0] =~ /^[-+=]$/) { $flag = $_[0]; $command .= " $flag"; shift; } elsif ($_[0] =~ s/^([-+=])//) { $flag = $1; $command .= " $flag"; } if ($flag ne '=' && !@_) { die "bts affects: mark which package as affected?\n"; } foreach my $package (@_) { $command .= " $package"; } mailbts("affects $bug", $command); } =item B<user> I<email> Specify a user I<email> address before using the B<usertags> command. =cut sub bts_user { my $email = checkemail(shift) or die "bts user: set user to what email address?\n"; if (!length $email) { die "bts user: set user to what email address?\n"; } opts_done(@_); if ($email ne $last_user) { mailbts("user $email", "user $email"); } $last_user = $email; } =item B<usertag> I<bug> [B<+>|B<->|B<=>] I<tag> [I<tag> ...] =item B<usertags> I<bug> [B<+>|B<->|B<=>] I<tag> [I<tag> ...] Set or unset a user tag on a I<bug>. The I<tag> must be the exact tag name wanted; there are no defaults or checking of tag names. Multiple tags may be specified as well. The two commands (B<usertag> and B<usertags>) are identical. At least one I<tag> must be specified, unless the B<=> flag is used, where the command bts usertags <bug> = will remove all user tags from the specified I<bug>. =cut sub bts_usertags { my $bug = checkbug(shift) or die "bts usertags: tag what bug?\n"; if (!@_) { die "bts usertags: set what user tag?\n"; } # Parse the rest of the command line. my $command = "usertags $bug"; my $flag = ""; if ($_[0] =~ /^[-+=]$/) { $flag = $_[0]; $command .= " $flag"; shift; } elsif ($_[0] =~ s/^([-+=])//) { $flag = $1; $command .= " $flag"; } if ($flag ne '=' && !@_) { die "bts usertags: set what user tag?\n"; } $command .= sprintf(' %s', join(' ', @_)); mailbts("usertagging $bug", $command); } =item B<claim> I<bug> [I<claim>] Record that you have claimed a I<bug> (e.g. for a bug squashing party). I<claim> should be a unique token allowing the bugs you have claimed to be identified; an e-mail address is often used. If no I<claim> is specified, the environment variable B<DEBEMAIL> or B<EMAIL> (checked in that order) is used. =cut sub bts_claim { my $bug = checkbug(shift) or die "bts claim: claim what bug?\n"; my $claim = checkemail(shift) || $ENV{'DEBEMAIL'} || $ENV{'EMAIL'} || ""; if (!length $claim) { die "bts claim: use what claim token?\n"; } $claim = extractemail($claim); bts_user("bugsquash\@qa.debian.org"); bts_usertags("$bug", "+$claim"); } =item B<unclaim> I<bug> [I<claim>] Remove the record that you have claimed a bug. If no I<claim> is specified, the environment variable B<DEBEMAIL> or B<EMAIL> (checked in that order) is used. =cut sub bts_unclaim { my $bug = checkbug(shift) or die "bts unclaim: unclaim what bug?\n"; my $claim = checkemail(shift) || $ENV{'DEBEMAIL'} || $ENV{'EMAIL'} || ""; if (!length $claim) { die "bts unclaim: use what claim token?\n"; } $claim = extractemail($claim); bts_user("bugsquash\@qa.debian.org"); bts_usertags("$bug", "-$claim"); } =item B<severity> I<bug> I<severity> Change the I<severity> of a I<bug>. Available severities are: B<wishlist>, B<minor>, B<normal>, B<important>, B<serious>, B<grave>, B<critical>. The severity may be abbreviated to any unique substring. =cut sub bts_severity { my $bug = checkbug(shift) or die "bts severity: change the severity of what bug?\n"; my $severity = lc(shift) or die "bts severity: set \#$bug\'s severity to what?\n"; my @matches = grep /^\Q$severity\E/i, @valid_severities; if (@matches != 1) { die "bts severity: \"$severity\" is not a valid severity.\nChoose from: @valid_severities\n"; } opts_done(@_); mailbts("severity of $bug is $matches[0]", "severity $bug $matches[0]"); } =item B<forwarded> I<bug> I<address> Mark the I<bug> as forwarded to the given I<address> (usually an email address or a URL for an upstream bug tracker). =cut sub bts_forwarded { my $bug = checkbug(shift) or die "bts forwarded: mark what bug as forwarded?\n"; my $email = join(' ', @_); if ($email =~ /$btsserver/) { die "bts forwarded: We don't forward bugs within $btsserver, use bts reassign instead\n"; } if (!length $email) { die "bts forwarded: mark bug $bug as forwarded to what email address?\n"; } mailbts("bug $bug is forwarded to $email", "forwarded $bug $email"); } =item B<notforwarded> I<bug> Mark a I<bug> as not forwarded. =cut sub bts_notforwarded { my $bug = checkbug(shift) or die "bts notforwarded: what bug?\n"; opts_done(@_); mailbts("bug $bug is not forwarded", "notforwarded $bug"); } =item B<package> [I<package> ...] The following commands will only apply to bugs against the listed I<package>s; this acts as a safety mechanism for the BTS. If no packages are listed, this check is turned off again. =cut sub bts_package { if (@_) { bts_limit(map { "package:$_" } @_); } else { bts_limit('package'); } } =item B<limit> [I<key>[B<:>I<value>]] ... The following commands will only apply to bugs which meet the specified criterion; this acts as a safety mechanism for the BTS. If no I<value>s are listed, the limits for that I<key> are turned off again. If no I<key>s are specified, all limits are reset. =over 8 =item B<submitter> E-mail address of the submitter. =item B<date> Date the bug was submitted. =item B<subject> Subject of the bug. =item B<msgid> Message-id of the initial bug report. =item B<package> Binary package name. =item B<source> Source package name. =item B<tag> Tags applied to the bug. =item B<severity> Bug severity. =item B<owner> Bug's owner. =item B<affects> Bugs affecting this package. =item B<archive> Whether to search archived bugs or normal bugs; defaults to B<0> (i.e. only search normal bugs). As a special case, if archive is B<both>, both archived and unarchived bugs are returned. =back For example, to limit the set of bugs affected by the subsequent control commands to those submitted by jrandomdeveloper@example.com and tagged B<wontfix>, one would use bts limit submitter:jrandomdeveloper@example.com tag:wontfix If a key is used multiple times then the set of bugs selected includes those matching any of the supplied values; for example bts limit package:foo severity:wishlist severity:minor only applies the subsequent control commands to bugs of package foo with either B<wishlist> or B<minor> severity. =cut sub bts_limit { my @args = @_; my %limits; # Ensure we're using the limit fields that debbugs expects. These are the # keys from Debbugs::Status::fields my %valid_keys = ( submitter => 'originator', date => 'date', subject => 'subject', msgid => 'msgid', package => 'package', source => 'source', src => 'source', tag => 'keywords', severity => 'severity', owner => 'owner', affects => 'affects', archive => 'unarchived', ); for my $arg (@args) { my ($key, $value) = split /:/, $arg, 2; next unless $key; if (!defined $value) { die "bts limit: No value given for '$key'\n"; } if (exists $valid_keys{$key}) { # Support "$key:" by making it look like "$key", i.e. no $value # defined undef $value unless length($value); if ($key eq "archive") { if (defined $value) { # limit looks for unarchived, not archive. Verify we have # a valid value and then switch the boolean value to match # archive => unarchive if ($value =~ /^yes|1|true|on$/i) { $value = 0; } elsif ($value =~ /^no|0|false|off$/i) { $value = 1; } elsif ($value ne 'both') { die "bts limit: Invalid value ($value) for archive\n"; } } } $key = $valid_keys{$key}; if (defined $value and $value) { push(@{ $limits{$key} }, $value); } else { $limits{$key} = (); } } elsif ($key eq 'clear') { %limits = (); $limits{$key} = 1; } else { die "bts limit: Unrecognized key: $key\n"; } } for my $key (keys %limits) { if ($key eq 'clear') { mailbts('clear all limit(s)', 'limit clear'); next; } if (defined $limits{$key}) { my $value = join ' ', @{ $limits{$key} }; mailbts("limit $key to $value", "limit $key $value"); } else { mailbts("clear $key limit", "limit $key"); } } } =item B<owner> I<bug> I<owner-email> Change the "owner" address of a I<bug>, with B<!> meaning `use the address on the current email as the new owner address'. The owner of a bug accepts responsibility for dealing with it. =cut sub bts_owner { my $bug = checkbug(shift) or die "bts owner: change owner of what bug?\n"; my $owner = checkemail(shift, 1) or die "bts owner: change owner to what?\n"; opts_done(@_); mailbts("owner $bug", "owner $bug $owner"); } =item B<noowner> I<bug> Mark a bug as having no "owner". =cut sub bts_noowner { my $bug = checkbug(shift) or die "bts noowner: what bug?\n"; opts_done(@_); mailbts("bug $bug has no owner", "noowner $bug"); } =item B<subscribe> I<bug> [I<email>] Subscribe the given I<email> address to the specified I<bug> report. If no email address is specified, the environment variable B<DEBEMAIL> or B<EMAIL> (in that order) is used. If those are not set, or B<!> is given as email address, your default address will be used. After executing this command, you will be sent a subscription confirmation to which you have to reply. When subscribed to a bug report, you receive all relevant emails and notifications. Use the unsubscribe command to unsubscribe. =cut sub bts_subscribe { my $bug = checkbug(shift) or die "bts subscribe: subscribe to what bug?\n"; my $email = checkemail(shift, 1); $email = lc($email) if defined $email; if (defined $email and $email eq '!') { $email = undef; } else { $email ||= $ENV{'DEBEMAIL'}; $email ||= $ENV{'EMAIL'}; $email = extractemail($email) if defined $email; } opts_done(@_); mailto( 'subscription request for bug #' . $bug, '', $bug . '-subscribe@' . $btsserver, $email ); } =item B<unsubscribe> I<bug> [I<email>] Unsubscribe the given email address from the specified bug report. As with subscribe above, if no email address is specified, the environment variables B<DEBEMAIL> or B<EMAIL> (in that order) is used. If those are not set, or B<!> is given as email address, your default address will be used. After executing this command, you will be sent an unsubscription confirmation to which you have to reply. Use the B<subscribe> command to, well, subscribe. =cut sub bts_unsubscribe { my $bug = checkbug(shift) or die "bts unsubscribe: unsubscribe from what bug?\n"; my $email = checkemail(shift, 1); $email = lc($email) if defined $email; if (defined $email and $email eq '!') { $email = undef; } else { $email ||= $ENV{'DEBEMAIL'}; $email ||= $ENV{'EMAIL'}; $email = extractemail($email) if defined $email; } opts_done(@_); mailto( 'unsubscription request for bug #' . $bug, '', $bug . '-unsubscribe@' . $btsserver, $email ); } =item B<reportspam> I<bug> ... The B<reportspam> command allows you to report a I<bug> report as containing spam. It saves one from having to go to the bug web page to do so. =cut sub bts_reportspam { my @bugs; if (!have_lwp()) { die "$progname: Couldn't run bts reportspam: $lwp_broken\n"; } foreach (@_) { my $bug = checkbug($_) or die "bts reportspam: some bug number(s) not valid\n"; push @bugs, $bug; } @bugs >= 1 or die "bts reportspam: at least one bug number must be specified\n"; init_agent() unless $ua; foreach my $bug (@bugs) { my $url = "$btscgispamurl?bug=$bug;ok=ok"; if ($noaction) { print "bts reportspam: would report $bug as containing spam (URL: " . $url . ")\n"; } else { my $request = HTTP::Request->new('GET', $url); my $response = $ua->request($request); if (!$response->is_success) { warn "$progname: failed to report $bug as containing spam: " . $response->status_line . "\n"; } } } } =item B<spamreport> I<bug> ... B<spamreport> is a synonym for B<reportspam>. =cut sub bts_spamreport { goto &bts_reportspam; } =item B<cache> [I<options>] [I<maint_email> | I<pkg> | B<src:>I<pkg> | B<from:>I<submitter>] =item B<cache> [I<options>] [B<release-critical> | B<release-critical/>... | B<RC>] Generate or update a cache of bug reports for the given email address or package. By default it downloads all bugs belonging to the email address in the B<DEBEMAIL> environment variable (or the B<EMAIL> environment variable if B<DEBEMAIL> is unset). This command may be repeated to cache bugs belonging to several people or packages. If multiple packages or addresses are supplied, bugs belonging to any of the arguments will be cached; those belonging to more than one of the arguments will only be downloaded once. The cached bugs are stored in F<$XDG_CACHE_HOME/devscripts/bts/> or, if B<XDG_CACHE_HOME> is not set, in F<~/.cache/devscripts/bts/>. You can use the cached bugs with the B<-o> switch. For example: bts -o bugs bts -o show 12345 Also, B<bts> will update the files in it in a piecemeal fashion as it downloads information from the BTS using the B<show> command. You might thus set up the cache, and update the whole thing once a week, while letting the automatic cache updates update the bugs you frequently refer to during the week. Some options affect the behaviour of the B<cache> command. The first is the setting of B<--cache-mode>, which controls how much B<bts> downloads of the referenced links from the bug page, including boring bits such as the acknowledgement emails, emails to the control bot, and the mbox version of the bug report. It can take three values: B<min> (the minimum), B<mbox> (download the minimum plus the mbox version of the bug report) or B<full> (the whole works). The second is B<--force-refresh> or B<-f>, which forces the download, even if the cached bug report is up-to-date. The B<--include-resolved> option indicates whether bug reports marked as resolved should be downloaded during caching. Each of these is configurable from the configuration file, as described below. They may also be specified after the B<cache> command as well as at the start of the command line. Finally, B<-q> or B<--quiet> will suppress messages about caches being up-to-date, and giving the option twice will suppress all cache messages (except for error messages). Beware of caching RC, though: it will take a LONG time! (With 1000+ RC bugs and a delay of 5 seconds between bugs, you're looking at a minimum of 1.5 hours, and probably significantly more than that.) =cut sub bts_cache { @ARGV = @_; my ($sub_cachemode, $sub_refreshmode, $sub_updatemode); my $sub_quiet = $quiet; my $sub_includeresolved = $includeresolved; GetOptions( "cache-mode|cachemode=s" => \$sub_cachemode, "f" => \$sub_refreshmode, "force-refresh!" => \$sub_refreshmode, "only-new!" => \$sub_updatemode, "q|quiet+" => \$sub_quiet, "include-resolved!" => \$sub_includeresolved, ) or die "$progname: unknown options for cache command\n"; @_ = @ARGV; # whatever's left if (defined $sub_refreshmode) { ($refreshmode, $sub_refreshmode) = ($sub_refreshmode, $refreshmode); } if (defined $sub_updatemode) { ($updatemode, $sub_updatemode) = ($sub_updatemode, $updatemode); } if (defined $sub_cachemode) { if ($sub_cachemode =~ $cachemode_re) { ($cachemode, $sub_cachemode) = ($sub_cachemode, $cachemode); } else { warn "$progname: ignoring invalid --cache-mode $sub_cachemode;\nmust be one of min, mbox, full.\n"; } } # This may be a no-op, we don't mind ($quiet, $sub_quiet) = ($sub_quiet, $quiet); ($includeresolved, $sub_includeresolved) = ($sub_includeresolved, $includeresolved); prunecache(); if (!have_lwp()) { die "$progname: Couldn't run bts cache: $lwp_broken\n"; } if (!-d $cachedir) { my $err; make_path($cachedir, { error => \$err }); if (@$err) { my ($path, $msg) = each(%{ $err->[0] }); die "$progname: couldn't mkdir $path: $msg\n"; } } download("css/bugs.css"); my $tocache; if (@_ > 0) { $tocache = sanitizething(shift); } else { $tocache = ''; } if (!length $tocache) { $tocache = $ENV{'DEBEMAIL'} || $ENV{'EMAIL'} || ''; if ($tocache =~ /^.*\s<(.*)>\s*$/) { $tocache = $1; } } if (!length $tocache) { die "bts cache: cache what?\n"; } my $sub_thgopts = ''; $sub_thgopts = ';pend-exc=done' if (!$includeresolved && $tocache !~ /^release-critical/); my %bugs = (); my %oldbugs = (); do { %oldbugs = (%oldbugs, map { $_ => 1 } bugs_from_thing($tocache, $sub_thgopts)); # download index download($tocache, $sub_thgopts, 1); %bugs = (%bugs, map { $_ => 1 } bugs_from_thing($tocache, $sub_thgopts)); $tocache = sanitizething(shift); } while (defined $tocache); # remove old bugs from cache if (keys %oldbugs) { tie(%timestamp, "Devscripts::DB_File_Lock", $timestampdb, O_RDWR() | O_CREAT(), 0600, $DB_HASH, "write") or die "$progname: couldn't open DB file $timestampdb for writing: $!\n" if !tied %timestamp; } foreach my $bug (keys %oldbugs) { if (!$bugs{$bug}) { deletecache($bug); } } untie %timestamp; # download bugs my $bugcount = 1; my $bugtotal = scalar keys %bugs; foreach my $bug (keys %bugs) { if (-f cachefile($bug, '') and $updatemode) { print "Skipping $bug as requested ... $bugcount/$bugtotal\n" if !$quiet; $bugcount++; next; } download($bug, '', 1, 0, $bugcount, $bugtotal); sleep $opt_cachedelay; $bugcount++; } # revert options if (defined $sub_refreshmode) { $refreshmode = $sub_refreshmode; } if (defined $sub_updatemode) { $updatemode = $sub_updatemode; } if (defined $sub_cachemode) { $cachemode = $sub_cachemode; } $quiet = $sub_quiet; $includeresolved = $sub_includeresolved; } =item B<cleancache> I<package> | B<src:>I<package> | I<maintainer> =item B<cleancache from:>I<submitter> | B<tag:>I<tag> | B<usertag:>I<tag> | I<number> | B<ALL> Clean the cache for the specified I<package>, I<maintainer>, etc., as described above for the B<bugs> command, or clean the entire cache if B<ALL> is specified. This is useful if you are going to have permanent network access or if the database has become corrupted for some reason. Note that for safety, this command does not default to the value of B<DEBEMAIL> or B<EMAIL>. =cut sub bts_cleancache { prunecache(); my $toclean = sanitizething(shift); if (!defined $toclean) { die "bts cleancache: clean what?\n"; } if (!-d $cachedir) { return; } if ($toclean eq 'ALL') { if (system("/bin/rm", "-rf", $cachedir) >> 8 != 0) { warn "Problems cleaning cache: $!\n"; } return; } # clean index tie(%timestamp, "Devscripts::DB_File_Lock", $timestampdb, O_RDWR() | O_CREAT(), 0600, $DB_HASH, "write") or die "$progname: couldn't open DB file $timestampdb for writing: $!\n" if !tied %timestamp; if ($toclean =~ /^\d+$/) { # single bug only deletecache($toclean); } else { my @bugs_to_clean = bugs_from_thing($toclean); deletecache($toclean); # remove old bugs from cache foreach my $bug (@bugs_to_clean) { deletecache($bug); } } untie %timestamp; } =item B<listcachedbugs> [I<number>] List cached bug ids (intended to support bash completion). The optional number argument restricts the list to those bug ids that start with that number. =cut sub bts_listcachedbugs { my $number = shift; if (not defined $number) { $number = ''; } if ($number =~ m{\D}) { return; } my $untie = 0; if (not tied %timestamp) { tie(%timestamp, "Devscripts::DB_File_Lock", $timestampdb, O_RDONLY(), 0600, $DB_HASH, "read") or die "$progname: couldn't open DB file $timestampdb for reading: $!\n"; $untie = 1; } print join "\n", grep { $_ =~ m{^$number\d+$} } sort keys %timestamp; print "\n"; if ($untie) { untie %timestamp; } } # Add any new commands here. =item B<version> Display version and copyright information. =cut sub bts_version { print <<"EOF"; $progname version $version Copyright (C) 2001-2003 by Joey Hess <joeyh\@debian.org>. Modifications Copyright (C) 2002-2004 by Julian Gilbey <jdg\@debian.org>. Modifications Copyright (C) 2007 by Josh Triplett <josh\@freedesktop.org>. It is licensed under the terms of the GPL, either version 2 of the License, or (at your option) any later version. EOF } =item B<help> Display a short summary of commands, suspiciously similar to parts of this man page. =cut # Other supporting subs # This must be the last bts_* sub sub bts_help { my $inlist = 0; my $insublist = 0; print <<"EOF"; Usage: $progname [options] command [args] [\#comment] [.|, command ... ] Valid options are: -o, --offline Do not attempt to connect to BTS for show/bug commands: use cached copy --online, --no-offline Attempt to connect (default) -n, --no-action Do not send emails but print them to standard output. --no-cache Do not attempt to cache new versions of BTS pages when performing show/bug commands --cache Do attempt to cache new versions of BTS pages when performing show/bug commands (default) --cache-mode={min|mbox|full} How much to cache when we are caching: the sensible bare minimum (default), the mbox as well, or everything? --cache-delay=seconds Time to sleep between each download when caching. -m, --mbox With show or bugs, open a mailreader to read the mbox version instead --mailreader=CMD Run CMD to read an mbox; default is 'mutt -f %s' (must contain %s, which is replaced by mbox name) --cc-addr=CC_EMAIL_ADDRESS Send carbon copies to a list of users. CC_EMAIL_ADDRESS should be a comma-separated list of e-mail addresses. Multiple options add more CCs. --use-default-cc Send carbon copies to any addresses specified in the configuration file BTS_DEFAULT_CC (default) --no-use-default-cc Do not do so --sendmail=cmd Sendmail command to use (default /usr/sbin/sendmail) --mutt Use mutt for sending of mails. --no-mutt Do not do so (default) --smtp-host=host SMTP host to use --smtp-username=user } Credentials to use when connecting to an SMTP --smtp-password=pass } server which requires authentication --smtp-helo=helo HELO to use when connecting to the SMTP server; (defaults to the content of /etc/mailname) --bts-server The name of the debbugs server to use (default https://bugs.debian.org) -f, --force-refresh Reload all bug reports being cached, even unchanged ones --no-force-refresh Do not do so (default) --only-new Download only new bugs when caching. Do not check for updates in bugs we already have. --include-resolved Cache bugs marked as resolved (default) --no-include-resolved Do not cache bugs marked as resolved --no-ack Suppress BTS acknowledgment mails --ack Do not do so (default) -i, --interactive Prompt for confirmation before sending e-mail --force-interactive Same as --interactive, with the exception that an editor is spawned before confirmation is requested --no-interactive Do not do so (default) -q, --quiet Only display information about newly cached pages. If given twice, only display error messages. --no-conf, --noconf Do not read devscripts config files; must be the first option given -h, --help Display this message -v, --version Display version and copyright info Default settings modified by devscripts configuration files: $modified_conf_msg Valid commands are: EOF seek DATA, 0, 0; while (<DATA>) { $inlist = 1 if /^=over 4/; next unless $inlist; $insublist = 1 if /^=over [^4]/; $insublist = 0 if /^=back/; if (/^=item\sB<([^->].*)>/ and !$insublist) { if ($1 eq 'help') { last; } # Strip POD markup before displaying and ensure we don't wrap # longer lines my $parser = Pod::BTS->new(width => 100); $parser->no_whining(1); $parser->output_fh(\*STDOUT); $parser->parse_string_document($_); } } } # Strips any leading # or Bug# and trailing : from a thing if what's left is # a pure positive number; # also RC is a synonym for release-critical/other/all.html sub sanitizething { my $bug = $_[0]; defined $bug or return undef; return 'release-critical/other/all.html' if $bug eq 'RC'; return 'release-critical/index.html' if $bug eq 'release-critical'; $bug =~ s/^(?:(?:Bug)?\#)?(\d+):?$/$1/; return $bug; } # Perform basic validation of an argument which should be an email address, # handling ! if allowed sub checkemail { my $email = $_[0] or return; my $allowbang = $_[1]; if ($email !~ /\@/ && (!$allowbang || $email ne '!')) { return; } return $email; } # Validate a bug number. Strips out extraneous leading junk, allowing # for things like "#74041" and "Bug#94921" sub checkbug { my $bug = $_[0] or return ""; my $quiet = $_[1] || 0; # used when we don't want warnings from checkbug if ($bug eq 'it') { if (not defined $it) { die "$progname: You specified 'it', but no previous bug number referenced!\n"; } } else { $bug =~ s/^(?:(?:bug)?\#)?(-?\d+):?$/$1/i; if (!exists $clonedbugs{$bug} && (!length $bug || $bug !~ /^[0-9]+$/)) { warn "\"$_[0]\" does not look like a bug number\n" unless $quiet; return ""; } # Valid, now set $it to this so that we can refer to it by 'it' later $it = $bug; } return $it; } # Stores up some extra information for a mail to the bts. sub mailbts { if ($subject eq '') { $subject = $_[0]; } elsif (length($subject) + length($_[0]) < 100) { $subject .= ", $_[0]" if length($_[0]); } elsif ($subject !~ / ...$/) { $subject .= " ..."; } $body .= "$comment[$index]\n" if $comment[$index]; $body .= "$_[1]\n"; } # Extract an array of email addresses from a string sub extract_addresses { my $s = shift; my @addresses; # Original regular expression from git-send-email, slightly modified while ($s and $s =~ /([^,<>"\s\@]+\@[^.,<>"\s@]+(?:\.[^.,<>"\s\@]+)+)(.*)/) { push @addresses, $1; $s = $2; } return @addresses; } # Send one full mail message using the smtphost or sendmail. sub send_mail { my ($from, $to, $cc, $subject, $body) = @_; my @fromaddresses = extract_addresses($from); unless (@fromaddresses) { die "Something went wrong: no from address" unless $noaction; @fromaddresses = ($from = '<undefined>'); } my $fromaddress = $fromaddresses[0]; # Message-ID algorithm from git-send-email my $msgid = sprintf("%s-%s", time(), int(rand(4200))) . "-bts-$fromaddress"; my $date = strftime "%a, %d %b %Y %T %z", localtime; my $message = fold_from_header("From: $from") . "\n"; $message .= "To: $to\n" if length $to; $message .= "Cc: $cc\n" if length $cc; $message .= "X-Debbugs-No-Ack: Yes\n" if not $requestack; $message .= "Subject: $subject\n" . "Date: $date\n" . "User-Agent: devscripts bts/$version$toolname\n" . "Message-ID: <$msgid>\n" . "\n"; $body = addfooter($body); ($message, $body) = confirmmail($message, $body); return if not defined $body; $message .= "$body\n"; if ($noaction) { print "$message\n"; } elsif ($use_mutt) { my ($fh, $filename) = tempfile( "btsXXXXXX", SUFFIX => ".mail", DIR => File::Spec->tmpdir, UNLINK => 1 ); open(MAILOUT, ">&", $fh) or die "$progname: writing to temporary file: $!\n"; print MAILOUT $message; my $mailcmd = $muttcmd; $mailcmd =~ s/\%([%s])/$1 eq '%' ? '%' : $filename/eg; exec($mailcmd) or die "$progname: unable to start mailclient: $!"; } elsif (length $smtphost) { my $smtp; if ($smtphost =~ m%^(?:(?:ssmtp|smtps)://)(.*)$%) { my ($host, $port) = split(/:/, $1); $port ||= '465'; if (have_smtps) { $smtp = Net::SMTPS->new( $host, Port => $port, Hello => $smtphelo, doSSL => 'ssl' ) or die "$progname: failed to open SMTPS connection to $smtphost\n($@)\n"; } else { die "$progname: Unable to establish SMTPS connection: $smtps_broken\n"; } } else { my ($host, $port) = split(/:/, $smtphost); $port ||= '25'; if (have_smtps) { $smtp = Net::SMTPS->new( $host, Port => $port, Hello => $smtphelo, doSSL => 'starttls' ) or die "$progname: failed to open SMTP connection to $smtphost\n($@)\n"; } else { $smtp = Net::SMTP->new($host, Port => $port, Hello => $smtphelo) or die "$progname: failed to open SMTP connection to $smtphost\n($@)\n"; } } if ($smtpuser) { if (have_authen_sasl) { $smtppass = getpass() if not $smtppass; $smtp->auth($smtpuser, $smtppass) or die "$progname: failed to authenticate to $smtphost\n($@)\n"; } else { die "$progname: failed to authenticate to $smtphost: $authen_sasl_broken\n"; } } $smtp->mail($fromaddress) or die "$progname: failed to set SMTP from address $fromaddress\n($@)\n"; my @addresses = extract_addresses($to); push @addresses, extract_addresses($cc); foreach my $address (@addresses) { $smtp->recipient($address) or die "$progname: failed to set SMTP recipient $address\n($@)\n"; } $smtp->data($message) or die "$progname: failed to send message as SMTP DATA\n($@)\n"; $smtp->quit or die "$progname: failed to quit SMTP connection\n($@)\n"; } else { my $pid = open(MAIL, "|-"); if (!defined $pid) { die "$progname: Couldn't fork: $!\n"; } $SIG{'PIPE'} = sub { die "$progname: pipe for $sendmailcmd broke\n"; }; if ($pid) { # parent print MAIL $message; close MAIL or die "$progname: $sendmailcmd error: $!\n"; } else { # child if ($debug) { exec("/bin/cat") or die "$progname: error running cat: $!\n"; } else { my @mailcmd = split ' ', $sendmailcmd; push @mailcmd, "-t" if $sendmailcmd =~ /$sendmail_t/; exec @mailcmd or die "$progname: error running $sendmailcmd: $!\n"; } } } } sub generate_packages_cc { my @ccs; if (keys %ccpackages && $packagesserver) { push @ccs, map { "$_\@$packagesserver" } sort keys %ccpackages; } if (keys %ccsubmitters && $btsserver) { push @ccs, map { "$_\@$btsserver" } sort keys %ccsubmitters; } return @ccs; } # Sends all cached mail to the bts (duh). sub mailbtsall { my $subject = shift; my $body = shift; my $charset = `locale charmap`; chomp $charset; $charset =~ s/^ANSI_X3\.4-19(68|86)$/US-ASCII/; $subject = MIME_encode_mimewords($subject, 'Charset' => $charset); if ($interactive eq 'force' || $use_mutt) { push @ccemails, generate_packages_cc(); } if ($ccsecurity) { push @ccemails, $ccsecurity; } my $ccemail = join(', ', @ccemails); if ($ENV{'DEBEMAIL'} || $ENV{'EMAIL'}) { # We need to fake the From: line my ($email, $name); if (exists $ENV{'DEBFULLNAME'}) { $name = $ENV{'DEBFULLNAME'}; } if (exists $ENV{'DEBEMAIL'}) { $email = $ENV{'DEBEMAIL'}; if ($email =~ /^(.*?)\s+<(.*)>\s*$/) { $name ||= $1; $email = $2; } } if (exists $ENV{'EMAIL'}) { if ($ENV{'EMAIL'} =~ /^(.*?)\s+<(.*)>\s*$/) { $name ||= $1; $email ||= $2; } else { $email ||= $ENV{'EMAIL'}; } } if (!$name) { # Perhaps not ideal, but it will have to do $name = (getpwuid($<))[6]; $name =~ s/,.*//; } my $from = $name ? "$name <$email>" : $email; $from = MIME_encode_mimewords($from, 'Charset' => $charset); send_mail($from, $btsemail, $ccemail, $subject, $body); } else { # No DEBEMAIL my $header = ""; $header = "To: $btsemail\n"; $header .= "Cc: $ccemail\n" if length $ccemail; $header .= "X-Debbugs-No-Ack: Yes\n" if not $requestack; $header .= "Subject: $subject\n" . "User-Agent: devscripts bts/$version$toolname\n" . "\n"; $body = addfooter($body); ($header, $body) = confirmmail($header, $body); return if not defined $body; if ($noaction) { print "$header$body\n"; return; } my $pid = open(MAIL, "|-"); if (!defined $pid) { die "$progname: Couldn't fork: $!\n"; } $SIG{'PIPE'} = sub { die "$progname: pipe for $sendmailcmd broke\n"; }; if ($pid) { # parent print MAIL $header; print MAIL $body; close MAIL or die "$progname: $sendmailcmd: $!\n"; } else { # child if ($debug) { exec("/bin/cat") or die "$progname: error running cat: $!\n"; } else { my @mailcmd = split ' ', $sendmailcmd; push @mailcmd, "-t" if $sendmailcmd =~ /$sendmail_t/; exec @mailcmd or die "$progname: error running $sendmailcmd: $!\n"; } } } } sub confirmmail { my ($header, $body) = @_; return ($header, $body) if $noaction; $body = edit($body) if $interactive eq 'force'; my $setHeader = 0; if ($interactive ne 'no') { while (1) { print "\n", $header, "\n", $body, "\n---\n"; print "OK to send? [Y/n/e] "; $_ = <STDIN>; if (/^n/i) { $body = undef; last; } elsif (/^(y|$)/i) { last; } elsif (/^e/i) { # Since the user has chosen to edit the message, we go ahead # and add the $ccpackages Ccs (if they haven't already been # added due to interactive). if ($interactive ne 'force' && !$setHeader) { $setHeader = 1; my $ccs = generate_packages_cc(); if ($header =~ m/^Cc: (.*?)$/m) { $ccs = "$1, $ccs"; $header =~ s/^Cc: .*?$/Cc: $ccs/m; } else { $header =~ s/^(To: .*?)$/$1\nCc: $ccs/m; } } $body = edit($body); } } } return ($header, $body); } sub addfooter() { my $body = shift; $body .= "thanks\n"; if ($interactive eq 'force') { if (-r $ENV{'HOME'} . "/.signature") { if (open SIG, "<", $ENV{'HOME'} . "/.signature") { $body .= "-- \n"; while (<SIG>) { $body .= $_; } close SIG; } } } return $body; } sub getpass() { system "stty -echo cbreak </dev/tty"; die "$progname: error disabling stty echo\n" if $?; print "\a${smtpuser}"; print "\@$smtphost" if $smtpuser !~ /\@/; print "'s SMTP password: "; $_ = <STDIN>; chomp; print "\n"; system "stty echo -cbreak </dev/tty"; die "$progname: error enabling stty echo\n" if $?; return $_; } sub extractemail() { my $thing = shift or die "$progname: extract e-mail from what?\n"; if ($thing =~ /^(.*?)\s+<(.*)>\s*$/) { $thing = $2; } return $thing; } # A simplified version of mailbtsall which sends one message only to # a specified address using the specified email From: header sub mailto { my ($subject, $body, $to, $from) = @_; if (defined($from) || $noaction) { send_mail($from, $to, '', $subject, $body); } else { # No $from unless (system("command -v mailx >/dev/null 2>&1") == 0) { die "$progname: You need to either specify an email address (say using DEBEMAIL)\nor have the bsd-mailx package (or another package providing mailx) installed\nto send mail!\n"; } my $pid = open(MAIL, "|-"); if (!defined $pid) { die "$progname: Couldn't fork: $!\n"; } $SIG{'PIPE'} = sub { die "$progname: pipe for mailx broke\n"; }; if ($pid) { # parent print MAIL $body; close MAIL or die "$progname: mailx: $!\n"; } else { # child if ($debug) { exec("/bin/cat") or die "$progname: error running cat: $!\n"; } else { exec("mailx", "-s", $subject, $to) or die "$progname: error running mailx: $!\n"; } } } } # The following routines are taken from a patched version of MIME::Words # posted at http://mail.nl.linux.org/linux-utf8/2002-01/msg00242.html # by Richard =?utf-8?B?xIxlcGFz?= (Chepas) <rch@richard.eu.org> sub MIME_encode_B { my $str = shift; require MIME::Base64; MIME::Base64::encode_base64($str, ''); } sub MIME_encode_Q { my $str = shift; $str =~ s{([_\?\=\015\012\t $NONPRINT])}{$1 eq ' ' ? '_' : sprintf("=%02X", ord($1))}eog ; # RFC-2047, Q rule 3 $str; } sub MIME_encode_mimeword { my $word = shift; my $encoding = uc(shift || 'Q'); my $charset = uc(shift || 'ISO-8859-1'); my $encfunc = (($encoding eq 'Q') ? \&MIME_encode_Q : \&MIME_encode_B); "=?$charset?$encoding?" . &$encfunc($word) . "?="; } sub MIME_encode_mimewords { my ($rawstr, %params) = @_; # check if we have something to encode $rawstr !~ /[$NONPRINT]/o and $rawstr !~ /\=\?/o and return $rawstr; my $charset = $params{Charset} || 'ISO-8859-1'; # if there is 1/3 unsafe bytes, the Q encoded string will be 1.66 times # longer and B encoded string will be 1.33 times longer than original one my $encoding = lc( $params{Encoding} || ( length($rawstr) > 3 * ($rawstr =~ tr/[\x00-\x1F\x7F-\xFF]//) ? 'q' : 'b' )); # Encode any "words" with unsafe bytes. my ($last_token, $last_word_encoded, $token) = ('', 0); $rawstr =~ s{([^\015\012\t ]+|[\015\012\t ]+)}{ # get next "word" $token = $1; if ($token =~ /[\015\012\t ]+/) { # white-space $last_token = $token; } else { if ($token !~ /[$NONPRINT]/o and $token !~ /\=\?/o) { # no unsafe bytes, leave as it is $last_word_encoded = 0; $last_token = $token; } else { # has unsafe bytes, encode to one or more encoded words # white-space between two encoded words is skipped on # decoding, so we should encode space in that case $_ = $last_token =~ /[\015\012\t ]+/ && $last_word_encoded ? $last_token.$token : $token; # We limit such words to about 18 bytes, to guarantee that the # worst-case encoding give us no more than 54 + ~10 < 75 bytes s{(.{1,15}[\x80-\xBF]{0,4})}{ # don't split multibyte characters - this regexp should # work for UTF-8 characters MIME_encode_mimeword($1, $encoding, $charset).' '; }sxeg; $_ = substr($_, 0, -1); # remove trailing space $last_word_encoded = 1; $last_token = $token; $_; } } }sxeg; $rawstr; } # This is a stripped-down version of Mail::Header::_fold_line, but is # not as general-purpose as the original, so take care if using it elsewhere! # The heuristics are changed to prevent splitting in the middle of an # encoded word; we should not have any commas or semicolons! sub fold_from_header { my $header = shift; chomp $header; # We assume there wasn't a newline anyhow my $maxlen = 76; my $max = int($maxlen - 5); # 4 for leading spcs + 1 for [\,\;] if (length($header) > $maxlen) { # Split the line up: # first split at a whitespace, # else we are looking at a single word and we won't try to split # it, even though we really ought to # But this could only happen if someone deliberately uses a really # long name with no spaces in it. my @x; push @x, $1 while ( $header =~ s/^\s* ([^\"]{1,$max}\s |[^\s\"]*(?:\"[^\"]*\"[ \t]?[^\s\"]*)+\s |[^\s\"]+\s ) //x ); push @x, $header; map { s/\s*$// } @x; if (@x > 1 and length($x[-1]) + length($x[-2]) < $max) { $x[-2] .= " $x[-1]"; pop @x; } $x[0] =~ s/^\s*//; $header = join("\n ", @x); } $header =~ s/^(\S+)\n\s*(?=\S)/$1 /so; return $header; } ########## Browsing and caching subroutines # Mirrors a given thing; if the online version is no newer than our # cached version, then returns an empty string, otherwise returns the # live thing as a (non-empty) string sub download { my $thing = shift; my $thgopts = shift || ''; my $manual = shift; # true="bts cache", false="bts show/bug" my $mboxing = shift; # true="bts --mbox show/bugs", and only if $manual=0 my $bug_current = shift; # current bug being downloaded if caching my $bug_total = shift; # total things to download if caching my $timestamp = 0; my $versionstamp = ''; my $url; my $oldcwd = getcwd; # What URL are we to download? if ($thgopts ne '') { # have to be intelligent here :/ $url = thing_to_url($thing) . $thgopts; } else { # let the BTS be intelligent $url = "$btsurl$thing"; } if (!-d $cachedir) { die "$progname: download() called but no cachedir!\n"; } chdir($cachedir) || die "$progname: chdir $cachedir: $!\n"; if (-f cachefile($thing, $thgopts)) { ($timestamp, $versionstamp) = get_timestamp($thing, $thgopts); $timestamp ||= 0; $versionstamp ||= 0; # And ensure we preserve any manual setting if (is_manual($timestamp)) { $manual = 1; } } # do we actually have to do more than we might have thought? # yes, if we've caching with --cache-mode=mbox or full and the bug had # previously been cached in a less thorough format my $forcedownload = 0; if ($thing =~ /^\d+$/ and !$refreshmode) { if (old_cache_format_version($versionstamp)) { $forcedownload = 1; } elsif ($cachemode ne 'min' or $mboxing) { if (!-r mboxfile($thing)) { $forcedownload = 1; } elsif ($cachemode eq 'full' and -d $thing) { opendir DIR, $thing or die "$progname: opendir $cachedir/$thing: $!\n"; my @htmlfiles = grep { /^\d+\.html$/ } readdir(DIR); closedir DIR; $forcedownload = 1 unless @htmlfiles; } } } print "Downloading $url ... " if !$quiet and $manual and $thing ne "css/bugs.css"; IO::Handle::flush(\*STDOUT); my ($ret, $msg, $livepage, $contenttype) = bts_mirror($url, $timestamp, $forcedownload); my $charset = $contenttype || ''; if ($charset =~ m/charset=(.*?)(;|\Z)/) { $charset = $1; } else { $charset = ""; } if ($ret == MIRROR_UP_TO_DATE) { # we have an up-to-date version already, nothing to do # and $timestamp is guaranteed to be well-defined if (is_automatic($timestamp) and $manual) { set_timestamp($thing, $thgopts, make_manual($timestamp), $versionstamp); } if (!$quiet and $manual and $thing ne "css/bugs.css") { print "(cache already up-to-date) "; print "$bug_current/$bug_total" if $bug_total; print "\n"; } chdir $oldcwd or die "$progname: chdir $oldcwd failed: $!\n"; return ""; } elsif ($ret == MIRROR_DOWNLOADED) { # Note the current timestamp, but don't record it until # we've successfully stashed the data away $timestamp = time; die "$progname: empty page downloaded\n" unless length $livepage; my $bug2filename = {}; if ($thing =~ /^\d+$/) { # we've downloaded an individual bug, and it's been updated, # so we need to also download all the attachments $bug2filename = download_attachments($thing, $livepage, $timestamp); } my $data = $livepage; # work on a copy, not the original my $cachefile = cachefile($thing, $thgopts); open(OUT_CACHE, ">$cachefile") or die "$progname: open $cachefile: $!\n"; $data = mangle_cache_file($data, $thing, $bug2filename, $timestamp, $charset ? $contenttype : ''); print OUT_CACHE $data; close OUT_CACHE or die "$progname: problems writing to $cachefile: $!\n"; set_timestamp($thing, $thgopts, $manual ? make_manual($timestamp) : make_automatic($timestamp), $version); if (!$quiet and $manual and $thing ne "css/bugs.css") { print "(cached new version) "; print "$bug_current/$bug_total" if $bug_total; print "\n"; } elsif ($quiet == 1 and $manual and $thing ne "css/bugs.css") { print "Downloading $url ... (cached new version)\n"; } elsif ($quiet > 1) { # do nothing } # Add a <base> tag to the live page content, so that relative urls # in it work when it's passed to the web browser. my $base = $url; $base =~ s%/[^/]*$%%; $livepage =~ s%<head>%<head><base href="$base">%i; chdir $oldcwd or die "$progname: chdir $oldcwd failed: $!\n"; return $livepage; } else { die "$progname: couldn't download $url:\n$msg\n"; } } sub download_attachments { my ($thing, $toppage, $timestamp) = @_; my %bug2filename; # We search for appropriate strings in the top page, and save the # attachments in files with names as follows: # - if the attachment specifies a filename, save as bug#/msg#-att#/filename # - if not, save as bug#/msg#-att# with suffix .txt if plain/text and # .html if plain/html, no suffix otherwise (too much like hard work!) # Since messages are never modified retrospectively, we don't download # attachments which have already been downloaded # Yuck, yuck, yuck. This regex splits the $data string at every # occurrence of either "[<a " or plain "<a ", preserving any "[". my @data = split /(?:(?=\[<[Aa]\s)|(?<!\[)(?=<[Aa]\s))/, $toppage; foreach (@data) { next unless m%<a(?: class=\".*?\")? href="(?:/cgi(?:-bin)?/)?((bugreport\.cgi[^\"]+)"(?: .*?)?>|(version\.cgi[^\"]+)"><img[^>]* src="(?:/cgi(?:-bin)?/)?([^\"]+)">|(version\.cgi[^\"]+)">)%i; my $ref = $5; $ref = $4 if not defined $ref; $ref = $2 if not defined $ref; my ($msg, $filename) = href_to_filename($_); next unless defined $msg; if ($msg =~ /^\d+-\d+$/) { # it's an attachment, must download if (-f dirname($filename)) { warn "$progname: found file where directory expected; using existing file (" . dirname($filename) . ")\n"; $bug2filename{$msg} = dirname($filename); } else { $bug2filename{$msg} = $filename; } # already downloaded? next if -f $bug2filename{$msg} and not $refreshmode; } elsif ($cachemode eq 'full' and $msg =~ /^\d+$/) { $bug2filename{$msg} = $filename; # already downloaded? next if -f $bug2filename{$msg} and not $refreshmode; } elsif ($cachemode eq 'full' and $msg =~ /^\d+-mbox$/) { $bug2filename{$msg} = $filename; # already downloaded? next if -f $bug2filename{$msg} and not $refreshmode; } elsif (($cachemode eq 'full' or $cachemode eq 'mbox' or $mboxmode) and $msg eq 'mbox') { $bug2filename{$msg} = $filename; # This always needs refreshing, as it does change as the bug # changes } elsif ($cachemode eq 'full' and $msg =~ /^(status|raw)mbox$/) { $bug2filename{$msg} = $filename; # Always need refreshing, as they could change each time the # bug does } elsif ($cachemode eq 'full' and $msg eq 'versions') { $bug2filename{$msg} = $filename; # Ensure we always download the full size images for # version graphs, without the informational links $ref =~ s%;info=1%;info=0%; $ref =~ s%(;|\?)(height|width)=\d+%$1%g; # already downloaded? next if -f $bug2filename{$msg} and not $refreshmode; } next unless exists $bug2filename{$msg}; warn "bts debug: downloading $btscgiurl$ref\n" if $debug; init_agent() unless $ua; # shouldn't be necessary, but do just in case my $request = HTTP::Request->new('GET', $btscgiurl . $ref); my $response = $ua->request($request); if ($response->is_success) { my $content_length = defined $response->content ? length($response->content) : 0; if ($content_length == 0) { warn "$progname: failed to download $ref, skipping\n"; next; } my $data = $response->content; if ($msg =~ /^\d+$/) { # we're dealing with a boring message, and so we must be # in 'full' mode $data =~ s%<HEAD>%<HEAD><BASE href="../">%; $data = mangle_cache_file($data, $thing, 'full', $timestamp); } make_path(dirname($bug2filename{$msg})); open OUT_CACHE, ">$bug2filename{$msg}" or die "$progname: open cache $bug2filename{$msg}\n"; print OUT_CACHE $data; close OUT_CACHE; } else { warn "$progname: failed to download $ref, skipping\n"; next; } } return \%bug2filename; } # Download the mailbox for a given bug, return mbox ($fh, filename) on success, # die on failure sub download_mbox { my $thing = shift; my $temp = shift; # do we wish to store it in cache or in a temp file? my $mboxfile = mboxfile($thing); die "$progname: trying to download mbox for illegal bug number $thing.\n" unless $mboxfile; if (!have_lwp()) { die "$progname: couldn't run bts --mbox: $lwp_broken\n"; } init_agent() unless $ua; my $request = HTTP::Request->new('GET', $btscgiurl . "bugreport.cgi?bug=$thing;mboxmaint=yes"); my $response = $ua->request($request); if ($response->is_success) { my $content_length = defined $response->content ? length($response->content) : 0; if ($content_length == 0) { die "$progname: failed to download mbox.\n"; } my ($fh, $filename); if ($temp) { ($fh, $filename) = tempfile( "btsXXXXXX", SUFFIX => ".mbox", DIR => File::Spec->tmpdir, UNLINK => 1 ); # Use filehandle for security open(OUT_MBOX, ">&", $fh) or die "$progname: writing to temporary file: $!\n"; } else { $filename = $mboxfile; open(OUT_MBOX, ">$mboxfile") or die "$progname: writing to mbox file $mboxfile: $!\n"; } print OUT_MBOX $response->content; close OUT_MBOX; return ($fh, $filename); } else { die "$progname: failed to download mbox.\n"; } } # Mangle downloaded file to work in the local cache, so # selectively modify the links sub mangle_cache_file { my ($data, $thing, $bug2filename, $timestamp, $ctype) = @_; my $fullmode = !ref $bug2filename; # Undo unnecessary '+' encoding in URLs while ($data =~ s!(href=\"[^\"]*)\%2b!$1+!ig) { } my $time = localtime(abs($timestamp)); $data =~ s%(<BODY.*>)%$1<p><em>[Locally cached on $time by devscripts version $version]</em></p>%i; $data =~ s%href="/css/bugs.css"%href="bugs.css"%; if ($ctype) { $data =~ s%(<HEAD.*>)%$1<META HTTP-EQUIV="Content-Type" CONTENT="$ctype">%i; } my @data; # We have to distinguish between release-critical pages and normal BTS # pages as they have a different structure if ($thing =~ /^release-critical/) { @data = split /(?=<[Aa])/, $data; foreach (@data) { s%<a href="(https?://$btsserver/cgi(?:-bin)?/bugreport\.cgi.*bug=(\d+)[^\"]*)">(.+?)</a>%<a href="$2.html">$3</a> (<a href="$1">online</a>)%i; s%<a href="(https?://$btsserver/cgi(?:-bin)?/pkgreport\.cgi.*pkg=([^\"&;]+)[^\"]*)">(.+?)</a>%<a href="$2.html">$3</a> (<a href="$1">online</a>)%i; # References to other bug lists on bugs.d.o/release-critical if (m%<a href="((?:debian|other)[-a-z/]+\.html)"%i) { my $ref = 'release-critical/' . $1; $ref =~ s%/%_%g; s%<a href="((?:debian|other)[-a-z/]+\.html)">(.+?)</a>%<a href="$ref">$2</a> (<a href="${btsurl}release-critical/$1">online</a>)%i; } # Maintainer email address - YUCK!! s%<a href="(https?://$btsserver/([^\"?]*\@[^\"?]*))">(.+?)</a>>%<a href="$2.html">$3</a>> (<a href="$1">online</a>)%i; # Graph - we don't download s%<img src="graph.png" alt="Graph of RC bugs">%<img src="${btsurl}release-critical/graph.png" alt="Graph of RC bugs (online)">%; } } else { # Yuck, yuck, yuck. This regex splits the $data string at every # occurrence of either "[<a " or plain "<a ", preserving any "[". @data = split /(?:(?=\[<[Aa]\s)|(?<!\[)(?=<[Aa]\s))/, $data; foreach (@data) { if ( m%<a(?: class=\".*?\")? href=\"(?:/cgi(?:-bin)?/)?bugreport\.cgi[^\?]*\?.*?;?bug=(\d+)%i ) { my $bug = $1; my ($msg, $filename) = href_to_filename($_); if ($bug eq $thing and defined $msg) { if ($fullmode or (!$fullmode and exists $$bug2filename{$msg})) { s%<a((?: class=\".*?\")?) href="(?:/cgi(?:-bin)?/)?(bugreport\.cgi[^\"]*)">(.+?)</a>%<a$1 href="$filename">$3</a> (<a$1 href="$btscgiurl$2">online</a>)%i; } else { s%<a((?: class=\".*?\")?) href="(?:/cgi(?:-bin)?/)?(bugreport\.cgi[^\"]*)">(.+?)</a>%$3 (<a$1 href="$btscgiurl$2">online</a>)%i; } } else { s%<a((?: class=\".*?\")?) href="(?:/cgi(?:-bin)?/)?(bugreport\.cgi[^\?]*\?.*?bug=(\d+))"(.*?)>(.+?)</a>%<a$1 href="$3.html"$4>$5</a> (<a$1 href="$btscgiurl$2">online</a>)%i; } } else { s%<a((?: class=\".*?\")?) href="(?:/cgi(?:-bin)?/)?(pkgreport\.cgi\?(?:pkg|maint)=([^\"&;]+)[^\"]*)">(.+?)</a>%<a$1 href="$3.html">$4</a> (<a$1 href="$btscgiurl$2">online</a>)%gi; s%<a((?: class=\".*?\")?) href="(?:/cgi(?:-bin)?/)?(pkgreport\.cgi\?src=([^\"&;]+)[^\"]*)">(.+?)</a>%<a$1 href="src_$3.html">$4</a> (<a$1 href="$btscgiurl$2">online</a>)%i; s%<a((?: class=\".*?\")?) href="(?:/cgi(?:-bin)?/)?(pkgreport\.cgi\?submitter=([^\"&;]+)[^\"]*)">(.+?)</a>%<a$1 href="from_$3.html">$4</a> (<a$1 href="$btscgiurl$2">online</a>)%i; s%<a((?: class=\".*?\")?) href="(?:/cgi(?:-bin)?/)?(pkgreport\.cgi\?.*?;?archive=([^\"&;]+);submitter=([^\"&;]+)[^\"]*)">(.+?)</a>%<a$1 href="from_$4_3Barchive_3D$3.html">$5</a> (<a$1 href="$btscgiurl$2">online</a>)%i; s%<a((?: class=\".*?\")?) href="(?:/cgi(?:-bin)?/)?(pkgreport\.cgi\?.*?;?package=([^\"&;]+)[^\"]*)">(.+?)</a>%<a$1 href="$3.html">$4</a> (<a$1 href="$btscgiurl$2">online</a>)%gi; s%<a((?: class=\".*?\")?) href="(?:/cgi(?:-bin)?/)?(bugspam\.cgi[^\"]+)">%<a$1 href="$btscgiurl$2">%i; s%<a((?: class=\".*?\")?) href="/([0-9]+?)">(.+?)</a>%<a$1 href="$2.html">$3</a> (<a$1 href="$btsurl$2">online</a>)%i; # Version graphs # - remove 'package=' and move the package to the front s%((?:<img[^>]* src=\"|<a[^>]* href=\")(?:/cgi(?:-bin)?/)?version\.cgi\?)([^\"]+)package=([^;\"]+)([^\"]+\"|\")>%$1$3;$2$4>%gi; # - replace 'found=' with '.f.' and 'fixed=' with '.fx.' 1 while s%((?:<img[^>]* src=\"|<a[^>]* href=\")(?:/cgi(?:-bin)?/)?version\.cgi\?)(.*?;)found=([^\"]+)\">%$1$2.f.$3">%i; 1 while s%((?:<img[^>]* src=\"|<a[^>]* href=\")(?:/cgi(?:-bin)?/)?version\.cgi\?)(.*?;)fixed=([^\"]+)\">%$1$2.fx.$3">%i; 1 while s%((?:<img[^>]* src=\"|<a[^>]* href=\")(?:/cgi(?:-bin)?/)?version\.cgi\?found=)([^\"]+)\">%$1.f.$2">%i; 1 while s%((?:<img[^>]* src=\"|<a[^>]* href=\")(?:/cgi(?:-bin)?/)?version\.cgi\?fixed=)([^\"]+)\">%$1.fx.$2">%i; # - replace '%2F' or '%2C' (a URL-encoded / or ,) with '.' 1 while s%((?:<img[^>]* src=\"|<a[^>]* href=\")(?:/cgi(?:-bin)?/)?version\.cgi\?[^\%]*)\%2[FC]([^\"]+)\">%$1.$2">%gi; # - display collapsed graph images at 25% s%(<img[^>]* src=\"[^\"]+);collapse=1([^\"]+)\">%$1$2.co" width="25\%" height="25\%">%gi; # - and link to the collapsed graph s%(<a[^>]* href=\"[^\"]+);collapse=1([^\"]+)\">%$1$2.co">%gi; # - remove any other parameters 1 while s%((?:<img[^>]* src|<a[^>]* href)=\"(?:/cgi(?:-bin)?/)?version\.cgi\?[^\"]+);(?:\w+=\d+)([^>]+)\>%$1$2>%gi; # - remove any +s (encoded spaces) 1 while s%((?:<img[^>]* src=\"|<a[^>]* href=\")(?:/cgi(?:-bin)?/)?version\.cgi\?[^\+]*)\+([^\"]+)\">%$1$2">%gi; # - remove trailing ";" and ";." from previous substitutions 1 while s%((?:<img[^>]* src=\"|<a[^>]* href=\")(?:/cgi(?:-bin)?/)?version\.cgi\?[^\"]+);\.(.*?)>%$1.$2>%gi; 1 while s%((?:<img[^>]* src=\"|<a[^>]* href=\")(?:/cgi(?:-bin)?/)?version\.cgi\?[^\"]+);\">%$1">%gi; # - final reference should be $package.$versions[.co].png s%(<img[^>]* src=\"|<a[^>]* href=\")(?:/cgi(?:-bin)?/)?version\.cgi\?([^\"]+)(\"[^>]*)>%$1$2.png$3>%gi; } } } return join("", @data); } # Removes a specified thing from the cache sub deletecache { my $thing = shift; my $thgopts = shift || ''; if (!-d $cachedir) { die "$progname: deletecache() called but no cachedir!\n"; } delete_timestamp($thing, $thgopts); unlink cachefile($thing, $thgopts); if ($thing =~ /^\d+$/) { rmtree("$cachedir/$thing", 0, 1) if -d "$cachedir/$thing"; unlink("$cachedir/$thing.mbox") if -f "$cachedir/$thing.mbox"; unlink("$cachedir/$thing.status.mbox") if -f "$cachedir/$thing.status.mbox"; unlink("$cachedir/$thing.raw.mbox") if -f "$cachedir/$thing.raw.mbox"; } } # Given a thing, returns the filename for it in the cache. sub cachefile { my $thing = shift; my $thgopts = shift || ''; if ($thing eq '') { die "$progname: cachefile given empty argument\n"; } if ($thing =~ /bugs.css$/) { return $cachedir . "bugs.css" } $thing =~ s/^src:/src_/; $thing =~ s/^from:/from_/; $thing =~ s/^tag:/tag_/; $thing =~ s/^usertag:/usertag_/; $thing =~ s%^release-critical/index\.html$%release-critical.html%; $thing =~ s%/%_%g; $thgopts =~ s/;/_3B/g; $thgopts =~ s/=/_3D/g; return File::Spec->catfile($cachedir, $thing . $thgopts . ($thing =~ /\.html$/ ? "" : ".html")); } # Given a thing, returns the filename for its mbox in the cache. sub mboxfile { my $thing = shift; return $thing =~ /^\d+$/ ? File::Spec->catfile($cachedir, $thing . ".mbox") : undef; } # Given a bug number, returns the dirname for it in the cache. sub cachebugdir { my $thing = shift; if ($thing !~ /^\d+$/) { die "$progname: cachebugdir given faulty argument: $thing\n"; } return File::Spec->catdir($cachedir, $thing); } # And the reverse: Given a filename in the cache, returns the corresponding # "thing". sub cachefile_to_thing { my $thing = basename(shift, '.html'); my $thgopts = ''; $thing =~ s/^src_/src:/; $thing =~ s/^from_/from:/; $thing =~ s/^tag_/tag:/; $thing =~ s/^usertag_/usertag:/; $thing =~ s%^release-critical\.html$%release-critical/index\.html%; $thing =~ s%_%/%g; $thing =~ s/_3B/;/g; $thing =~ s/_3D/=/g; $thing =~ /^(.*?)((?:;.*)?)$/; ($thing, $thgopts) = ($1, $2); return ($thing, $thgopts); } # Given a thing, gives the official BTS cgi page for it sub thing_to_url { my $thing = shift; my $thingurl; # have to be intelligent here :/ if ($thing =~ /^\d+$/) { $thingurl = $btscgibugurl . "?bug=" . $thing; } elsif ($thing =~ /^from:/) { ($thingurl = $thing) =~ s/^from:/submitter=/; $thingurl = $btscgipkgurl . '?' . $thingurl; } elsif ($thing =~ /^src:/) { ($thingurl = $thing) =~ s/^src:/src=/; $thingurl = $btscgipkgurl . '?' . $thingurl; } elsif ($thing =~ /^tag:/) { ($thingurl = $thing) =~ s/^tag:/tag=/; $thingurl = $btscgipkgurl . '?' . $thingurl; } elsif ($thing =~ /^usertag:/) { ($thingurl = $thing) =~ s/^usertag:/tag=/; $thingurl = $btscgipkgurl . '?' . $thingurl; } elsif ($thing =~ m%^release-critical(\.html|/(index\.html)?)?$%) { $thingurl = $btsurl . 'release-critical/index.html'; } elsif ($thing =~ m%^release-critical/%) { $thingurl = $btsurl . $thing; } elsif ($thing =~ /\@/) { # so presume it's a maint request $thingurl = $btscgipkgurl . '?maint=' . $thing; } else { # it's a package, or had better be... $thingurl = $btscgipkgurl . '?pkg=' . $thing; } return $thingurl; } # Given a thing, reads all links to bugs from the corresponding cache file # if there is one, and returns a list of them. sub bugs_from_thing { my $thing = shift; my $thgopts = shift || ''; my $cachefile = cachefile($thing, $thgopts); if (-f $cachefile) { local $/; open(IN, $cachefile) || die "$progname: open $cachefile: $!\n"; my $data = <IN>; close IN; return $data =~ m!href="(\d+)\.html"!g; } else { return (); } } # Given an <a href="bugreport.cgi?...>...</a> string, return a # msg id and corresponding filename sub href_to_filename { my $href = $_[0]; my ($msg, $filename); if ($href =~ m%\[<a(?: class=\".*?\")? href="((?:/cgi(?:-bin)?/)?bugreport\.cgi([^\?]*)\?[^\"]*)">.*?\(([^,]*), .*?\)\]% ) { # this looks like an attachment; $4 should give the MIME-type my $uri = URI->new($1); my $urlfilename = $2; my $bug = $uri->query_param_delete('bug'); my $mimetype = $3; my $ref = $uri->query(); $ref =~ s/&(?:amp;)?/;/g; # normalise all hrefs $uri->query($ref); $msg = $uri->query_param('msg'); my $att = $uri->query_param('att'); return undef unless $msg && $att; $msg .= "-$att"; $urlfilename ||= $att // ''; my $fileext = ''; if ($urlfilename =~ m%^/%) { $filename = basename($urlfilename); } else { $filename = ''; if ($mimetype eq 'text/plain') { $fileext = '.txt'; } if ($mimetype eq 'text/html') { $fileext = '.html'; } } if (length($filename)) { $filename = "$bug/$msg/$filename"; } else { $filename = "$bug/$msg$fileext"; } } elsif ($href =~ m%<a(?: class=\".*?\")? href="((?:/cgi(?:-bin)?/)?bugreport\.cgi([^\?]*)\?([^"]*))".*?>% ) { my $uri = URI->new($1); my $urlfilename = $2; my $bug = $uri->query_param_delete('bug'); $msg = $uri->query_param_delete('msg'); my $ref = $uri->query // ''; $ref =~ s/&(?:amp;)?/;/g; # normalise all hrefs $ref =~ s/;archive=(yes|no)\b//; $ref =~ s/%3D/=/g; $uri->query($ref); my %params = ( mboxstatus => '', mboxstat => '', mboxmaint => '', mbox => '', $uri->query_form(), ); if ($msg && !%params) { $filename = File::Spec->catfile($bug, "$msg.html"); } elsif (($params{mboxstat} || $params{mboxstatus}) eq 'yes') { $msg = 'statusmbox'; $filename = "$bug.status.mbox"; } elsif ($params{mboxmaint} eq 'yes') { $msg = 'mbox'; $filename = "$bug.mbox"; } elsif ($params{mbox} eq 'yes') { if ($msg) { $filename = "$bug/$msg.mbox"; $msg .= '-mbox'; } else { $filename = "$bug.raw.mbox"; $msg = 'rawmbox'; } } elsif (!$ref) { return undef; } else { $href =~ s/>.*/>/s; warn "$progname: in href_to_filename: unrecognised BTS URL type: $href\n"; return undef; } } elsif ($href =~ m%<(?:a[^>]* href|img [^>]* src)="((?:/cgi(?:-bin)?/)?version\.cgi\?[^"]+)"[^>]*>%i ) { my $uri = URI->new($1); my %params = $uri->query_form(); if ($params{package}) { $filename .= $params{package}; } if ($params{found}) { $filename .= ".f.$params{found}"; } if ($params{fixed}) { $filename .= ".fx.$params{fixed}"; } if ($params{collapse}) { $filename .= '.co'; } # Replace encoded "/" and "," characters with "." $filename =~ s@(?:%2[FC]|/|,)@.@gi; # Remove encoded spaces $filename =~ s/\+//g; $msg = 'versions'; $filename .= '.png'; } else { return undef; } return ($msg, $filename); } # Browses a given thing, with preprocessed list of URL options such as # ";opt1=val1;opt2=val2" with possible caching if there are no options sub browse { prunecache(); my $thing = shift; my $thgopts = shift || ''; if ($thing eq '') { if ($thgopts ne '') { die "$progname: you can only give options for a BTS page if you specify a bug/maint/... .\n"; } runbrowser($btsurl); return; } my $hascache = -d $cachedir; my $cachefile = cachefile($thing, $thgopts); my $mboxfile = mboxfile($thing); if ($mboxmode and !$mboxfile) { die "$progname: you can only request a mailbox for a single bug report.\n"; } # Check that if we're requesting a tag, that it's a valid tag if (($thing . $thgopts) =~ /(?:^|;)(?:tag|include|exclude)[:=]([^;]*)/) { unless (exists $valid_tags{$1}) { die "$progname: invalid tag requested: $1\nRecognised tag names are: " . join(" ", @valid_tags) . "\n"; } } my $livedownload = 1; if ($offlinemode) { $livedownload = 0; if (!$hascache) { die "$progname: Sorry, you are in offline mode and have no cache.\nRun \"bts cache\" or \"bts show\" to create one.\n"; } elsif ((!$mboxmode and !-r $cachefile) or ($mboxmode and !-r $mboxfile)) { die "$progname: Sorry, you are in offline mode and that is not cached.\nUse \"bts [--cache-mode=...] cache\" to update the cache.\n"; } if ($mboxmode) { runmailreader($mboxfile); } else { runbrowser("file://$cachefile"); } } # else we're in online mode elsif ($caching && have_lwp() && $thing ne '') { if (!$hascache) { if (!-d dirname($cachedir)) { unless (make_path(dirname($cachedir))) { warn "$progname: couldn't mkdir " . dirname($cachedir) . ": $!\n"; goto LIVE; } } unless (make_path($cachedir)) { warn "$progname: couldn't mkdir $cachedir: $!\n"; goto LIVE; } } $livedownload = 0; my $live = download($thing, $thgopts, 0, $mboxmode); if ($mboxmode) { runmailreader($mboxfile); } else { if (length($live)) { my ($fh, $livefile) = tempfile( "btsXXXXXX", SUFFIX => ".html", DIR => File::Spec->tmpdir, UNLINK => 1 ); # Use filehandle for security open(OUT_LIVE, ">&", $fh) or die "$progname: writing to temporary file: $!\n"; # Correct relative urls to point to the bts. $live =~ s%\shref="(?:/cgi(?:-bin)?/)?(\w+\.cgi)% href="$btscgiurl$1%g; print OUT_LIVE $live; # Some browsers don't like unseekable filehandles, # so use filename runbrowser("file://$livefile"); } else { runbrowser("file://$cachefile"); } } } LIVE: # we are not caching; just show it live if ($livedownload) { if ($mboxmode) { # we appear not to be caching; OK, we'll download to a # temporary file warn "bts debug: downloading ${btscgiurl}bugreport.cgi?bug=$thing;mbox=yes\n" if $debug; my ($fh, $fn) = download_mbox($thing, 1); runmailreader($fn); } else { if ($thgopts ne '') { my $thingurl = thing_to_url($thing); runbrowser($thingurl . $thgopts); } else { # let the BTS be intelligent runbrowser($btsurl . $thing); } } } } # Removes all files from the cache which were downloaded automatically # and have not been accessed for more than 30 days. We also only run # this at most once per day for efficiency. sub prunecache { # TODO: Remove handling of $oldcache post-Stretch my $oldcache = File::Spec->catdir($ENV{HOME}, '.devscripts_cache', 'bts'); if (-d $oldcache && !-d $cachedir) { my $err; make_path(dirname($cachedir), { error => \$err }); if (!@$err) { system('mv', $oldcache, $cachedir); } } return unless -d $cachedir; return if -f $prunestamp and -M _ < 1; my $oldcwd = getcwd; chdir($cachedir) || die "$progname: chdir $cachedir: $!\n"; # remove the now-defunct live-download file unlink "live_download.html"; opendir DIR, '.' or die "$progname: opendir $cachedir: $!\n"; my @cachefiles = grep { !/^\.\.?$/ } readdir(DIR); closedir DIR; # Are there any unexpected files lying around? my @known_files = map { basename($_) } ($timestampdb, $timestampdb . ".lock", $prunestamp); my %weirdfiles = map { $_ => 1 } grep { !/\.(html|css|png)$/ } @cachefiles; foreach (@known_files) { delete $weirdfiles{$_} if exists $weirdfiles{$_}; } # and bug directories foreach (@cachefiles) { if (/^(\d+)\.html$/) { delete $weirdfiles{$1} if exists $weirdfiles{$1} and -d $1; delete $weirdfiles{"$1.mbox"} if exists $weirdfiles{"$1.mbox"} and -f "$1.mbox"; delete $weirdfiles{"$1.raw.mbox"} if exists $weirdfiles{"$1.raw.mbox"} and -f "$1.raw.mbox"; delete $weirdfiles{"$1.status.mbox"} if exists $weirdfiles{"$1.status.mbox"} and -f "$1.status.mbox"; } } warn "$progname: unexpected files/dirs in cache directory $cachedir:\n " . join("\n ", keys %weirdfiles) . "\n" if keys %weirdfiles; my @oldfiles; foreach (@cachefiles) { next unless /\.(html|css)$/; push @oldfiles, $_ if -A $_ > 30; } # We now remove the oldfiles if they're automatically downloaded tie(%timestamp, "Devscripts::DB_File_Lock", $timestampdb, O_RDWR() | O_CREAT(), 0600, $DB_HASH, "write") or die "$progname: couldn't open DB file $timestampdb for writing: $!\n" if !tied %timestamp; my @unrecognised; foreach my $oldfile (@oldfiles) { my ($thing, $thgopts) = cachefile_to_thing($oldfile); unless (defined get_timestamp($thing, $thgopts)) { push @unrecognised, $oldfile; next; } next if is_manual(get_timestamp($thing, $thgopts)); # Otherwise, it's automatic and we purge it deletecache($thing, $thgopts); } untie %timestamp; if (!-e $prunestamp) { open PRUNESTAMP, ">$prunestamp" || die "$progname: prune timestamp: $!\n"; close PRUNESTAMP; } chdir $oldcwd || die "$progname: chdir $oldcwd: $!\n"; utime time, time, $prunestamp; } # Determines which browser to use sub runbrowser { my $URL = shift; if (system('sensible-browser', $URL) >> 8 != 0) { warn "Problem running sensible-browser: $!\n"; } } # Determines which mailreader to use sub runmailreader { my $file = shift; my $quotedfile; die "$progname: could not read mbox file $file!\n" unless -r $file; if ($file !~ /\'/) { $quotedfile = qq['$file']; } elsif ($file !~ /[\"\\\$\'\!]/) { $quotedfile = qq["$file"]; } else { die "$progname: could not figure out how to quote the mbox filename \"$file\"\n"; } my $reader = $mailreader; $reader =~ s/\%([%s])/$1 eq '%' ? '%' : $quotedfile/eg; if (system($reader) >> 8 != 0) { warn "Problem running mail reader: $!\n"; } } # Timestamp handling # # We store a +ve timestamp to represent an automatic download and # a -ve one to represent a manual download. sub get_timestamp { my $thing = shift; my $thgopts = shift || ''; my $timestamp = undef; my $versionstamp = undef; if (tied %timestamp) { ($timestamp, $versionstamp) = split /;/, $timestamp{ $thing . $thgopts } if exists $timestamp{ $thing . $thgopts }; } else { tie(%timestamp, "Devscripts::DB_File_Lock", $timestampdb, O_RDONLY(), 0600, $DB_HASH, "read") or die "$progname: couldn't open DB file $timestampdb for reading: $!\n"; ($timestamp, $versionstamp) = split /;/, $timestamp{ $thing . $thgopts } if exists $timestamp{ $thing . $thgopts }; untie %timestamp; } return wantarray ? ($timestamp, $versionstamp) : $timestamp; } sub set_timestamp { my $thing = shift; my $thgopts = shift || ''; my $timestamp = shift; my $versionstamp = shift || $version; if (tied %timestamp) { $timestamp{ $thing . $thgopts } = "$timestamp;$versionstamp"; } else { tie(%timestamp, "Devscripts::DB_File_Lock", $timestampdb, O_RDWR() | O_CREAT(), 0600, $DB_HASH, "write") or die "$progname: couldn't open DB file $timestampdb for writing: $!\n"; $timestamp{ $thing . $thgopts } = "$timestamp;$versionstamp"; untie %timestamp; } } sub delete_timestamp { my $thing = shift; my $thgopts = shift || ''; if (tied %timestamp) { delete $timestamp{ $thing . $thgopts }; } else { tie(%timestamp, "Devscripts::DB_File_Lock", $timestampdb, O_RDWR() | O_CREAT(), 0600, $DB_HASH, "write") or die "$progname: couldn't open DB file $timestampdb for writing: $!\n"; delete $timestamp{ $thing . $thgopts }; untie %timestamp; } } sub is_manual { return $_[0] < 0; } sub make_manual { return -abs($_[0]); } sub is_automatic { return $_[0] > 0; } sub make_automatic { return abs($_[0]); } # Returns true if current cached version is older than critical version # We're only using really simple version numbers here: a.b.c sub old_cache_format_version { my $cacheversion = $_[0]; my @cache = split /\./, $cacheversion; my @new = split /\./, $new_cache_format_version; push @cache, 0, 0, 0, 0; push @new, 0, 0; return ($cache[0] < $new[0]) || ($cache[0] == $new[0] && $cache[1] < $new[1]) || ($cache[0] == $new[0] && $cache[1] == $new[1] && $cache[2] < $new[2]) || ( $cache[0] == $new[0] && $cache[1] == $new[1] && $cache[2] == $new[2] && $cache[3] < $new[3]); } # We would love to use LWP::Simple::mirror in this script. # Unfortunately, bugs.debian.org does not respect the # If-Modified-Since header. For single bug reports, however, # bugreport.cgi will return a Last-Modified header if sent a HEAD # request. So this is a hack, based on code from the LWP modules. :-( # Return value: # (return value, error string) # with return values: MIRROR_ERROR failed # MIRROR_DOWNLOADED downloaded new version # MIRROR_UP_TO_DATE up-to-date sub bts_mirror { my ($url, $timestamp, $force) = @_; init_agent() unless $ua; if ($url =~ m%/\d+$% and !$refreshmode and !$force) { # Single bug, worth doing timestamp checks my $request = HTTP::Request->new('HEAD', $url); my $response = $ua->request($request); if ($response->is_success) { my $lm = $response->last_modified; if (defined $lm and $lm <= abs($timestamp)) { return (MIRROR_UP_TO_DATE, $response->status_line); } } else { return (MIRROR_ERROR, $response->status_line); } } # So now we download the full thing regardless # We don't care if we scotch the contents of $file - it's only # a temporary file anyway my $request = HTTP::Request->new('GET', $url); my $response = $ua->request($request); if ($response->is_success) { # This check from LWP::UserAgent; I don't even know whether # the BTS sends a Content-Length header... my $nominal_content_length = $response->content_length || 0; my $true_content_length = defined $response->content ? length($response->content) : 0; if ($true_content_length == 0) { return (MIRROR_ERROR, $response->status_line); } if ($nominal_content_length > 0) { if ($true_content_length < $nominal_content_length) { return (MIRROR_ERROR, "Transfer truncated: only $true_content_length out of $nominal_content_length bytes received" ); } if ($true_content_length > $nominal_content_length) { return (MIRROR_ERROR, "Content-length mismatch: expected $nominal_content_length bytes, got $true_content_length" ); } # else OK } return ( MIRROR_DOWNLOADED, $response->status_line, $response->content, $response->header('Content-Type')); } else { return (MIRROR_ERROR, $response->status_line); } } sub init_agent { $ua = new LWP::UserAgent; # we create a global UserAgent object $ua->agent("LWP::UserAgent/Devscripts/$version"); $ua->env_proxy; } sub opts_done { if (@_) { die "$progname: unknown options to '$command[$index]': @_\n"; } } sub edit { my $message = shift; my ($fh, $filename); ($fh, $filename) = tempfile( "btsXXXX", SUFFIX => ".mail", DIR => File::Spec->tmpdir ); open(OUT_MAIL, ">$filename") or die "$progname: writing to temporary file: $!\n"; print OUT_MAIL $message; close OUT_MAIL; my $rc = system("sensible-editor $filename"); undef $message; if ($rc == 0) { open(OUT_MAIL, "<$filename") or die "$progname: reading from temporary file: $!\n"; while (<OUT_MAIL>) { $message .= $_; } close OUT_MAIL; } unlink($filename); return $message; } =back =head1 ENVIRONMENT VARIABLES =over 4 =item B<DEBEMAIL> If this is set, the From: line in the email will be set to use this email address instead of your normal email address (as would be determined by B<mail>). =item B<DEBFULLNAME> If B<DEBEMAIL> is set, B<DEBFULLNAME> is examined to determine the full name to use; if this is not set, B<bts> attempts to determine a name from your F<passwd> entry. =item B<BROWSER> If set, it specifies the browser to use for the B<show> and B<bugs> options. See the description above. =back =head1 CONFIGURATION VARIABLES The two configuration files F</etc/devscripts.conf> and F<~/.devscripts> are sourced by a shell in that order to set configuration variables. Command line options can be used to override configuration file settings. Environment variable settings are ignored for this purpose. The currently recognised variables are: =over 4 =item B<BTS_OFFLINE> If this is set to B<yes>, then it is the same as the B<--offline> command line parameter being used. Only has an effect on the B<show> and B<bugs> commands. The default is B<no>. See the description of the B<show> command above for more information. =item B<BTS_CACHE> If this is set to B<no>, then it is the same as the B<--no-cache> command line parameter being used. Only has an effect on the B<show> and B<bug> commands. The default is B<yes>. Again, see the B<show> command above for more information. =item B<BTS_CACHE_MODE=>{B<min>,B<mbox>,B<full>} How much of the BTS should we mirror when we are asked to cache something? Just the minimum, or also the mbox or the whole thing? The default is B<min>, and it has the same meaning as the B<--cache-mode> command line parameter. Only has an effect on the cache. See the B<cache> command for more information. =item B<BTS_FORCE_REFRESH> If this is set to B<yes>, then it is the same as the B<--force-refresh> command line parameter being used. Only has an effect on the B<cache> command. The default is B<no>. See the B<cache> command for more information. =item B<BTS_MAIL_READER> If this is set, specifies a mail reader to use instead of B<mutt>. Same as the B<--mailreader> command line option. =item B<BTS_SENDMAIL_COMMAND> If this is set, specifies a B<sendmail> command to use instead of F</usr/sbin/sendmail>. Same as the B<--sendmail> command line option. =item B<BTS_ONLY_NEW> Download only new bugs when caching. Do not check for updates in bugs we already have. The default is B<no>. Same as the B<--only-new> command line option. =item B<BTS_SMTP_HOST> If this is set, specifies an SMTP host to use for sending mail rather than using the B<sendmail> command. Same as the B<--smtp-host> command line option. Note that this option takes priority over B<BTS_SENDMAIL_COMMAND> if both are set, unless the B<--sendmail> option is used. =item B<BTS_SMTP_AUTH_USERNAME>, B<BTS_SMTP_AUTH_PASSWORD> If these options are set, then it is the same as the B<--smtp-username> and B<--smtp-password> options being used. =item B<BTS_SMTP_HELO> Same as the B<--smtp-helo> command line option. =item B<BTS_INCLUDE_RESOLVED> If this is set to B<no>, then it is the same as the B<--no-include-resolved> command line parameter being used. Only has an effect on the B<cache> command. The default is B<yes>. See the B<cache> command for more information. =item B<BTS_SUPPRESS_ACKS> If this is set to B<yes>, then it is the same as the B<--no-ack> command line parameter being used. The default is B<no>. =item B<BTS_INTERACTIVE> If this is set to B<yes> or B<force>, then it is the same as the B<--interactive> or B<--force-interactive> command line parameter being used. The default is B<no>. =item B<BTS_DEFAULT_CC> Specify a list of e-mail addresses to which a carbon copy of the generated e-mail to the control bot should automatically be sent. =item B<BTS_SERVER> Specify the name of a debbugs server which should be used instead of https://bugs.debian.org. =back =head1 SEE ALSO Please see L<https://www.debian.org/Bugs/server-control> for more details on how to control the BTS using emails and L<https://www.debian.org/Bugs/> for more information about the BTS. querybts(1), reportbug(1), pts-subscribe(1), devscripts.conf(5) =head1 COPYRIGHT This program is Copyright (C) 2001-2003 by Joey Hess <joeyh@debian.org>. Many modifications have been made, Copyright (C) 2002-2005 Julian Gilbey <jdg@debian.org> and Copyright (C) 2007 Josh Triplett <josh@freedesktop.org>. It is licensed under the terms of the GPL, either version 2 of the License, or (at your option) any later version. =cut # Please leave this alone unless you understand the seek above. __DATA__
Close