Linux e000727e84fa 5.4.0-208-generic #228-Ubuntu SMP Fri Feb 7 19:41:33 UTC 2025 x86_64
Apache/2.4.62 (Debian)
: 192.168.16.2 | : 192.168.16.1
Cant Read [ /etc/named.conf ]
8.2.27
root
www.github.com/MadExploits
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
CPANEL RESET
CREATE WP USER
README
+ Create Folder
+ Create File
/
usr /
bin /
[ HOME SHELL ]
Name
Size
Permission
Action
[
66.89
KB
-rwxr-xr-x
ab
58.42
KB
-rwxr-xr-x
addpart
30.31
KB
-rwxr-xr-x
addr2line
23.14
KB
-rwxr-xr-x
apt
18.31
KB
-rwxr-xr-x
apt-cache
86.38
KB
-rwxr-xr-x
apt-cdrom
22.38
KB
-rwxr-xr-x
apt-config
26.31
KB
-rwxr-xr-x
apt-get
50.38
KB
-rwxr-xr-x
apt-key
27.32
KB
-rwxr-xr-x
apt-mark
58.38
KB
-rwxr-xr-x
ar
51.17
KB
-rwxr-xr-x
arch
42.86
KB
-rwxr-xr-x
as
897.41
KB
-rwxr-xr-x
autoconf
14.85
KB
-rwxr-xr-x
autoheader
8.82
KB
-rwxr-xr-x
autom4te
32.69
KB
-rwxr-xr-x
autoreconf
26.3
KB
-rwxr-xr-x
autoscan
16.77
KB
-rwxr-xr-x
autoupdate
33.22
KB
-rwxr-xr-x
awk
154.66
KB
-rwxr-xr-x
b2sum
58.98
KB
-rwxr-xr-x
base32
46.89
KB
-rwxr-xr-x
base64
46.89
KB
-rwxr-xr-x
basename
42.83
KB
-rwxr-xr-x
basenc
54.89
KB
-rwxr-xr-x
bash
1.21
MB
-rwxr-xr-x
bashbug
6.7
KB
-rwxr-xr-x
bunzip2
38.3
KB
-rwxr-xr-x
bzcat
38.3
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.3
KB
-rwxr-xr-x
bzip2recover
14.23
KB
-rwxr-xr-x
bzless
1.27
KB
-rwxr-xr-x
bzmore
1.27
KB
-rwxr-xr-x
c++
1.25
MB
-rwxr-xr-x
c++filt
18.51
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.68
KB
-rwxr-xr-x
captoinfo
90.34
KB
-rwxr-xr-x
cat
42.98
KB
-rwxr-xr-x
cc
1.24
MB
-rwxr-xr-x
chage
78.49
KB
-rwxr-sr-x
chattr
14.24
KB
-rwxr-xr-x
chcon
67.11
KB
-rwxr-xr-x
checkgid
14.23
KB
-rwxr-xr-x
chfn
61.2
KB
-rwsr-xr-x
chgrp
67.05
KB
-rwxr-xr-x
chmod
62.98
KB
-rwxr-xr-x
choom
54.31
KB
-rwxr-xr-x
chown
71.05
KB
-rwxr-xr-x
chrt
66.31
KB
-rwxr-xr-x
chsh
51.64
KB
-rwsr-xr-x
cksum
139.05
KB
-rwxr-xr-x
clear
14.24
KB
-rwxr-xr-x
clear_console
14.15
KB
-rwxr-xr-x
cmp
50.95
KB
-rwxr-xr-x
comm
46.92
KB
-rwxr-xr-x
corelist
15.01
KB
-rwxr-xr-x
cp
147.61
KB
-rwxr-xr-x
cpan
8.16
KB
-rwxr-xr-x
cpan5.36-x86_64-linux-gnu
8.18
KB
-rwxr-xr-x
cpp
1.24
MB
-rwxr-xr-x
cpp-12
1.24
MB
-rwxr-xr-x
csplit
119.17
KB
-rwxr-xr-x
curl
274.22
KB
-rwxr-xr-x
cut
46.98
KB
-rwxr-xr-x
dash
122.7
KB
-rwxr-xr-x
date
119.05
KB
-rwxr-xr-x
dd
87.15
KB
-rwxr-xr-x
deb-systemd-helper
23.79
KB
-rwxr-xr-x
deb-systemd-invoke
6.09
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
delpart
30.31
KB
-rwxr-xr-x
df
99.8
KB
-rwxr-xr-x
diff
151.58
KB
-rwxr-xr-x
diff3
67.14
KB
-rwxr-xr-x
dir
147.8
KB
-rwxr-xr-x
dircolors
50.92
KB
-rwxr-xr-x
dirname
38.83
KB
-rwxr-xr-x
dmesg
86.58
KB
-rwxr-xr-x
dnsdomainname
22.15
KB
-rwxr-xr-x
domainname
22.15
KB
-rwxr-xr-x
dpkg
310.64
KB
-rwxr-xr-x
dpkg-architecture
14.85
KB
-rwxr-xr-x
dpkg-buildflags
8.14
KB
-rwxr-xr-x
dpkg-buildpackage
32.63
KB
-rwxr-xr-x
dpkg-checkbuilddeps
7.45
KB
-rwxr-xr-x
dpkg-deb
166.52
KB
-rwxr-xr-x
dpkg-distaddfile
2.72
KB
-rwxr-xr-x
dpkg-divert
154.55
KB
-rwxr-xr-x
dpkg-genbuildinfo
18.48
KB
-rwxr-xr-x
dpkg-genchanges
17.39
KB
-rwxr-xr-x
dpkg-gencontrol
14.2
KB
-rwxr-xr-x
dpkg-gensymbols
10.65
KB
-rwxr-xr-x
dpkg-maintscript-helper
20.71
KB
-rwxr-xr-x
dpkg-mergechangelogs
8.88
KB
-rwxr-xr-x
dpkg-name
6.62
KB
-rwxr-xr-x
dpkg-parsechangelog
4.83
KB
-rwxr-xr-x
dpkg-query
158.58
KB
-rwxr-xr-x
dpkg-realpath
4.09
KB
-rwxr-xr-x
dpkg-scanpackages
8.47
KB
-rwxr-xr-x
dpkg-scansources
8.98
KB
-rwxr-xr-x
dpkg-shlibdeps
31.17
KB
-rwxr-xr-x
dpkg-source
22.91
KB
-rwxr-xr-x
dpkg-split
126.48
KB
-rwxr-xr-x
dpkg-statoverride
62.33
KB
-rwxr-xr-x
dpkg-trigger
86.48
KB
-rwxr-xr-x
dpkg-vendor
3.18
KB
-rwxr-xr-x
du
171.33
KB
-rwxr-xr-x
dwp
1.79
MB
-rwxr-xr-x
echo
42.83
KB
-rwxr-xr-x
egrep
41
B
-rwxr-xr-x
elfedit
35.03
KB
-rwxr-xr-x
enc2xs
40.96
KB
-rwxr-xr-x
encguess
3
KB
-rwxr-xr-x
env
47.4
KB
-rwxr-xr-x
expand
42.92
KB
-rwxr-xr-x
expiry
30.45
KB
-rwxr-sr-x
expr
115.05
KB
-rwxr-xr-x
factor
83.2
KB
-rwxr-xr-x
faillog
22.53
KB
-rwxr-xr-x
fallocate
34.31
KB
-rwxr-xr-x
false
34.83
KB
-rwxr-xr-x
fcgistarter
14.23
KB
-rwxr-xr-x
fgrep
41
B
-rwxr-xr-x
file
26.48
KB
-rwxr-xr-x
fincore
34.36
KB
-rwxr-xr-x
find
219.58
KB
-rwxr-xr-x
findmnt
83.59
KB
-rwxr-xr-x
flock
34.39
KB
-rwxr-xr-x
fmt
46.89
KB
-rwxr-xr-x
fold
42.89
KB
-rwxr-xr-x
free
26.3
KB
-rwxr-xr-x
g++
1.25
MB
-rwxr-xr-x
g++-12
1.25
MB
-rwxr-xr-x
gcc
1.24
MB
-rwxr-xr-x
gcc-12
1.24
MB
-rwxr-xr-x
gcc-ar
34.54
KB
-rwxr-xr-x
gcc-ar-12
34.54
KB
-rwxr-xr-x
gcc-nm
34.54
KB
-rwxr-xr-x
gcc-nm-12
34.54
KB
-rwxr-xr-x
gcc-ranlib
34.54
KB
-rwxr-xr-x
gcc-ranlib-12
34.54
KB
-rwxr-xr-x
gcov
720.16
KB
-rwxr-xr-x
gcov-12
720.16
KB
-rwxr-xr-x
gcov-dump
568.02
KB
-rwxr-xr-x
gcov-dump-12
568.02
KB
-rwxr-xr-x
gcov-tool
588.09
KB
-rwxr-xr-x
gcov-tool-12
588.09
KB
-rwxr-xr-x
gencat
26.75
KB
-rwxr-xr-x
getconf
26.5
KB
-rwxr-xr-x
getent
35.47
KB
-rwxr-xr-x
getopt
34.31
KB
-rwxr-xr-x
gmake
234.65
KB
-rwxr-xr-x
gold
2.99
MB
-rwxr-xr-x
gp-archive
159.06
KB
-rwxr-xr-x
gp-collect-app
175.27
KB
-rwxr-xr-x
gp-display-html
578.29
KB
-rwxr-xr-x
gp-display-src
150.81
KB
-rwxr-xr-x
gp-display-text
257.3
KB
-rwxr-xr-x
gpasswd
86.42
KB
-rwsr-xr-x
gpgv
463
KB
-rwxr-xr-x
gprof
108.35
KB
-rwxr-xr-x
gprofng
146.59
KB
-rwxr-xr-x
grep
198.39
KB
-rwxr-xr-x
groups
42.89
KB
-rwxr-xr-x
gunzip
2.29
KB
-rwxr-xr-x
gzexe
6.3
KB
-rwxr-xr-x
gzip
95.84
KB
-rwxr-xr-x
h2ph
28.54
KB
-rwxr-xr-x
h2xs
59.51
KB
-rwxr-xr-x
hardlink
50.39
KB
-rwxr-xr-x
head
46.95
KB
-rwxr-xr-x
hostid
38.83
KB
-rwxr-xr-x
hostname
22.15
KB
-rwxr-xr-x
htcacheclean
34.24
KB
-rwxr-xr-x
htdbm
26.23
KB
-rwxr-xr-x
htdigest
14.23
KB
-rwxr-xr-x
htpasswd
26.23
KB
-rwxr-xr-x
i386
26.58
KB
-rwxr-xr-x
iconv
63.13
KB
-rwxr-xr-x
id
47.02
KB
-rwxr-xr-x
ifnames
4.08
KB
-rwxr-xr-x
infocmp
62.31
KB
-rwxr-xr-x
infotocap
90.34
KB
-rwxr-xr-x
install
155.8
KB
-rwxr-xr-x
instmodsh
4.27
KB
-rwxr-xr-x
ionice
34.31
KB
-rwxr-xr-x
ipcmk
34.38
KB
-rwxr-xr-x
ipcrm
34.31
KB
-rwxr-xr-x
ipcs
74.31
KB
-rwxr-xr-x
ischroot
14.32
KB
-rwxr-xr-x
join
54.98
KB
-rwxr-xr-x
json_pp
4.88
KB
-rwxr-xr-x
kill
22.3
KB
-rwxr-xr-x
last
50.31
KB
-rwxr-xr-x
lastb
50.31
KB
-rwxr-xr-x
lastlog
31.75
KB
-rwxr-xr-x
ld
1.27
MB
-rwxr-xr-x
ld.bfd
1.27
MB
-rwxr-xr-x
ld.gold
2.99
MB
-rwxr-xr-x
ld.so
205.96
KB
-rwxr-xr-x
ldd
5.28
KB
-rwxr-xr-x
libnetcfg
15.41
KB
-rwxr-xr-x
link
38.83
KB
-rwxr-xr-x
linux32
26.58
KB
-rwxr-xr-x
linux64
26.58
KB
-rwxr-xr-x
ln
71.12
KB
-rwxr-xr-x
locale
46.16
KB
-rwxr-xr-x
localedef
291.91
KB
-rwxr-xr-x
logger
54.9
KB
-rwxr-xr-x
login
51.78
KB
-rwxr-xr-x
logname
38.83
KB
-rwxr-xr-x
logresolve
14.24
KB
-rwxr-xr-x
ls
147.8
KB
-rwxr-xr-x
lsattr
14.24
KB
-rwxr-xr-x
lsblk
202.31
KB
-rwxr-xr-x
lscpu
126.31
KB
-rwxr-xr-x
lsfd
120.3
KB
-rwxr-xr-x
lsipc
98.31
KB
-rwxr-xr-x
lsirq
34.48
KB
-rwxr-xr-x
lslocks
70.7
KB
-rwxr-xr-x
lslogins
94.31
KB
-rwxr-xr-x
lsmem
66.31
KB
-rwxr-xr-x
lsns
82.31
KB
-rwxr-xr-x
lto-dump
30.47
MB
-rwxr-xr-x
lto-dump-12
30.47
MB
-rwxr-xr-x
lzcat
82.7
KB
-rwxr-xr-x
lzcmp
7.25
KB
-rwxr-xr-x
lzdiff
7.25
KB
-rwxr-xr-x
lzegrep
10.09
KB
-rwxr-xr-x
lzfgrep
10.09
KB
-rwxr-xr-x
lzgrep
10.09
KB
-rwxr-xr-x
lzless
1.77
KB
-rwxr-xr-x
lzma
82.7
KB
-rwxr-xr-x
lzmainfo
14.3
KB
-rwxr-xr-x
lzmore
2.14
KB
-rwxr-xr-x
m4
271.52
KB
-rwxr-xr-x
make
234.65
KB
-rwxr-xr-x
make-first-existing-target
4.79
KB
-rwxr-xr-x
mawk
154.66
KB
-rwxr-xr-x
mcookie
34.38
KB
-rwxr-xr-x
md5sum
50.95
KB
-rwxr-xr-x
md5sum.textutils
50.95
KB
-rwxr-xr-x
mesg
18.3
KB
-rwxr-xr-x
mkdir
95.27
KB
-rwxr-xr-x
mkfifo
67.17
KB
-rwxr-xr-x
mknod
71.2
KB
-rwxr-xr-x
mktemp
42.92
KB
-rwxr-xr-x
more
58.31
KB
-rwxr-xr-x
mount
58.3
KB
-rwsr-xr-x
mountpoint
18.3
KB
-rwxr-xr-x
mv
139.62
KB
-rwxr-xr-x
namei
34.31
KB
-rwxr-xr-x
nawk
154.66
KB
-rwxr-xr-x
newgrp
47.75
KB
-rwsr-xr-x
nice
42.86
KB
-rwxr-xr-x
nisdomainname
22.15
KB
-rwxr-xr-x
nl
111.11
KB
-rwxr-xr-x
nm
44.03
KB
-rwxr-xr-x
nohup
42.89
KB
-rwxr-xr-x
nproc
42.89
KB
-rwxr-xr-x
nsenter
34.54
KB
-rwxr-xr-x
numfmt
67.02
KB
-rwxr-xr-x
objcopy
155.66
KB
-rwxr-xr-x
objdump
362.56
KB
-rwxr-xr-x
od
79.02
KB
-rwxr-xr-x
openssl
953.26
KB
-rwxr-xr-x
pager
58.31
KB
-rwxr-xr-x
partx
118.31
KB
-rwxr-xr-x
passwd
66.65
KB
-rwsr-xr-x
paste
42.89
KB
-rwxr-xr-x
patch
187.44
KB
-rwxr-xr-x
pathchk
42.86
KB
-rwxr-xr-x
perl
3.63
MB
-rwxr-xr-x
perl5.36-x86_64-linux-gnu
14.41
KB
-rwxr-xr-x
perl5.36.0
3.63
MB
-rwxr-xr-x
perlbug
44.12
KB
-rwxr-xr-x
perldoc
125
B
-rwxr-xr-x
perlivp
10.61
KB
-rwxr-xr-x
perlthanks
44.12
KB
-rwxr-xr-x
pgrep
34.42
KB
-rwxr-xr-x
piconv
8.16
KB
-rwxr-xr-x
pidof
26.31
KB
-rwxr-xr-x
pidwait
34.42
KB
-rwxr-xr-x
pinky
47.05
KB
-rwxr-xr-x
pkg-config
44.04
KB
-rwxr-xr-x
pkgconf
44.04
KB
-rwxr-xr-x
pkill
34.42
KB
-rwxr-xr-x
pl2pm
4.43
KB
-rwxr-xr-x
pldd
22.69
KB
-rwxr-xr-x
pmap
34.34
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
pr
79.11
KB
-rwxr-xr-x
printenv
34.83
KB
-rwxr-xr-x
printf
62.92
KB
-rwxr-xr-x
prlimit
38.83
KB
-rwxr-xr-x
prove
13.34
KB
-rwxr-xr-x
ps
142.93
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
ptx
135.23
KB
-rwxr-xr-x
pwd
42.92
KB
-rwxr-xr-x
pwdx
14.3
KB
-rwxr-xr-x
ranlib
51.17
KB
-rwxr-xr-x
rbash
1.21
MB
-rwxr-xr-x
re2c
698.47
KB
-rwxr-xr-x
re2go
698.47
KB
-rwxr-xr-x
re2rust
698.47
KB
-rwxr-xr-x
readelf
751.38
KB
-rwxr-xr-x
readlink
50.89
KB
-rwxr-xr-x
realpath
50.92
KB
-rwxr-xr-x
rename.ul
22.3
KB
-rwxr-xr-x
renice
14.3
KB
-rwxr-xr-x
reset
30.24
KB
-rwxr-xr-x
resizepart
70.31
KB
-rwxr-xr-x
rev
14.3
KB
-rwxr-xr-x
rgrep
30
B
-rwxr-xr-x
rm
71.05
KB
-rwxr-xr-x
rmdir
54.92
KB
-rwxr-xr-x
rotatelogs
26.31
KB
-rwxr-xr-x
rpcgen
95
KB
-rwxr-xr-x
run-parts
26.91
KB
-rwxr-xr-x
runcon
42.95
KB
-rwxr-xr-x
savelog
10.24
KB
-rwxr-xr-x
script
70.3
KB
-rwxr-xr-x
scriptlive
54.3
KB
-rwxr-xr-x
scriptreplay
46.3
KB
-rwxr-xr-x
sdiff
55.08
KB
-rwxr-xr-x
sed
123.46
KB
-rwxr-xr-x
seq
58.92
KB
-rwxr-xr-x
setarch
26.58
KB
-rwxr-xr-x
setpriv
78.31
KB
-rwxr-xr-x
setsid
14.3
KB
-rwxr-xr-x
setterm
46.31
KB
-rwxr-xr-x
sg
47.75
KB
-rwsr-xr-x
sh
122.7
KB
-rwxr-xr-x
sha1sum
54.95
KB
-rwxr-xr-x
sha224sum
58.95
KB
-rwxr-xr-x
sha256sum
58.95
KB
-rwxr-xr-x
sha384sum
62.95
KB
-rwxr-xr-x
sha512sum
62.95
KB
-rwxr-xr-x
shasum
9.75
KB
-rwxr-xr-x
shred
63.14
KB
-rwxr-xr-x
shuf
58.98
KB
-rwxr-xr-x
size
26.86
KB
-rwxr-xr-x
skill
30.33
KB
-rwxr-xr-x
slabtop
22.37
KB
-rwxr-xr-x
sleep
42.86
KB
-rwxr-xr-x
snice
30.33
KB
-rwxr-xr-x
sort
115.68
KB
-rwxr-xr-x
splain
18.99
KB
-rwxr-xr-x
split
59.55
KB
-rwxr-xr-x
stat
95.2
KB
-rwxr-xr-x
stdbuf
58.92
KB
-rwxr-xr-x
streamzip
7.75
KB
-rwxr-xr-x
strings
30.98
KB
-rwxr-xr-x
strip
155.7
KB
-rwxr-xr-x
stty
83.02
KB
-rwxr-xr-x
su
70.31
KB
-rwsr-xr-x
sum
50.96
KB
-rwxr-xr-x
sync
38.89
KB
-rwxr-xr-x
tabs
18.23
KB
-rwxr-xr-x
tac
111.05
KB
-rwxr-xr-x
tail
75.14
KB
-rwxr-xr-x
tar
519.52
KB
-rwxr-xr-x
taskset
62.31
KB
-rwxr-xr-x
tee
42.95
KB
-rwxr-xr-x
tempfile
14.18
KB
-rwxr-xr-x
test
58.89
KB
-rwxr-xr-x
tic
90.34
KB
-rwxr-xr-x
timeout
47.49
KB
-rwxr-xr-x
tload
18.32
KB
-rwxr-xr-x
toe
22.23
KB
-rwxr-xr-x
top
131.58
KB
-rwxr-xr-x
touch
107.05
KB
-rwxr-xr-x
tput
26.27
KB
-rwxr-xr-x
tr
54.89
KB
-rwxr-xr-x
true
34.83
KB
-rwxr-xr-x
truncate
42.89
KB
-rwxr-xr-x
tset
30.24
KB
-rwxr-xr-x
tsort
54.89
KB
-rwxr-xr-x
tty
34.86
KB
-rwxr-xr-x
tzselect
14.99
KB
-rwxr-xr-x
uclampset
62.31
KB
-rwxr-xr-x
umount
34.3
KB
-rwsr-xr-x
uname
42.86
KB
-rwxr-xr-x
uncompress
2.29
KB
-rwxr-xr-x
unexpand
42.92
KB
-rwxr-xr-x
uniq
46.95
KB
-rwxr-xr-x
unlink
38.83
KB
-rwxr-xr-x
unlzma
82.7
KB
-rwxr-xr-x
unshare
82.54
KB
-rwxr-xr-x
unxz
82.7
KB
-rwxr-xr-x
update-alternatives
58.31
KB
-rwxr-xr-x
uptime
14.3
KB
-rwxr-xr-x
users
38.89
KB
-rwxr-xr-x
utmpdump
30.3
KB
-rwxr-xr-x
vdir
147.8
KB
-rwxr-xr-x
vmstat
34.72
KB
-rwxr-xr-x
w
22.3
KB
-rwxr-xr-x
wall
38.3
KB
-rwxr-xr-x
watch
26.71
KB
-rwxr-xr-x
wc
51.05
KB
-rwxr-xr-x
wdctl
70.34
KB
-rwxr-xr-x
whereis
30.77
KB
-rwxr-xr-x
which
946
B
-rwxr-xr-x
which.debianutils
946
B
-rwxr-xr-x
who
59.02
KB
-rwxr-xr-x
whoami
38.86
KB
-rwxr-xr-x
x86_64
26.58
KB
-rwxr-xr-x
x86_64-linux-gnu-addr2line
23.14
KB
-rwxr-xr-x
x86_64-linux-gnu-ar
51.17
KB
-rwxr-xr-x
x86_64-linux-gnu-as
897.41
KB
-rwxr-xr-x
x86_64-linux-gnu-c++filt
18.51
KB
-rwxr-xr-x
x86_64-linux-gnu-cpp
1.24
MB
-rwxr-xr-x
x86_64-linux-gnu-cpp-12
1.24
MB
-rwxr-xr-x
x86_64-linux-gnu-dwp
1.79
MB
-rwxr-xr-x
x86_64-linux-gnu-elfedit
35.03
KB
-rwxr-xr-x
x86_64-linux-gnu-g++
1.25
MB
-rwxr-xr-x
x86_64-linux-gnu-g++-12
1.25
MB
-rwxr-xr-x
x86_64-linux-gnu-gcc
1.24
MB
-rwxr-xr-x
x86_64-linux-gnu-gcc-12
1.24
MB
-rwxr-xr-x
x86_64-linux-gnu-gcc-ar
34.54
KB
-rwxr-xr-x
x86_64-linux-gnu-gcc-ar-12
34.54
KB
-rwxr-xr-x
x86_64-linux-gnu-gcc-nm
34.54
KB
-rwxr-xr-x
x86_64-linux-gnu-gcc-nm-12
34.54
KB
-rwxr-xr-x
x86_64-linux-gnu-gcc-ranlib
34.54
KB
-rwxr-xr-x
x86_64-linux-gnu-gcc-ranlib-12
34.54
KB
-rwxr-xr-x
x86_64-linux-gnu-gcov
720.16
KB
-rwxr-xr-x
x86_64-linux-gnu-gcov-12
720.16
KB
-rwxr-xr-x
x86_64-linux-gnu-gcov-dump
568.02
KB
-rwxr-xr-x
x86_64-linux-gnu-gcov-dump-12
568.02
KB
-rwxr-xr-x
x86_64-linux-gnu-gcov-tool
588.09
KB
-rwxr-xr-x
x86_64-linux-gnu-gcov-tool-12
588.09
KB
-rwxr-xr-x
x86_64-linux-gnu-gold
2.99
MB
-rwxr-xr-x
x86_64-linux-gnu-gp-archive
159.06
KB
-rwxr-xr-x
x86_64-linux-gnu-gp-collect-ap...
175.27
KB
-rwxr-xr-x
x86_64-linux-gnu-gp-display-ht...
578.29
KB
-rwxr-xr-x
x86_64-linux-gnu-gp-display-sr...
150.81
KB
-rwxr-xr-x
x86_64-linux-gnu-gp-display-te...
257.3
KB
-rwxr-xr-x
x86_64-linux-gnu-gprof
108.35
KB
-rwxr-xr-x
x86_64-linux-gnu-gprofng
146.59
KB
-rwxr-xr-x
x86_64-linux-gnu-ld
1.27
MB
-rwxr-xr-x
x86_64-linux-gnu-ld.bfd
1.27
MB
-rwxr-xr-x
x86_64-linux-gnu-ld.gold
2.99
MB
-rwxr-xr-x
x86_64-linux-gnu-lto-dump
30.47
MB
-rwxr-xr-x
x86_64-linux-gnu-lto-dump-12
30.47
MB
-rwxr-xr-x
x86_64-linux-gnu-nm
44.03
KB
-rwxr-xr-x
x86_64-linux-gnu-objcopy
155.66
KB
-rwxr-xr-x
x86_64-linux-gnu-objdump
362.56
KB
-rwxr-xr-x
x86_64-linux-gnu-pkg-config
44.04
KB
-rwxr-xr-x
x86_64-linux-gnu-pkgconf
44.04
KB
-rwxr-xr-x
x86_64-linux-gnu-ranlib
51.17
KB
-rwxr-xr-x
x86_64-linux-gnu-readelf
751.38
KB
-rwxr-xr-x
x86_64-linux-gnu-size
26.86
KB
-rwxr-xr-x
x86_64-linux-gnu-strings
30.98
KB
-rwxr-xr-x
x86_64-linux-gnu-strip
155.7
KB
-rwxr-xr-x
xargs
70.45
KB
-rwxr-xr-x
xsubpp
5.05
KB
-rwxr-xr-x
xz
82.7
KB
-rwxr-xr-x
xzcat
82.7
KB
-rwxr-xr-x
xzcmp
7.25
KB
-rwxr-xr-x
xzdiff
7.25
KB
-rwxr-xr-x
xzegrep
10.09
KB
-rwxr-xr-x
xzfgrep
10.09
KB
-rwxr-xr-x
xzgrep
10.09
KB
-rwxr-xr-x
xzless
1.77
KB
-rwxr-xr-x
xzmore
2.14
KB
-rwxr-xr-x
yes
38.83
KB
-rwxr-xr-x
ypdomainname
22.15
KB
-rwxr-xr-x
zcat
1.94
KB
-rwxr-xr-x
zcmp
1.64
KB
-rwxr-xr-x
zdiff
6.31
KB
-rwxr-xr-x
zdump
22.52
KB
-rwxr-xr-x
zegrep
29
B
-rwxr-xr-x
zfgrep
29
B
-rwxr-xr-x
zforce
2.03
KB
-rwxr-xr-x
zgrep
7.91
KB
-rwxr-xr-x
zipdetails
68.55
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
Delete
Unzip
Zip
${this.title}
Close
Code Editor : deb-systemd-helper
#!/usr/bin/perl # vim:ts=4:sw=4:expandtab # © 2013-2014 Michael Stapelberg <stapelberg@debian.org> # # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # * Neither the name of Michael Stapelberg nor the # names of contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # . # THIS SOFTWARE IS PROVIDED BY Michael Stapelberg ''AS IS'' AND ANY # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL Michael Stapelberg BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. =head1 NAME deb-systemd-helper - subset of systemctl for machines not running systemd =head1 SYNOPSIS B<deb-systemd-helper> enable | disable | purge | mask | unmask | is-enabled | was-enabled | debian-installed | update-state | reenable S<I<unit file> ...> =head1 DESCRIPTION B<deb-systemd-helper> is a Debian-specific helper script which re-implements the enable, disable, is-enabled and reenable commands from systemctl. The "enable" action will only be performed once (when first installing the package). On the first "enable", a state file is created which will be deleted upon "purge". The "mask" action will keep state on whether the service was enabled/disabled before and will properly return to that state on "unmask". The "was-enabled" action is not present in systemctl, but is required in Debian so that we can figure out whether a service was enabled before we installed an updated service file. See http://bugs.debian.org/717603 for details. The "debian-installed" action is also not present in systemctl. It returns 0 if the state file of at least one of the given units is present. The "update-state" action is also not present in systemctl. It updates B<deb-systemd-helper>'s state file, removing obsolete entries (e.g. service files that are no longer shipped by the package) and adding new entries (e.g. new service files shipped by the package) without enabling them. B<deb-systemd-helper> is intended to be used from maintscripts to enable systemd unit files. It is specifically NOT intended to be used interactively by users. Instead, users should run systemd and use systemctl, or not bother about the systemd enabled state in case they are not running systemd. =head1 ENVIRONMENT =over 4 =item B<_DEB_SYSTEMD_HELPER_DEBUG> If you export _DEB_SYSTEMD_HELPER_DEBUG=1, deb-systemd-helper will print debug messages to stderr (thus visible in dpkg runs). Please include these when filing a bugreport. =item B<DPKG_ROOT> Instead of working on the filesystem root /, perform all operations on a chroot system in the directory given by DPKG_ROOT. =back =cut use strict; use warnings; use File::Path qw(make_path); # in core since Perl 5.001 use File::Basename; # in core since Perl 5 use File::Temp qw(tempfile); # in core since Perl 5.6.1 use Getopt::Long; # in core since Perl 5 # Make Data::Dumper::Dumper available if present (not present on systems that # only have perl-base, not perl). eval { require Data::Dumper; } or *Data::Dumper::Dumper = sub { "no Data::Dumper" }; my $dpkg_root = $ENV{DPKG_ROOT} // ''; use constant { SYSTEM_INSTANCE_ENABLED_STATE_DIR => '/var/lib/systemd/deb-systemd-helper-enabled', USER_INSTANCE_ENABLED_STATE_DIR => '/var/lib/systemd/deb-systemd-user-helper-enabled', SYSTEM_INSTANCE_MASKED_STATE_DIR => '/var/lib/systemd/deb-systemd-helper-masked', USER_INSTANCE_MASKED_STATE_DIR => '/var/lib/systemd/deb-systemd-user-helper-masked', }; my $quiet = 0; my $instance = 'system'; my $enabled_state_dir = $dpkg_root . SYSTEM_INSTANCE_ENABLED_STATE_DIR; my $masked_state_dir = $dpkg_root . SYSTEM_INSTANCE_MASKED_STATE_DIR; # Globals are bad, but in this specific case, it really makes things much # easier to write and understand. my $changed_sth; my $has_systemctl = -x "$dpkg_root/bin/systemctl" || -x "$dpkg_root/usr/bin/systemctl"; sub assertdpkgroot { my ($path, $msg) = @_; if (length $ENV{DPKG_ROOT}) { if ($path !~ /^\Q$dpkg_root\E/) { error("doesn't start with dpkg_root: $path $msg"); } if ($path =~ /^\Q$dpkg_root$dpkg_root\E/) { error("double dpkg_root: $path $msg"); } } } sub assertnotdpkgroot { my ($path, $msg) = @_; if (length $ENV{DPKG_ROOT}) { if ($path =~ /^\Q$dpkg_root\E/) { error("starts with dpkg_root: $path $msg"); } } } sub error { print STDERR "$0: error: @_\n"; exit (1); } sub debug { my ($msg) = @_; return if !defined($ENV{_DEB_SYSTEMD_HELPER_DEBUG}) || $ENV{_DEB_SYSTEMD_HELPER_DEBUG} != 1; print STDERR "(deb-systemd-helper DEBUG) $msg\n"; } sub is_purge { return (defined($ENV{_DEB_SYSTEMD_HELPER_PURGE}) && $ENV{_DEB_SYSTEMD_HELPER_PURGE} == 1) } sub find_unit { my ($scriptname) = @_; my $service_path = $scriptname; if (-f "$dpkg_root/etc/systemd/$instance/$scriptname") { $service_path = "/etc/systemd/$instance/$scriptname"; } elsif (-f "$dpkg_root/lib/systemd/$instance/$scriptname") { $service_path = "/lib/systemd/$instance/$scriptname"; } elsif (-f "$dpkg_root/usr/lib/systemd/$instance/$scriptname") { $service_path = "/usr/lib/systemd/$instance/$scriptname"; } return $service_path; } sub dsh_state_path { my ($scriptname) = @_; return $enabled_state_dir . '/' . basename($scriptname) . '.dsh-also'; } sub state_file_entries { my ($dsh_state) = @_; debug "Reading state file $dsh_state"; my @entries; if (open(my $fh, '<', $dsh_state)) { @entries = map { chomp; "$dpkg_root$_" } <$fh>; close($fh); } return @entries; } # Writes $service_link into $dsh_state unless it’s already in there. sub record_in_statefile { my ($dsh_state, $service_link) = @_; assertdpkgroot($dsh_state, "record_in_statefile"); assertnotdpkgroot($service_link, "record_in_statefile"); # Appending a newline makes the following code simpler; we can skip # chomp()ing and appending newlines in every print. $service_link .= "\n"; make_path(dirname($dsh_state)); my $line_exists; my ($outfh, $tmpname) = tempfile('.stateXXXXX', DIR => dirname($dsh_state), SUFFIX => '.tmp', UNLINK => 0); chmod(0644, $tmpname); if (-e $dsh_state) { open(my $infh, '<', $dsh_state) or error("unable to read from $dsh_state"); while (<$infh>) { $line_exists = 1 if $_ eq $service_link; print $outfh $_; } close($infh); } print $outfh $service_link unless $line_exists; close($outfh) or error("unable to close $tmpname"); debug "Renaming temp file $tmpname to state file $dsh_state"; rename($tmpname, $dsh_state) or error("Unable to move $tmpname to $dsh_state"); } # Gets the transitive closure of links, i.e. all links that need to be created # when enabling this service file. Not straight-forward because service files # can refer to other service files using Also=. sub get_link_closure { my ($scriptname, $service_path, @visited) = @_; assertnotdpkgroot($service_path, "get_link_closure"); my @links; my @wants_dirs; my $unit_name = basename($service_path); my $wanted_target = $unit_name; # The keys parsed from the unit file below can only have unit names # as values. Since unit names can't have whitespace in systemd, # simply use split and strip any leading/trailing quotes. See # systemd-escape(1) for examples of valid unit names. open my $fh, '<', "$dpkg_root$service_path" or error("unable to read $dpkg_root$service_path"); while (my $line = <$fh>) { chomp($line); my $service_link; if ($line =~ /^\s*(WantedBy|RequiredBy)=(.+)$/i) { for my $value (split(/\s+/, $2)) { $value =~ s/^(["'])(.*)\g1$/$2/; my $wants_dir = "/etc/systemd/$instance/$value"; $wants_dir .= '.wants' if $1 eq 'WantedBy'; $wants_dir .= '.requires' if $1 eq 'RequiredBy'; push @wants_dirs, "$wants_dir/"; } } if ($line =~ /^\s*Also=(.+)$/i) { for my $value (split(/\s+/, $1)) { $value =~ s/^(["'])(.*)\g1$/$2/; if ($value ne $unit_name and not grep $_ eq $value, @visited) { # We can end up in an infinite recursion, so remember what units we # already processed to break it push @visited, $value; push @links, get_link_closure($value, find_unit($value), @visited); } } } if ($line =~ /^\s*Alias=(.+)$/i) { for my $value (split(/\s+/, $1)) { $value =~ s/^(["'])(.*)\g1$/$2/; if ($value ne $unit_name) { push @links, { dest => $service_path, src => "/etc/systemd/$instance/$1" }; } } } if ($line =~ /^\s*DefaultInstance=\s*(["']?+)(.+)\g1\s*$/i) { $wanted_target = $2; $wanted_target = $unit_name =~ s/^(.*\@)(\.\w+)$/$1$wanted_target$2/r; } } close($fh); for my $wants_dir (@wants_dirs) { push @links, { dest => $service_path, src => $wants_dir . $wanted_target }; } return @links; } sub all_links_installed { my ($scriptname, $service_path) = @_; my @links = get_link_closure($scriptname, $service_path); foreach my $link (@links) { assertnotdpkgroot($link->{src}, "all_links_installed"); } my @missing_links = grep { ! -l "$dpkg_root$_->{src}" } @links; return (@missing_links == 0); } sub no_link_installed { my ($scriptname, $service_path) = @_; my @links = get_link_closure($scriptname, $service_path); foreach my $link (@links) { assertnotdpkgroot($link->{src}, "all_links_installed"); } my @existing_links = grep { -l "$dpkg_root$_->{src}" } @links; return (@existing_links == 0); } sub enable { my ($scriptname, $service_path) = @_; if ($has_systemctl) { # We use 'systemctl preset' on the initial installation only. # On upgrade, we manually add the missing symlinks only if the # service already has some links installed. Using 'systemctl # preset' allows administrators and downstreams to alter the # enable policy using systemd-native tools. my $create_links = 0; if (debian_installed($scriptname)) { $create_links = 1 unless no_link_installed($scriptname, $service_path); } else { debug "Using systemctl preset to enable $scriptname"; my $systemd_root = '/'; if ($dpkg_root ne '') { $systemd_root = $dpkg_root; } system("systemctl", "--root=$systemd_root", $instance eq "user" ? "--global" : "--system", "--preset-mode=enable-only", "preset", $scriptname) == 0 or error("systemctl preset failed on $scriptname: $!"); } make_systemd_links($scriptname, $service_path, create_links => $create_links); } else { # We create all the symlinks ourselves make_systemd_links($scriptname, $service_path); } } sub make_systemd_links { my ($scriptname, $service_path, %opts) = @_; $opts{'create_links'} //= 1; my $dsh_state = dsh_state_path($scriptname); my @links = get_link_closure($scriptname, $service_path); for my $link (@links) { my $service_path = $link->{dest}; my $service_link = $link->{src}; record_in_statefile($dsh_state, $service_link); my $statefile = $service_link; $statefile =~ s,^/etc/systemd/$instance/,$enabled_state_dir/,; $service_link = "$dpkg_root$service_link"; assertdpkgroot($statefile, "make_systemd_links"); assertdpkgroot($service_link, "make_systemd_links"); assertnotdpkgroot($service_path, "make_systemd_links"); next if -e $statefile; if ($opts{'create_links'} && ! -l $service_link) { make_path(dirname($service_link)); symlink($service_path, $service_link) or error("unable to link $service_link to $service_path: $!"); $changed_sth = 1; } # Store the fact that we ran enable for this service_path, # so that we can skip enable the next time. # This allows us to call deb-systemd-helper unconditionally # and still only enable unit files on the initial installation # of a package. make_path(dirname($statefile)); open(my $fh, '>>', $statefile) or error("Failed to create/touch $statefile"); close($fh) or error("Failed to create/touch $statefile"); } } # In contrary to make_systemd_links(), which only modifies the state file in an # append-only fashion, update_state() can also remove entries from the state # file. # # The distinction is important because update_state() should only be called # when the unit file(s) are guaranteed to be on-disk, e.g. on package updates, # but not on package removals. sub update_state { my ($scriptname, $service_path) = @_; my $dsh_state = dsh_state_path($scriptname); my @links = get_link_closure($scriptname, $service_path); assertdpkgroot($dsh_state, "update_state"); debug "Old state file contents: " . Data::Dumper::Dumper([ state_file_entries($dsh_state) ]); make_path(dirname($dsh_state)); my ($outfh, $tmpname) = tempfile('.stateXXXXX', DIR => dirname($dsh_state), SUFFIX => '.tmp', UNLINK => 0); chmod(0644, $tmpname); for my $link (@links) { assertnotdpkgroot($link->{src}, "update_state"); print $outfh $link->{src} . "\n"; } close($outfh) or error("Failed to close $tmpname"); debug "Renaming temp file $tmpname to state file $dsh_state"; rename($tmpname, $dsh_state) or error("Unable to move $tmpname to $dsh_state"); debug "New state file contents: " . Data::Dumper::Dumper([ state_file_entries($dsh_state) ]); } sub was_enabled { my ($scriptname) = @_; my @entries = state_file_entries(dsh_state_path($scriptname)); debug "Contents: " . Data::Dumper::Dumper(\@entries); for my $link (@entries) { assertdpkgroot($link, "was_enabled"); if (! -l $link) { debug "Link $link is missing, considering $scriptname was-disabled."; return 0; } } debug "All links present, considering $scriptname was-enabled."; return 1; } sub debian_installed { my ($scriptname) = @_; return -f dsh_state_path($scriptname); } sub remove_links { my ($service_path) = @_; my $dsh_state = dsh_state_path($service_path); my @entries = state_file_entries($dsh_state); debug "Contents: " . Data::Dumper::Dumper(\@entries); assertdpkgroot($dsh_state, "remove_links"); assertnotdpkgroot($service_path, "remove_links"); if (is_purge()) { unlink($dsh_state) if -e $dsh_state; } # Also disable all the units which were enabled when this one was enabled. for my $link (@entries) { # Delete the corresponding state file: # • Always when purging # • If the user did not disable (= link still exists) the service. # If we don’t do this, the link will be deleted a few lines down, # but not re-created when re-installing the package. assertdpkgroot($link, "remove_links"); if (is_purge() || -l $link) { my $link_state = $link; $link_state =~ s,^\Q$dpkg_root\E/etc/systemd/$instance/,$enabled_state_dir/,; unlink($link_state); } next unless -l $link; unlink($link) or print STDERR "$0: unable to remove '$link': $!\n"; $changed_sth = 1; } # Read $service_path, recurse for all Also= units. # This might not work when $service_path was already deleted, # i.e. after apt-get remove. In this case we just return # silently in order to not confuse the user about whether # disabling actually worked or not — the case is handled by # dh_installsystemd generating an appropriate disable # command by parsing the service file at debhelper-time. open(my $fh, '<', "$dpkg_root$service_path") or return; while (my $line = <$fh>) { chomp($line); my $service_link; if ($line =~ /^\s*Also=(.+)$/i) { remove_links(find_unit($1)); } } close($fh); } # Recursively deletes a directory structure, if all (!) components are empty, # e.g. to clean up after purging. sub rmdir_if_empty { my ($dir) = @_; debug "rmdir_if_empty $dir"; rmdir_if_empty($_) for (grep { -d } <$dir/*>); if (!rmdir($dir)) { debug "rmdir($dir) failed ($!)"; } } sub mask_service { my ($scriptname, $service_path) = @_; my $mask_link = "$dpkg_root/etc/systemd/$instance/" . basename($service_path); if (-e $mask_link) { # If the link already exists, don’t do anything. return if -l $mask_link && readlink($mask_link) eq '/dev/null'; # If the file already exists, the user most likely copied the .service # file to /etc/ to change it in some way. In this case we don’t need to # mask the .service in the first place, since it will not be removed by # dpkg. debug "$mask_link already exists, not masking."; return; } make_path(dirname($mask_link)); # clean up after possible leftovers from Alias= to self (LP#1439793) unlink($mask_link); symlink('/dev/null', $mask_link) or error("unable to link $mask_link to /dev/null: $!"); $changed_sth = 1; my $statefile = $mask_link; $statefile =~ s,^\Q$dpkg_root\E/etc/systemd/$instance/,$masked_state_dir/,; # Store the fact that we masked this service, so that we can unmask it on # installation time. We cannot unconditionally unmask because that would # interfere with the user’s decision to mask a service. make_path(dirname($statefile)); open(my $fh, '>>', $statefile) or error("Failed to create/touch $statefile"); close($fh) or error("Failed to create/touch $statefile"); } sub unmask_service { my ($scriptname, $service_path) = @_; my $mask_link = "$dpkg_root/etc/systemd/$instance/" . basename($service_path); # Not masked? Nothing to do. return unless -e $mask_link; if (! -l $mask_link || readlink($mask_link) ne '/dev/null') { debug "Not unmasking $mask_link because it is not a link to /dev/null"; return; } my $statefile = $mask_link; $statefile =~ s,^\Q$dpkg_root\E/etc/systemd/$instance/,$masked_state_dir/,; if (! -e $statefile) { debug "Not unmasking $mask_link because the state file $statefile does not exist"; return; } unlink($mask_link) or error("unable to remove $mask_link: $!"); $changed_sth = 1; unlink($statefile); } my $result = GetOptions( "quiet" => \$quiet, "user" => sub { $instance = 'user'; }, "system" => sub { $instance = 'system'; }, # default ); if ($instance eq 'user') { debug "is user unit = yes"; $enabled_state_dir = $dpkg_root . USER_INSTANCE_ENABLED_STATE_DIR; $masked_state_dir = $dpkg_root . USER_INSTANCE_MASKED_STATE_DIR; } my $action = shift; if (!defined($action)) { # Called without arguments. Explain that this script should not be run interactively. print "$0 is a program which should be called by dpkg maintscripts only.\n"; print "Please do not run it interactively, ever. Also see the manpage deb-systemd-helper(1).\n"; exit 0; } if (!$ENV{DPKG_MAINTSCRIPT_PACKAGE}) { print STDERR "$0 was not called from dpkg. Exiting.\n"; exit 1; } if ($action eq 'purge') { $ENV{_DEB_SYSTEMD_HELPER_PURGE} = 1; $action = 'disable'; } debug "is purge = " . (is_purge() ? "yes" : "no"); my $rc = 0; if ($action eq 'is-enabled' || $action eq 'was-enabled' || $action eq 'debian-installed') { $rc = 1; } for my $scriptname (@ARGV) { my $service_path = find_unit($scriptname); debug "action = $action, scriptname = $scriptname, service_path = $service_path"; if ($action eq 'is-enabled') { my $enabled = all_links_installed($scriptname, $service_path); print STDERR ($enabled ? "enabled\n" : "disabled\n") unless $quiet; $rc = 0 if $enabled; } # was-enabled is the same as is-enabled, but only considers links recorded # in the state file. This is useful after package upgrades, to determine # whether the unit file was enabled before upgrading, even if the unit file # has changed and is not entirely enabled currently (due to a new Alias= # line for example). # # If all machines were running systemd, this issue would not be present # because is-enabled would query systemd, which would not have picked up # the new unit file yet. if ($action eq 'was-enabled') { my $enabled = was_enabled($scriptname); print STDERR ($enabled ? "enabled\n" : "disabled\n") unless $quiet; $rc = 0 if $enabled; } if ($action eq 'update-state') { update_state($scriptname, $service_path); } if ($action eq 'debian-installed') { $rc = 0 if debian_installed($scriptname); } if ($action eq 'reenable') { remove_links($service_path); make_systemd_links($scriptname, $service_path); } if ($action eq 'disable') { remove_links($service_path); # Clean up the state dir if it’s empty, or at least clean up all empty # subdirectories. Necessary to cleanly pass a piuparts run. rmdir_if_empty($dpkg_root . SYSTEM_INSTANCE_ENABLED_STATE_DIR); rmdir_if_empty($dpkg_root . USER_INSTANCE_ENABLED_STATE_DIR); # Same with directories below /etc/systemd, where we create symlinks. # If systemd is not installed (and no other package shipping service # files), this would make piuparts fail, too. rmdir_if_empty($_) for (grep { -d } <$dpkg_root/etc/systemd/system/*>); rmdir_if_empty($_) for (grep { -d } <$dpkg_root/etc/systemd/user/*>); } if ($action eq 'enable') { enable($scriptname, $service_path); } if ($action eq 'mask') { mask_service($scriptname, $service_path); } if ($action eq 'unmask') { unmask_service($scriptname, $service_path); # Clean up the state dir if it’s empty, or at least clean up all empty # subdirectories. Necessary to cleanly pass a piuparts run. rmdir_if_empty($dpkg_root . SYSTEM_INSTANCE_MASKED_STATE_DIR); rmdir_if_empty($dpkg_root . USER_INSTANCE_MASKED_STATE_DIR); } } # If we changed anything and this machine is running systemd, tell # systemd to reload so that it will immediately pick up our # changes. if (!length $ENV{DPKG_ROOT} && $changed_sth && $instance eq 'system' && -d "/run/systemd/system") { system("systemctl", "daemon-reload"); } exit $rc; =head1 AUTHOR Michael Stapelberg <stapelberg@debian.org> =cut
Close