live-build/helpers/lh_chroot_sources

313 lines
8.4 KiB
Plaintext
Raw Normal View History

2007-09-23 08:04:46 +00:00
#!/bin/sh
# lh_chroot_sources(1) - manage /etc/apt/sources.list
2008-03-06 14:43:00 -01:00
# Copyright (C) 2006-2008 Daniel Baumann <daniel@debian.org>
2007-09-23 08:04:48 +00:00
#
# live-helper comes with ABSOLUTELY NO WARRANTY; for details see COPYING.
# This is free software, and you are welcome to redistribute it
# under certain conditions; see COPYING for details.
2007-09-23 08:04:46 +00:00
set -e
2007-09-23 08:05:11 +00:00
# Including common functions
LH_BASE="${LH_BASE:-/usr/share/live-helper}"
for FUNCTION in "${LH_BASE}"/functions/*.sh
2007-09-23 08:04:46 +00:00
do
2007-09-23 08:05:11 +00:00
. "${FUNCTION}"
2007-09-23 08:04:46 +00:00
done
2007-09-23 08:05:11 +00:00
# Setting static variables
2007-09-23 08:04:48 +00:00
DESCRIPTION="manage /etc/apt/sources.list"
HELP=""
USAGE="${PROGRAM} {install|remove} [--force]"
Arguments "${@}"
2007-09-23 08:04:46 +00:00
# Reading configuration files
2008-04-07 10:10:21 +00:00
Read_conffile config/all config/common config/bootstrap config/chroot config/binary config/source
2007-09-23 08:04:46 +00:00
Set_defaults
# Requiring stage file
2007-09-23 08:04:47 +00:00
Require_stagefile .stage/bootstrap
2007-09-23 08:04:46 +00:00
case "${1}" in
install)
2007-09-23 08:05:12 +00:00
Echo_message "Configuring file /etc/apt/sources.list"
2007-09-23 08:04:46 +00:00
# Checking stage file
2007-09-23 08:04:47 +00:00
Check_stagefile .stage/chroot_sources
2007-09-23 08:04:46 +00:00
2007-09-23 08:04:50 +00:00
# Checking lock file
Check_lockfile .lock
# Creating lock file
Create_lockfile .lock
2007-09-23 08:04:46 +00:00
# Configure custom sources.list
echo "deb ${LH_MIRROR_CHROOT} ${LH_DISTRIBUTION} ${LH_SECTIONS}" > chroot/etc/apt/sources.list
2007-09-23 08:04:46 +00:00
2007-09-23 08:05:17 +00:00
if [ "${LH_SOURCE}" = "enabled" ]
2007-09-23 08:04:46 +00:00
then
echo "deb-src ${LH_MIRROR_CHROOT} ${LH_DISTRIBUTION} ${LH_SECTIONS}" >> chroot/etc/apt/sources.list
2007-09-23 08:04:46 +00:00
fi
2007-09-23 08:05:17 +00:00
if [ "${LH_SECURITY}" = "enabled" ]
2007-09-23 08:04:46 +00:00
then
2007-10-19 10:45:57 +00:00
if [ "${LH_DISTRIBUTION}" != "sid" ] && [ "${LH_DISTRIBUTION}" != "unstable" ]
then
echo "deb ${LH_MIRROR_CHROOT_SECURITY} ${LH_DISTRIBUTION}/updates ${LH_SECTIONS}" >> chroot/etc/apt/sources.list
2007-09-23 08:04:51 +00:00
2007-10-19 10:45:57 +00:00
if [ "${LH_SOURCE}" = "enabled" ]
then
echo "deb-src ${LH_MIRROR_CHROOT_SECURITY} ${LH_DISTRIBUTION}/updates ${LH_SECTIONS}" >> chroot/etc/apt/sources.list
2007-10-19 10:45:57 +00:00
fi
fi
2007-09-23 08:04:46 +00:00
fi
2007-09-23 08:04:47 +00:00
# Check local sources.list
if ls config/chroot_sources/*.chroot > /dev/null 2>&1
2007-09-23 08:04:47 +00:00
then
echo "" >> chroot/etc/apt/sources.list
echo "# Custom repositories" >> chroot/etc/apt/sources.list
2007-09-23 08:04:49 +00:00
for FILE in config/chroot_sources/*.chroot
2007-09-23 08:04:49 +00:00
do
2007-09-23 08:04:50 +00:00
cat ${FILE} | grep -v "^##" >> chroot/etc/apt/sources.list
2007-09-23 08:04:49 +00:00
done
fi
Install local packages using a local APT repo instead of using "dpkg -i" This patch modifies chroot_sources to build a small APT repo of the local-packages and use that for local package installation instead of "dpkg -i". This has a few advantages: * Removes the true ugliness that is "dpkg -i *.deb && apt-get install -f". This not only is slow and brittle, it causes scary "dpkg dependency error" messages to appear in build logs. * We can (ie. not implemented here) move to installing all the packages from: - lh_chroot_packages (ie. ${LH_PACKAGES}) - lh_chroot_local-packages (ie. config/chroot_local-packages/*.deb) - lh_chroot_local-packageslists - lh_chroot_packages-lists - lh_chroot_linux-image .. in one shot. This would primarily improve speed as we would not keep invoking ${LH_APT}, and package installations can share triggers and suchlike -- installing a custom live-initramfs via local packages currently costs an additional "update-initramfs -u" call. It would also fix a number of obscure dependency cases, such as the one documented in #475739, and--if the user is using aptitude--may even result in better resolution choices. * Removes some messy and somewhat brittle code in lh_chroot_linux-image that edgecases a local live-initramfs. The disadvantages are: * If local packages are being used and we are building in a chroot, we must refresh the sources list and rebuild the repo before building the binary images. (However, before this patch, we had to do this anyway if the binary mirrors were different from the chroot ones.) * We must add a little hack to the minimal hook to detect whether we are using local packages and not remove apt-utils (which creates the repository in lh_chroot_sources) if that is the case -- we cannot simply use "Install_package" inside lh_chroot_sources as we are not guaranteed to have working APT data because the minimal hook deliberately removes them!
2008-04-16 05:53:34 +00:00
# Configure local package repository
if ls config/chroot_local-packages/*.deb > /dev/null 2>&1
then
rm -rf chroot/root/local-packages
mkdir -p chroot/root/local-packages
# Copy packages
if ls config/chroot_local-packages/*_"${LH_ARCHITECTURE}".deb > /dev/null 2>&1
then
cp -l config/chroot_local-packages/*_"${LH_ARCHITECTURE}".deb chroot/root/local-packages
Install local packages using a local APT repo instead of using "dpkg -i" This patch modifies chroot_sources to build a small APT repo of the local-packages and use that for local package installation instead of "dpkg -i". This has a few advantages: * Removes the true ugliness that is "dpkg -i *.deb && apt-get install -f". This not only is slow and brittle, it causes scary "dpkg dependency error" messages to appear in build logs. * We can (ie. not implemented here) move to installing all the packages from: - lh_chroot_packages (ie. ${LH_PACKAGES}) - lh_chroot_local-packages (ie. config/chroot_local-packages/*.deb) - lh_chroot_local-packageslists - lh_chroot_packages-lists - lh_chroot_linux-image .. in one shot. This would primarily improve speed as we would not keep invoking ${LH_APT}, and package installations can share triggers and suchlike -- installing a custom live-initramfs via local packages currently costs an additional "update-initramfs -u" call. It would also fix a number of obscure dependency cases, such as the one documented in #475739, and--if the user is using aptitude--may even result in better resolution choices. * Removes some messy and somewhat brittle code in lh_chroot_linux-image that edgecases a local live-initramfs. The disadvantages are: * If local packages are being used and we are building in a chroot, we must refresh the sources list and rebuild the repo before building the binary images. (However, before this patch, we had to do this anyway if the binary mirrors were different from the chroot ones.) * We must add a little hack to the minimal hook to detect whether we are using local packages and not remove apt-utils (which creates the repository in lh_chroot_sources) if that is the case -- we cannot simply use "Install_package" inside lh_chroot_sources as we are not guaranteed to have working APT data because the minimal hook deliberately removes them!
2008-04-16 05:53:34 +00:00
fi
if ls config/chroot_local-packages/*_all.deb > /dev/null 2>&1
then
cp -l config/chroot_local-packages/*_all.deb chroot/root/local-packages
Install local packages using a local APT repo instead of using "dpkg -i" This patch modifies chroot_sources to build a small APT repo of the local-packages and use that for local package installation instead of "dpkg -i". This has a few advantages: * Removes the true ugliness that is "dpkg -i *.deb && apt-get install -f". This not only is slow and brittle, it causes scary "dpkg dependency error" messages to appear in build logs. * We can (ie. not implemented here) move to installing all the packages from: - lh_chroot_packages (ie. ${LH_PACKAGES}) - lh_chroot_local-packages (ie. config/chroot_local-packages/*.deb) - lh_chroot_local-packageslists - lh_chroot_packages-lists - lh_chroot_linux-image .. in one shot. This would primarily improve speed as we would not keep invoking ${LH_APT}, and package installations can share triggers and suchlike -- installing a custom live-initramfs via local packages currently costs an additional "update-initramfs -u" call. It would also fix a number of obscure dependency cases, such as the one documented in #475739, and--if the user is using aptitude--may even result in better resolution choices. * Removes some messy and somewhat brittle code in lh_chroot_linux-image that edgecases a local live-initramfs. The disadvantages are: * If local packages are being used and we are building in a chroot, we must refresh the sources list and rebuild the repo before building the binary images. (However, before this patch, we had to do this anyway if the binary mirrors were different from the chroot ones.) * We must add a little hack to the minimal hook to detect whether we are using local packages and not remove apt-utils (which creates the repository in lh_chroot_sources) if that is the case -- we cannot simply use "Install_package" inside lh_chroot_sources as we are not guaranteed to have working APT data because the minimal hook deliberately removes them!
2008-04-16 05:53:34 +00:00
fi
if ls chroot/root/local-packages/*.deb > /dev/null 2>&1
then
# Generate Packages.gz
echo "cd /root/local-packages && apt-ftparchive packages . > Packages" | Chroot sh
gzip -9 chroot/root/local-packages/Packages
# Add to sources.list
echo "" >> chroot/etc/apt/sources.list
echo "# Local packages" >> chroot/etc/apt/sources.list
echo "deb file:/root/local-packages ./" >> chroot/etc/apt/sources.list
else
Echo_warning "Local packages must be named with suffix '_all.deb' or '_\$architecture.deb'."
fi
fi
2007-09-23 08:04:52 +00:00
# Update indices from cache
2007-09-23 08:05:09 +00:00
if [ "${LH_CACHE_INDICES}" = "enabled" ] && [ -d cache/indices_bootstrap ]
2007-09-23 08:04:49 +00:00
then
2007-09-23 08:05:11 +00:00
if ls cache/indices_bootstrap/secring.gpg* > /dev/null 2>&1
2007-09-23 08:04:52 +00:00
then
2007-09-23 08:05:09 +00:00
cp -f cache/indices_bootstrap/secring.gpg* chroot/etc/apt
2007-09-23 08:04:52 +00:00
fi
2007-09-23 08:04:49 +00:00
2007-09-23 08:05:11 +00:00
if ls cache/indices_bootstrap/trusted.gpg* > /dev/null 2>&1
2007-09-23 08:04:52 +00:00
then
2007-09-23 08:05:09 +00:00
cp -f cache/indices_bootstrap/trusted.gpg* chroot/etc/apt
2007-09-23 08:04:52 +00:00
fi
2007-09-23 08:04:47 +00:00
2007-09-23 08:05:09 +00:00
if [ -f cache/indices_bootstrap/pkgcache.bin ]
2007-09-23 08:04:52 +00:00
then
2007-09-23 08:05:09 +00:00
cp -f cache/indices_bootstrap/pkgcache.bin chroot/var/cache/apt
2007-09-23 08:04:52 +00:00
fi
2007-09-23 08:05:09 +00:00
if [ -f cache/indices_bootstrap/srcpkgcache.bin ]
2007-09-23 08:04:52 +00:00
then
2007-09-23 08:05:09 +00:00
cp -f cache/indices_bootstrap/srcpkgcache.bin chroot/var/cache/apt
2007-09-23 08:04:52 +00:00
fi
2007-09-23 08:05:11 +00:00
if ls cache/indices_bootstrap/*_Packages > /dev/null 2>&1
2007-09-23 08:04:52 +00:00
then
2007-09-23 08:05:09 +00:00
cp -f cache/indices_bootstrap/*_Packages chroot/var/lib/apt/lists
2007-09-23 08:04:52 +00:00
fi
2007-09-23 08:05:11 +00:00
if ls cache/indices_bootstrap/*_Sources > /dev/null 2>&1
2007-09-23 08:04:52 +00:00
then
2007-09-23 08:05:09 +00:00
cp -f cache/indices_bootstrap/*_Sources chroot/var/lib/apt/lists
2007-09-23 08:04:52 +00:00
fi
2007-09-23 08:05:11 +00:00
if ls cache/indices_bootstrap/*_Release* > /dev/null 2>&1
2007-09-23 08:04:52 +00:00
then
2007-09-23 08:05:09 +00:00
cp -f cache/indices_bootstrap/*_Release* chroot/var/lib/apt/lists
2007-09-23 08:04:52 +00:00
fi
if [ "${LH_APT}" = "aptitude" ] && [ ! -x /usr/bin/aptitude ]
2007-09-23 08:04:46 +00:00
then
Chroot "apt-get ${APT_OPTIONS} install aptitude"
2007-09-23 08:04:46 +00:00
fi
2007-09-23 08:04:52 +00:00
else # Get fresh indices
# Check local gpg keys
if ls config/chroot_sources/*.chroot.gpg > /dev/null 2>&1
2007-09-23 08:04:52 +00:00
then
for FILE in config/chroot_sources/*.chroot.gpg
2007-09-23 08:04:52 +00:00
do
cp ${FILE} chroot/root
Chroot "apt-key add /root/$(basename ${FILE})"
rm -f chroot/root/$(basename ${FILE})
2007-09-23 08:04:52 +00:00
done
fi
2007-09-23 08:04:46 +00:00
2007-09-23 08:04:52 +00:00
# Check local keyring packages
2007-09-23 08:05:11 +00:00
if ls config/chroot_sources/*.deb > /dev/null 2>&1
2007-09-23 08:04:52 +00:00
then
for PACKAGE in config/chroot_sources/*.deb
do
cp ${PACKAGE} chroot/root
Chroot "dpkg -i /root/$(basename ${PACKAGE})"
rm -f chroot/root/$(basename ${PACKAGE})
2007-09-23 08:04:52 +00:00
done
fi
2007-09-23 08:04:46 +00:00
2007-09-23 08:04:52 +00:00
# Installing aptitude
if [ "${LH_APT}" = "aptitude" ] && [ ! -x /usr/bin/aptitude ]
2007-09-23 08:04:52 +00:00
then
Chroot "apt-get ${APT_OPTIONS} update"
Chroot "apt-get ${APT_OPTIONS} install aptitude"
2007-09-23 08:04:52 +00:00
fi
Apt update
Apt upgrade
Apt dist-upgrade
2007-09-23 08:04:52 +00:00
# Installing keyring packages
2007-09-23 08:05:17 +00:00
if [ -n "${LH_KEYRING_PACKAGES}" ]
2007-09-23 08:04:52 +00:00
then
Apt --force-yes install "${LH_KEYRING_PACKAGES}"
Apt update
2007-09-23 08:04:52 +00:00
fi
if [ "${LH_CACHE_INDICES}" = "enabled" ]
then
2007-09-23 08:05:11 +00:00
mkdir -p cache/indices_bootstrap
2007-09-23 08:04:52 +00:00
2007-09-23 08:05:09 +00:00
cp -f chroot/etc/apt/secring.gpg* cache/indices_bootstrap
cp -f chroot/etc/apt/trusted.gpg* cache/indices_bootstrap
2007-09-23 08:04:52 +00:00
2007-09-23 08:05:09 +00:00
cp -f chroot/var/cache/apt/pkgcache.bin cache/indices_bootstrap
if ls chroot/var/cache/apt/srcpkgcache.bin > /dev/null 2>&1
then
cp -f chroot/var/cache/apt/srcpkgcache.bin cache/indices_bootstrap
fi
2007-09-23 08:04:52 +00:00
2007-09-23 08:05:09 +00:00
cp -f chroot/var/lib/apt/lists/*_Packages cache/indices_bootstrap
if ls chroot/var/lib/apt/lists/*_Sources > /dev/null 2>&1
then
cp -f chroot/var/lib/apt/lists/*_Sources cache/indices_bootstrap
fi
2007-09-23 08:05:09 +00:00
cp -f chroot/var/lib/apt/*_Release* cache/indices_bootstrap
2007-09-23 08:04:52 +00:00
fi
2007-09-23 08:04:49 +00:00
fi
2007-09-23 08:04:46 +00:00
# Creating stage file
2007-09-23 08:04:47 +00:00
Create_stagefile .stage/chroot_sources
2007-09-23 08:04:46 +00:00
;;
remove)
2007-09-23 08:05:12 +00:00
Echo_message "Deconfiguring file /etc/apt/sources.list"
2007-09-23 08:04:50 +00:00
# Checking lock file
Check_lockfile .lock
# Creating lock file
Create_lockfile .lock
2007-09-23 08:04:46 +00:00
# Configure generic indices
2007-09-23 08:05:17 +00:00
if [ "${LH_BINARY_INDICES}" = "enabled" ]
2007-09-23 08:04:46 +00:00
then
2007-09-23 08:04:49 +00:00
# Don't do anything if it's not required
if [ "${LH_MIRROR_CHROOT}" = "${LH_MIRROR_BINARY}" ] && \
Install local packages using a local APT repo instead of using "dpkg -i" This patch modifies chroot_sources to build a small APT repo of the local-packages and use that for local package installation instead of "dpkg -i". This has a few advantages: * Removes the true ugliness that is "dpkg -i *.deb && apt-get install -f". This not only is slow and brittle, it causes scary "dpkg dependency error" messages to appear in build logs. * We can (ie. not implemented here) move to installing all the packages from: - lh_chroot_packages (ie. ${LH_PACKAGES}) - lh_chroot_local-packages (ie. config/chroot_local-packages/*.deb) - lh_chroot_local-packageslists - lh_chroot_packages-lists - lh_chroot_linux-image .. in one shot. This would primarily improve speed as we would not keep invoking ${LH_APT}, and package installations can share triggers and suchlike -- installing a custom live-initramfs via local packages currently costs an additional "update-initramfs -u" call. It would also fix a number of obscure dependency cases, such as the one documented in #475739, and--if the user is using aptitude--may even result in better resolution choices. * Removes some messy and somewhat brittle code in lh_chroot_linux-image that edgecases a local live-initramfs. The disadvantages are: * If local packages are being used and we are building in a chroot, we must refresh the sources list and rebuild the repo before building the binary images. (However, before this patch, we had to do this anyway if the binary mirrors were different from the chroot ones.) * We must add a little hack to the minimal hook to detect whether we are using local packages and not remove apt-utils (which creates the repository in lh_chroot_sources) if that is the case -- we cannot simply use "Install_package" inside lh_chroot_sources as we are not guaranteed to have working APT data because the minimal hook deliberately removes them!
2008-04-16 05:53:34 +00:00
[ "${LH_MIRROR_CHROOT_SECURITY}" = "${LH_MIRROR_BINARY_SECURITY}" ] && \
[ ! -d chroot/root/local-packages ]
2007-09-23 08:04:49 +00:00
then
2007-09-23 08:05:16 +00:00
# Removing stage file
rm -f .stage/chroot_sources
2007-09-23 08:04:49 +00:00
exit 0
fi
2007-09-23 08:04:46 +00:00
# Cleaning apt list cache
2007-09-23 08:04:47 +00:00
rm -rf chroot/var/lib/apt/lists
mkdir -p chroot/var/lib/apt/lists/partial
2007-09-23 08:04:46 +00:00
2007-09-23 08:05:17 +00:00
echo "deb ${LH_MIRROR_BINARY} ${LH_DISTRIBUTION} ${LH_SECTIONS}" > chroot/etc/apt/sources.list
2007-09-23 08:04:46 +00:00
2007-09-23 08:05:17 +00:00
if [ "${LH_SOURCE}" = "enabled" ]
2007-09-23 08:04:46 +00:00
then
2007-09-23 08:05:17 +00:00
echo "deb-src ${LH_MIRROR_BINARY} ${LH_DISTRIBUTION} ${LH_SECTIONS}" >> chroot/etc/apt/sources.list
2007-09-23 08:04:46 +00:00
fi
2007-09-23 08:05:17 +00:00
if [ "${LH_SECURITY}" = "enabled" ]
2007-09-23 08:04:46 +00:00
then
2007-10-19 10:45:57 +00:00
if [ "${LH_DISTRIBUTION}" != "sid" ] && [ "${LH_DISTRIBUTION}" != "unstable" ]
then
echo "deb ${LH_MIRROR_BINARY_SECURITY} ${LH_DISTRIBUTION}/updates ${LH_SECTIONS}" >> chroot/etc/apt/sources.list
if [ "${LH_SOURCE}" = "enabled" ]
then
echo "deb-src ${LH_MIRROR_BINARY_SECURITY} ${LH_DISTRIBUTION}/updates ${LH_SECTIONS}" >> chroot/etc/apt/sources.list
fi
fi
2007-09-23 08:04:46 +00:00
fi
2007-09-23 08:04:47 +00:00
# Check local sources.list
2007-09-23 08:05:11 +00:00
if ls config/chroot_sources/*.binary > /dev/null 2>&1
2007-09-23 08:04:47 +00:00
then
echo "" >> chroot/etc/apt/sources.list
echo "# Custom repositories" >> chroot/etc/apt/sources.list
2007-09-23 08:04:49 +00:00
2007-09-23 08:05:09 +00:00
for FILE in config/chroot_sources/*.binary
2007-09-23 08:04:49 +00:00
do
2007-09-23 08:04:50 +00:00
cat ${FILE} | grep -v "^##" >> chroot/etc/apt/sources.list
2007-09-23 08:04:49 +00:00
done
fi
# Check local gpg keys
2007-09-23 08:05:11 +00:00
if ls config/chroot_sources/*.binary.gpg > /dev/null 2>&1
2007-09-23 08:04:49 +00:00
then
2007-09-23 08:05:09 +00:00
for FILE in config/chroot_sources/*.binary.gpg
2007-09-23 08:04:49 +00:00
do
cp ${FILE} chroot/root
Chroot "apt-key add /root/$(basename ${FILE})"
rm -f chroot/root/$(basename ${FILE})
2007-09-23 08:04:49 +00:00
done
2007-09-23 08:04:47 +00:00
fi
# Updating indices
Apt update
2007-09-23 08:04:46 +00:00
fi
# Cleaning apt packages cache
2007-09-23 08:04:47 +00:00
rm -rf chroot/var/cache/apt
mkdir -p chroot/var/cache/apt/archives/partial
2007-09-23 08:04:46 +00:00
Install local packages using a local APT repo instead of using "dpkg -i" This patch modifies chroot_sources to build a small APT repo of the local-packages and use that for local package installation instead of "dpkg -i". This has a few advantages: * Removes the true ugliness that is "dpkg -i *.deb && apt-get install -f". This not only is slow and brittle, it causes scary "dpkg dependency error" messages to appear in build logs. * We can (ie. not implemented here) move to installing all the packages from: - lh_chroot_packages (ie. ${LH_PACKAGES}) - lh_chroot_local-packages (ie. config/chroot_local-packages/*.deb) - lh_chroot_local-packageslists - lh_chroot_packages-lists - lh_chroot_linux-image .. in one shot. This would primarily improve speed as we would not keep invoking ${LH_APT}, and package installations can share triggers and suchlike -- installing a custom live-initramfs via local packages currently costs an additional "update-initramfs -u" call. It would also fix a number of obscure dependency cases, such as the one documented in #475739, and--if the user is using aptitude--may even result in better resolution choices. * Removes some messy and somewhat brittle code in lh_chroot_linux-image that edgecases a local live-initramfs. The disadvantages are: * If local packages are being used and we are building in a chroot, we must refresh the sources list and rebuild the repo before building the binary images. (However, before this patch, we had to do this anyway if the binary mirrors were different from the chroot ones.) * We must add a little hack to the minimal hook to detect whether we are using local packages and not remove apt-utils (which creates the repository in lh_chroot_sources) if that is the case -- we cannot simply use "Install_package" inside lh_chroot_sources as we are not guaranteed to have working APT data because the minimal hook deliberately removes them!
2008-04-16 05:53:34 +00:00
# Remove local package repository
rm -rf chroot/root/local-packages
2007-09-23 08:04:46 +00:00
# Removing stage file
2007-09-23 08:04:47 +00:00
rm -f .stage/chroot_sources
2007-09-23 08:04:46 +00:00
;;
*)
2007-09-23 08:04:48 +00:00
Usage
2007-09-23 08:04:46 +00:00
;;
esac