pkg-deinstall

#! /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}

pkg-descr

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

pkg-install

#! /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 < "${subdir}" must be a true subdirectory of "${dir}", not a symbolic link.
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 <>/etc/syslog.conf
!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 <>/etc/newsyslog.conf
/var/log/cvsup.log 664 7 * 24 Z
/var/log/cvsupd.log 664 7 * 24 Z
EOF
echo "Done."
else
cat < OK, please remember to do it yourself. You should log "${facility}.info"
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 <>/etc/crontab
${m} ${hstr} * * * root ${base}/update.sh
EOF
cat < Done. The first update will be ${delay} minutes from now, at ${hh}:${mm}.
The cvsupd server will be started automatically after the first update,
and whenever you reboot.
EOF
else
cat < OK, please remember to do it yourself. The crontab entry should run
"${base}/update.sh" as root.
EOF
fi
fi

echo ""
echo "You are now a FreeBSD mirror site."
;;
esac

pkg-plist

etc/cvsup/config.sh
etc/cvsup/cvsupd.access
etc/cvsup/sup.client/distrib/refuse.self
etc/cvsup/supfile
etc/cvsup/update.sh