[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: apt-get wrapper for maintaining Partial Mirrors



Actually attaching the file this time...

On Sat, Jun 20, 2009 at 01:54:28AM +0000, Tzafrir Cohen wrote:
> On Fri, Jun 19, 2009 at 06:23:08AM -0500, Joseph Rawson wrote:
> > On Friday 19 June 2009 05:09:31 Tzafrir Cohen wrote:
> > > On Fri, Jun 19, 2009 at 01:52:43AM -0500, Joseph Rawson wrote:
> > > > would be much more interested in making a tool that would make it easier
> > > > to manage local/partial debian mirrors (i.e. one that helped resolve the
> > > > dependencies), rather than have an apt-get wrapper.  I also think that
> > > > once such a tool is made, it would make it easier to build an apt-get
> > > > wrapper that works with it.  I don't think that viewing the problem with
> > > > an "apt-get wrapper" solution is the best way to approach it, but I do
> > > > think that it would be valuable once the underlying problems are solved.
> > >
> > > And reprepro does not fit the bill because?
> > >
> > It fits part of the bill, as it's an excellent tool for maintaining a 
> > repository, but it doesn't resolve dependencies (nor should it).
> 
> Just in case it might help, here's a script we used internally (at the
> Sarge time) to maintain a dummy repository that would help us eventually
> resolve an original list of packages to a complete list of packages we
> ask a reprepro source to update.
> 
> -- 
> Tzafrir Cohen         | tzafrir@jabber.org | VIM is
> http://tzafrir.org.il |                    | a Mutt's
> tzafrir@cohens.org.il |                    |  best
> ICQ# 16849754         |                    | friend
> 
> 
> -- 
> To UNSUBSCRIBE, email to debian-devel-REQUEST@lists.debian.org
> with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
> 

-- 
Tzafrir Cohen         | tzafrir@jabber.org | VIM is
http://tzafrir.org.il |                    | a Mutt's
tzafrir@cohens.org.il |                    |  best
ICQ# 16849754         |                    | friend
#!/bin/bash

# using bash-specific PIPESTATUS

CMD=`basename $0`

REPREPRO=reprepro
BASE_DIR=repo
APT_BASE_DIR=${BASE_DIR}/Aptdir
APT_DIR=${APT_DIR:-${APT_BASE_DIR}/unstable}
MAIN_REPO=/home/repo
PACKAGES_LIST_FILE=packages
STATIC_DIR=$MAIN_REPO/static
STATIC_INST=$MAIN_REPO/static_inst
INSTALLER_PATH=$BASE_DIR/dists/sarge/main/installer-i386/current
CD_OVERRIDE=cd-override/cd

set -e

usage() {
	echo >&2 "apter: apt resolver wrapper"
	echo >&2 "       (functionality varies by basename of \$0)"
	echo >&2 "Usage: $0 <setup|generate|refresh>"
}

# $1: file
# $2: condition
get_entry() {
  awk <$BASE_DIR/conf/$1 -v RS='\n\n' "/\<$2\>\n/ {print \$0}" 
  #echo >&2 "printed updates section $2."
}

# $1: file (updates/distributions)
# $2: condition
# $3: field name
get_field() {
	get_entry "$1" "$2" | grep "^$3: " | cut -d: -f2-
}

dists_list() {
	awk '/^Codename: / {print $2}' $BASE_DIR/conf/distributions
}

case "$CMD" in
	apt-get|apt-cache|aptitude)
		exec $CMD \
			-o Dir=$PWD/$APT_DIR \
			-o Dir::State::status=$PWD/$APT_DIR/var/lib/dpkg/status \
			"$@"
		;;
	apter)
		case "$1" in
		setup)
			for dist in `dists_list`
			do
				APT_DIR=$APT_BASE_DIR/$dist
				export APT_DIR
			
				for dir in \
					etc/apt var/lib/apt/lists/partial \
					var/lib/dpkg var/cache/apt/archives/partial
				do mkdir -p $APT_DIR/$dir
				done
				touch $APT_DIR/var/lib/dpkg/status
				# relevant update sources:
				update_sources=`get_field distributions "Codename: $dist" Update`
				(
					for upd in $update_sources
					do 
						get_entry updates "Name: $upd"
						echo ''
					done
				) | tools/updates2sources >$APT_DIR/etc/apt/sources.list
				cat <<EOF >$APT_DIR/etc/apt/preferences
# give our packages a higher priority:
Package: *
Pin: release o=Xorcom
Pin-Priority: 600
EOF
			done
			;;
		generate)
			# setup the apt wrapper:
			$0 setup
			$0 refresh
			;;
		refresh) 
			rm -rf $BASE_DIR/{db,dists,lists,pool}
			$0 refresh-nodel
			;;
		upgrade|refresh-nodel) 
			apt_cmd=`dirname $0`/apt-get
			for file in `ls $STATIC_DIR`
 			do rsync -a --delete $STATIC_DIR/$file $BASE_DIR
			done
			# note: no --delete here
			rsync -aC $CD_OVERRIDE/* $BASE_DIR/
			
			#rm -f $BASE_DIR/conf/*.updates
			for dist in `dists_list`
			do
				if `echo $PACKAGES_LIST_FILE*.$dist | grep -q '\*'`
				then
					#echo "(Distro $dist has no packages lists. Skipped)"
					continue
				fi
				echo "refreshing distro $dist."
				APT_DIR=$APT_BASE_DIR/$dist
				export APT_DIR
				# Resolve required packages to packages from 
				# specific repositories:
				for pack_list in $PACKAGES_LIST_FILE*.$dist
				do
					packages=`grep -v '^#' $pack_list` 
					$apt_cmd update
					$apt_cmd install -y --dry-run $packages \
					| tools/aptdry2lists

					# bail out if apt fail. $PIPESTATUS is ${PIPESTATUS[0]}
					if [ $PIPESTATUS -ne 0 ]; then 
						echo >&2 "Error demo-installing packages from $pack_list"
						echo >&2 "Try running APT_DIR=$APT_DIR $apt_cmd install --dry-run \`grep -v '^#' $pack_list\`"
						exit $PIPESTATUS; 
					fi
				done
				chmod -R g+w $APT_DIR/var 2>/dev/null || true
				if [  ! -r $BASE_DIR/dists/$dist/main/installer-i386 ]
				then
					mkdir -p $BASE_DIR/dists/$dist/main
					ln -s ../../sarge/main/installer-i386 $BASE_DIR/dists/$dist/main/installer-i386 
				fi
			done
			for file in $BASE_DIR/conf/*.updates.unsorted
			do
				new_file=`echo $file | sed -e 's/.unsorted$//'`
				sort -u $file >$new_file
				rm $file
			done
			
			# Recreate repository:
			$REPREPRO --noskipold --ask-passphrase --ignore=unknownfield -b $BASE_DIR update
			$REPREPRO -b $BASE_DIR createsymlinks
			mkdir -p $INSTALLER_PATH
			rsync -aq --delete $STATIC_INST/ $INSTALLER_PATH
			;;
		*) 
			echo >&2 "Unknown apter command $1."
			usage
			exit 1
			;;
		esac
		;;
	*)
		echo >&2 "Unknown apter functionality $0"
		exit 2
		;;
esac	

Reply to: