an easy and consistent way of installing software ported to FreeBSD
#! /bin/sh
ask() {
local question default answer
question=$1
default=$2
if [ -z "${PACKAGE_BUILDING}" ]; then
read -p "${question} [${default}]? " answer
fi
if [ x${answer} = x ]; then
answer=${default}
fi
echo ${answer}
}
yesno() {
local dflt question answer
question=$1
dflt=$2
while :; do
answer=$(ask "${question}" "${dflt}")
case "${answer}" in
[Yy]*) return 0;;
[Nn]*) return 1;;
esac
echo "Please answer yes or no."
done
}
delete_account() {
local u g home
u=$1
g=$2
if yesno "Do you want me to remove group \"${g}\"" y; then
pw groupdel -n ${g}
echo "Done."
fi
if yesno "Do you want me to remove user \"${u}\"" y; then
eval home=~${u}
pw userdel -n ${u}
echo "Done."
if [ -d "${home}" ]; then
echo "Please remember to remove the home directory \"${home}\" as"
echo "well as the mirrored files."
fi
fi
}
if [ x$2 != xDEINSTALL ]; then
exit
fi
export PATH=/bin:/usr/bin:/usr/sbin
base=${PKG_PREFIX}/etc/cvsup
. ${base}/config.sh || exit
if ps -axc | grep -q cvsupd; then
if yesno "There are some cvsupd processes running. Shall I kill them" y
then
killall cvsupd
sleep 2
else
echo "OK ... I hope you know what you are doing."
fi
fi
tmp="/etc/#cvsma$$"
trap "rm -f ${tmp}" 0 1 2 3 15
rm -rf ${base}/prefixes
rm -f ${base}/.start_server
if yesno "Do you want me to remove scheduled updates from \"/etc/crontab\"" y
then
sed "/\/etc\/cvsup\/update\.sh/d" /etc/crontab >${tmp} || exit
chmod 644 ${tmp}
mv ${tmp} /etc/crontab || exit
echo "Done."
fi
if yesno \
"Do you want me to remove the cvsupd logging from \"/etc/syslog.conf\"" y
then
sed "/^!cvsupd/,/cvsupd\.log\$/d" /etc/syslog.conf >${tmp} || exit
chmod 644 ${tmp}
mv ${tmp} /etc/syslog.conf || exit
if [ -f /var/run/syslog.pid ]; then
echo "Giving syslogd a kick in the pants."
kill -HUP $(cat /var/run/syslog.pid)
fi
echo "Done."
fi
if yesno "Do you want me to remove the cvsup and cvsupd log entries from \
\"/etc/newsyslog.conf\"" y; then
sed "/cvsup\.log/d
/cvsupd\.log/d" /etc/newsyslog.conf >${tmp} || exit
chmod 644 ${tmp}
mv ${tmp} /etc/newsyslog.conf || exit
echo "Done."
fi
delete_account ${user} ${group}
delete_account ${cuser} ${cgroup}
This is the CVSup Mirror Kit, an easy way to set up a FreeBSD mirror
site. When you type "make", it asks you a few questions about
which files you want to mirror, where you want to put them on your
disks, where you want to update them from, etc. After a "make
install" your system will then be running as a nearly self-maintaining
FreeBSD mirror site. It will even update its own configuration
files from the master site automatically.
This kit is not for people who just want to keep their own files
up to date with CVSup. It is for people who wish to run servers
that distribute the FreeBSD sources to others.
This port requires CVSup version 15.3 or later.
WWW: http://www.cvsup.org/
jdp@FreeBSD.org
#! /bin/sh
base=${PREFIX}/etc/cvsup
prefixes=${base}/prefixes
chmods_done=" "
ask() {
local question default answer
question=$1
default=$2
if [ -z "${PACKAGE_BUILDING}" ]; then
read -p "${question} [${default}]? " answer
fi
if [ x${answer} = x ]; then
answer=${default}
fi
echo ${answer}
}
yesno() {
local dflt question answer
question=$1
dflt=$2
while :; do
answer=$(ask "${question}" "${dflt}")
case "${answer}" in
[Yy]*) return 0;;
[Nn]*) return 1;;
esac
echo "Please answer yes or no."
done
}
install_links() {
local link dir subdir path
while [ $# -ge 3 ]; do
link=$1
dir=$2
subdir=$3
echo " Linking ${link} -> ${dir}"
ln -sf ${dir} ${prefixes}/${link} || exit
if [ "x${dir}" != "xSKIP" -a "x${dir}" != "x.." ]; then
if [ "x${subdir}" = "x." ]; then
path=${dir}
else
path=${dir}/${subdir}
fi
( cd ${prefixes} || exit
if [ "x${subdir}" != "x." -a -h ${path} ]; then
cat <
Please remove the symbolic link and/or configure again using the true
directory path to "${subdir}".
EOF
exit 1
fi
test -d ${path} || mkdir -p ${path} || exit ) || exit
if ! expr "${chmods_done}" : ".* ${path} " >/dev/null 2>&1; then
echo -n " Fixing ownerships and modes in ${path} ..."
( chdir ${prefixes} && \
chown -R ${cuser}:${cgroup} ${path} && \
chmod -R a+rX ${path} ) || exit
echo " done."
chmods_done="${chmods_done}${path} "
fi
fi
shift 3
done
}
make_account() {
local u g gcos homeopt home
u=$1
g=$2
gcos=$3
homeopt=${4:+"-d $4"}
if pw group show "${g}" >/dev/null 2>&1; then
echo "You already have a group \"${g}\", so I will use it."
else
echo "You need a group \"${g}\"."
if which -s pw && yesno "Would you like me to create it" y; then
pw groupadd ${g} || exit
echo "Done."
else
echo "Please create it, and try again."
if ! grep -q "^${u}:" /etc/passwd; then
echo "While you're at it, please create a user \"${u}\" too,"
echo "with a default group of \"${g}\"."
fi
exit 1
fi
fi
if pw user show "${u}" >/dev/null 2>&1; then
echo "You already have a user \"${u}\", so I will use it."
else
echo "You need a user \"${u}\"."
if which -s pw && yesno "Would you like me to create it" y; then
pw useradd ${u} -g ${g} -h - ${homeopt} \
-s /nonexistent -c "${gcos}" || exit
echo "Done."
else
echo "Please create it, and try again."
exit 1
fi
fi
if [ x"$homeopt" = x ]; then
eval home=~${u}
if [ ! -d "${home}" ]; then
if yesno \
"Would you like me to create ${u}'s home directory (${home})" y
then
mkdir -p ${home}/.cvsup || exit
touch ${home}/.cvsup/auth || exit
chown -R ${u}:${g} ${home} || exit
chmod -R go= ${home} || exit
else
echo "Please create it, and try again."
exit 1
fi
fi
fi
}
case $2 in
POST-INSTALL)
. ${base}/config.sh || exit
if which -s pw && which -s lockf; then
:
else
cat <
This system looks like a pre-2.2 version of FreeBSD. I see that it
is missing the "lockf" and/or "pw" utilities. I need these utilities.
Please get them and install them, and try again. You can get the
sources from:
ftp://ftp.freebsd.org/pub/FreeBSD/FreeBSD-current/src/usr.bin/lockf.tar.gz
ftp://ftp.freebsd.org/pub/FreeBSD/FreeBSD-current/src/usr.sbin/pw.tar.gz
EOF
exit 1
fi
echo ""
make_account ${user} ${group} "CVSup Daemon" "/nonexistent"
make_account ${cuser} ${cgroup} "CVSup Client"
echo "Fixing ownerships and modes in \"${base}\"."
chown -R root:wheel ${base}
test -d ${base}/sup || mkdir -p ${base}/sup
test -d ${base}/sup.client || mkdir -p ${base}/sup.client
chown -R ${cuser}:${cgroup} ${base}/sup ${base}/sup.client
chmod -R go=u-w ${base}
echo "Setting up links and directories for distributions."
test -d ${prefixes} || mkdir ${prefixes} || exit
install_links ${distribs}
echo ""
if grep -q "^[^#]*${facility}.*/var/log/cvsupd.log" /etc/syslog.conf; then
echo -n "It looks like you already have some logging set up, so I "
echo "will use it."
else
if yesno "Would you like me to set up the syslog logging" y; then
echo "Setting up server logging in \"/etc/syslog.conf\"."
cat <
!cvsupd
${facility}.info /var/log/cvsupd.log
EOF
if [ ! -f /var/log/cvsupd.log ]; then
echo "Creating \"/var/log/cvsupd.log\"."
cp /dev/null /var/log/cvsupd.log
fi
if [ -f /var/run/syslog.pid ]; then
echo "Giving syslogd a kick in the pants."
kill -HUP $(cat /var/run/syslog.pid)
fi
echo "Adding cvsup and cvsupd log entry to \"/etc/newsyslog.conf\"."
cat <
/var/log/cvsup.log 664 7 * 24 Z
/var/log/cvsupd.log 664 7 * 24 Z
EOF
echo "Done."
else
cat <
to "/var/log/cvsupd.log". Don't forget to add an entry to
"/etc/newsyslog.conf".
EOF
fi
fi
echo ""
if grep -q "^[^#]*${base}/update\.sh" /etc/crontab; then
echo "It looks like your crontab is already set up, so I'll use that."
else
if [ ${interval} -eq 1 ]; then
updstr="hourly updates"
else
updstr="updates every ${interval} hours"
fi
if yesno "Would you like me to set up your crontab for ${updstr}" y
then
echo "Scheduling ${updstr} in \"/etc/crontab\"."
delay=5
now=$(date "+%s")
start=$((${now} + ${delay}*60))
hh=$(date -r ${start} "+%H")
mm=$(date -r ${start} "+%M")
h=$((${hh}))
m=$((${mm}))
if [ ${interval} -eq 1 ]; then
hstr="*"
else
h0=$((${h} % ${interval}))
if [ ${interval} -eq 24 ]; then
hstr=${h0}
else
h1=$((${h0} + 24 - ${interval}))
hstr=${h0}-${h1}/${interval}
fi
fi
cat <
${m} ${hstr} * * * root ${base}/update.sh
EOF
cat <
The cvsupd server will be started automatically after the first update,
and whenever you reboot.
EOF
else
cat <
"${base}/update.sh" as root.
EOF
fi
fi
echo ""
echo "You are now a FreeBSD mirror site."
;;
esac
etc/cvsup/config.sh
etc/cvsup/cvsupd.access
etc/cvsup/sup.client/distrib/refuse.self
etc/cvsup/supfile
etc/cvsup/update.sh