flatcar-scripts/make_local_repo.sh
rspangler@google.com d74220d772 Start copying over source.
git-svn-id: svn://chrome-svn/chromeos/trunk@4 06c00378-0e64-4dae-be16-12b19f9950a1
2009-10-09 20:56:14 +00:00

226 lines
6.4 KiB
Bash
Executable File

#!/bin/bash
# Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Load common constants. This should be the first executable line.
# The path to common.sh should be relative to your script's location.
. "$(dirname "$0")/common.sh"
# Script must be run outside the chroot
assert_outside_chroot
DEFAULT_DEST="$GCLIENT_ROOT/repo"
DEFAULT_DEV_PKGLIST="$SRC_ROOT/package_repo/repo_list_dev.txt"
DEFAULT_IMG_PKGLIST="$SRC_ROOT/package_repo/repo_list_image.txt"
# Command line options
DEFINE_string suite "$DEFAULT_EXT_SUITE" "Ubuntu suite to pull packages from."
DEFINE_string mirror "$DEFAULT_EXT_MIRROR" "Ubuntu repository mirror to use."
DEFINE_string dest "$DEFAULT_DEST" "Destination directory for repository."
DEFINE_string devlist "$DEFAULT_DEV_PKGLIST" \
"File listing packages to use for development."
DEFINE_string imglist "$DEFAULT_IMG_PKGLIST" \
"File listing packages to use for image."
DEFINE_string devsuite "$DEFAULT_DEV_SUITE" "Dev suite to update."
DEFINE_string imgsuite "$DEFAULT_IMG_SUITE" "Image suite to update."
DEFINE_boolean updev $FLAGS_TRUE "Update development repository."
DEFINE_boolean upimg $FLAGS_TRUE "Update image repository."
# Parse command line flags
FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"
# Die on error
set -e
# Architectures and sections to support in local mirror
REPO_ARCH="i386 armel"
REPO_SECTIONS="main restricted multiverse universe"
# Where to store packages downloaded from external repository, inside the
# chroot.
DEB_CACHE_DIR="/var/cache/make_local_repo"
CHROOT=`readlink -f $FLAGS_dest`
REPO_SUBDIR="apt"
REPO="$CHROOT/$REPO_SUBDIR"
#------------------------------------------------------------------------------
# Functions
# Run a command in the chroot
function in_chroot {
sudo chroot "$CHROOT" "$@"
}
# Run a bash command line in the chroot
function bash_chroot {
# Use $* not $@ since 'bash -c' needs a single arg
sudo chroot "$CHROOT" bash -c "$*"
}
# Clean up chroot mount points
function cleanup_chroot_mounts {
# Clear the trap from setup_chroot_mounts, now that we're unmounting.
trap - EXIT
mount | grep "on $(readlink -f "$CHROOT")" | awk '{print $3}' \
| xargs -r -L1 sudo umount
}
# Set up chroot mount points
function setup_chroot_mounts {
if [ ! -e "$CHROOT/proc" ]; then mkdir -p "$CHROOT/proc"; fi
sudo mount none -t proc "$CHROOT/proc"
if [ ! -e "$CHROOT/dev/pts" ]; then mkdir -p "$CHROOT/dev/pts"; fi
sudo mount none -t devpts "$CHROOT/dev/pts"
# Make sure we clean up the mounts on exit
trap cleanup_chroot_mounts EXIT
}
# Make a minimal chroot
function make_chroot {
echo "Creating chroot to build local package repository..."
mkdir -p "$CHROOT"
# Install packages which may not be installed on the local system
install_if_missing debootstrap
# Add debootstrap link for the suite, if it doesn't exist.
if [ ! -e "/usr/share/debootstrap/scripts/$FLAGS_suite" ]
then
sudo ln -s /usr/share/debootstrap/scripts/gutsy \
"/usr/share/debootstrap/scripts/$FLAGS_suite"
fi
# Run debootstrap
sudo debootstrap --arch=i386 --variant=minbase \
--include=gnupg \
"$FLAGS_suite" "$CHROOT" "$FLAGS_mirror"
# Set up chroot mounts, since the package installs below need them
setup_chroot_mounts
# Install packages into chroot
bash_chroot "echo deb $FLAGS_mirror $FLAGS_suite $REPO_SECTIONS \
> /etc/apt/sources.list"
in_chroot apt-get update
in_chroot apt-get --yes --force-yes install reprepro wget
# Clean up chroot mounts
cleanup_chroot_mounts
}
# Create reprepro repository
function make_repo {
echo "Creating repository directory..."
sudo rm -rf "$REPO"
sudo mkdir -p "$REPO"
sudo chown $USER "$REPO"
mkdir -p "$REPO/conf"
mkdir -p "$REPO/incoming"
# Create the distributions conf file
CONF="$REPO/conf/distributions"
rm -f "$CONF"
cat <<EOF > $CONF
Origin: $FLAGS_mirror
Label: Chrome OS Dev
Suite: stable
Codename: $FLAGS_devsuite
Version: 3.1
Architectures: $REPO_ARCH
Components: $REPO_SECTIONS
Description: Chrome OS Development
Origin: $FLAGS_mirror
Label: Chrome OS
Suite: stable
Codename: $FLAGS_imgsuite
Version: 3.1
Architectures: $REPO_ARCH
Components: $REPO_SECTIONS
Description: Chrome OS Image
EOF
}
# Update a suite in the repository from a list of packages
function update_suite {
SUITE="${1:?}"
PKGLIST="${2:?}"
echo "Updating $SUITE from $PKGLIST..."
# Clear the suite first
# Since packages are either source or not, this removes all of them.
in_chroot reprepro -b "$REPO_SUBDIR" removefilter "$SUITE" "!Source"
in_chroot reprepro -b "$REPO_SUBDIR" removefilter "$SUITE" "Source"
# Add packages to the suite
echo "Downloading packages..."
for DEB in `grep -v '^#' < $PKGLIST | awk '{print $1}'`
do
echo "Adding $DEB..."
DEB_PRIO=`cat $PKGLIST | grep '^'$DEB' ' | awk '{print $3}'`
DEB_SECTION=`cat $PKGLIST | grep '^'$DEB' ' | awk '{print $4}'`
DEB_PATH=`cat $PKGLIST | grep '^'$DEB' ' | awk '{print $5}'`
DEB_FILE="$DEB_CACHE_DIR/"`basename $DEB_PATH`
# Download the package if necessary
if [ ! -e "$CHROOT/$DEB_FILE" ]
then
in_chroot wget --no-verbose "$FLAGS_mirror/${DEB_PATH}" -O "$DEB_FILE"
fi
# Copy the file into the target suite with the correct priority
in_chroot reprepro -b "$REPO_SUBDIR" -P "$DEB_PRIO" -S "$DEB_SECTION" \
includedeb "$SUITE" "$DEB_FILE"
done
}
#------------------------------------------------------------------------------
# Create a minimal chroot in which we can run reprepro, if one doesn't
# already exist. Necessary since the version of reprepro available on
# older systems is buggy.
if [ ! -e "$CHROOT" ]
then
make_chroot
fi
# Set up chroot mounts
setup_chroot_mounts
# Create/update repo. Need to run this every time so we rebuild the
# distributions file.
make_repo
# Create cache directory for downloaded .debs. This needs to be outside the
# repository so we can delete and rebuild the repository without needing to
# re-download all the .debs.
if [ ! -e "$CHROOT/$DEB_CACHE_DIR" ]
then
sudo mkdir -p "$CHROOT/$DEB_CACHE_DIR"
sudo chown $USER "$CHROOT/$DEB_CACHE_DIR"
fi
# Update the development and image suites
if [ $FLAGS_updev -eq $FLAGS_TRUE ]
then
update_suite $FLAGS_devsuite $FLAGS_devlist
fi
if [ $FLAGS_upimg -eq $FLAGS_TRUE ]
then
update_suite $FLAGS_imgsuite $FLAGS_imglist
fi
# Clean up the chroot mounts
cleanup_chroot_mounts
echo "Done."