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

Re: support-snapshots.debian.org-in-live-build



On Fri, Oct 31, 2014 at 1:21 AM, Richard Nelson <unixabg@gmail.com> wrote:
> Greetings,
>
> On Thu, Oct 30, 2014 at 8:12 PM, Richard Nelson <unixabg@gmail.com> wrote:
>>
>> Greetings,
>>
>> On Fri, Oct 3, 2014 at 5:33 AM, Igor Cher <igorflint@gmail.com> wrote:
>>>
>>> Hi,
>>>
>>> Is there any progress on adding snapshot repository support
>>> (https://lists.debian.org/debian-live/2012/06/msg00140.html) ?
>>>
>>
>> I as well think the idea has merit. Would you be willing to test && adjust
>> patch to work with the latest debian-next branch in git? If it works as it
>> should against debian-next branch then I believe it would be of value to
>> include in the debian-next branch.
>>
>
> Sorry I intended to include the last patch you had offered in that thread to
> assist future readers to see your last submission on the idea, so here is
> what I think appears to be the last patch submitted
> https://lists.debian.org/debian-live/2012/06/msg00237.html
>
> Thanks.
>
>> Thanks.
>
>

Hi,

sorry for this late reply. Appended to this email is an updated patch
for live-build 4.0.3-1.

Thank you.
From 2523e73a68fd53889433c4e3a8fcefe5778326de Mon Sep 17 00:00:00 2001
From: "Rui Miguel P. Bernardo" <rui.bernardo.pt@gmail.com>
Date: Tue, 11 Nov 2014 09:17:55 +0000
Subject: [PATCH] support snapshots.debian.org in live-build (4.0.3-1)

---
 functions/debian-snapshots.sh            |  138 ++++++++++++++++++++++++++++++
 functions/defaults.sh                    |   24 ++++++
 scripts/build/bootstrap_archive-keys     |    7 +-
 scripts/build/chroot_apt                 |   10 +++
 scripts/build/config                     |   12 ++-
 scripts/build/installer_debian-installer |    5 ++
 6 files changed, 194 insertions(+), 2 deletions(-)
 create mode 100644 functions/debian-snapshots.sh

diff --git a/functions/debian-snapshots.sh b/functions/debian-snapshots.sh
new file mode 100644
index 0000000..4d6ee90
--- /dev/null
+++ b/functions/debian-snapshots.sh
@@ -0,0 +1,138 @@
+#!/bin/sh
+
+## live-build(7) - System Build Scripts
+## Copyright (C) 2006-2012 Daniel Baumann <daniel@debian.org>
+##
+## live-build 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.
+
+Short_date ()
+{
+	SHORT_DATE="${1}:-${LB_SNAPSHOT}}"
+	# returns the date as YYYYMMDD
+	echo "${SHORT_DATE}" | cut -c 1-8
+}
+
+Last_archive_entry ()
+{
+	# returns the last date link
+	LAST_ENTRY="$(cat /tmp/index.html | grep "$(date +%Y%m)" | sed 's|.*<a href="\([^"]*\)".*$|\1|' | tail -n 1 )"
+	echo "$( echo ${LAST_ENTRY} | sed 's|./||' | sed 's|/||' )"
+}
+
+First_archive_entry ()
+{
+	# returns the 1st date link (1st line is daily-images in daily installer html)
+	FIRST_ENTRY="$(cat /tmp/index.html | grep DIR | sed 's|.*<a href="\([^"]*\)".*$|\1|' | head -n 2 | tail -n 1 )"
+	echo "$( echo ${FIRST_ENTRY} | sed 's|./||' | sed 's|/||' )"
+}
+
+Previous_date ()
+{
+	INITIAL_DATE="${1}"
+
+	# convert date to seconds
+	UNIX_TIME=$(date -d "$INITIAL_DATE" +%s)
+	# one day is 86400 secs
+	#ONE_DAY=$(( 24 * 3600 ))
+	ONE_DAY=86400
+
+	# subtract one day to date
+	PREVIOUS_DATE=$(date -d "$INITIAL_DATE -$ONE_DAY sec" "+%Y%m%d")
+
+	# return previous date
+	echo "${PREVIOUS_DATE}"
+}
+
+Dated_archive_entry ()
+{
+	# returns the link for a specific date
+	WANTED_DATE="${1}:-${LB_SNAPSHOT}}"
+	DATED_ENTRY="$(cat /tmp/index.html | grep "$(Short_date ${WANTED_DATE})" | sed 's|.*<a href="\([^"]*\)".*$|\1|' | tail -n 1 )"
+	echo "$( echo ${DATED_ENTRY} | sed 's|./||' | sed 's|/||' )"
+}
+
+Previous_archive_entry ()
+{
+	# returns the link for the match or the previous entry before specific date
+	FIRST_DATE="$(Short_date $(First_archive_entry))"
+
+	DATE="$(Short_date ${LB_SNAPSHOT})"
+
+	# if there is no daily installer available for
+	# a very old date, then use the oldest daily installer
+	# available, even with kernel mismatch.
+	if [ ${DATE} -le ${FIRST_DATE} ]
+	then
+		DATE=${FIRST_DATE}
+	fi
+
+	while [ "${DATE}" != "${FIRST_DATE}" ]; do
+		LINK=$(cat /tmp/index.html |  grep "${DATE}" | sed 's|.*<a href="\([^"]*\)".*$|\1|' )
+
+		if [ -z "${LINK}" ]
+		then
+			# date was not found
+			# try previous date
+			DATE=$(Previous_date "${DATE}")
+		else
+			# a link was found
+			break
+		fi
+	done
+
+	# return link to matched date or previous daily installer date,
+	# the 1st one if no other younger d-i for that date was found
+	Dated_archive_entry "${DATE}"
+}
+
+Latest_debian_archive_snapshot_available ()
+{
+	# returns the complete date/time for the link of the latest (last) available debian archive snapshot date
+	wget 'http://snapshot.debian.org/archive/debian/?year='"$(date +%Y)"';month='"$(date +%m)" -O /tmp/index.html && true
+	LAST_ARCHIVE_SNAPSHOT="$(Last_archive_entry)"
+	echo "${LAST_ARCHIVE_SNAPSHOT}"
+}
+
+Dated_debian_archive_snapshot ()
+{
+	# returns the complete date/time for the link of the latest for a specific date in snapshots.debian.org
+	DATE_YEAR="$(Short_date ${LB_SNAPSHOT} | cut -c 1-4 )"
+	DATE_MONTH="$(Short_date ${LB_SNAPSHOT} | cut -c 5-6 )"
+	wget 'http://snapshot.debian.org/archive/debian/?year='"${DATE_YEAR}"';month='"${DATE_MONTH}" -O /tmp/index.html && true
+	LAST_ARCHIVE_SNAPSHOT="$(Dated_archive_entry)"
+	echo "${LAST_ARCHIVE_SNAPSHOT}"
+}
+
+Latest_debian_installer_snapshot_available ()
+{
+	# returns the date-hour for the latest date of debian-installer daily build available for an arch
+	# d-i archive uses different date links
+	wget 'http://d-i.debian.org/daily-images/'"${LIVE_IMAGE_ARCHITECTURE}" -O /tmp/index.html && true
+	LAST_INSTALLER_SNAPSHOT="$(Last_archive_entry)"
+	echo "${LAST_INSTALLER_SNAPSHOT}"
+}
+
+Dated_debian_installer_snapshot ()
+{
+	# returns the date-hour for the specific date of debian-installer daily build available for an arch
+	# d-i archive uses different date links
+	wget 'http://d-i.debian.org/daily-images/'"${LIVE_IMAGE_ARCHITECTURE}" -O /tmp/index.html && true
+	DATED_INSTALLER_SNAPSHOT="$(Dated_archive_entry)"
+	echo "${DATED_INSTALLER_SNAPSHOT}"
+}
+
+Available_daily_installer ()
+{
+	# returns the desired daily d-i date link or the previous existing daily d-i
+	DAILY_INSTALLER="$(Dated_debian_installer_snapshot)"
+	if [ -z "${DAILY_INSTALLER}" ]
+	then
+		# no wanted date was found, download available dates and search previous
+		wget 'http://d-i.debian.org/daily-images/'"${LIVE_IMAGE_ARCHITECTURE}" -O /tmp/index.html && true
+		DAILY_INSTALLER=$(Previous_archive_entry)
+	fi
+
+	echo "${DAILY_INSTALLER}"
+}
diff --git a/functions/defaults.sh b/functions/defaults.sh
index feebdee..d0c288a 100755
--- a/functions/defaults.sh
+++ b/functions/defaults.sh
@@ -370,6 +370,19 @@ Set_defaults ()
 
 	## config/bootstrap
 
+	# Setting snapshots.debian.org
+	if [ -n "${LB_SNAPSHOT}" ]
+	then
+		LB_MIRROR_BOOTSTRAP="${LB_MIRROR_BOOTSTRAP:-http://snapshot.debian.org/archive/debian/${LB_SNAPSHOT}}";
+		LB_PARENT_MIRROR_BOOTSTRAP="${LB_MIRROR_BOOTSTRAP}"
+		LB_MIRROR_CHROOT_SECURITY="${LB_MIRROR_CHROOT_SECURITY:-http://snapshot.debian.org/archive/debian-security/${LB_SNAPSHOT}}";
+		LB_PARENT_MIRROR_CHROOT_SECURITY="${LB_PARENT_MIRROR_CHROOT_SECURITY:-${LB_MIRROR_CHROOT_SECURITY}}"
+		LB_MIRROR_BINARY="${LB_MIRROR_BINARY:-http://snapshot.debian.org/archive/debian/${LB_SNAPSHOT}}";
+		LB_PARENT_MIRROR_BINARY="${LB_PARENT_MIRROR_BINARY:-${LB_MIRROR_BINARY}}"
+		LB_MIRROR_BINARY_SECURITY="${LB_MIRROR_BINARY_SECURITY:-http://snapshot.debian.org/archive/debian-security/${LB_SNAPSHOT}}";
+		LB_PARENT_MIRROR_BINARY_SECURITY="${LB_PARENT_MIRROR_BINARY_SECURITY:-${LB_MIRROR_BINARY_SECURITY}}"
+	fi
+
 	# Setting mirror to fetch packages from
 	case "${LB_MODE}" in
 		debian)
@@ -1059,6 +1072,17 @@ Check_defaults ()
 		fi
 	fi
 
+	if [ -n "${LB_SNAPSHOT}" ] && [ "${LB_DEBIAN_INSTALLER}" = "live" ] && [ "${LB_DEBIAN_INSTALLER_DISTRIBUTION}" = "daily" ]
+	then
+		DAILY_LIVE_INSTALLER="$(Dated_debian_installer_snapshot)"
+		# if there is no available daily installer
+		if [ -z "${DAILY_LIVE_INSTALLER}" ]
+		then
+			Echo_warning "You have selected debian-snapshots option with daily live-installer, but there is no daily live installer available at that date. The selected date was ${LB_SNAPSHOT}"
+			Echo_warning "The last available daily installer before ${LB_SNAPSHOT} will be used. Please check http://d-i.debian.org/daily-images/ to see the oldest daily installer available."
+		fi
+	fi
+
 	if [ "${LB_BOOTLOADER}" = "syslinux" ]
 	then
 		# syslinux + fat or ntfs, or extlinux + ext[234] or btrfs
diff --git a/scripts/build/bootstrap_archive-keys b/scripts/build/bootstrap_archive-keys
index 4b9324f..2bec20d 100755
--- a/scripts/build/bootstrap_archive-keys
+++ b/scripts/build/bootstrap_archive-keys
@@ -71,7 +71,12 @@ do
 	rm -f chroot/key.asc chroot/key.asc.sig
 done
 
-Chroot chroot "apt-get update"
+if [ -n "${LB_SNAPSHOT}" ]
+then
+	Chroot chroot "apt-get update -o Acquire::Check-Valid-Until=false"
+else
+	Chroot chroot "apt-get update"
+fi
 
 # Creating stage file
 Create_stagefile .build/bootstrap_archive-keys
diff --git a/scripts/build/chroot_apt b/scripts/build/chroot_apt
index 09ece39..b4e2c70 100755
--- a/scripts/build/chroot_apt
+++ b/scripts/build/chroot_apt
@@ -54,6 +54,13 @@ case "${1}" in
 			echo "Acquire::http::Proxy \"${LB_APT_HTTP_PROXY}\";" > chroot/etc/apt/apt.conf.d/00http-proxy
 		fi
 
+		# Configuring snapshots.debian.org
+		if [ -n "${LB_SNAPSHOT}" ]
+		then
+			echo '// see bug #595801' > chroot/etc/apt/apt.conf.d/00debian-snapshots
+			echo 'Acquire::Check-Valid-Until "false";' >> chroot/etc/apt/apt.conf.d/00debian-snapshots
+		fi
+
 		# Configuring apt pipeline
 		if [ -n "${LB_APT_PIPELINE}" ]
 		then
@@ -227,6 +234,9 @@ EOF
 		# Deconfiguring aptitude http proxy
 		rm -f chroot/etc/apt/apt.conf.d/00http-proxy
 
+		# Deconfiguring snapshots.debian.org
+		rm -f chroot/etc/apt/apt.conf.d/00debian-snapshots
+
 		# Deconfiguring aptitude pipeline
 		rm -f chroot/etc/apt/apt.conf.d/00pipeline
 
diff --git a/scripts/build/config b/scripts/build/config
index e3b1e51..d455d77 100755
--- a/scripts/build/config
+++ b/scripts/build/config
@@ -52,6 +52,7 @@ USAGE="${PROGRAM}   [--apt apt|aptitude]\n\
 \t    [--debian-installer-distribution daily|CODENAME]\n\
 \t    [--debian-installer-preseedfile FILE|URL]\n\
 \t    [--debian-installer-gui true|false]\n\
+\t    [--snapshot yyyymmdd|yyyymmddThhmmssZ\n\
 \t    [--debug]\n\
 \t    [-d|--distribution CODENAME]\n\
 \t    [--parent-distribution CODENAME]\n\
@@ -147,7 +148,7 @@ Local_arguments ()
 		net-cow-server:,net-tarball:,firmware-binary:,firmware-chroot:,swap-file-path:,swap-file-size:,
 		loadlin:,win32-loader:,source:,source-images:,breakpoints,conffile:,debug,force,
 		help,ignore-system-defaults,quiet,usage,verbose,version,bootstrap-qemu-static:,bootstrap-qemu-arch:,
-		bootstrap-qemu-exclude:"
+		bootstrap-qemu-exclude:,snapshot:"
 	# Remove spaces added by indentation
 	LONG_OPTIONS="$(echo ${LONG_OPTIONS} | tr -d ' ')"
 	ARGUMENTS="$(getopt --longoptions ${LONG_OPTIONS} --name="${PROGRAM}" --options a:f:d:m:l:k:p:b:e:s:c:huv --shell sh -- "${@}")"
@@ -300,6 +301,11 @@ Local_arguments ()
 				shift 2
 				;;
 
+			--snapshot)
+				LB_SNAPSHOT="${2}"
+				shift 2
+				;;
+
 			--initramfs)
 				LB_INITRAMFS="${2}"
 				shift 2
@@ -949,6 +955,10 @@ LB_DEBCONF_FRONTEND="${LB_DEBCONF_FRONTEND}"
 # (Default: ${LB_DEBCONF_PRIORITY})
 LB_DEBCONF_PRIORITY="${LB_DEBCONF_PRIORITY}"
 
+# \$LB_SNAPSHOT: set snapshots.debian.org date to use
+# (Default: empty or not set to not use archive snapshot, or a valid date in snapshots.debian.org URL format)
+LB_SNAPSHOT="${LB_SNAPSHOT}"
+
 # \$LB_INITRAMFS: set initramfs hook
 # (Default: ${LB_INITRAMFS})
 LB_INITRAMFS="${LB_INITRAMFS}"
diff --git a/scripts/build/installer_debian-installer b/scripts/build/installer_debian-installer
index 6415fff..63b9091 100755
--- a/scripts/build/installer_debian-installer
+++ b/scripts/build/installer_debian-installer
@@ -256,6 +256,11 @@ case "${LB_DERIVATIVE}" in
 
 			# Debian Installer daily builds
 			URL="http://d-i.debian.org/daily-images/${LIVE_IMAGE_ARCHITECTURE}/daily/";
+			# use snapshot installer too
+			if [ -n "${LB_SNAPSHOT}" ]
+			then
+				URL="http://d-i.debian.org/daily-images/${LIVE_IMAGE_ARCHITECTURE}/$(Available_daily_installer)/"
+			fi
 		else
 			URL="${LB_MIRROR_DEBIAN_INSTALLER}/dists/${LB_DEBIAN_INSTALLER_DISTRIBUTION}/main/installer-${LIVE_IMAGE_ARCHITECTURE}/current/images/"
 		fi
-- 
1.7.10.4


Reply to: