1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
|
# Copyright 1999-2021 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI="6"
WANT_AUTOMAKE=none
inherit cron pam flag-o-matic user autotools versionator systemd
DESCRIPTION="A command scheduler with extended capabilities over cron and anacron"
HOMEPAGE="http://fcron.free.fr/"
SRC_URI="http://fcron.free.fr/archives/${P}.src.tar.gz"
LICENSE="GPL-2"
KEYWORDS="amd64 arm ~arm64 ~hppa ~ia64 ~mips ppc ppc64 sparc x86"
IUSE="audit debug pam selinux l10n_fr +mta +system-crontab readline"
DEPEND="virtual/libcrypt:=
audit? ( sys-process/audit )
pam? ( sys-libs/pam )
readline? ( sys-libs/readline:= )
selinux? ( sys-libs/libselinux )"
RDEPEND="${DEPEND}
app-misc/editor-wrapper
mta? ( virtual/mta )
pam? ( sys-auth/pambase )"
PATCHES=(
"${FILESDIR}"/${PN}-3.1.1-noreadline.patch
"${FILESDIR}"/${PN}-3.2.1-configure-fix-audit-parameter-check.patch
"${FILESDIR}"/${PN}-3.2.1-musl-getopt-order.patch
)
pkg_setup() {
enewgroup fcron
enewuser fcron -1 -1 -1 fcron
rootuser=$(egetent passwd 0 | cut -d ':' -f 1)
[[ ${rootuser} ]] || rootuser=root
rootgroup=$(egetent group 0 | cut -d ':' -f 1)
[[ ${rootgroup} ]] || rootgroup=root
}
src_prepare() {
default
# respect LDFLAGS
sed -i "s:\(@LIBS@\):\$(LDFLAGS) \1:" Makefile.in || die "sed failed"
# Adjust fcrontab path
sed -i -e 's:/etc/fcrontab:/etc/fcron/fcrontab:' script/check_system_crontabs.sh || die
mv configure.in configure.ac || die
cp "${FILESDIR}"/crontab.2 "${WORKDIR}"/crontab || die
eautoconf
}
src_configure() {
# Don't try to pass --with-debug as it'll play with cflags as
# well, and run foreground which is a _very_ nasty idea for
# Gentoo.
use debug && append-cppflags -DDEBUG
# bindir is used just for calling fcronsighup
econf \
--with-cflags="${CFLAGS}" \
--bindir=/usr/libexec \
--sbindir=/usr/libexec \
$(use_with audit) \
$(use_with mta sendmail) \
$(use_with pam) \
$(use_with readline) \
$(use_with selinux) \
--sysconfdir=/etc/fcron \
--with-username=fcron \
--with-groupname=fcron \
--with-piddir=/run \
--with-spooldir=/var/spool/fcron \
--with-fifodir=/run \
--with-fcrondyn=yes \
--disable-checks \
--with-editor=/usr/libexec/editor \
--with-shell=/bin/sh \
--without-db2man \
--without-dsssl-dir \
--with-rootname=${rootuser} \
--with-rootgroup=${rootgroup} \
--with-systemdsystemunitdir="$(systemd_get_systemunitdir)"
}
src_compile() {
default
# bug #216460
sed -i \
-e 's:/usr/local/etc/fcron:/etc/fcron/fcron:g' \
-e 's:/usr/local/etc:/etc:g' \
-e 's:/usr/local/:/usr/:g' \
doc/*/*/*.{txt,1,5,8,html} \
|| die "unable to fix documentation references"
}
src_install() {
keepdir /var/spool/fcron
exeinto /usr/libexec
doexe fcron fcronsighup
dobin fcrondyn fcrontab
insinto /etc/fcron
doins files/fcron.{allow,deny,conf}
if use system-crontab; then
dosym fcrontab /usr/bin/crontab
exeinto /usr/libexec
newexe script/check_system_crontabs.sh check_system_crontabs
insinto /etc/fcron
newins "${FILESDIR}"/fcrontab.2 fcrontab
fowners ${rootuser}:fcron /etc/fcron/fcrontab
fperms 0640 /etc/fcron/fcrontab
insinto /etc
newins "${FILESDIR}"/crontab.2 crontab
fi
fowners fcron:fcron \
/var/spool/fcron \
/usr/bin/fcron{dyn,tab}
# fcronsighup needs to be suid root, because it sends a HUP to the
# running fcron daemon, but only has to be called by the fcron group
# anyway
fowners ${rootuser}:fcron \
/usr/libexec/fcronsighup \
/etc/fcron/fcron.{allow,deny,conf} \
/etc/fcron
fperms 6770 /var/spool/fcron
fperms 6775 /usr/bin/fcron{dyn,tab}
fperms 4710 /usr/libexec/fcronsighup
fperms 0750 /etc/fcron
fperms 0640 /etc/fcron/fcron.{allow,deny,conf}
use pam && pamd_mimic system-services fcron auth account session
cat > "${T}"/fcrontab.pam <<- EOF
# Don't ask for the user's password; fcrontab will only allow to
# change user if running as root.
auth sufficient pam_permit.so
# Still use the system-auth stack for account and session as the
# sysadmin might have set up stuff properly, and also avoids
# sidestepping limits (since fcrontab will run \$EDITOR).
account include system-auth
session include system-auth
EOF
use pam && newpamd "${T}"/fcrontab.pam fcrontab
newinitd "${FILESDIR}"/fcron.init-r5 fcron
systemd_newunit "${S}/script/fcron.init.systemd" fcron.service
newconfd "${FILESDIR}"/fcron.confd fcron
local DOCS=( MANIFEST VERSION "${WORKDIR}/crontab")
DOCS+=( doc/en/txt/{readme,thanks,faq,todo,relnotes,changes}.txt )
local HTML_DOCS=( doc/en/HTML/. )
einstalldocs
newdoc files/fcron.conf fcron.conf.sample
doman doc/en/man/*.{1,5,8}
for lang in fr; do
use l10n_${lang} || continue
doman -i18n=${lang} doc/${lang}/man/*.{1,5,8}
docinto html/${lang}
dodoc -r doc/${lang}/HTML/.
done
}
pkg_postinst() {
if [[ -z "${REPLACING_VERSIONS}" ]]; then
# This is a new installation
elog "Make sure you execute"
elog ""
elog " # emerge --config ${CATEGORY}/${PN}"
elog ""
elog "to install the default systab on this system."
else
local v
for v in ${REPLACING_VERSIONS}; do
if ! version_is_at_least "3.2.1" ${v}; then
# This is an upgrade
elog "fcron's default systab was updated since your last installation."
elog "You can use"
elog ""
elog " # emerge --config ${CATEGORY}/${PN}"
elog ""
elog "to re-install systab (do not call this command before you"
elog "have merged your configuration files)."
# Show this elog only once
break
fi
done
fi
if ! use system-crontab; then
echo ""
ewarn "Remember that fcron will *not* use /etc/cron.d in this configuration"
ewarn "due to USE=-system-crontab!"
echo ""
fi
}
pkg_config() {
if [[ $(fcrontab -l -u systab 2>/dev/null) ]]; then
eerror "We're not going to make any change to your systab as long as"
eerror "it contains data; please clear it before proceeding."
eerror "You can do that with"
eerror ""
eerror " # fcrontab -u systab -r"
eerror ""
eerror "However you are advised to do this by hand to review existing"
eerror "systab just in case."
return 1
fi
if use system-crontab; then
elog "This is going to set up fcron to execute check_system_crontabs."
elog "In this configuration, /etc/crontab and /etc/cron.d are respected."
elog "Per default fcron will check for modifications every 10 minutes."
/usr/libexec/check_system_crontabs -v -i -f
else
elog "This is going to set up fcron to set up a default systab that"
elog "executes /etc/cron.{hourly,daily,weekly,monthly} but will ignore"
elog "/etc/crontab and /etc/cron.d."
fcrontab -u systab - <<- EOF
!serial(true)
00 * * * * /bin/rm -f /var/spool/cron/lastrun/cron.hourly
00 00 * * * /bin/rm -f /var/spool/cron/lastrun/cron.daily
00 00 * * 6 /bin/rm -f /var/spool/cron/lastrun/cron.weekly
00 00 1 * * /bin/rm -f /var/spool/cron/lastrun/cron.monthly
*/10 * * * * /usr/bin/test -x /usr/sbin/run-crons && /usr/sbin/run-crons
!serial(false)
EOF
fi
}
|