Commit 6b7e174c authored by Alessandro Elias's avatar Alessandro Elias
Browse files

Merge branch 'issue/601' into 'develop'

SCRUM#602: Several improvements

See merge request !19
parents df0f9afe e07ba2b0
Pipeline #18862 passed with stage
in 12 seconds
chroot
overlay
kernel
*.swp
iso/**/*.iso
src/preseed/.preseed.bkp
initrd
cache/*
iso/*
initrd/*
initrd.lz
chroot*.tar.gz
packages-needed
base
todos.txt
vmlinuz-*-generic
initrd.img-*-generic
.Trash-1000/*
.vscode/*
\ No newline at end of file
......@@ -18,5 +18,6 @@ echo -e "$files"| xargs shellcheck -s bash && \
echo "AWESOME! No problems found." ; \
exit 0
#else
echo -e "Understand errors in: ${BLUE}https://github.com/koalaman/shellcheck/wiki${NC}"
echo -e "Understand errors in: \
${BLUE}https://github.com/koalaman/shellcheck/wiki${NC}"
exit 1
{
// sulzbach:
"editor.rulers": [80],
"editor.fontSize": 16
}
\ No newline at end of file
export NO_DBUS=true
PASSWD="123mudar"
\ No newline at end of file
TMPFS="${PREFIX}/tmp"
TMPFS_SIZE="6291456k"
TMP="${TMPFS}/${_PROF}"
CHROOTDIR="${PREFIX}/overlay"
SCRIPTSDIR="${PREFIX}/scripts-enabled/${_PROF}"
ISODIR="${PREFIX}/iso"
CACHEDIR="${PREFIX}/cache/${_PROF}/${_REPO}"
PKGLIST="${PREFIX}/pkg-list/${_PROF}"
SOURCESLIST="${PREFIX}/sources-list"
LOG_PATH="/var/log/create-iso"
NAME="Linux Comunicacoes"
WEBSITE="https://cidadesdigitais.c3sl.ufpr.br/linux-comunicacoes/"
ISOURL="http://cdimage.ubuntu.com/ubuntu-gnome/releases/16.04/release"
KEYURL="http://repo.c3sl.ufpr.br/lc2/lc.c3sl.ufpr.br.key"
NAME="Linux Educacional Netbook"
WEBSITE="https://linuxeducacional.c3sl.ufpr.br"
ISOURL="http://cdimage.ubuntu.com/ubuntu-gnome/releases/16.04/release"
KEYURL="http://repo.c3sl.ufpr.br/le6/le.c3sl.ufpr.br.key"
NAME="Linux Educacional"
WEBSITE="https://linuxeducacional.c3sl.ufpr.br"
ISOURL="http://cdimage.ubuntu.com/ubuntu-gnome/releases/16.04/release"
KEYURL="http://repo.c3sl.ufpr.br/le6/le.c3sl.ufpr.br.key"
SHORTNAME=le6
TMP=${PREFIX}/${_DIST}
CHROOTDIR=${PREFIX}/overlay
TMPFS=${PREFIX}/tmp
DISTRO=Linux_Educacional_6.1.0
DPLIST=${PREFIX}/pkg-list/${_DIST}/dependencies.list
INSTLIST=${PREFIX}/pkg-list/${_DIST}/install.list
ISOLINUX=${PREFIX}/src/isolinux
MOUNTLIST=${TMP}/mountlist
OURSOURCESLIST=${PREFIX}/sources-list/${_DIST}/${SHORTNAME}.list
RMDSKT=${PREFIX}/pkg-list/${_DIST}/remove-desktop.list
RMLIST=${PREFIX}/pkg-list/${_DIST}/remove.list
REPOPKGS=${PREFIX}/pkg-list/${_DIST}/repo-local.list
SCRIPTSDIR=${PREFIX}/scripts-enabled/${_DIST}
SOURCESLISTDEFAULT=${PREFIX}/sources-list/${_DIST}/default.list
SCRIPT_NAME="exec.sh"
LOG_PATH="/var/log"
_HELP=false
_PROF=""
_INPUT=""
_OUTPUT=""
_REPO="stable"
_VERSION=""
_DEBUG=false
_MAIL=false
_HELP=false
_DIST=""
_ARCH="amd64"
_REPO="stable"
......@@ -21,129 +21,214 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
# USA.
export PREFIX="${PWD}"
source "${PREFIX}/conf/pre.conf"
# Get the prefix path (root) of create-iso
export PREFIX="$(realpath "$(dirname "$0")")"
# Load default values of parameters
source "${PREFIX}/conf/opts.conf"
while true; do
case "${1}" in
-h | --help ) _HELP=true; shift ;;
-d | --distro ) _DIST="${2}"; shift; shift ;;
-a | --arch ) _ARCH="${2}"; shift; shift ;;
-r | --repo ) _REPO="${2}"; shift; shift ;;
-* ) echo "Unrecognized option. Try with --help."; exit 1 ;;
* ) break ;;
-h | --help ) _HELP=true; break ;;
-p | --profile ) _PROF="$2"; shift; shift ;;
-v | --version ) _VERSION="$2"; shift; shift ;;
-i | --input ) _INPUT="$2"; shift; shift ;;
-o | --output ) _OUTPUT="$2"; shift; shift ;;
-r | --repo ) _REPO="$2"; shift; shift ;;
-d | --debug ) _DEBUG=true; shift ;;
-s | --sendmail ) _MAIL=true; shift ;;
-* ) echo "Unrecognized option. Try with --help."; exit 1 ;;
* ) break ;;
esac
done
if [ "${_HELP}" = true ]; then
echo "Usage: ${0} [OPTION] [ARGUMENT]..."
echo ""
echo "Examples:"
echo " sudo ${0} --distro le6/testing # Generate default arch (amd64) le6 iso image"
echo " sudo ${0} -d le6/testing -a i386 # Generate i386 architecture le6 iso image"
echo ""
echo "Options:"
echo " -h, --help Show this help list"
echo " -d, --distro [DIST] Select iso image's distro"
echo " -a, --arch [amd64 | i386] Select iso image's architecture"
echo " -r, --repo [stable | testing | unstable] Select remote repository codename to download packages from"
exit 2
if [[ "${_HELP}" = true ]]; then
echo "Usage: $0 [OPTION] [ARGUMENT] ..."
echo ""
echo "Options:"
echo " -h, --help Show this help list"
echo -n " -p, --profile [PROF] Select create-iso "
echo "profile"
echo -n " -v, --version [VERSION] Set version of the "
echo "distribution to be built"
echo -n " -i, --input [PATH] Select ISO9660 file "
echo "to be used as base"
echo -n " -o, --output [PATH] Select output path of "
echo "the created ISO9660 image"
echo -n " -r, --repo [stable | testing | unstable] Select the base remote "
echo "repository of the distribution by codename"
echo " -d, --debug Execute in debug mode"
exit 0
fi
if [ -z "${_DIST}" ]; then
echo "No distro specified. Try with --help."
exit 1
if [[ "$(id -u)" != "0" ]]; then
echo "You must have more power to run this script. Are you root?"
exit -1
fi
if [ "${_ARCH}" != "amd64" ] && [ "${_ARCH}" != "i386" ]; then
echo "Unrecognized architecture. Try with --help."
if [[ -z "${_PROF}" ]]; then
echo "No profile specified. Try with --help."
exit 1
fi
if [ "${_REPO}" != "stable" ] && [ "${_REPO}" != "testing" ] && [ "${_REPO}" != "unstable" ]; then
echo "Unrecognized remote repository codename. Try with --help."
# Load profile config
if ! source "${PREFIX}/conf/${_PROF}.conf"; then
echo "Unavailable profile. Try with --help."
exit 1
fi
if [ "$(id -u)" != "0" ]; then
echo "You must have more power to run this script. Are you root?"
exit -1
# Load generic config
source "${PREFIX}/conf/general.conf"
if [[ -z "${_VERSION}" ]]; then
echo "No version specified. Proceeding with unset version."
else
NAME="${NAME} ${_VERSION}"
fi
source "${PREFIX}/conf/${_DIST}/create-iso.conf"
if [[ "${_REPO}" != "stable" ]] && [[ "${_REPO}" != "testing" ]] && \
[[ "${_REPO}" != "unstable" ]]; then
echo "Unrecognized remote repository codename. Try with --help."
exit 1
fi
TIME_STAMP="$(date +'%Y-%m-%dT%H:%M:%S')"
export LOG_FILE="${LOG_PATH}/create-iso-${TIME_STAMP}.log"
mkdir --parents "${LOG_PATH}"
export LOG_FILE="${LOG_PATH}/${TIME_STAMP}.log"
exec 1<&-
exec 2<&-
exec 1<> "${LOG_FILE}"
exec 1>&1
mkdir --parents "${TMP}"
source "${PREFIX}/common.sh"
source "${PREFIX}/helper/logging.incsh"
source "${PREFIX}/lib/mktmpfs.sh"
source "${PREFIX}/lib/overlay.sh"
source "${PREFIX}/include/base.sh"
source "${PREFIX}/include/chroot.sh"
source "${PREFIX}/include/logging.sh"
source "${PREFIX}/include/mount.sh"
# Disable debug logging if not in debug mode
[[ "${_DEBUG}" == false ]] && let VERBOSE_FLAGS="${ALL} ^ ${LDEBUG}"
# Installation of create-iso's dependencies
apt-get install isolinux syslinux squashfs-tools genisoimage xorriso --yes || \
createIsoLogger --message "Failed to install basic tools" --tag "apt-get"
apt-get install isolinux syslinux squashfs-tools genisoimage xorriso reprepro \
binwalk --yes || \
create_iso_logger --message "Failed to install basic tools" --tag "apt-get"
# The default filename of the generated iso is a concatenation of lowered-cased
# hyphen-delimited distribution version, repo codename and timestamp
[[ -z "${_OUTPUT}" ]] && _OUTPUT="${ISODIR}/output/$(sed -e 's/ /-/g' -e \
's/\(.*\)/\L\1/g' <<< "${NAME}")-${_REPO}-${TIME_STAMP}.iso"
cond_mount tmpfs "${TMPFS}" tmpfs "suid,dev,size=${TMPFS_SIZE}"
mkdir --parents "${CACHEDIR}"
find="$(find "${CACHEDIR}" -mindepth 1 -maxdepth 1 -type d | sort --numeric)"
if [[ -z "${find}" ]]; then
[[ -z "${_INPUT}" ]] && _INPUT="$(get_iso "${ISODIR}" "${ISOURL}")"
cond_mount "${_INPUT}" "${PREFIX}/isobase" iso9660 ro,loop
# TODO: Mount iso in place
mkdir --parents "${TMP}/lower"
lowerdir="${TMP}/lower"
SQUASHFSPATH="${PREFIX}/isobase/casper/filesystem.squashfs"
else
lowerdir="$(head --lines=1 <<< "${find}")"
find="$(grep --invert-match "${lowerdir}" <<< "${find}")"
lowerdir="$(sed 's/:/\\:/g' <<< "${lowerdir}")/image"
for dir in ${find}; do
lowerdir="$(sed 's/:/\\:/g' <<< "${dir}")/image:${lowerdir}"
done
SQUASHFSPATH="${TMP}/image/casper/filesystem.squashfs"
fi
upperdir="${TMP}/upper"
workdir="${TMP}/work"
mkdir --parents "${upperdir}"
mkdir --parents "${workdir}"
cond_mount overlay "${TMP}/image" overlay \
"rw,lowerdir=${lowerdir},upperdir=${upperdir},workdir=${workdir}"
cond_mount "${SQUASHFSPATH}" "${PREFIX}/squashfsbase" squashfs ro,loop
lowerdir="${PREFIX}/squashfsbase"
upperdir="${TMPFS}/upper"
workdir="${TMPFS}/work"
mkdir --parents "${upperdir}"
mkdir --parents "${workdir}"
mountTmpfs "${TMPFS}"
mountOverlay "${CHROOTDIR}" "${TMPFS}"
cond_mount overlay "${CHROOTDIR}" overlay \
"rw,lowerdir=${lowerdir},upperdir=${upperdir},workdir=${workdir}"
export NO_DBUS=true
# Each one of the available scripts is executed in numeric order
for script in "${SCRIPTSDIR}"/*; do
if [ -x "${script}" ] && grep -E --quiet '^[0-9]{2}-[A-Za-z]+' <<< "$(basename "${script}")"; then
createIsoLogger --message "Running $(basename "${script}")..." --type info
if ! "${script}"\
"${_DIST}" \
"${_ARCH}" \
"${_REPO}" \
"${CHROOTDIR}" \
"${SCRIPT_NAME}" \
"${DISTRO}" \
"${DPLIST}" \
"${INSTLIST}" \
"${ISOLINUX}" \
"${MOUNTLIST}" \
"${OURSOURCESLIST}" \
"${RMDSKT}" \
"${RMLIST}" \
"${SCRIPTSDIR}" \
"${SHORTNAME}" \
"${SOURCESLISTDEFAULT}" \
if [[ -x "${script}" ]] && grep -E --quiet '^[0-9]{2}-[A-Za-z]+' \
<<< "$(basename "${script}")"; then
create_iso_logger --message "Running $(basename "${script}")..." \
--type info
if ! "${script}" \
"${_PROF}" \
"${NAME}" \
"${WEBSITE}" \
"${TMP}" \
"${TMPFS}" \
"${REPOPKGS}" \
"${LOG_FILE}"; then
cleanup "${CHROOTDIR}" "${TMP}"
exit 1
"${CHROOTDIR}" \
"${CACHEDIR}" \
"${PKGLIST}" \
"${SOURCESLIST}" \
"${_REPO}" \
"${KEYURL}" \
"${_DEBUG}"; then
cleanup "${CHROOTDIR}"
create_iso_logger --message "Failed to run " \
"$(basename "${script}")"
fi
# If the script is marked as 'chroot', it means it performs changes in the overlayed chroot filesystem,
# therefore, the 'chroot script', filled with the required commands by the marked script, is executed
# This warning is disabled because the literal '-' is actually needed:
# This warning is disabled because the literal '-' is needed:
# shellcheck disable=SC1001
if [[ "$(basename "${script}")" =~ [0-9]+\-chroot\.* ]]; then
initChroot "${CHROOTDIR}" "${LOG_FILE}"
execChroot "${CHROOTDIR}" "${SCRIPT_NAME}"
closeChroot "${CHROOTDIR}" "${LOG_FILE}"
# If the script is marked as 'chroot', it means it performs
# changes in the overlaid chroot filesystem, therefore, the
# 'chroot script', filled with the required commands by the marked
# script, is executed
init_chroot "${CHROOTDIR}"
exec_chroot "${CHROOTDIR}"
close_chroot "${CHROOTDIR}"
fi
fi
done
# Finally generates the resulting iso image
NAME="LinuxEducacional6-$(echo "${_DIST}" | cut --delimiter='/' --fields=2).iso"
pushd "${TMP}/image" || createIsoLogger --message "Unable to change directory" --tag "pushd"
xorriso -as mkisofs -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin -c isolinux/boot.cat -b isolinux/isolinux.bin \
-no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot -no-emul-boot -isohybrid-gpt-basdat \
-o "${PREFIX}/iso/${NAME}" . || createIsoLogger --message "Failed to generate iso image." --tag "xorriso"
popd || createIsoLogger --message "Unable to change directory" --tag "popd"
cleanup "${CHROOTDIR}" "${TMP}"
umountOverlay "${CHROOTDIR}" "${TMPFS}"
umountTmpfs "${TMPFS}"
mkdir --parents "$(dirname "${_OUTPUT}")"
pushd "${TMP}/image" || \
create_iso_logger --message "Unable to change directory" --tag "pushd"
xorriso -as mkisofs -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin -c \
isolinux/boot.cat -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 \
-boot-info-table -eltorito-alt-boot -no-emul-boot -isohybrid-gpt-basdat -o \
"${_OUTPUT}" . || \
create_iso_logger --message "Failed to generate iso image." --tag "xorriso"
popd || create_iso_logger --message "Unable to change directory" --tag "popd"
cleanup "${CHROOTDIR}"
cond_umount "${CHROOTDIR}"
rm --recursive --force "${CHROOTDIR}"
cond_umount "${PREFIX:?}/squashfsbase"
rm --recursive --force "${PREFIX:?}/squashfsbase"
cond_umount "${TMP:?}/image"
mkdir --parents "${CACHEDIR}/${TIME_STAMP}"
mv "${TMP}/MD5SUMS" "${CACHEDIR}/${TIME_STAMP}/" || \
create_iso_logger --message "Unable to move file" --tag "mv"
mv "${TMP}/upper" "${CACHEDIR}/${TIME_STAMP}/image" || \
create_iso_logger --message "Unable to move directory" --tag "mv"
cond_umount "${TMPFS}"
rm --recursive --force "${TMPFS}"
cond_umount "${PREFIX:?}/isobase"
rm --recursive --force "${PREFIX:?}/isobase"
exit 0
#!/bin/bash
# shellcheck disable=SC1090
#
# Copyright (C) 2017 Centro de Computacao Cientifica e Software Livre
# Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
#
# This file is part of create-iso
#
# create-iso is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 3
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
# USA.
if [ "$(id -u)" != "0" ]; then
echo "You must have more power to run this script. Are you root?"
exit -1
fi
PREFIX="$(realpath "$(dirname "$0")")"
EXE="$1"
VERSION="$2"
ISOPATH="$3"
TODAY="$(date +'%Y-%m-%d')"
CMD="\"${EXE}\" --profile le6 --version \"${VERSION}\" --repo testing --output \"${PREFIX}/linux-educacional-${VERSION}-testing-${TODAY}.iso\" --debug --sendmail"
CFGFILE="${PREFIX}/vars.cfg"
source "${CFGFILE}"
if [ "${SWITCH}" == 0 ]; then
# Turn up switch
sed --in-place "s/SWITCH=0/SWITCH=1/" "${CFGFILE}"
# Do nothing
exit 0
else
# Turn down switch
sed --in-place "s/SWITCH=1/SWITCH=0/" "${CFGFILE}"
# Proceed with job
fi
# Create GNU screen session
screen -dmS "${TODAY}" || exit 1
# Execute c3geniso in the main window
screen -S "${TODAY}" -X stuff "${CMD} && scp -i /home/lucas/.ssh/id_rsa_deployiso \"${PREFIX}\"/*.iso repository@repo.c3sl.ufpr.br:'/home/repository/www/le6/iso' && mv \"${PREFIX}\"/*.iso \"${ISOPATH}\" && exit\n" || exit 2
exit 0
#!/bin/bash
# shellcheck disable=SC1090
mount --bind /dev chroot/dev
mount --bind /dev/pts chroot/dev/pts
mount --bind /sys chroot/sys
mount --bind /proc chroot/proc
#chroot chroot dbus-uuidgen > chroot/var/lib/dbus/machine-id
chroot chroot
readonly ERROR=1
readonly WARNING=2
readonly INFO=4
readonly DEBUG=8
readonly ALL=15
VERBOSE_FLAGS=${ALL}
mapType() {
case "${1}" in
e | error ) echo "${ERROR}" ;;
w | warning ) echo "${WARNING}" ;;
i | info ) echo "${INFO}" ;;
d | debug ) echo "${DEBUG}" ;;
* ) createIsoLogger -m "Invalid type '${1}'" -T "LOGGER"; return 1 ;;
esac
}
createIsoLogger() {
TYPE="${ERROR}"
MSG=""
SCRIPT="$(basename "${BASH_SOURCE[1]}")"
LINE="${BASH_LINENO[0]}"
while true; do
case "${1}" in
-t | --type ) TYPE="$(mapType "${2}")" || return; shift; shift ;;
-T | --tag ) TAG="${2}"; shift; shift ;;
-m | --message ) MSG="${2}"; shift; shift ;;
-s | --script ) SCRIPT="${2}"; shift; shift ;;
-l | --line ) LINE="${2}"; shift; shift ;;
-* ) createIsoLogger -m "Unrecognized option '${1}'" -T "LOGGER"; return ;;
* ) break ;;
esac
done
if [ "$((${VERBOSE_FLAGS} & ${TYPE}))" -eq "${TYPE}" ]; then
if [ -z "${TAG}" ]; then
LOG_LINE="[${SCRIPT}]: line ${LINE}: ${MSG}"
else
LOG_LINE="[${SCRIPT}]: line ${LINE}: [${TAG}]: ${MSG}"
fi
case "${TYPE}" in
"${ERROR}" ) LOG_LINE="\033[38;5;9m[ERROR]: ${LOG_LINE}\033[0m" ;;
"${WARNING}" ) LOG_LINE="\033[38;5;11m[WARNING]: ${LOG_LINE}\033[0m" ;;
"${INFO}" ) LOG_LINE="\033[38;5;10m[INFO]: ${LOG_LINE}\033[0m" ;;
"${DEBUG}" ) LOG_LINE="\033[38;5;6m[DEBUG]: ${LOG_LINE}\033[0m" ;;
* ) createIsoLogger -m "Invalid type '${TYPE}'" -T "LOGGER"; return ;;
esac
echo -e "${LOG_LINE}" 1>&2
echo -e "${LOG_LINE}" >> "${LOG_FILE}"
else
createIsoLogger -m "Tried to use disabled type '${TYPE}'" -T "LOGGER"
return
fi
if [ "${TYPE}" -eq "${ERROR}" ]; then
/bin/bash
fi
}
true
#!/bin/bash
# shellcheck disable=SC1090
#
# Copyright (C) 2017 Centro de Computacao Cientifica e Software Livre
# Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
#
# This file is part of create-iso
#
# create-iso is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 3
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
# USA.
get_iso() {
local isodir="$1"
local isosrc="$2"
local isoname
local md5
local oldmd5
local newmd5
md5="$(wget "${isosrc}/MD5SUMS" -O- | \
grep "amd64" | \
sort --version-sort | \
tail --lines=1)"
isoname="$(cut --delimiter='*' --fields=2 <<< "${md5}")"
newmd5="$(cut --delimiter=' ' --fields=1 <<< "${md5}")"
oldmd5="$(cat "${isodir}/input/MD5SUMS")"
if [[ "${oldmd5}" != "${newmd5}" ]]; then
mkdir --parents "${isodir}/input"
pushd "${isodir}/input" >/dev/null || \
create_iso_logger --message "Unable to change directory" --tag "pushd"
create_iso_logger --message "Downloading ${isoname}" --type info
wget "${isosrc}/${isoname}" || \
create_iso_logger --message "Unable to download image" --tag "wget"
create_iso_logger --message "Generating md5sum" --type info
md5="$(md5sum "${isodir}/input/${isoname}" | \
cut --delimiter=' ' --fields=1)"
[[ "${md5}" != "${newmd5}" ]] && \
create_iso_logger --message "Iso image is corrupted"
popd >/dev/null || \
create_iso_logger --message "Unable to change directory" --tag "popd"
echo "${newmd5}" > "${isodir}/input/MD5SUMS"
fi
echo "${isodir}/input/${isoname}"
}
\ No newline at end of file
#!/bin/bash
# shellcheck disable=SC1090
initChroot() {
local chrootdir="${1}"
#
# Copyright (C) 2017 Centro de Computacao Cientifica e Software Livre
# Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
#
# This file is part of create-iso
#
# create-iso is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 3
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.