Linux vps-61133.fhnet.fr 4.9.0-19-amd64 #1 SMP Debian 4.9.320-2 (2022-06-30) x86_64
Apache/2.4.25 (Debian)
Server IP : 93.113.207.21 & Your IP : 216.73.216.35
Domains :
Cant Read [ /etc/named.conf ]
User : www-data
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
usr /
sbin /
Delete
Unzip
Name
Size
Permission
Date
Action
a2disconf
15.89
KB
-rwxr-xr-x
2019-06-16 11:49
a2dismod
15.89
KB
-rwxr-xr-x
2019-06-16 11:49
a2dissite
15.89
KB
-rwxr-xr-x
2019-06-16 11:49
a2enconf
15.89
KB
-rwxr-xr-x
2019-06-16 11:49
a2enmod
15.89
KB
-rwxr-xr-x
2019-06-16 11:49
a2ensite
15.89
KB
-rwxr-xr-x
2019-06-16 11:49
a2query
9.64
KB
-rwxr-xr-x
2022-03-18 13:54
accessdb
10.23
KB
-rwxrwxrwx
2016-12-13 14:10
add-shell
860
B
-rwxrwxrwx
2017-04-02 19:10
addgnupghome
3.01
KB
-rwxrwxrwx
2019-02-07 21:57
addgroup
33.7
KB
-rwxrwxrwx
2016-06-27 00:55
adduser
33.7
KB
-rwxrwxrwx
2016-06-27 00:55
anacron
34.02
KB
-rwxr-xr-x
2017-05-29 18:36
apache2
651.16
KB
-rwxr-xr-x
2022-03-18 13:54
apache2ctl
7.05
KB
-rwxr-xr-x
2019-10-13 17:39
apachectl
7.05
KB
-rwxr-xr-x
2019-10-13 17:39
applygnupgdefaults
2.17
KB
-rwxrwxrwx
2019-02-07 21:57
arp
62.03
KB
-rwxrwxrwx
2016-12-26 06:58
arpaname
9.99
KB
-rwxr-xr-x
2022-03-19 14:43
arpd
46.84
KB
-rwxrwxrwx
2017-11-24 10:22
aspell-autobuildhash
13.22
KB
-rwxrwxrwx
2016-10-10 11:58
backup-manager
6.94
KB
-rwxrwxrwx
2016-08-23 12:51
bacula-console
44.77
KB
-rwxr-xr-x
2020-08-26 20:03
bacula-fd
239.47
KB
-rwxr-xr-x
2020-08-26 20:03
bconsole
44.77
KB
-rwxr-xr-x
2020-08-26 20:03
biosdecode
18.82
KB
-rwxrwxrwx
2016-09-01 04:59
bsmtp
18.52
KB
-rwxr-xr-x
2020-08-26 20:03
btraceback
2.27
KB
-rwxr-xr-x
2020-08-26 20:03
check_forensic
952
B
-rwxr-xr-x
2011-04-26 17:10
chgpasswd
57.8
KB
-rwxr-xr-x
2021-03-17 10:27
chpasswd
49.9
KB
-rwxr-xr-x
2021-03-17 10:27
chroot
38.88
KB
-rwxrwxrwx
2017-02-22 13:23
clamd
202.1
KB
-rwxr-xr-x
2022-05-27 11:18
clamonacc
190.09
KB
-rwxr-xr-x
2022-05-27 11:18
convertquota
71.74
KB
-rwxrwxrwx
2018-02-24 07:55
cpgr
52
KB
-rwxr-xr-x
2021-03-17 10:27
cppw
52
KB
-rwxr-xr-x
2021-03-17 10:27
cron
47.48
KB
-rwxr-xr-x
2021-10-29 22:04
dbconfig-generate-include
12.37
KB
-rwxrwxrwx
2017-01-05 20:23
dbconfig-load-include
5.57
KB
-rwxrwxrwx
2017-01-05 20:23
ddns-confgen
17.99
KB
-rwxr-xr-x
2022-03-19 14:43
delgroup
15.43
KB
-rwxrwxrwx
2016-06-27 00:55
deluser
15.43
KB
-rwxrwxrwx
2016-06-27 00:55
dmidecode
102.49
KB
-rwxrwxrwx
2016-09-01 04:59
dnssec-checkds
10.66
KB
-rwxr-xr-x
2022-03-19 14:43
dnssec-coverage
28.07
KB
-rwxr-xr-x
2022-03-19 14:43
dnssec-dsfromkey
50
KB
-rwxr-xr-x
2022-03-19 14:43
dnssec-dsfromkey-pkcs11
50
KB
-rwxr-xr-x
2022-03-19 14:43
dnssec-importkey
50
KB
-rwxr-xr-x
2022-03-19 14:43
dnssec-importkey-pkcs11
50
KB
-rwxr-xr-x
2022-03-19 14:43
dnssec-keyfromlabel
54
KB
-rwxr-xr-x
2022-03-19 14:43
dnssec-keyfromlabel-pkcs11
54
KB
-rwxr-xr-x
2022-03-19 14:43
dnssec-keygen
62
KB
-rwxr-xr-x
2022-03-19 14:43
dnssec-keygen-pkcs11
62
KB
-rwxr-xr-x
2022-03-19 14:43
dnssec-revoke
46
KB
-rwxr-xr-x
2022-03-19 14:43
dnssec-revoke-pkcs11
46
KB
-rwxr-xr-x
2022-03-19 14:43
dnssec-settime
54
KB
-rwxr-xr-x
2022-03-19 14:43
dnssec-settime-pkcs11
54
KB
-rwxr-xr-x
2022-03-19 14:43
dnssec-signzone
102.03
KB
-rwxr-xr-x
2022-03-19 14:43
dnssec-signzone-pkcs11
102.03
KB
-rwxr-xr-x
2022-03-19 14:43
dnssec-verify
46.01
KB
-rwxr-xr-x
2022-03-19 14:43
dnssec-verify-pkcs11
46.01
KB
-rwxr-xr-x
2022-03-19 14:43
dovecot
86.09
KB
-rwxr-xr-x
2021-01-05 13:19
dpkg-preconfigure
3.52
KB
-rwxrwxrwx
2017-05-21 19:08
dpkg-reconfigure
4.23
KB
-rwxrwxrwx
2017-05-21 19:08
e2freefrag
10.07
KB
-rwxrwxrwx
2020-07-25 11:03
e4crypt
22.07
KB
-rwxrwxrwx
2020-07-25 11:03
e4defrag
25.99
KB
-rwxrwxrwx
2020-07-25 11:03
edquota
80.11
KB
-rwxrwxrwx
2018-02-24 07:55
fdformat
30.66
KB
-rwxrwxrwx
2018-03-07 19:29
filefrag
14.02
KB
-rwxrwxrwx
2020-07-25 11:03
genccode
10.59
KB
-rwxr-xr-x
2021-10-12 12:29
gencmn
10.64
KB
-rwxr-xr-x
2021-10-12 12:29
genl
50.79
KB
-rwxrwxrwx
2017-11-24 10:22
gennorm2
43.38
KB
-rwxr-xr-x
2021-10-12 12:29
genrandom
10
KB
-rwxr-xr-x
2022-03-19 14:43
gensprep
18.98
KB
-rwxr-xr-x
2021-10-12 12:29
groupadd
57.86
KB
-rwxr-xr-x
2021-03-17 10:27
groupdel
53.65
KB
-rwxr-xr-x
2021-03-17 10:27
groupmems
53.84
KB
-rwxr-xr-x
2021-03-17 10:27
groupmod
68.22
KB
-rwxr-xr-x
2021-03-17 10:27
grpck
53.77
KB
-rwxr-xr-x
2021-03-17 10:27
grpconv
49.65
KB
-rwxr-xr-x
2021-03-17 10:27
grpunconv
49.65
KB
-rwxr-xr-x
2021-03-17 10:27
grub-bios-setup
790.19
KB
-rwxrwxrwx
2019-06-12 13:20
grub-install
996.58
KB
-rwxrwxrwx
2019-06-12 13:20
grub-macbless
777.88
KB
-rwxrwxrwx
2019-06-12 13:20
grub-mkconfig
7.82
KB
-rwxrwxrwx
2019-06-12 13:20
grub-mkdevicemap
204.47
KB
-rwxrwxrwx
2019-06-12 13:20
grub-probe
790.19
KB
-rwxrwxrwx
2019-06-12 13:20
grub-reboot
4.01
KB
-rwxrwxrwx
2019-06-12 13:20
grub-set-default
3.48
KB
-rwxrwxrwx
2019-06-12 13:20
httxt2dbm
9.99
KB
-rwxr-xr-x
2022-03-18 13:54
iconvconfig
22.66
KB
-rwxrwxrwx
2019-02-06 22:17
icupkg
19.18
KB
-rwxr-xr-x
2021-10-12 12:29
inetd
34.38
KB
-rwxrwxrwx
2017-01-02 11:49
install-sgmlcatalog
4.44
KB
-rwxrwxrwx
2016-11-07 08:06
invoke-rc.d
17.69
KB
-rwxrwxrwx
2017-05-02 12:20
ip6tables-apply
6.85
KB
-rwxrwxrwx
2017-04-12 11:41
iptables-apply
6.85
KB
-rwxrwxrwx
2017-04-12 11:41
irqbalance
55.38
KB
-rwxrwxrwx
2017-03-10 19:56
isc-hmac-fixup
9.99
KB
-rwxr-xr-x
2022-03-19 14:43
ispell-autobuildhash
15.39
KB
-rwxrwxrwx
2016-10-10 11:58
ldattach
30.71
KB
-rwxrwxrwx
2018-03-07 19:29
locale-gen
1.5
KB
-rwxrwxrwx
2017-07-31 16:32
logrotate
75.27
KB
-rwxrwxrwx
2017-01-07 19:54
logwatch
58
KB
-rwxr-xr-x
2017-01-21 17:44
make-ssl-cert
3.78
KB
-rwxrwxrwx
2017-04-28 21:58
mkinitramfs
10.01
KB
-rwxrwxrwx
2017-04-26 03:00
mklost+found
9.99
KB
-rwxrwxrwx
2020-07-25 11:03
mysqld
17.05
MB
-rwxr-xr-x
2021-03-22 19:49
named
622.24
KB
-rwxr-xr-x
2022-03-19 14:43
named-checkconf
34.19
KB
-rwxr-xr-x
2022-03-19 14:43
named-checkzone
30.19
KB
-rwxr-xr-x
2022-03-19 14:43
named-compilezone
30.19
KB
-rwxr-xr-x
2022-03-19 14:43
named-journalprint
9.99
KB
-rwxr-xr-x
2022-03-19 14:43
named-pkcs11
622.24
KB
-rwxr-xr-x
2022-03-19 14:43
named-rrchecker
13.99
KB
-rwxr-xr-x
2022-03-19 14:43
netfilter-persistent
1.05
KB
-rwxr-xr-x
2020-05-02 21:33
newusers
78.43
KB
-rwxr-xr-x
2021-03-17 10:27
nfnl_osf
13.99
KB
-rwxrwxrwx
2017-04-12 11:41
nginx
1.01
MB
-rwxr-xr-x
2021-06-07 21:02
nologin
5.99
KB
-rwxr-xr-x
2021-03-17 10:27
nsec3hash
10
KB
-rwxr-xr-x
2022-03-19 14:43
ntp-keygen
73.77
KB
-rwxrwxrwx
2018-02-15 12:45
ntp-wait
3.13
KB
-rwxrwxrwx
2018-02-15 12:45
ntpd
713.22
KB
-rwxrwxrwx
2018-02-15 12:45
ntpdate
75.17
KB
-rwxrwxrwx
2018-02-15 12:45
ntpdate-debian
534
B
-rwxrwxrwx
2018-02-15 12:45
ntptime
18.12
KB
-rwxrwxrwx
2018-02-15 12:45
ownership
10.13
KB
-rwxrwxrwx
2016-09-01 04:59
pam-auth-update
19.03
KB
-rwxrwxrwx
2017-05-27 17:44
pam_getenv
2.82
KB
-rwxrwxrwx
2017-05-27 17:44
pam_timestamp_check
10.37
KB
-rwxrwxrwx
2017-05-27 17:44
paperconfig
4.07
KB
-rwxrwxrwx
2016-11-11 12:28
passenger-memory-stats
5.65
KB
-rwxrwxrwx
2019-03-17 19:40
passenger-status
10.68
KB
-rwxrwxrwx
2019-03-17 19:40
phpdismod
7.11
KB
-rwxrwxrwx
2017-01-01 20:43
phpenmod
7.11
KB
-rwxrwxrwx
2017-01-01 20:43
phpquery
6.26
KB
-rwxrwxrwx
2017-01-01 20:43
pkcs11-destroy
9.99
KB
-rwxr-xr-x
2022-03-19 14:43
pkcs11-keygen
15.58
KB
-rwxr-xr-x
2022-03-19 14:43
pkcs11-list
9.99
KB
-rwxr-xr-x
2022-03-19 14:43
pkcs11-tokens
9.99
KB
-rwxr-xr-x
2022-03-19 14:43
pma-configure
299
B
-rwxr-xr-x
2020-10-23 11:41
pma-secure
157
B
-rwxr-xr-x
2020-10-23 11:41
postalias
17.99
KB
-rwxr-xr-x
2020-02-16 20:59
postcat
14.06
KB
-rwxr-xr-x
2020-02-16 20:59
postconf
175.28
KB
-rwxr-xr-x
2020-02-16 20:59
postdrop
14.12
KB
-rwxr-sr-x
2020-02-16 20:59
postfix
14.07
KB
-rwxr-xr-x
2020-02-16 20:59
postfix-add-filter
4.9
KB
-rwxrwxrwx
2020-02-16 20:59
postfix-add-policy
3.83
KB
-rwxrwxrwx
2020-02-16 20:59
postkick
9.99
KB
-rwxr-xr-x
2020-02-16 20:59
postlock
9.99
KB
-rwxr-xr-x
2020-02-16 20:59
postlog
10.15
KB
-rwxr-xr-x
2020-02-16 20:59
postmap
17.99
KB
-rwxr-xr-x
2020-02-16 20:59
postmulti
26.38
KB
-rwxr-xr-x
2020-02-16 20:59
postqueue
22.07
KB
-rwxr-sr-x
2020-02-16 20:59
postsuper
22.32
KB
-rwxr-xr-x
2020-02-16 20:59
posttls-finger
34.09
KB
-rwxrwxrwx
2020-02-16 20:59
pure-authd
18.41
KB
-rwxrwxrwx
2016-12-08 13:28
pure-ftpd
161.4
KB
-rwxrwxrwx
2016-12-08 13:28
pure-ftpd-control
1.68
KB
-rwxrwxrwx
2016-12-08 13:28
pure-ftpd-virtualchroot
165.4
KB
-rwxrwxrwx
2016-12-08 13:28
pure-ftpd-wrapper
12.16
KB
-rwxrwxrwx
2016-12-08 13:28
pure-ftpwho
22.02
KB
-rwxrwxrwx
2016-12-08 13:28
pure-mrtginfo
9.99
KB
-rwxrwxrwx
2016-12-08 13:28
pure-quotacheck
14.01
KB
-rwxrwxrwx
2016-12-08 13:28
pure-uploadscript
14.26
KB
-rwxrwxrwx
2016-12-08 13:28
pwck
49.84
KB
-rwxr-xr-x
2021-03-17 10:27
pwconv
45.74
KB
-rwxr-xr-x
2021-03-17 10:27
pwunconv
41.72
KB
-rwxr-xr-x
2021-03-17 10:27
qmqp-sink
13.99
KB
-rwxrwxrwx
2020-02-16 20:59
qmqp-source
18.01
KB
-rwxrwxrwx
2020-02-16 20:59
qshape
12.55
KB
-rwxrwxrwx
2020-02-16 20:59
quot
67.48
KB
-rwxrwxrwx
2018-02-24 07:55
quota_nld
75.8
KB
-rwxrwxrwx
2018-02-24 07:55
quotastats
14.38
KB
-rwxrwxrwx
2018-02-24 07:55
quotatool
26.45
KB
-rwxrwxrwx
2014-12-21 21:54
readprofile
18.59
KB
-rwxrwxrwx
2018-03-07 19:29
remove-default-ispell
2.86
KB
-rwxrwxrwx
2016-10-10 11:58
remove-default-wordlist
2.86
KB
-rwxrwxrwx
2016-10-10 11:58
remove-shell
904
B
-rwxrwxrwx
2017-04-02 19:10
repquota
72.05
KB
-rwxrwxrwx
2018-02-24 07:55
rmail
13.99
KB
-rwxrwxrwx
2020-02-16 20:59
rmt
55.03
KB
-rwxr-xr-x
2021-11-27 22:50
rmt-tar
55.03
KB
-rwxr-xr-x
2021-11-27 22:50
rndc
29.99
KB
-rwxr-xr-x
2022-03-19 14:43
rndc-confgen
17.99
KB
-rwxr-xr-x
2022-03-19 14:43
rpc.rquotad
75.96
KB
-rwxrwxrwx
2018-02-24 07:55
rsyslogd
636.3
KB
-rwxr-xr-x
2022-05-20 21:25
rtcwake
42.81
KB
-rwxrwxrwx
2018-03-07 19:29
safe_finger
10.08
KB
-rwxrwxrwx
2016-12-26 00:08
select-default-ispell
3.23
KB
-rwxrwxrwx
2016-10-10 11:58
select-default-wordlist
3.21
KB
-rwxrwxrwx
2016-10-10 11:58
sendmail
26.15
KB
-rwxr-xr-x
2020-02-16 20:59
service
9.83
KB
-rwxrwxrwx
2017-05-02 12:20
setquota
84.11
KB
-rwxrwxrwx
2018-02-24 07:55
smartctl
663.63
KB
-rwxrwxrwx
2016-07-30 19:10
smartd
591.07
KB
-rwxrwxrwx
2016-07-30 19:10
smtp-sink
30.93
KB
-rwxrwxrwx
2020-02-16 20:59
smtp-source
22.02
KB
-rwxrwxrwx
2020-02-16 20:59
snmpd
30.01
KB
-rwxr-xr-x
2020-08-04 17:15
split-logfile
2.36
KB
-rwxr-xr-x
2022-03-18 13:54
sshd
772.48
KB
-rwxrwxrwx
2019-07-15 15:32
tarcat
936
B
-rwxr-xr-x
2021-11-27 22:50
tcpd
10
KB
-rwxrwxrwx
2016-12-26 00:08
tcpdchk
22.13
KB
-rwxrwxrwx
2016-12-26 00:08
tcpdmatch
18.04
KB
-rwxrwxrwx
2016-12-26 00:08
tcpdump
1007.6
KB
-rwxr-xr-x
2020-11-10 15:22
tcptraceroute
1.56
KB
-rwxrwxrwx
2016-08-29 17:45
tcptraceroute.db
1.56
KB
-rwxrwxrwx
2016-08-29 17:45
traceroute
67.16
KB
-rwxrwxrwx
2016-08-29 17:45
try-from
10
KB
-rwxrwxrwx
2016-12-26 00:08
tsig-keygen
17.99
KB
-rwxr-xr-x
2022-03-19 14:43
tunelp
26.61
KB
-rwxrwxrwx
2018-03-07 19:29
tzconfig
106
B
-rwxr-xr-x
2019-10-11 09:23
ufw
4.4
KB
-rwx------
2017-01-10 22:16
unhide
38.26
KB
-rwxrwxrwx
2019-12-17 18:08
unhide-linux
38.26
KB
-rwxrwxrwx
2019-12-17 18:08
unhide-posix
10
KB
-rwxrwxrwx
2019-12-17 18:08
unhide-tcp
18.85
KB
-rwxrwxrwx
2019-12-17 18:08
unhide.rb
13.97
KB
-rwxrwxrwx
2015-11-09 01:23
unhide_rb
14.09
KB
-rwxrwxrwx
2019-12-17 18:08
update-ca-certificates
4.85
KB
-rwxr-xr-x
2021-03-13 18:38
update-catalog
9.15
KB
-rwxrwxrwx
2016-11-07 08:06
update-default-aspell
1
KB
-rwxrwxrwx
2016-10-10 11:58
update-default-ispell
9.68
KB
-rwxrwxrwx
2016-10-10 11:58
update-default-wordlist
7.5
KB
-rwxrwxrwx
2016-10-10 11:58
update-dictcommon-aspell
1
KB
-rwxrwxrwx
2016-10-10 11:58
update-dictcommon-hunspell
782
B
-rwxrwxrwx
2016-10-10 11:58
update-grub
64
B
-rwxrwxrwx
2019-06-12 13:20
update-grub2
64
B
-rwxrwxrwx
2019-06-12 13:20
update-gsfontmap
450
B
-rwxr-xr-x
2022-05-01 17:15
update-inetd
6.05
KB
-rwxrwxrwx
2017-01-15 12:37
update-initramfs
8.02
KB
-rwxrwxrwx
2017-03-06 23:42
update-locale
2.99
KB
-rwxrwxrwx
2016-03-21 00:45
update-mime
8.84
KB
-rwxrwxrwx
2016-05-01 13:20
update-passwd
30.41
KB
-rwxrwxrwx
2017-01-16 16:52
update-rc.d
15.69
KB
-rwxrwxrwx
2017-05-02 12:20
update-xmlcatalog
16.88
KB
-rwxrwxrwx
2016-11-07 15:53
upgrade-from-grub-legacy
1.49
KB
-rwxrwxrwx
2019-06-12 13:20
useradd
119.29
KB
-rwxr-xr-x
2021-03-17 10:27
userdel
82.49
KB
-rwxr-xr-x
2021-03-17 10:27
usermod
119.1
KB
-rwxr-xr-x
2021-03-17 10:27
validlocale
1.73
KB
-rwxrwxrwx
2016-03-21 00:45
vigr
60.22
KB
-rwxr-xr-x
2021-03-17 10:27
vipw
60.22
KB
-rwxr-xr-x
2021-03-17 10:27
visudo
200.34
KB
-rwxr-xr-x
2021-01-23 10:10
vpddecode
14.27
KB
-rwxrwxrwx
2016-09-01 04:59
warnquota
84.11
KB
-rwxrwxrwx
2018-02-24 07:55
xqmstats
14.36
KB
-rwxrwxrwx
2018-02-24 07:55
zic
42.54
KB
-rwxrwxrwx
2019-02-06 22:17
Save
Rename
#!/usr/bin/perl -w # # a2enmod by Stefan Fritsch <sf@debian.org> # Licensed under Apache License 2.0 # # The coding style is "perltidy -pbp" use strict; use Cwd 'realpath'; use File::Spec; use File::Basename; use File::Path; use Getopt::Long; use 5.014; no if $] >= 5.017011, warnings => 'experimental::smartmatch'; my $quiet; my $force; my $maintmode; my $purge; Getopt::Long::Configure('bundling'); GetOptions( 'quiet|q' => \$quiet, 'force|f' => \$force, 'maintmode|m' => \$maintmode, 'purge|p' => \$purge ) or exit 2; my $basename = basename($0); $basename =~ /^a2(en|dis)(mod|site|conf)((?:-.+)?)$/ or die "$basename call name unknown\n"; my $act = $1; my $obj = $2; my $dir_suffix = $3; my @essential_module_list = qw(alias auth_basic authn_file authz_host authz_user autoindex deflate dir env filter logio mime negotiation setenvif unixd version watchdog); my $env_file = $ENV{APACHE_ENVVARS}; if (! $env_file) { if ($ENV{APACHE_CONFDIR}) { $env_file = "$ENV{APACHE_CONFDIR}/envvars"; } else { $env_file = "/etc/apache2$dir_suffix/envvars"; } } $ENV{LANG} = 'C'; read_env_file($env_file); $act .= 'able'; my ( $name, $dir, $sffx, $reload ); if ( $obj eq 'mod' ) { $obj = 'module'; $dir = 'mods'; $sffx = '.load'; $reload = 'restart'; } elsif ( $obj eq 'conf' ) { $obj = 'conf'; $dir = 'conf'; $sffx = '.conf'; $reload = 'reload'; } else { $dir = 'sites'; $sffx = '.conf'; $reload = 'reload'; } $name = ucfirst($obj); my $confdir = $ENV{APACHE_CONFDIR} || "/etc/apache2$dir_suffix"; my $availdir = $ENV{ uc("APACHE_${dir}_AVAILABLE") } || "$confdir/$dir-available"; my $enabldir = $ENV{ uc("APACHE_${dir}_ENABLED") } || "$confdir/$dir-enabled"; my $statedir = $ENV{ uc("APACHE_STATE_DIRECTORY") } || "/var/lib/apache2"; $statedir .= "/$obj"; my $choicedir = $act eq 'enable' ? $availdir : $enabldir; my $linkdir = File::Spec->abs2rel( $availdir, $enabldir ); my $request_reload = 0; my $request_htcacheclean; my $htc = "apache-htcacheclean$dir_suffix"; my $htc_service = "apache-htcacheclean"; # Service name for systemd my $apache_service = "apache2"; if (defined($dir_suffix) and $dir_suffix ne '') { # Uses '@instance.service' suffix instead of '-instance' suffix my $service_suffix = '@' . substr($dir_suffix, 1) . '.service'; $htc_service .= $service_suffix; $apache_service .= $service_suffix; } my $rc = 0; if ( !scalar @ARGV ) { my @choices = myglob('*'); print "Your choices are: @choices\n"; print "Which ${obj}(s) do you want to $act (wildcards ok)?\n"; my $input = <>; @ARGV = split /\s+/, $input; } my @objs; foreach my $arg (@ARGV) { $arg =~ s/${sffx}$//; my @glob = myglob($arg); if ( !@glob ) { error("No $obj found matching $arg!\n"); $rc = 1; } else { push @objs, @glob; } } foreach my $acton (@objs) { doit($acton) or $rc = 1; } my $htcstart = ""; my $apache_reload = ""; my $cmd = ($act eq "enable") ? "start" : "stop"; if (is_systemd()) { $htcstart = " systemctl $cmd $htc_service\n"; $apache_reload = " systemctl $reload $apache_service\n"; } else { $htcstart = " service $htc $cmd\n"; $apache_reload = " service apache2$dir_suffix $reload\n"; } info( "To activate the new configuration, you need to run:\n" . $apache_reload . ($request_htcacheclean ? $htcstart : "") ) if $request_reload; exit($rc); ############################################################################## sub myglob { my $arg = shift; my @glob = map { s{^$choicedir/}{}; s{$sffx$}{}; $_ } glob("$choicedir/$arg$sffx"); return @glob; } sub doit { my $acton = shift; my ( $conftgt, $conflink ); if ( $obj eq 'module' ) { if ( $act eq 'enable' && $acton eq 'cgi' && threaded() ) { print "Your MPM seems to be threaded. Selecting cgid instead of cgi.\n"; $acton = 'cgid'; } $conftgt = "$availdir/$acton.conf"; if ( -e $conftgt ) { $conflink = "$enabldir/$acton.conf"; } } my $tgt = "$availdir/$acton$sffx"; my $link = "$enabldir/$acton$sffx"; if ( !-e $tgt ) { if ( -l $link && !-e $link ) { if ( $act eq 'disable' ) { info("removing dangling symlink $link\n"); unlink($link); # force a .conf path. It may exist as dangling link, too $conflink = "$enabldir/$acton.conf"; if ( -l $conflink && !-e $conflink ) { info("removing dangling symlink $conflink\n"); unlink($conflink); } return 1; } else { error("$link is a dangling symlink!\n"); } } if ( $purge ) { switch_marker( $obj, $act, $acton ); # exit silently, we are purging anyway return 1; } error("$name $acton does not exist!\n"); return 0; } # handle module dependencies if ( $obj eq 'module' ) { if ( $act eq 'enable' ) { my @depends = get_deps("$availdir/$acton.load"); do_deps( $acton, @depends ) or return 0; my @conflicts = get_deps( "$availdir/$acton.load", "Conflicts" ); check_conflicts( $acton, @conflicts ) or return 0; } else { my @depending; foreach my $d ( glob("$enabldir/*.load") ) { my @deps = get_deps($d); if ( is_in( $acton, @deps ) ) { $d =~ m,/([^/]+).load$,; push @depending, $1; } } if ( scalar @depending ) { if ($force) { do_deps( $acton, @depending ) or return 0; } else { error( "The following modules depend on $acton ", "and need to be disabled first: @depending\n" ); return 0; } } } } elsif ( $act eq 'enable' ) { my @depends = get_deps("$availdir/$acton$sffx"); warn_deps( $acton, @depends ) or return 0; } if ( $act eq 'enable' ) { my $check = check_link( $tgt, $link ); if ( $check eq 'ok' ) { if ($conflink) { # handle .conf file my $confcheck = check_link( $conftgt, $conflink ); if ( $confcheck eq 'ok' ) { info("$name $acton already enabled\n"); return 1; } elsif ( $confcheck eq 'missing' ) { print "Enabling config file $acton.conf.\n"; add_link( $conftgt, $conflink ) or return 0; } else { error( "Config file $acton.conf not properly enabled: $confcheck\n" ); return 0; } } else { info("$name $acton already enabled\n"); return 1; } } elsif ( $check eq 'missing' ) { if ($conflink) { # handle .conf file my $confcheck = check_link( $conftgt, $conflink ); if ( $confcheck eq 'missing' ) { add_link( $conftgt, $conflink ) or return 0; } elsif ( $confcheck ne 'ok' ) { error( "Config file $acton.conf not properly enabled: $confcheck\n" ); return 0; } } print "Enabling $obj $acton.\n"; special_module_handling($acton); return add_link( $tgt, $link ) && switch_marker( $obj, $act, $acton ); } else { error("$name $acton not properly enabled: $check\n"); return 0; } } else { if ( -e $link || -l $link ) { special_module_handling($acton); if ($obj eq 'module' && grep {$_ eq $acton} @essential_module_list) { $force || essential_module_handling($acton); } remove_link($link); if ( $conflink && -e $conflink ) { remove_link($conflink); } switch_marker( $obj, $act, $acton ); print "$name $acton disabled.\n"; } elsif ( $conflink && -e $conflink ) { print "Disabling stale config file $acton.conf.\n"; remove_link($conflink); } else { info("$name $acton already disabled\n"); if ( $purge ) { switch_marker( $obj, $act, $acton ); } return 1; } } return 1; } sub get_deps { my $file = shift; my $type = shift || "Depends"; my $fd; if ( !open( $fd, '<', $file ) ) { error("Can't open $file: $!"); return; } my $line; while ( defined( $line = <$fd> ) ) { chomp $line; if ( $line =~ /^# $type:\s+(.*?)\s*$/ ) { my $deps = $1; return split( /[\n\s]+/, $deps ); } # only check until the first non-empty non-comment line last if ( $line !~ /^\s*(?:#.*)?$/ ); } return; } sub do_deps { my $acton = shift; foreach my $d (@_) { info("Considering dependency $d for $acton:\n"); if ( !doit($d) ) { error("Could not $act dependency $d for $acton, aborting\n"); return 0; } } return 1; } sub warn_deps { my $acton = shift; my $modsenabldir = $ENV{APACHE_MODS_ENABLED} || "$confdir/mods-enabled"; foreach my $d (@_) { info("Checking dependency $d for $acton:\n"); if ( !-e "$modsenabldir/$d.load" ) { warning( "Module $d is not enabled, but $acton depends on it, aborting\n" ); return 0; } } return 1; } sub check_conflicts { my $acton = shift; my $haderror = 0; foreach my $d (@_) { info("Considering conflict $d for $acton:\n"); my $tgt = "$availdir/$d$sffx"; my $link = "$enabldir/$d$sffx"; my $confcheck = check_link( $tgt, $link ); if ( $confcheck eq 'ok' ) { error( "Module $d is enabled - cannot proceed due to conflicts. It needs to be disabled first!\n" ); # Don't return immediately, there could be several conflicts $haderror++; } } if ($haderror) { return 0; } return 1; } sub add_link { my ( $tgt, $link ) = @_; # create relative link if ( !symlink( File::Spec->abs2rel( $tgt, dirname($link) ), $link ) ) { die("Could not create $link: $!\n"); } $request_reload = 1; return 1; } sub check_link { my ( $tgt, $link ) = @_; if ( !-e $link ) { if ( -l $link ) { # points to nowhere info("Removing dangling link $link"); unlink($link) or die "Could not remove $link\n"; } return 'missing'; } if ( -e $link && !-l $link ) { return "$link is a real file, not touching it"; } if ( realpath($link) ne realpath($tgt) ) { return "$link exists but does not point to $tgt, not touching it"; } return 'ok'; } sub remove_link { my ($link) = @_; if ( -l $link ) { unlink($link) or die "Could not remove $link: $!\n"; } elsif ( -e $link ) { error("$link is not a symbolic link, not deleting\n"); return 0; } $request_reload = 1; return 1; } sub threaded { my $result = ""; $result = qx{/usr/sbin/apache2ctl -V | grep 'threaded'} if -x '/usr/sbin/apache2ctl'; if ( $? != 0 ) { # config doesn't work if ( -e "$enabldir/mpm_prefork.load" ) { return 0; } elsif (-e "$enabldir/mpm_worker.load" || -e "$enabldir/mpm_event.load" ) { return 1; } else { error("Can't determine enabled MPM"); # do what user requested return 0; } } if ( $result =~ / no/ ) { return 0; } elsif ( $result =~ / yes/ ) { return 1; } else { die("Can't parse output from apache2ctl -V:\n$result\n"); } } sub info { print @_ if !$quiet; } sub error { print STDERR 'ERROR: ', @_; } sub warning { print STDERR 'WARNING: ', @_; } sub is_in { my $needle = shift; foreach my $e (@_) { return 1 if $needle eq $e; } return 0; } sub read_env_file { my $file = shift; -r $file or return; my @lines = qx{env - sh -c '. $file && env'}; if ($?) { die "Could not read $file\n"; } foreach my $l (@lines) { chomp $l; $l =~ /^(.*)?=(.*)$/ or die "Could not parse $file\n"; $ENV{$1} = $2; } } sub switch_marker { die('usage: switch_marker([module|site|conf], [enable|disable], $name)') if @_ != 3; my $which = shift; my $what = shift; my $name = shift; my $mode = "admin"; $mode = "maint" if $maintmode; #print("switch_marker $which $what $name\n"); # TODO: get rid of the magic string(s) my $state_marker_dir = "$statedir/$what" . "d" . "_by_$mode"; my $state_marker = "$state_marker_dir/$name"; if ( !-d $state_marker_dir ) { File::Path::mkpath("$state_marker_dir") || error( "Failed to create marker directory: '$state_marker_dir'\n"); } # XXX: swap find with perl alternative my @markers = qx{find "$statedir" -type f -a -name "$name"}; chomp(@markers); foreach (@markers) { unless ( unlink $_ ) { error("Failed to remove old marker '$_'!\n") && return 0; } } unless ($purge) { qx{touch "$state_marker"}; if ( $? != 0 ) { error("Failed to create marker '$state_marker'!\n") && return 0; } return 1; } } sub essential_module_handling { my $module = shift; print "WARNING: The following essential module will be disabled.\n"; print "This might result in unexpected behavior and should NOT be done\n"; print "unless you know exactly what you are doing!\n $module\n\n"; print "To continue type in the phrase 'Yes, do as I say!' or retry by passing '-f': "; my $input = <STDIN>; chomp($input); if ($input ne 'Yes, do as I say!') { print("Aborting\n"); exit(1) } } sub special_module_handling { my $acton = shift; if ($obj ne 'module') { return; } given ($acton) { when ('ssl') { if ( $act eq 'enable' ) { info( "See /usr/share/doc/apache2/README.Debian.gz on " . "how to configure SSL and create self-signed " . "certificates.\n" ); } } when ('cache_disk') { $request_htcacheclean = 1; my $verb = "\u$act"; my $command; $verb =~ s/e$/ing/; if (-d "/run/systemd" and -x "/bin/systemctl") { info("$verb external service $htc_service\n"); $command = "systemctl $act $htc_service"; } else { info("$verb external service $htc\n"); $command = "update-rc.d $htc $act"; } my $res = system($command); if ($res == 0) { info("The service will be started on next reboot.\n") if $act eq 'enable'; } else { warning("'$command' failed\n"); } } } } sub is_systemd { my $init = readlink("/proc/1/exe") || ""; return scalar $init =~ /systemd/; } # vim: syntax=perl sw=4 sts=4 sr et