3 changed files with 351 additions and 0 deletions
@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
|
||||
http_proxy=http://192.168.0.253:3142/ |
||||
ISOFILE=$HOME/debian-12.12.0-i386-netinst.iso |
||||
JIGDO=$HOME/jigdo |
||||
DESTINATION=$HOME |
||||
MIRROR=http://debian.proxad.net |
||||
MIRRORNONUS=http://debian.proxad.net |
||||
@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
|
||||
http_proxy=http://192.168.0.253:3142/ |
||||
ISOFILE=$HOME/debian-13.0.0-amd64-netinst.iso |
||||
JIGDOPATH=$HOME/jigdo |
||||
DESTINATION=$HOME |
||||
MIRROR=http://debian.proxad.net |
||||
MIRRORNONUS=http://debian.proxad.net |
||||
@ -0,0 +1,339 @@
@@ -0,0 +1,339 @@
|
||||
#! /usr/bin/env bash |
||||
set -ueEo pipefail |
||||
|
||||
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" |
||||
|
||||
check_tools() |
||||
{ |
||||
if ! udisksctl status >/dev/null |
||||
then |
||||
echo "udisksctl is required" |
||||
exit 1 |
||||
fi |
||||
if ! wget --version >/dev/null |
||||
then |
||||
echo "wget is required" |
||||
exit 1 |
||||
fi |
||||
if ! jigdo-lite --version >/dev/null |
||||
then |
||||
echo "jigdo-lite is required" |
||||
exit 1 |
||||
fi |
||||
} |
||||
|
||||
check_tools |
||||
|
||||
usage() { |
||||
cat <<EOF |
||||
|
||||
Upgrade an existant official debian iso to last revision. |
||||
|
||||
options: |
||||
-c|--configfile Specify a config file |
||||
-d|--destination Path or filename to produce the new isofile |
||||
-h|--help Show this message. |
||||
-i|--isofile Isofile to upgrade |
||||
-j|--jigdo Jigdo file local storage path |
||||
-m|--mirror Download pacakge repository |
||||
-p|--proxy specify a optional debian apt proxy |
||||
-v Show more output. |
||||
|
||||
Configfile contents example: |
||||
http_proxy=http://<ip>:<port> |
||||
ISOFILE=$HOME/debian-13.0.0-amd64-netinst.iso |
||||
JIGDO=$HOME/jigdo |
||||
DESTINATION=$HOME |
||||
MIRROR=http://deb.debian.org |
||||
EOF |
||||
} |
||||
|
||||
main() { |
||||
|
||||
cd "$SCRIPT_DIR" |
||||
|
||||
ISOFILE="" |
||||
VERBOSITY=0 |
||||
|
||||
while [[ $# -gt 0 ]]; do |
||||
case $1 in |
||||
-c|--configfile) |
||||
CONFIGFILE=$2 |
||||
[[ -z ${CONFIGFILE} ]] && echo "missing argument $1" && exit 1 |
||||
if [ -e "${CONFIGFILE}" ] |
||||
then |
||||
# shellcheck source=/dev/null |
||||
source "${CONFIGFILE}" |
||||
else |
||||
echo "ERROR: specified configfile not found"* |
||||
exit 1 |
||||
fi |
||||
shift |
||||
shift |
||||
;; |
||||
-d|--destination) |
||||
DESTINATION=$2 |
||||
[[ -z ${DESTINATION} ]] && echo "missing argument $1" && exit 1 |
||||
shift |
||||
shift |
||||
;; |
||||
-h|--help) |
||||
usage |
||||
exit 0 |
||||
;; |
||||
-i|--isofile) |
||||
ISOFILE=$2 |
||||
[[ -z ${ISOFILE} ]] && echo "missing argument $1" && exit 1 |
||||
shift |
||||
shift |
||||
;; |
||||
-j|--jigdo) |
||||
JIGDOPATH=$2 |
||||
[[ -z ${JIGDOPATH} ]] && echo "missing argument $1" && exit 1 |
||||
shift |
||||
shift |
||||
;; |
||||
-m|--mirror) |
||||
MIRROR=$2 |
||||
[[ -z ${MIRROR} ]] && echo "missing argument $1" && exit 1 |
||||
shift |
||||
shift |
||||
;; |
||||
-p|--proxy) |
||||
http_proxy=$2 |
||||
[[ -z ${http_proxy} ]] && echo "missing argument $1" && exit 1 |
||||
shift |
||||
shift |
||||
;; |
||||
-v|--verbose) |
||||
VERBOSITY=1 |
||||
shift |
||||
;; |
||||
*) |
||||
echo "ERROR: unknown option: $1" |
||||
usage |
||||
exit 1 |
||||
;; |
||||
esac |
||||
done |
||||
|
||||
if [ ! -e "$ISOFILE" ] |
||||
then |
||||
echo "ERROR: provide the source isofile." |
||||
exit 1 |
||||
fi |
||||
|
||||
DESTINATION=${DESTINATION:-$(pwd)} |
||||
JIGDOPATH=${JIGDOPATH:-$HOME/jigdo} |
||||
http_proxy=${http_proxy:-} |
||||
if [ ! -d "${JIGDOPATH}" ] |
||||
then |
||||
mkdir -p "${JIGDOPATH}" |
||||
fi |
||||
MIRROR=${MIRROR:-http://deb.debian.org/} |
||||
|
||||
# debian-13.0.0-amd64-netinst.iso |
||||
bnfile=$(basename "${ISOFILE}") |
||||
distribution=$( echo "${bnfile}" |cut --delimiter='-' --fields=1 ) |
||||
majorversion=$( echo "${bnfile}" |cut --delimiter='-' --fields=2 |cut --delimiter='.' --fields=1 ) |
||||
minorversion=$( echo "${bnfile}" |cut --delimiter='-' --fields=2 |cut --delimiter='.' --fields=2 ) |
||||
incrementalversion=$( echo "${bnfile}" |cut --delimiter='-' --fields=2 |cut --delimiter='.' --fields=3 ) |
||||
architecture=$( echo "${bnfile}" |cut --delimiter='-' --fields=3) |
||||
flavor=$( echo "${bnfile}" |cut --delimiter='-' --fields=4 |cut --delimiter='.' --fields=1 ) |
||||
extension=$( echo "${bnfile}" |cut --delimiter='-' --fields=4 |cut --delimiter='.' --fields=2 ) |
||||
|
||||
if [[ ${VERBOSITY} -gt 0 ]] |
||||
then |
||||
echo "isofile = ${ISOFILE}" |
||||
echo "reconstructed = ${distribution}-${majorversion}.${minorversion}.${incrementalversion}-${architecture}-${flavor}.iso" |
||||
fi |
||||
|
||||
if [ "${extension}" != "iso" ] |
||||
then |
||||
echo "Not implemented for extension : ${extension}" |
||||
exit 1 |
||||
fi |
||||
|
||||
if [ "${distribution}" != "debian" ] |
||||
then |
||||
echo "Not implemented for distribution : ${distribution}" |
||||
exit 1 |
||||
fi |
||||
|
||||
case ${flavor} in |
||||
netinst) |
||||
cdimagejigdodirectory="jigdo-cd" |
||||
;; |
||||
*) |
||||
echo "Not implemented for flavor : ${flavor}" |
||||
exit 1 |
||||
;; |
||||
esac |
||||
|
||||
case ${majorversion} in |
||||
13) |
||||
# https://cdimage.debian.org/cdimage/release/current/amd64/jigdo-cd/debian-13.5.0-amd64-netinst.jigdo |
||||
jigdorooturl="https://cdimage.debian.org/cdimage/release/current" |
||||
cdimagetargeturl="${jigdorooturl}/${architecture}/${cdimagejigdodirectory}" |
||||
;; |
||||
12) |
||||
# https://cdimage.debian.org/cdimage/archive/ |
||||
# https://cdimage.debian.org/cdimage/archive/12.14.0/i386/jigdo-cd/debian-12.14.0-i386-netinst.jigdo |
||||
jigdorooturl=https://cdimage.debian.org/cdimage/archive |
||||
# compute the target url is required for archive section |
||||
cdimagearchiveindex=/tmp/jigdo-${majorversion}-index.html |
||||
if wget ${jigdorooturl} --output-document "${cdimagearchiveindex}" |
||||
then |
||||
targetversion=$( grep "[DIR]" "${cdimagearchiveindex}" | grep "a href=\"${majorversion}" | cut --delimiter='.' --fields=2 | sort --numeric-sort | tail --lines=1 ) |
||||
cdimagetargeturl="${jigdorooturl}/${majorversion}.${targetversion}.${incrementalversion}/${architecture}/${cdimagejigdodirectory}" |
||||
else |
||||
echo "download error ${cdimagetargeturl}/SHA512SUMS" |
||||
echo "check your network connection" |
||||
exit 1 |
||||
fi |
||||
;; |
||||
*) |
||||
echo "Not implemented" |
||||
exit 1 |
||||
esac |
||||
|
||||
sha512filelist=${JIGDOPATH}/jigdo-${distribution}-${majorversion}-last-${architecture}-${flavor}-sha512sum |
||||
|
||||
if [[ ${VERBOSITY} -ge 0 ]] |
||||
then |
||||
echo "isofile = ${ISOFILE}" |
||||
echo "reconstructed = ${distribution}-${majorversion}.${minorversion}.${incrementalversion}-${architecture}-${flavor}.iso" |
||||
echo "cdimagetargeturl = ${cdimagetargeturl}" |
||||
echo "sha512filelist = ${sha512filelist}" |
||||
fi |
||||
|
||||
if wget "${cdimagetargeturl}/SHA512SUMS" --output-document "${sha512filelist}" |
||||
then |
||||
# retrieve the cdimage "directory checksum" to extract last "current" version |
||||
targetjigdoname=$( grep "${distribution}-${majorversion}.*-${architecture}-${flavor}.jigdo" "${sha512filelist}" | cut --delimiter=' ' --fields=3 ) |
||||
targettemplatename=$( grep "${distribution}-${majorversion}.*-${architecture}-${flavor}.template" "${sha512filelist}" | cut --delimiter=' ' --fields=3 ) |
||||
targetversion=$( echo "${targetjigdoname}" | cut --delimiter='-' --fields=2 | cut --delimiter='.' --fields=2 ) |
||||
if [[ ${minorversion} -gt ${targetversion} ]] |
||||
then |
||||
echo "Rule violated : your version is more advanced than target" |
||||
echo "Not implemented" |
||||
exit 1 |
||||
elif [[ ${minorversion} -lt ${targetversion} ]] |
||||
then |
||||
# download jigdo if not already done or bad checksum |
||||
jigdofilepath=$(find "${JIGDOPATH}" -name "${distribution}-${majorversion}.${targetversion}.${incrementalversion}-${architecture}-${flavor}.jigdo") |
||||
if [[ ! -e "${jigdofilepath}" ]] || ! sha512sum --ignore-missing --check "${sha512filelist}" "${jigdofilepath}" |
||||
then |
||||
if wget "${cdimagetargeturl}/${targetjigdoname}" --output-document "${JIGDOPATH}/${targetjigdoname}" |
||||
then |
||||
jigdofilepath="${JIGDOPATH}/${targetjigdoname}" |
||||
pushd "${JIGDOPATH}" || exit 1 |
||||
echo "sha512sum --ignore-missing --check ${sha512filelist}" |
||||
if ! sha512sum --ignore-missing --check "${sha512filelist}" |
||||
then |
||||
echo "download error : bad checksum : ${cdimagetargeturl}/${targetjigdoname}" |
||||
echo "check your network connection" |
||||
exit 1 |
||||
fi |
||||
popd |
||||
fi |
||||
else |
||||
echo "jigdo file ${jigdofilepath} is ok" |
||||
fi |
||||
# download template if not already done or bad checksum |
||||
templatefilepath=$(find "${JIGDOPATH}" -name "${distribution}-${majorversion}.${targetversion}.${incrementalversion}-${architecture}-${flavor}.template") |
||||
if [[ ! -e "${templatefilepath}" ]] || ! sha512sum --ignore-missing --check "${sha512filelist}" "${templatefilepath}" |
||||
then |
||||
if wget "${cdimagetargeturl}/${targettemplatename}" --output-document "${JIGDOPATH}/${targettemplatename}" |
||||
then |
||||
templatefilepath="${JIGDOPATH}/${targettemplatename}" |
||||
pushd "${JIGDOPATH}" || exit 1 |
||||
echo "sha512sum --ignore-missing --check ${sha512filelist}" |
||||
if ! sha512sum --ignore-missing --check "${sha512filelist}" |
||||
then |
||||
echo "download error : bad checksum : ${cdimagetargeturl}/${targettemplatename}" |
||||
echo "check your network connection" |
||||
exit 1 |
||||
fi |
||||
popd |
||||
fi |
||||
else |
||||
echo "template file ${templatefilepath} is ok" |
||||
fi |
||||
else |
||||
echo "Already on the last version" |
||||
exit 0 |
||||
fi |
||||
else |
||||
echo "download error ${cdimagetargeturl}/SHA512SUMS" |
||||
echo "check your network connection" |
||||
exit 1 |
||||
fi |
||||
|
||||
# mount loop image |
||||
looplog=/tmp/udisks_loop-setup_$(basename "${ISOFILE}").log |
||||
mountlog=/tmp/udisks_mount_$(basename "${ISOFILE}").log |
||||
|
||||
if ! ( [ ! -d "/media/$(whoami)" ] && ! find "/media/$(whoami)" -maxdepth 1 -type d -name "*${majorversion}.${minorversion}.${incrementalversion}*${architecture}*" ) |
||||
then |
||||
if udisksctl loop-setup --read-only --file="${ISOFILE}" | tee "${looplog}" |
||||
then |
||||
blockdevice=$( cut --delimiter=' ' --fields=5 "${looplog}" | cut --delimiter='.' --fields=1 ) |
||||
devicename=$( echo "${blockdevice}" | cut --delimiter='/' --fields=3 ) |
||||
else |
||||
echo "ERROR : loop-setup" |
||||
exit 1 |
||||
fi |
||||
if [[ ! "${blockdevice}" =~ ^/dev/loop*$ ]] && lsblk | grep "^${devicename}" |
||||
then |
||||
if udisksctl mount --block-device "${blockdevice}p1" | tee "${mountlog}" |
||||
then |
||||
if ! grep --quiet "^Mounted" "${mountlog}" |
||||
then |
||||
echo "ERROR : mount" |
||||
exit 1 |
||||
fi |
||||
else |
||||
echo "ERROR : mount" |
||||
exit 1 |
||||
fi |
||||
else |
||||
echo "ERROR : loop-setup" |
||||
echo "It may not work by ssh or systemd-run because of polkit" |
||||
echo "See https://github.com/coldfix/udiskie/wiki/Permissions" |
||||
exit 1 |
||||
fi |
||||
fi |
||||
|
||||
# MOUNTPATH=$( find "/media/$(whoami)" -maxdepth 1 -type d -name "*${majorversion}.${minorversion}.${incrementalversion}*${architecture}*" ) |
||||
|
||||
if [ -n "${http_proxy}" ] |
||||
then |
||||
proxyoption="-e http_proxy=${http_proxy}" |
||||
else |
||||
proxyoption="" |
||||
fi |
||||
cat > "${HOME}"/.jigdo-lite <<EOF |
||||
jigdo='' |
||||
debianMirror='${MIRROR}/debian/' |
||||
nonusMirror='${MIRROR}/debian-non-US/' |
||||
tmpDir='${JIGDOPATH}/db' |
||||
jigdoOpts='--cache jigdo-file-cache.db' |
||||
wgetOpts='-nv --passive-ftp --dot-style=mega --continue --timeout=30 ${proxyoption} ' |
||||
scanMenu='$( find "/media/$(whoami)" -maxdepth 1 -type d -name "*${majorversion}.${minorversion}.${incrementalversion}*${architecture}*" )/' |
||||
filesPerFetch='30' |
||||
EOF |
||||
|
||||
if jigdo-lite --noask "${jigdofilepath}" |
||||
then |
||||
echo "completed" |
||||
else |
||||
echo "Error: something was wrong" |
||||
exit 1 |
||||
fi |
||||
|
||||
} |
||||
|
||||
if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then |
||||
main "$@" |
||||
fi |
||||
Loading…
Reference in new issue