Add support for plugins, move all distribution-specific code there

While at it, also change name of local repo to pkgs-for-tmplate (was
yum_repo_qubes).
pull/1/head
Marek Marczykowski-Górecki 9 years ago
parent 518b0a39da
commit 3092bb2d71

6
.gitignore vendored

@ -1,11 +1,7 @@
*~
appmenus
build_timestamp_*
cache_*
mnt_*
*.iso
*.fs
*.img
install-templates.sh
yum_repo_qubes/*
scripts_fedora/base_rpms_fc21/*
pkgs-for-template/*

@ -3,24 +3,21 @@ $(error "You must set DIST variable, e.g. DIST=fc14")
endif
export DIST
dist_ver := $(shell DIST=$(DIST) ./builder_setup)
DISTRIBUTION := $(word 1,$(dist_ver))
DIST_VERSION := $(word 2,$(dist_ver))
TEMPLATE_NAME := $(word 3,$(dist_ver))
TEMPLATE_BUILDER = 1
-include $(addsuffix /Makefile.builder,$(BUILDER_PLUGINS_DIRS))
ifeq (,$(TEMPLATE_NAME))
TEMPLATE_NAME := $(DISTRIBUTION)-$(DIST_VERSION)-x64
TEMPLATE_NAME := $(DIST)
ifdef TEMPLATE_FLAVOR
TEMPLATE_NAME := $(TEMPLATE_NAME)-$(TEMPLATE_FLAVOR)
endif
endif
# Make sure names are < 32 characters, process aliases
fix_up := $(shell TEMPLATE_NAME=$(TEMPLATE_NAME) ./builder_fix_filenames)
TEMPLATE_NAME := $(word 1,$(fix_up))
export DISTRIBUTION
export TEMPLATE_NAME
export TEMPLATE_SCRIPTS
export DISTRIBUTION
VERSION := $(shell cat version)
TIMESTAMP := $(shell date -u +%Y%m%d%H%M)
@ -32,7 +29,7 @@ help:
prepare:
@echo $(TIMESTAMP) > build_timestamp_$(DIST)
@echo $(TIMESTAMP) > build_timestamp_$(TEMPLATE_NAME)
rpms: prepare rootimg-build
@echo "Building template: $(TEMPLATE_NAME)"
@ -40,7 +37,10 @@ rpms: prepare rootimg-build
./create_template_list.sh || :
rootimg-build:
sudo -E ./prepare_image prepared_images/$(TEMPLATE_NAME).img && \
ifeq (,$(TEMPLATE_SCRIPTS))
$(error Building template $(DIST) not supported by any of configured plugins)
endif
sudo -E ./prepare_image prepared_images/$(TEMPLATE_NAME).img
sudo -E ./qubeize_image prepared_images/$(TEMPLATE_NAME).img $(TEMPLATE_NAME)
update-repo-installer:
@ -48,8 +48,8 @@ update-repo-installer:
ln -f rpm/noarch/qubes-template-$(TEMPLATE_NAME)-$(VERSION)-$(shell cat build_timestamp_$(DIST))*.noarch.rpm $$UPDATE_REPO/rpm
prepare-repo-template:
rm -rf yum_repo_qubes/$(DIST)
mkdir -p yum_repo_qubes/$(DIST)/rpm yum_repo_qubes/$(DIST)/repodata
rm -rf pkgs-for-template/$(DIST)
mkdir -p pkgs-for-template/$(DIST)
clean:
sudo rm -fr qubeized_images/root.img.*

@ -1,5 +0,0 @@
gnome-terminal.desktop
nautilus.desktop
firefox.desktop
mozilla-thunderbird.desktop
libreoffice-startcenter.desktop

@ -1,6 +0,0 @@
gnome-terminal.desktop
gpk-application.desktop
gpk-prefs.desktop
gpk-update-viewer.desktop
system-config-date.desktop
system-config-printer.desktop

@ -1,5 +0,0 @@
gnome-terminal.desktop
nautilus.desktop
firefox.desktop
mozilla-thunderbird.desktop
libreoffice-startcenter.desktop

@ -1,6 +0,0 @@
gnome-terminal.desktop
gpk-application.desktop
gpk-prefs.desktop
gpk-update-viewer.desktop
system-config-date.desktop
system-config-printer.desktop

@ -1,3 +0,0 @@
gnome-terminal.desktop
nautilus.desktop
firefox.desktop

@ -1,5 +0,0 @@
gnome-terminal.desktop
gpk-application.desktop
gpk-prefs.desktop
system-config-date.desktop
system-config-printer.desktop

@ -1,3 +0,0 @@
gnome-terminal.desktop
nautilus.desktop
firefox.desktop

@ -1,5 +0,0 @@
gnome-terminal.desktop
gpk-application.desktop
gpk-prefs.desktop
system-config-date.desktop
system-config-printer.desktop

@ -1,5 +0,0 @@
gnome-terminal.desktop
org.gnome.Nautilus.desktop
iceweasel.desktop
icedove.desktop
yelp.desktop

@ -1,6 +0,0 @@
gnome-terminal.desktop
gpk-application.desktop
gpk-update-viewer.desktop
gpk-prefs.desktop
gpk-log.desktop
yelp.desktop

@ -1,16 +0,0 @@
evolution.desktop
gimp.desktop
yelp.desktop
iceweasel.desktop
eog.desktop
rhythmbox.desktop
gnome-system-log.desktop
gnome-terminal.desktop
gnome-calculator.desktop
org.gnome.Cheese.desktop
org.gnome.Nautilus.desktop
org.gnome.gedit.desktop
shotwell.desktop
org.gnome.Totem.desktop
libreoffice-startcenter.desktop
session-properties.desktop

@ -1,10 +0,0 @@
gdebi.desktop
yelp.desktop
gpk-log.desktop
gpk-prefs.desktop
gpk-update-viewer.desktop
gpk-application.desktop
gnome-printers-panel.desktop
tracker-preferences.desktop
gnome-system-log.desktop
gnome-terminal.desktop

@ -1,5 +0,0 @@
gnome-terminal.desktop
firefox.desktop
thunderbird.desktop
nautilus.desktop
yelp.desktop

@ -1,6 +0,0 @@
gnome-terminal.desktop
gpk-application.desktop
gpk-update-viewer.desktop
gpk-prefs.desktop
gpk-log.desktop
yelp.desktop

@ -1,5 +0,0 @@
gnome-terminal.desktop
firefox.desktop
thunderbird.desktop
nautilus.desktop
yelp.desktop

@ -1,6 +0,0 @@
gnome-terminal.desktop
gpk-application.desktop
gpk-update-viewer.desktop
gpk-prefs.desktop
gpk-log.desktop
yelp.desktop

@ -1,5 +0,0 @@
gnome-terminal.desktop
firefox.desktop
thunderbird.desktop
nautilus.desktop
yelp.desktop

@ -1,6 +0,0 @@
gnome-terminal.desktop
gpk-application.desktop
gpk-update-viewer.desktop
gpk-prefs.desktop
gpk-log.desktop
yelp.desktop

@ -1,5 +0,0 @@
gnome-terminal.desktop
firefox.desktop
thunderbird.desktop
nautilus.desktop
yelp.desktop

@ -1,6 +0,0 @@
gnome-terminal.desktop
gpk-application.desktop
gpk-update-viewer.desktop
gpk-prefs.desktop
gpk-log.desktop
yelp.desktop

@ -1,5 +0,0 @@
gnome-terminal.desktop
firefox.desktop
thunderbird.desktop
nautilus.desktop
yelp.desktop

@ -1,6 +0,0 @@
gnome-terminal.desktop
gpk-application.desktop
gpk-update-viewer.desktop
gpk-prefs.desktop
gpk-log.desktop
yelp.desktop

@ -1,5 +0,0 @@
gnome-terminal.desktop
firefox.desktop
thunderbird.desktop
nautilus.desktop
yelp.desktop

@ -1,6 +0,0 @@
gnome-terminal.desktop
gpk-application.desktop
gpk-update-viewer.desktop
gpk-prefs.desktop
gpk-log.desktop
yelp.desktop

@ -1,5 +0,0 @@
gnome-terminal.desktop
iceweasel.desktop
icedove.desktop
nautilus.desktop
yelp.desktop

@ -1,6 +0,0 @@
gnome-terminal.desktop
gpk-application.desktop
gpk-update-viewer.desktop
gpk-prefs.desktop
gpk-log.desktop
yelp.desktop

@ -1,15 +0,0 @@
gnome-terminal.desktop
gcalctool.desktop
evolution.desktop
nautilus.desktop
iceweasel.desktop
libreoffice-startcenter.desktop
gedit.desktop
gimp.desktop
eog.desktop
totem.desktop
rhythmbox.desktop
gnome-system-log.desktop
cheese.desktop
session-properties.desktop
yelp.desktop

@ -1,11 +0,0 @@
gnome-terminal.desktop
gpk-application.desktop
gpk-update-viewer.desktop
gpk-prefs.desktop
gpk-log.desktop
gnome-panel.desktop
gnome-printers-panel.desktop
gnome-system-log.desktop
gdebi.desktop
tracker-preferences.desktop
yelp.desktop

@ -1,16 +0,0 @@
gnome-terminal.desktop
gpk-application.desktop
gpk-update-viewer.desktop
gpk-prefs.desktop
gpk-log.desktop
yelp.desktop
gateway-firewall30default.desktop
gateway-firewall50user.desktop
gateway-torrc.desktop
gateway-torrcexamples.desktop
gateway-firewall30default.desktop
gateway-firewall50user.desktop
gateway-firsttimesetup.desktop
gateway-torrc.desktop
gateway-torrcexamples.desktop
whonix_repository.desktop

@ -1,10 +0,0 @@
gnome-terminal.desktop
nautilus.desktop
yelp.desktop
gateway-arm.desktop
gateway-reloadfirewall.desktop
gateway-reloadtor.desktop
gateway-restarttor.desktop
gateway-stoptor.desktop
timesync.desktop
whonixcheck.desktop

@ -1,16 +0,0 @@
gnome-terminal.desktop
gpk-application.desktop
gpk-update-viewer.desktop
gpk-prefs.desktop
gpk-log.desktop
yelp.desktop
gateway-firewall30default.desktop
gateway-firewall50user.desktop
gateway-torrc.desktop
gateway-torrcexamples.desktop
gateway-firewall30default.desktop
gateway-firewall50user.desktop
gateway-firsttimesetup.desktop
gateway-torrc.desktop
gateway-torrcexamples.desktop
whonix_repository.desktop

@ -1,14 +0,0 @@
gnome-terminal.desktop
nautilus.desktop
yelp.desktop
anondist-torbrowser.desktop
timesync.desktop
whonixcheck.desktop
whonix-contribute.desktop
whonix-documentation.desktop
whonix-donate.desktop
whonix-featureblog.desktop
whonix-forum.desktop
whonix-importantblog.desktop
whonix-irc-chat-support.desktop
whonix-mailinglist.desktop

@ -1,12 +0,0 @@
gnome-terminal.desktop
gpk-application.desktop
gpk-update-viewer.desktop
gpk-prefs.desktop
gpk-log.desktop
yelp.desktop
gnome-panel.desktop
gnome-printers-panel.desktop
gnome-system-log.desktop
tracker-preferences.desktop
anondist-torbrowser_update.desktop
whonix_repository.desktop

@ -1,22 +0,0 @@
gnome-terminal.desktop
nautilus.desktop
gcalctool.desktop
evolution.desktop
libreoffice-startcenter.desktop
gimp.desktop
eog.desktop
totem.desktop
shotwell.desktop
rhythmbox.desktop
anondist-torbrowser.desktop
timesync.desktop
whonixcheck.desktop
whonix-contribute.desktop
whonix-documentation.desktop
whonix-donate.desktop
whonix-featureblog.desktop
whonix-forum.desktop
whonix-importantblog.desktop
whonix-irc-chat-support.desktop
whonix-mailinglist.desktop
yelp.desktop

@ -1,14 +0,0 @@
gnome-terminal.desktop
gpk-application.desktop
gpk-update-viewer.desktop
gpk-prefs.desktop
gpk-log.desktop
gpk-application.desktop
gpk-update-viewer.desktop
gpk-prefs.desktop
gnome-panel.desktop
gnome-printers-panel.desktop
gnome-system-log.desktop
tracker-preferences.desktop
anondist-torbrowser_update.desktop
yelp.desktop

@ -11,8 +11,6 @@ fi
rpmbuild --target noarch \
--define "template_name $NAME" \
--define "DIST $DIST" \
--define "DISTRIBUTION $DISTRIBUTION" \
--define "VERSION $VERSION" \
--define "_topdir $PWD/rpmbuild" \
--define "_tmppath $PWD/rpmbuild/tmp" \
-bb templates.spec

@ -2,44 +2,14 @@
# Setup env variables
case "$DIST" in
fc*)
DISTRIBUTION=fedora
VERSION=${DIST/fc/}
;;
wheezy)
DISTRIBUTION=debian
VERSION=7
;;
jessie)
DISTRIBUTION=debian
VERSION=8
;;
trusty)
DISTRIBUTION=qubuntu
VERSION=14.04
;;
utopic)
DISTRIBUTION=qubuntu
VERSION=14.10
;;
vivid)
DISTRIBUTION=qubuntu
VERSION=15.04
;;
*)
DISTRIBUTION="$DIST"
VERSION=
;;
esac
if [ -d "scripts_$DIST" ]; then
SCRIPTSDIR="scripts_$DIST"
else
SCRIPTSDIR="scripts_$DISTRIBUTION"
SCRIPTSDIR=$TEMPLATE_SCRIPTS
if [ ! -d "$SCRIPTSDIR" ]; then
echo "Scripts directory $SCRIPTSDIR does not exists"
exit 1
fi
if [ -z "$CACHEDIR" ]; then
CACHEDIR=cache_$DIST
fi
export SCRIPTSDIR CACHEDIR
echo $DISTRIBUTION $VERSION

Binary file not shown.

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE comps PUBLIC "-//Red Hat, Inc.//DTD Comps info//EN" "comps.dtd">
<comps>
<group>
<id>qubes-vm</id>
<name>Qubes Environment</name>
<default>true</default>
<packagelist>
<packagereq type="mandatory">qubes-core-vm-systemd</packagereq>
<packagereq type="mandatory">qubes-core-vm</packagereq>
<packagereq type="mandatory">qubes-gui-vm</packagereq>
<packagereq type="mandatory">xen-libs</packagereq>
<packagereq type="mandatory">xen-qubes-vm-essentials</packagereq>
<packagereq type="default">qubes-doc-vm</packagereq>
<packagereq type="optional">thunderbird-qubes</packagereq>
<packagereq type="optional">qubes-pdf-converter</packagereq>
<packagereq type="optional">qubes-gpg-split</packagereq>
</packagelist>
</group>
</comps>

@ -10,15 +10,15 @@ RETCODE=0
: ${DIST=fc14}
. ./builder_setup >/dev/null
. ./umount_kill.sh >/dev/null
if [ "${VERBOSE}" -ge 2 -o "${DEBUG}" == "1" ]; then
set -x
else
set -e
fi
. ./builder_setup >/dev/null
. ./umount_kill.sh >/dev/null
if ! [ $# -eq 1 ]; then
echo "usage ${0} <img_file_name>"
exit

@ -78,10 +78,12 @@ export INSTALLDIR=mnt
# ------------------------------------------------------------------------------
echo "--> Choosing appmenus whitelists..."
rm -f appmenus
if [ -d "appmenus_${DIST}_${TEMPLATE_FLAVOR}" ]; then
ln -s "appmenus_${DIST}_${TEMPLATE_FLAVOR}" appmenus
elif [ -d "appmenus_$DIST" ]; then
ln -s "appmenus_$DIST" appmenus
if [ -d "${SCRIPTSDIR}/appmenus_${DIST}_${TEMPLATE_FLAVOR}" ]; then
ln -s "${SCRIPTSDIR}/appmenus_${DIST}_${TEMPLATE_FLAVOR}" appmenus
elif [ -d "${SCRIPTSDIR}/appmenus_$DIST" ]; then
ln -s "${SCRIPTSDIR}/appmenus_$DIST" appmenus
elif [ -d "${SCRIPTSDIR}/appmenus" ]; then
ln -s "${SCRIPTSDIR}/appmenus" appmenus
else
ln -s "appmenus_generic" appmenus
fi
@ -91,17 +93,12 @@ fi
# ------------------------------------------------------------------------------
echo "--> Linking /home to /rw/home..."
mv mnt/home mnt/home.orig
ln -sf /rw/home mnt/home
mkdir mnt/home
echo "--> Linking /usr/local to /rw/usrlocal..."
mv mnt/usr/local mnt/usr/local.orig
ln -sf /rw/usrlocal mnt/usr/local
if [ -e mnt/etc/sysconfig/i18n ]; then
echo "--> Setting up default locale..."
echo LC_CTYPE=en_US.UTF-8 > mnt/etc/sysconfig/i18n
fi
# ------------------------------------------------------------------------------
# Finsh - unmount image
# ------------------------------------------------------------------------------
@ -112,3 +109,4 @@ echo "Qubeized image stored at: $IMG"
echo "Reducing image size (calling cleanup_image)..."
./cleanup_image "$IMG"
chown -R --reference=. qubeized_images/$NAME

@ -1,25 +0,0 @@
#!/bin/sh
ISO_VERSION=`date +%Y.%m`.01
mkdir -p $CACHEDIR
echo "Downloading Archlinux dvd..."
wget -N -P $CACHEDIR "http://mir.archlinux.fr/iso/$ISO_VERSION/archlinux-$ISO_VERSION-dual.iso"
wget -N -P $CACHEDIR "http://mir.archlinux.fr/iso/$ISO_VERSION/archlinux-$ISO_VERSION-dual.iso.sig"
echo "Verifying dvd..."
gpg --import "$SCRIPTSDIR/archlinux-master-keys.asc"
gpg --verify "$CACHEDIR/archlinux-$ISO_VERSION-dual.iso.sig" "$CACHEDIR/archlinux-$ISO_VERSION-dual.iso" || exit
if [ "$CACHEDIR/archlinux-$ISO_VERSION-dual.iso" -nt $CACHEDIR/root-image.fs ]; then
echo "Extracting squash filesystem from DVD..."
mkdir mnt_archlinux_dvd
mount -o loop "$CACHEDIR/archlinux-$ISO_VERSION-dual.iso" mnt_archlinux_dvd || echo "!!Error mounting iso to mnt_archlinux_dvd"
cp mnt_archlinux_dvd/arch/x86_64/airootfs.sfs $CACHEDIR/ || echo "!!Error copying root sfs file to \$CACHEDIR"
umount mnt_archlinux_dvd
mount -o loop $CACHEDIR/airootfs.sfs mnt_archlinux_dvd || echo "!!Error mounting root sfs"
cp mnt_archlinux_dvd/airootfs.img $CACHEDIR/ || echo "!!Error copying root fs file"
umount mnt_archlinux_dvd
rm $CACHEDIR/airootfs.sfs
fi

@ -1,38 +0,0 @@
#!/bin/sh
set -e
echo "Mounting archlinux install system into mnt_archlinux_dvd..."
mkdir -p mnt_archlinux_dvd
mount $CACHEDIR/airootfs.img mnt_archlinux_dvd
echo "Fix bug intruduced in arch-chroot causing arguments not to be passed"
sed "s/unshare --fork --pid//" -i mnt_archlinux_dvd/usr/bin/arch-chroot
echo "Fix chroot cannot be umounted because of gpg-agent started by pacman"
sed "/chroot_umount() {/a pkill gpg-agent" -i mnt_archlinux_dvd/usr/bin/arch-chroot
cat mnt_archlinux_dvd/usr/bin/arch-chroot
echo "Creating chroot bootstrap environment"
mount --bind $INSTALLDIR mnt_archlinux_dvd/mnt
cp /etc/resolv.conf mnt_archlinux_dvd/etc
echo "-> Initializing pacman keychain"
# Note: pacman-key starts gpg-agent automatically, which locks /dev
./mnt_archlinux_dvd/usr/bin/arch-chroot mnt_archlinux_dvd/ pacman-key --init
./mnt_archlinux_dvd/usr/bin/arch-chroot mnt_archlinux_dvd/ pacman-key --populate
echo "-> Installing core pacman packages..."
./mnt_archlinux_dvd/usr/bin/arch-chroot mnt_archlinux_dvd/ sh -c 'pacstrap /mnt base'
echo "--> Removing non required linux kernel (can be added manually through a package)"
./mnt_archlinux_dvd/usr/bin/arch-chroot $INSTALLDIR pacman --noconfirm -Rsc linux
echo "-> Cleaning up bootstrap environment"
umount mnt_archlinux_dvd/mnt
umount mnt_archlinux_dvd
cp $SCRIPTSDIR/resolv.conf $INSTALLDIR/etc

@ -1,27 +0,0 @@
#!/bin/sh
if [ -n "${TEMPLATE_FLAVOR}" ]; then
PKGLISTFILE="$SCRIPTSDIR/packages_${TEMPLATE_FLAVOR}.list"
if ! [ -r "${PKGLISTFILE}" ]; then
echo "ERROR: ${PKGLISTFILE} does not exists!"
exit 1
fi
else
PKGLISTFILE="$SCRIPTSDIR/packages.list"
fi
set -e
echo "Mounting archlinux install system into mnt_archlinux_dvd..."
mount $CACHEDIR/airootfs.img mnt_archlinux_dvd
echo "Fix bug intruduced in arch-chroot causing arguments not to be passed"
sed "s/unshare --fork --pid//" -i mnt_archlinux_dvd/usr/bin/arch-chroot
PKGGROUPS=`cat $PKGLISTFILE`
echo "-> Installing archlinux package groups..."
echo "-> Selected packages:"
echo "$PKGGROUPS"
./mnt_archlinux_dvd/usr/bin/arch-chroot $INSTALLDIR pacman --needed --noconfirm -S $PKGGROUPS
umount mnt_archlinux_dvd

@ -1,77 +0,0 @@
#!/bin/sh
set -e
echo "Mounting archlinux install system into mnt_archlinux_dvd..."
mkdir -p mnt_archlinux_dvd
mount $CACHEDIR/airootfs.img mnt_archlinux_dvd
echo "Fix bug intruduced in arch-chroot causing arguments not to be passed"
sed "s/unshare --fork --pid//" -i mnt_archlinux_dvd/usr/bin/arch-chroot
# Note: Enable x86 repos
su -c "echo '[multilib]' >> $INSTALLDIR/etc/pacman.conf"
su -c "echo 'SigLevel = PackageRequired' >> $INSTALLDIR/etc/pacman.conf"
su -c "echo 'Include = /etc/pacman.d/mirrorlist' >> $INSTALLDIR/etc/pacman.conf"
echo "--> Registering Qubes custom repository"
cat >> $INSTALLDIR/etc/pacman.conf <<EOF
[qubes] # QubesTMP
SigLevel = Optional TrustAll # QubesTMP
Server = file:///mnt/qubes-rpms-mirror-repo/pkgs # QubesTMP
EOF
export CUSTOMREPO=$PWD/yum_repo_qubes/archlinux
mkdir -p $INSTALLDIR/mnt/qubes-rpms-mirror-repo
mount --bind $CUSTOMREPO $INSTALLDIR/mnt/qubes-rpms-mirror-repo
./mnt_archlinux_dvd/usr/bin/arch-chroot $INSTALLDIR sh -c "cd /mnt/qubes-rpms-mirror-repo/;repo-add pkgs/qubes.db.tar.gz pkgs/*.pkg.tar.xz"
chown -R --reference=$CUSTOMREPO $CUSTOMREPO
./mnt_archlinux_dvd/usr/bin/arch-chroot $INSTALLDIR sh -c "pacman -Sy"
echo "--> Installing qubes-packages..."
./mnt_archlinux_dvd/usr/bin/arch-chroot $INSTALLDIR sh -c "pacman -S --noconfirm qubes-vm-xen"
./mnt_archlinux_dvd/usr/bin/arch-chroot $INSTALLDIR sh -c "pacman -S --noconfirm qubes-vm-core"
./mnt_archlinux_dvd/usr/bin/arch-chroot $INSTALLDIR sh -c "pacman -S --noconfirm qubes-vm-gui"
echo "--> Updating template fstab file..."
cat >> $INSTALLDIR/etc/fstab <<EOF
/dev/mapper/dmroot / ext4 defaults,noatime 1 1
/dev/xvdb /rw ext4 defaults,noatime 1 2
/dev/xvdc1 swap swap defaults 0 0
/rw/home /home none noauto,bind,defaults 0 0
EOF
echo "--> Configuring system to our preferences"
# Name network devices using simple names (ethX)
ln -s /dev/null $INSTALLDIR/etc/udev/rules.d/80-net-name-slot.rules
# Initialize encoding to qubes standards
ln -s /etc/sysconfig/i18n $INSTALLDIR/etc/locale.conf
# Enable some locales (incl. UTF-8
sed 's/#en_US/en_US/g' -i $INSTALLDIR/etc/locale.gen
./mnt_archlinux_dvd/usr/bin/arch-chroot $INSTALLDIR sh -c "locale-gen"
# Creating a random file in /lib/modules to ensure that the directory in never deleted when packages are removed
mkdir -p $INSTALLDIR/lib/modules
touch $INSTALLDIR/lib/modules/QUBES
# Ensure os-release is setup correctly or Fedora dracut will fail when displaying the OS
# also ensure that the path is relative, because root is in /newroot before dracut switch root
ln -s ../usr/lib/os-release $INSTALLDIR/etc/os-release
# Disable qubes local repository
sed '/QubesTMP/d' -i $INSTALLDIR/etc/pacman.conf
# Reregistering qubes repository to the remote version
echo "--> Registering Qubes remote repository"
cat >> $INSTALLDIR/etc/pacman.conf <<EOF
[qubes]
Server = http://olivier.medoc.free.fr/archlinux/pkgs/
EOF
echo "--> Cleaning up..."
umount $INSTALLDIR/mnt/qubes-rpms-mirror-repo
umount mnt_archlinux_dvd

@ -1,37 +0,0 @@
#!/bin/sh
set -e
echo "Mounting archlinux install system into mnt_archlinux_dvd..."
mount $CACHEDIR/airootfs.img mnt_archlinux_dvd
echo "Fix bug intruduced in arch-chroot causing arguments not to be passed"
sed "s/unshare --fork --pid//" -i mnt_archlinux_dvd/usr/bin/arch-chroot
echo "--> Starting cleanup actions"
# Remove unused packages and their dependencies (make dependencies)
cleanuppkgs=`./mnt_archlinux_dvd/usr/bin/arch-chroot $INSTALLDIR pacman -Qdt | grep -v kernel | cut -d " " -f 1`
echo "--> Packages that can be cleaned up: $cleanuppkgs"
if [ -n "$cleanuppkgs" ] ; then
./mnt_archlinux_dvd/usr/bin/arch-chroot $INSTALLDIR pacman --noconfirm -Rsc $cleanuppkgs
fi
# Remove video plugins
echo "--> Removing video plugins"
VIDEOPKGS=`./mnt_archlinux_dvd/usr/bin/arch-chroot $INSTALLDIR pacman -Qs -q xf86-video`
echo $VIDEOPKGS | ./mnt_archlinux_dvd/usr/bin/arch-chroot $INSTALLDIR pacman --noconfirm -Rsc -
# Remove other font package
./mnt_archlinux_dvd/usr/bin/arch-chroot $INSTALLDIR pacman --noconfirm -Rsc xorg-fonts-100dpi xorg-fonts-75dpi
# Clean pacman cache
./mnt_archlinux_dvd/usr/bin/arch-chroot $INSTALLDIR pacman --noconfirm -Scc
umount mnt_archlinux_dvd
#rm -f $INSTALLDIR/var/lib/rpm/__db.00* $INSTALLDIR/var/lib/rpm/.rpm.lock
#yum -c $PWD/yum.conf $YUM_OPTS clean packages --installroot=$INSTALLDIR
# Make sure that rpm database has right format (for rpm version in template, not host)
#echo "--> Rebuilding rpm database..."
#chroot `pwd`/mnt /bin/rpm --rebuilddb 2> /dev/null

@ -1,411 +0,0 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.13 (GNU/Linux)
mQGNBE7Gu3MBDACGmD2FPejnpbdjOxuEDKYmIC1y2SkD1W97KwS9tOSceGy1gni9
uObZsiiiUqzu9p8uOpX0kxdykgk9cliH6QxFQr5e1WOSG6MkkDqYLAjP5kVFnT4T
E6lDklYQ6YW7j3lJVwFDNXV6yobt6ApMHaDGqERpcgs6prKb9wZZ/EdyqBblYTyJ
t0s3RpE5AolNHSboaJZ5YRf5s/T0mteJ37pAIljgXhfeiqxAl1Yp+RkRglaiHLhZ
pcJW2HRACmYv9SYSuLV0JcCAG4qeUyiHSoz93gAaf6VCv5JsYVg2Mwt5rGqE7CXg
XDHV4Klq/KrmaHmp81qpB1ngK1g6cCz34mdnLBMbyt5G2EdrIOiv/bBo5LsXtEhz
C6I/LZ75sXV3xC60+6ZWKkeZFtyXq0g9X5Gxc+wf79K2EVkAC1UwEylK/n8rfP01
vk6fkNJsSb42BEchyECo5iMY2BMGXQ6mlJqpEx3bxE4W1Di01XaT29nB/8hP3xbk
kJ1bu4hMa35sQQEAEQEAAbRIUGllcnJlIFNjaG1pdHogKEFyY2ggTGludXggTWFz
dGVyIEtleSkgPHBpZXJyZUBtYXN0ZXIta2V5LmFyY2hsaW51eC5vcmc+iQG4BBMB
AgAiBQJOxrtzAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRAzSIgvasak
wqLMC/9NV/ZY0nhUIZ/8I+U6ez60cr11i4Oq1NtZmNoNta6ER0OXrlunu6h+ZKiH
ET0jva0XS2B5eDBipDY7PHSuF7v2b0MbBR603FVryHrmL4SosJoZ/dC4T8Xr8L9d
k+fY65aIXt0EZme2AgRaqKXn4sW0vcOHDmGm2HqPv8TWtCu5ZDkOT/u9LP4oUde0
e0cpfdZLCgxLqYj5tFWO2Gt7Gq5WCDxHtr/QhFX7GqNTqvr6AukzT7S991tKlk6V
Wm/qMHo4tDrC2fBcvV4f+fFHSe/oBkxbF0LrcodkJ81Iq+e99p2JQ/Rn2yBZyKWL
hmuiDRavoQ/TgfEmn92j2rzq5IPiQkjuyQpDsYGV9K1KhMsunK4j1Xbt2tyUEo0K
H4ynAP07COUNa36rRw3ZqlErHR4BwFksvN5sdJ+zHIHeLsQEComRh7TV0DWukdTN
T4gpwIXNxBKN+b6QxHWtnsJlMsaExiI1OefHvBJAjXzzow0z6v3+axZ9Q/PrTtPp
YNpRI1iJARwEEAECAAYFAk7GwKcACgkQfy1DS5dB6Kz/iwgAohyIg/iB0V0ga9Ze
XvJoFe2ElKfQktZRkvkWR2rmCBD+3+CHFazJV8brOoPdhH14ECRIc85ZVhdQjB/C
ffiK9rK4Kc8jfPUWfY/ijH1aF96x+nReLfIeFyGqvdnLK1VsHXL8/uXWQ7a8byvq
smMDVL1ls9EixBeC38hLBkjRNepD+5epnhXohm11goCWHLPd0t6vVQFHRJCgnEmc
pZa9vxtJ/9SzoeShgJnFDoezeWLYZh82U0RONXQlUS7Z8N/roDz9sNiCYB7MSuQX
SNuBP3lK/1LQLBn7ZQuJcPOZRbbs6gN1w4tVhv5TEwP8+WqEpVLs0sy7+D55IKqj
+qp0V7iNBE7Gu3MBBADDfAfUJ2pBqqlVXwIKsn9XNTHZxjoFr4WcYqp9nKqZjLg+
sZLqnxPf1l465CPuQ8mbyAqXhbJmlNNd/jnZYHIV71kKledNu333XOOkAadhcF/W
7u09kYToxpsTrhmr+Dzw+KaFw4pZ1wwEL4DEEFt3KsSN2QLLru+pFkQGuqSA9QAR
AQABiQGfBBgBAgAJBQJOxrtzAhsMAAoJEDNIiC9qxqTCOj4L/A4Hz0oI3hsbLiha
7l4zaRK4stoINKfznV2Dba0exqhOIJDz9eYuGWo6q0B/SYXijiVcelaEhWD6NPtB
MZSQVZxNTP/B+tDQtAJO3BiS1ZNjn8F0wNH/CTaa+QNrxjz5xkHyBQ1oX102ny2M
4SJaJWXSRCxhXrPNt1r0oYqSd8Q6I13/P9UmzubQGrHJSGOd09GyOufcP2YTUeIB
EIbnWIdjWcyYkJPfoN8GQvDy1cKmVJ4J0161zRBNT8rG8Mp57RlwJ0di7m2bUE80
n+cozJ7DcTSAvlCWeaDKDQjiLkDc4c542oIrW2uv10YnA+bD0HYYYAof9kbMl+1V
pcJQ5c2Ksf+LGZVpP42Cm86s8h1VNtL9iRx00axuRkLLcLv805z3qTLZF4Gug9ML
DkM0CbSSrKVucIuAjMvTHRj5Jd82y61f2HASqKivjclcND4vNE1dpqLsXMeA9PHa
HnaKiY1Grws/23zwyLGXPrX8kbogKFbma3/t+4FqiHhqhtQ6orkBjQROxrtzAQwA
swrARYqwizazWDIw74iUhakQI9tRmzJCl7WhYwdR2qwoDROBH4Bf6XC1k8gI9vw5
4D5f1lly1ooc0sQoC3WcTpbVOhoHuTrOKVnK1qzuqI7RqC2yVR0NiMo2JSUrQs/O
C9o4PBS0u6P//igr3YXrc3KlzixgT2LnFx/gVid/AAOHSccsm94bVYLO61e8Q0er
8NkhVzREANp1Tkxji1ftBQVXATEeJ89tM6fLbY+sMxUtn0WyaxF94h/XBIRQE+6B
dLHwIGQ/vb9F1RVAm4dE25AGrYXU9m0ywi8dhEdk3wGG1NXVobuD17aZIXR5RNeH
vUeWsOxCVlFVR/Cs1SgVPnuA94j+pw8pCqgfTw+dq+K3nGEG+9y0rpITl88+jl6e
64RfiheeP+12Y1vK7qqLqADQ+E3Oxlo2s5ZOUNsnrH1D1DW6fJY6t7FpD2FliC/t
70KO1i5is1ilblbF7lxAOufrbNnGo92pwhxhh/lrr6jS9h8j/imAxs0wzk9rR08r
ABEBAAGJAZ8EGAECAAkFAk7Gu3MCGyAACgkQM0iIL2rGpMLipwv/VknAoRjwb1lk
k6Nw/eC+Y2Uav+VeKkweeJVwxphJ4Lbfrhvaq9lWpR329sPXZt7r1X3F+cLUR43N
jprW2nWna0vmZfrUIdwzA5FTco5Vx4NPQFgX+R0bByOX3ySXmXtysCc5j1S7C89g
5JYUVXD1aPB9FL1z6hRarh83Ip7351ZbOhrBSWIDMRi3qY3EL9N2jxApA0iHJ3yv
3BBa8KPrFnV9Xidz5gS/qIVa5aLJy2QR8HusOe+na2oUjBg+41XgSyzFOyEgfiYl
jMtHqFYy5HW3LcHfi3kUIY/Se7Sl1p+XsCF+PLiDeYBcvTEhcCt6U+JQVqfuzGSx
SoMWtJR2o3DbGh5V0BdmO4xmUcRyiQWIhT1e3NeLgcBqpOIBpro0zsbXCeQHQCOW
esy/nDU4NSaB7OhzUCyOyLGCzsYyFhrO+p59z3JPF6rX5UMqIxwLFmaHsFQBIRBX
HL80ZLoYBX5+b6+gwJTM6uSJbGvwBgfAJ1TLtDX/mqmhMLsUnqoomQGNBE7Hp9UB
DACNaL5VM5JsuA6EGjfJmagZO3pSlNWEtx0NmGQYPYOBwywXZFwq0zBdpNFxwJOy
xn2xdgQxtX8L1APxT7T/WGTPPDMHx7/N1xaWJqRxTQYV50MTmJaR+pgSR59zR1ex
RpEClcLOx72LpGKMYpWQ7JRJn0/9+JtSpwHlsfYrdi+VMgfU62d9H00sSCkmJsl/
3uvLvcbDyqtFu9bpMA7T2g+Ws1xaocD3fwRPogpM2Q2czYr514O6wZp//wScBHRs
gFRjQsYm02ZdbEQCmmK80/WhFA3CoovNG0+zXqu92tW7fj+pvTp34GX61MPUj7IN
KzxfSCo6ygtyUrozr5IuYlMc1misT26kfQUuKRgg7M3eF3pKcaVCDNX14h7Y+tcX
4yUBTsi5lvE88xZUTLp0MSmNMy22wX+OrCbb/YnzW4XnFWYgS/i8hfaeKsxuIi3g
7kkUmvydTtVpgCYWfZZWeHt9cG+FoZjjoH7aePMaL7QCYi4zc2t2p5BbNZI/zmd/
/dcAEQEAAbRJVGhvbWFzIELDpGNobGVyIChBcmNoIExpbnV4IE1hc3RlciBLZXkp
IDx0aG9tYXNAbWFzdGVyLWtleS5hcmNobGludXgub3JnPokBuAQTAQIAIgUCTsen
1QIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQUYQlLYJLGOhFowv/cqno
gm8UAuXIXyfO1g9l7HdLDH9KjJWuO/QqvWW1ZmsgbbmRCn93kqanXYyiKhaIhc/z
tAa6uiIqPQ4X1TP8gMijWD1zL0fi4R4V60S9om0Veft8O7Xbu47/Ztlefbwjnnoh
aqGuM/cusS2hI9j2Q52kuIaJvSB2kndP24QFQH6Q+4F0UtJ2YmeOA3mcquuJBrnj
faA4SsHJudtCL6P2KaoxaH7uNwG4b9wgFnDBFZi9Pzs88cXu1/tOW5gxGUijNPi5
SCmlzKbdLHRx6rr+8f6dWsyzwK7J/9l46dfjqn7sryml1w64+V+mG4vwdE4uRITS
mAb9MpFrbZY7LJxagSuKYkrt2QcV69gBeOJ8pSy6I2q+tRBdCejZlzJ63cboIE/K
MKM/X9tMk+E/NvIjcKVFH5at7EywISpqNU3c4IsEcz/zc17UQ4A/+muxs/xng3oW
B0h4wFpfbxdDmKGrwqMXdO8jenYYVM7dRFJnQJm6V2Zi1/rQiz0YxCdA0K8siQIc
BBABAgAGBQJOx6rnAAoJEChPw0yOSxolQ9cQALslj3sqdKzWtvZ+QNUJY5kbeex9
/c5KzTVvIvsmiWLlIcxR23sVPHPqAokFoEnyFTcOTawiTzbEp1iy3MHmHKCtrDTa
Ia/jbnHNhl8ND0nZXnhu8Pe+uJX32xesivK6R+46FGzJmyHru3khOVFUmDQIP5r2
ogOB++swzmuH/6Wn+zGCSU4PZtoY1gD8+ETyhFWnilOZzwNXX8thPZP7vAjw/2Pn
nu9z8f/d7FMglfQJ1BLPsKRwj5MN1cblpLQCH0Gk6TakvI1VVAxpHbpJQrsxZ6k9
7vbLgtWeKty5GmNZTcmjTJejYrHKk0a9K7PtoI7OHsVjCSYiimnHCdRI0wdqDjFh
rUWFoAdeHkippaI8qsqQnJwYqpK34PvmigF0sWcRg3/PgVIceenE5o7eQdX+w8Jm
TrJouLxMo67ZrySATP35PWuF2sk5AJfvnnQkO67WRXI36NeXAHXYpjmJ2ccuzQyR
R5KIK0hZXy5fajvekvt02wEHffQwdHaaQ7h7+c7XlkG2HC+/SPBHg6GTRaWDu99t
5K6iGwArr5YAIUeMoNNRtDbJkeSo0I769DYfXmQ10pGASJon5Su6WUskX2MdoLEe
Ce90X1qoR9uSE7iMuS6IQSx/6TGpBOryTT08Ka4uIojauVt2hMrNW3JcpEW4BSA1
SnB004oD+X3uJlxsuI0ETsen1QEEALxGNpmp9ije7XNBqbpZI+6Qj1UZD4aS/wKR
wpkumVF+U4wgzUg5DXydqmxYGm53tFY4Epg7MY2INFEJQcnFjWWAhwHfb6KAWAsp
fbnNsyOG2WqPfXBTerhI0INXOKuFvtn7Qjkb/YL4WjrTT5vrP3jYEF2rptpANnxV
8EkmabzVABEBAAGJAZ8EGAECAAkFAk7Hp9UCGwwACgkQUYQlLYJLGOgV4Qv/ZpiZ
f2YR4MTLRvZur+kDc7UYf+MaBLkbuJXksOXgRu/lQPTkozjQ4vJnHdlQV2QyUY9x
vtYozFfGlHzH1g4D/0tWOUG788g5D8mKg+yNb4Fx4oku5HVNIZROMiJiaHVAgdZv
+A+Q2r7zYnwEVndeZCXizXzVIhfbATqph/jMjXc9v9zvMVd7ZrhlBJSwdO8ylxCj
AX71xW2Lp6wOefEN08TwpavIRtXwUZCm8oZEKBYBwrnZfS/HfbK7sGiZn9dXnTmh
4SlNwbcddDbC584iKR8wMm4YrgoZxNPxUSd040GVcS+DKFWaG5amm1e4imNSQ+dC
6NQr6j27Pa9DQnu7O5ulL61R/8zEJO99eR0oAzQuVJkOWLn8M1dosp5FaIS0AMm7
HfjPaGDkBrz5zlyUAQFM5CY0c6oPZzRSJ1bZ7ost7LKB5OSW6S7C2zbZgXS1ZzF5
xVo3c4AHtxIIPAX1+idhs3C9TpLvkucPQLJ6OpINDcZyaaEZfFr4jDRHW0eaiQGf
BCgBAgAJBQJOx7ByAh0DAAoJEFGEJS2CSxjoOG8MAIAPbJLRIScwMV6a87w5BNkX
mm9p9gDxf5YlUxY6RNsppeWqQGoyoBilwQlfER0SurZWU6vJh/Nkzxkh7SqtTMpH
GF5HFPFAO8cMKZRB2qOBMoGChHLpYNKIKhQZtCiRYgWYWYr2mToTcpvoVAYFNuP2
oOzWEo689PdeVVETtr0onJ0ru8LKN/nvTjZ6qVG2bdJ73xkHIkYUyq+z2AdoasbP
tWHsVsJ9lDA34l2LXMZK5XKz/AkODX++YWtvAIJfKWr55V72Tp6uu3Z+f4JqfQY3
wYpAkAgdvrSdbmESG61Xe+HnLzC0qk2/yVyEo5SOHHDt58dO0oB+9TMwAyviJqG5
59cxfd1uE4EmHjuGHeN2RwfOz2RL9wpGguKe8VH47huqXr8ZEpNfxvnoycHum0Nq
EfBp/94pp8ggoB+mGK+W0fnw6sGqFWT9n7ImB3NbuzT0sd/p2wEWd08nvRbbQCWZ
PaHzPAUX6R/V0+oah8j+pU6HurKAa/3fuRE66JJIK7kBDQROx6fVAQgAhEWcwAlU
Uwy5g53bpVGvqAFj6/KJmPp2pH8slVyyf1fWB66F4op5/cFO5qY44a3HhRWCI+Hj
OW+Ib8fUAT6A5EilkLSgf/F5VKLZdmH5L1ub3exGl3gt7hNb8P826JfTO57VnLUn
ksGS8wg6ecJK08CRkjmtYM5WUlExXv5kSVxGnHp0DLMQ+vekbIYRBIBv3OB/lGey
KImACdK0IPWiFrGJiLUUvNctcXTEnb/2yW/ctFmt7xtBgbN5q4brq0ZCxTDy91rK
+np+tRiEtQlE4Ut8s4qS8RRaNJWPTkmCQDH72SRgqfxO6nlMRkhMHIikbDZXvn3f
Xayywo9Uas0ElQARAQABiQGfBBgBAgAJBQJOx6fVAhsgAAoJEFGEJS2CSxjo4QoL
/1o6dwwP/TjB/JqUFrvTyi4OK258CEv4GvXTnUlE1F7gBqQEWZnDpTW1ZBcrUAwA
f56Nm9iEoFZbTW8c3oEXCb7F6ezfV74o43Lg9Tlks2leUmxc0+3PnXbMqJBfNgO9
W96I/7Q99t5YKDmjLeEGeVlCSBlEkkiLMupC3LgKAfLOLxi9DjlpvAXBVvTlMM9y
gEGRdwsTSygBYEVQheLHW3vZJlAZLgRdCRummxJmM91jkJJP1b2xHtdTQ/HlylfR
KESpKswvIffOofHYKHtRRIvhCA7rcpNHOcpCkZO4nONlLhD7bgb/hE+4fFldroUl
TcSHX7GjYyZ8SCiWfCCks03gKo6TCnDSIpWfsMX4sQswsGZu0V+aGHq1jA/d3f2U
2Bh+EaCTCQr5AggAoW/PMJo89NYia1ayMXneXy9mdzaTHSIC0+HXdRq+V1qvPnsR
3ZSat9eF7/JhsAVXBYr2HIdqJ5FBk12rfbh1XRXb/IOEG7AvFE0k16oVMyr35JNC
/okBnwQoAQIACQUCTsewbQIdAwAKCRBRhCUtgksY6A5bDACCWeELwz5KvZq+rmeO
ZtLm28L36xf7dtKKIaBA7Rctk4LCokXlsmotZolXuoULH1mgPxxEOKWxTVBoXSGa
EWTUP61LcSmRDygCFBNct/MHB+mw00jrfpLjW/8c7A3ysD/VR42gXxWtojSaqGES
gYVegWeFNY+8UxIHtIGfmpaE+58dVbO9Z774Z1eSpjZzbMHWZtV4RmnZLrZjTF+S
MYpY0b6Xo7LtQUidcldhtXgA+JhOd1leOGL8eXJAdBPkqaNmyXNYa+9yFsIN17d0
aw/Owrn/AlFBR6FQBjl4Mf5D41uJIy+bcmolHeTnx5pgIngBPo76W7zQDgiNcQ8U
fW4mRSOHpo7jh5o88kF3QTNETmEQQSQUlNnOH4NP9XiL2Ce85gs0D++nRDmt2tbs
hSqS8xEpU2oxRjEQx5eyuQqEZEt95nLC7YkECqvUDopAmCR8zVzur2HKtz/ScMQ8
cLvgV/WGDWK7TtEiLpQR6VL76LQ67lyK35zq8pLjQwsD0e2ZAY0ETs+AVwEMAJpq
roi38dsjygX9T+0vp7wNFX13hSndkuL9TnfSIrPv6G95t3y0fBXN0jGuhr7ue8vR
3r/OxIgyWYemrvtvemFKdFHcirx98ohwMG6RLYxFqMR2xzFi17M16ME4eK81feVz
o4ACLd63SLb3DPOwoJZchT9xVfQvBi3lExScgC+f3un2CFC32GRcsLR+5SQBLbf3
JnY7KeBR3JqgMqfl7ilcLa61hy/VzXZKdfnCCRUxfwba9Zr1usai1NKffbVjEOfZ
XLq8wSjadp2payXzx70cr7p0WXkUjUv6RUh5PJyyNtCDD/CR4ky0SbpedpSaMJgg
uLUOUE8YPrvtswl5jAd4UHWpfqeL8uYjn1qakle0QhN/98iKLYtmwus9Xowe1iZO
ZnAGbPuW8WHHylmGq8PMxyge2axQgJR2OaOUz7fURza5zjZiTG+Ora8CiOWgG7Lj
HnmBFjYud3UYFvydC+u3ORrPLK99lN/+dw7FjJeqbqZrPJdZwUru1PBtO+qhHQAR
AQABtENJb251dCBCaXJ1IChBcmNoIExpbnV4IE1hc3RlciBLZXkpIDxpb251dEBt
YXN0ZXIta2V5LmFyY2hsaW51eC5vcmc+iQG4BBMBAgAiBQJOz4BXAhsDBgsJCAcD
AgYVCAIJCgsEFgIDAQIeAQIXgAAKCRB+/VZ9TH6oh0nsC/44S+yY8czvD97e/ZyL
t+hI3Eu6AZHD+hRuirsVYPi22TasvmmoqeOZ8cyCXROFSGkbN8JjYdgd2lRuAtT9
YAJqmVNfYNhNBKH9Xo5Z9sKFSK31K8SYovABPmWxIiazWJrDzMi4Gi5WZ2kwz8Cm
TZk1iAcwTOh29sgerntmpplka+Y3snVhZnPIBrAVmqR6YeDjdGwPfL/0IzBUuv0k
mf9KNIurY0pA2x30Dnnb0tlJeMrH3/qujSpvCpwMiCrTz8f389dXtUq9GHBVlrSU
OtaOmInDCtgb6oTU+B4GIpeRFB6UPUsqIT2uDTNySiMcMBJP1nXQQGZUUUT1F41p
o5J/ALpflhQ8HEg6q/E2psep8h8qvx+ZLj2vtCyNI5xu5JerWM/rRoHJ7EhKeKPh
a2nr86Las3OIA5BIueklNyM0Rw53q1Cu2fJGQ7L9qF3WmvNc15Y7teNuRe+zXY8O
RXP8YTDYWJ5RNN+0+lff7JgGCgy58McJaU0pZND5DkSq606JARwEEAECAAYFAk7P
iSsACgkQ6PGLoWFRN7yDqggAoCpJmWN3OHKPBTTdZMtg2xjb/H2evEpJeMBy0xdA
WfxLjhZ89B3UQPY7BlBd+UYAT2jo2gf0ZhWUvZLXD9XlxXporn/0JNb/A145KZ/K
jWEM+HkAz+ngyroA+bf2j1+n2HTBCFK9QzR5z5MJptoT3nlSCMZJ6fTMSYAKW5a0
SR5QmTFSdm4UsuVw8wNHdSm68QTpdobna+g2JvSdN5UgK6lfdJ7ta/wCEQJOO6Ho
xx8n5M2nNqiFZ6AmcFoTukXUnyiYcCfmZ7LX/S3R/x17CS2BW67f1cN/fnNgDJZh
3nnzRLgtvpHXOyaLakp4TGB1qqSMxS0NzbX5zLCNjr+kCbiNBE7PgFcBBADag+PB
qx7suYMsDt64rsXTSYmfa4Fsuzs0K0FiDZqmfu1OP91FrX1E95OpTTL+ag42pGMZ
AVR4xJijB83Z/BsjAsIR0x7/mpOPoN67jJwU8obCUjxoIOaCPKzlNY1/to7iHKJN
Q31syBJzTmXtg0zeMXZ8CgaxeHOAxFYV+OlTGwARAQABiQGfBCgBAgAJBQJOz4vY
Ah0DAAoJEH79Vn1MfqiHNZgL/jAyQlZRKRAN2lDJq6ofRj/tfKoGvLtpTM13/6mt
i+HrD9fVqOFitbQaDuef1PWtWpeQOhEgxH+tWyqmFMD1Cv74W3QlhkaMB0ihJATa
4WU08jZnxOtoSw7SUiqK0XsxqFOwAOxMplYL98DjRwMyUNHgUPBnG9Jzu8rMbiIz
7xz83xbl0lwscRi3uHiwifuPAy2R6mCeGJkZvGJm9HQPtC9L7zjcA2HJlaHqOiaB
ekPcpzqpZA0aXPgmuRPyKfsFtuuRY4jFOooWA7IplD8IlpruLlX4fEMVo68UmTKL
VBATz8xyay7BnNfnjKn5ZUQYalNYcM9MhpmL2+ZAPInXEsHSXUVUC26NVONWnhVs
AGBZbgpyLh0eGc3PgQBYe20BS8wh4INsDx4eORPr1hA/wo5BQixmxoRx22vidJRK
LTlQYPC2i/V80KXLgII+EOVktxD2JEUH63Sad8zEPqBQcwZ1LNe3X8MxQKcw9cJZ
82eQ2gGcFQxjv9Y5u/4m4dNZuokBnwQYAQIACQUCTs+AVwIbDAAKCRB+/VZ9TH6o
h/FkC/4i8kPOy/cbjXNE3Rjm5mtxj6PR/CvNZ56K4Gz4E+Ew8FYFOO87qjsp1kRA
a/45IcDdYFUVnF/cphXXmy4/wcTtfjsybKBt9MznJHffsZSU5MGqIQDcl1JDy7wu
Bf53GsoKxIAgOAe6x6MI1L+VlevUpX1CjtKj1ywrRf9DIPnQiYdi5ATUrF05gGPc
E+r99AEv5cghtE+W2uJ1u2JSfKOIdlrtTAuVg6udSLlOEbLEeWQSA3hrYlc73heC
byduWYmtiY7WcETYB76ptXRo4kH3NsBiqxyuQ/CELE5IG5Wls/ZG41uaoAS+8r9F
EW17rmVuj2wXjLGUP6U/arLhEp4cUsUcYBaw1gjgG39EyXoPACd+f0wj+T9Jow29
XWldcSG6HMsJfZ+SNAtaajfKCK11U30ca3/Uk7+ooO4See15BjhK6Xh8Cq5BmCRs
hf7fhfSdTSWVjlD/MGqvsIzGKAzb8aLz9zdycV7YWfP5AJgvpiJThTT3DG7fhf4f
dk3riF65AY0ETs+AVwEMAKLBLYOgCrM/FLigtqAsznTR5NEn2szC2TXc2UrS7Y7C
Iyj0BNoEvDy7iCTtSCFI7pjAiqqr6e8b0NCojGb//DotHIZ1JKcTfI54AKXr0Raj
IeVqSl1UPiQgfBrYUEJCbOjats8YvcUue2VCHWcVyFd7bGHXq4uOoVidz6hn0rrG
7CBNpALrCZH8VAzrWxM/wRkBiQKFjeVjjzNDJ4/TRc6JyK2x6WWg5hzpTJwthDw8
Lo1slF1eeJ/cSnoOnpwz2zEVoiVG3W1WsJP7fKhhBvHYvo6JNrSr3kLoLWypSLMP
k3CllsADwUwUFsKugrxvcYmUJRBpGrT7D/C2wTMta6fr/KhI4BLe7oW/03s85vg9
mwHLXl0Cbe9KH5QMgS3AWn/9pF3EURwekIF/4jBavLpL1ubV5mpEN/ttyMOi1Tts
eRFj3UDhY751b5OVOy+/GmeC+DodWP/kh+kFZ4J7f9nhFhUenjVjssnROhc9zGbG
NUMi8HhYSelW0gvlxHxaSQARAQABiQGfBCgBAgAJBQJOz4uDAh0DAAoJEH79Vn1M
fqiHnvcL/jSnORFtjsNYxS2ygViELcKMR+k+Vi7LZIMrirK6PzvV+CB59dhFDkQK
OyAVJya3iGnhnSyCtlAVKf+6GPwXrCeRtbjGlYu10DqP4tcLCLbifL7QEt6kHKpg
1ajQgV9cjZvfy1aYtIgulMCrI0ozD6zgYAAFbqlbKcgKHdgJ4jGw8bQBLxOwH87e
wThINraG3UP8UDcaHjPW1TZDFQKTNjqB6aaYe6h31+GOHIJg1YxNkArqrfCgoMdC
PupJDdgco7xABtNHUQ72iA5y1x/q/mVInTzw6PrI2X1dBqbxbpLDjQr+DMkr+ehr
viPF8ATpjFNXFLonr32Ds+GSSDkMhBaV6YHYo6RR6pnYZy+Jd6jICEcAH5zzrXv3
Nk7bFRr6+CQM6++yDRwwN2b0HeAPYcJmBAjD2aUoEJB3Ag0dOiAmZob+Qi3oFALk
vMprbwnbGJ2fCSs22a6/CJ6Yl/WROfrWBGJfnNpsNbdaFx3PI9jj1A4ud1+PuAB9
wwxGgkgKOokBnwQYAQIACQUCTs+AVwIbIAAKCRB+/VZ9TH6oh0bzC/0U66KJ3BYA
wedd/3PE0hEEqQ6+gilFzIW+EiCEM8zHW0iLGdkiqZhanjydhrTaAB8FFyDXahZL
kKmUfrTRdxdqHuWWelaoySTo2cqlvX8TVKWHukdWun1gjyEinMf4pxgNbnMFbO3+
1dUpg5/4RlSK6xkaMiCSYe3kO6HhPsbRqrSeYNZQv/aSMNkAaSrJkJMpysPq6bvY
MJ+Gl3amdgeiQiC4scfwFdvyk/XbbQID3yuSnjJElYGu7yc8YRat0e9wCh1CZZ0U
zLoBmDGTfeSzUzUCbzewnVLTy/UqalngrrP0kNbhWlCuZKFlXHmtp5z48Vb0oX5R
5CmDJyvo1T0WcXq3cyWPUyCVLJHNhtaFADKe913oVUMEsl+yp+V35nzxc9xYSzbw
tDcXyTnblZ2HE+KtE6+H6sP5YYDe0Op7LIU6+CVYt+tNA5FTfFWDIriDTTbnUFnx
U0Eq4laIqVkDW1byywBR7KM0h1K9cWrLHq+FF552YZX47Bik91R8P0GZAg0ETtVe
EAEQALsAH28eNHhv+Ver8cA1543a9ZBgrfEvb/TWe9Q/DJyMNsKQ6DYtnMGK6fgo
BFYeCyUSuFnbpjGx/kZCaRud0CWJknVAMLwS+n2IfjO9zQEKnpPDj4ju4dz+uU3D
iDn/3YTMdW05bPDQVoHl7FE9l+Ia67I63NufLegQfDXW6KCFjG3s84h2UEUYBmN/
VByNzV0CFFR6sftb8IWEv58C+C7XM+2N6Lib2NA1HbGNHwhK70fJ9gTPWzu1B4vc
BnBWDhhhF0VKNslABzUImhGHlidh2OnF+CY1UvGjwECozjlmtfbWdbX56iDTTfrR
3aVCGFiYWvJKvFcu+VN+lqm3Q3BlttKW+EltLgLcND9bGPdYhphNd3e1dsfoJAGc
5QvyYi1CfAckpsddkpXV1kcB+0w0GtKWUdfuzjJlkIqwN3s/GJIKoUkiGH9EoYdF
WmunHtZnVvjcyh5EOpxG8b792ehREV7vETPNlTjtiMumXEYRPNCbDuF9iQyKFq0p
+UyzemA1u5Q527AXfBu8z/fU+YIIPb9ld4f4EEUl270zCP9lYHAczFSdMOeVHNKi
jkQsG1zmhDVF5lkPkHLfZYY2ii2BTeaNKLZcHSIvydBJgE5Cu9eUHEXs0h0h0QiM
da/I8s/Y9/yvaPwvLtYdb+tWnFEKZExVKHN68BMVMEGEx7x5ABEBAAG0REFsbGFu
IE1jUmFlIChBcmNoIExpbnV4IE1hc3RlciBLZXkpIDxhbGxhbkBtYXN0ZXIta2V5
LmFyY2hsaW51eC5vcmc+iEYEEBECAAYFAk8t1IMACgkQPscuWCa9lMLCtgCfa8Hv
L4o3QiVvj3ySDe9uz68JA4AAnjQkjxLgBz1/UzyHCisq7wK0/RyhiFkEMBECABkF
Ak8t1c0SHQBNaXNndWlkZWQgU2NyaXB0AAoJED7HLlgmvZTCkugAniMbIOb3/TAh
JXaphdERBp8FFPLEAJ40P5xMkirW6fxpaQiOz5EnyVwBaIkBHAQQAQIABgUCTtWO
vgAKCRD5n/4P6umZvZ2uB/9a91+TFAcPtiG5kswdgBr65UX+y83zt7Y7dVYEo6XI
2zWZKWkbM/O+wc5aRcQUIOydMTp6FK1s1hMCoc7Kza8GvVebDo8OnqNCKC1/GIbt
nDUWg0kQWU28e8senlollWPF7tsFhDwV1l6hc23gn+74yFM49F8WglC434pdCei+
b2BheZ4oOL2trPpQnsG4F4lT7bxb5pVIn7NKL9q0WEy3sxNnuaztezCdudKovOf0
Wzasjlhjay62ZoyZ/C6qB0s2idnRYbT+lM/d5AADtaVIczHJ6JNx8kF/+QvwmaNs
4iaHyZOz7d30EWUcNBeVnS+qxvgOQkLDzIPHDzkHI1xbiQEcBBABAgAGBQJO1nGo
AAoJEAYJamrRzt2swd0H/RcN+L70DNwJHJRSglfNf6L8hRWTV9XO9NjaJ1BJBGX5
uNHdaO/vf+0fAWhK3/f8oRnrSQ0BLUi4WucoPxOD5lEpb0kczy+0XNSqNd5o5a78
BJBSM0pnkkxD1EcHZS0LuVwas7mSBwbKM6bfeC47NmT5SxGFzUpEqSfcssJ/DZpP
30bufx3G/XUyVOph4rj3aJ5i36ZWA2FZtcuTr3n1buqWJim2MHMioQGx9/2ubbeV
t6CHBF89bQeH9XZNGGFaTPYtQVPcZzLoWajXAfLv5K5X/6t1RyAlEOr5n727DYfv
HRqLOZBYe/fNg6koolTfWvH9Ky3fJQ5KYWANhS6fVAqJAjgEEwECACIFAk7VXhAC
GwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJELod+2T/+XnnymUP/3mM0MXC
q6Nk/QnGEV2ZOu/uu7uIMwRzq2jpNLoqKKJNHOcxk19GItRPKfcoY9BkprhM1DK7
hYiD6RayKBmKmWwolaayfdjYxyNlNl/4aKuIXP8OJYfh1ltXFox9c630hytnzHiK
MLpdRSbm3COTuT6sPI6Kkij8cOi2520p+27KsYy9HsWBeNV5X4JTQBbl7q+RcF7U
Ce0e1POGcOtaqz7RBt5RXO4hKnY8kqiCya+lXfDE/BExI7CNSKgkZjSRsTEiqnFY
97chJrqRaLDZjy9EXL3VVJJuEEk92LttKAfwN3zI69VU26b819tP5/W+7cG4N7sI
hRovDxCiNPdnUq3yPwhEfjWfrUrTRbEHKloIHDH3mkfKPF0PX8QUXZQmyHrJ7Ker
FDxw5ZpK6gkvOU9mBGTKB4ijlL6fMuLzTo8SJsI33mdH+eRp1pLvnfEjDZUfSGX2
P7R6WV2Sn4dgQSV/JCfna6lbYrVazVhuqQFtZzchOJbBzhd9XVJbGH625Qa7iBTX
123kv0O7LvnnuWtFKqivoOBx5aROLGVxZy8+VzQh2xbUT9V2eKxR5o8vG0vTTD4u
HmC4SVVK6QMG+ghAxs3NftNYNxLpUeyHmAxc75afxZrSj58XOQyl3IAuypVuY+aV
TnMGwxQWTe5qK8s2+Xjq9e3ErSAB/4ZSBi+QmQGNBE7VPpABDADAOk+g4YfRSe3F
pZ+ZxQzcAhZBt9t4tm1DJsrrpczlB4Nah4Pjy1ZDUuOD6K97+56obAyHw/FXpukc
Oljn5ugj8DxkWZoFZoQXJ/7en5b4aMPaDtzl41bk4ntmge7D3wMmzfNJzKoQJU4U
4QyCfPb7W4SlGcmrFmrqHLZ3SMU8JBlPwN6+j4WuT04Bkg+2LurrlBotwf7n0naz
runkK5/CMHSbFObpd6Ug7cLoy7Jc54QEOxTNL+wVe3H4cbFZJ7Jly7h++5zo1O6b
ngNR+SapiCMSMsa5nPN4m6PbjspRqvO7U+LDtkUa1I9vzbpDUeURDBmVCwPseOg8
aLko0jBjyvOb/TILaoj2hNpM2zyl4ytgpAc/ccUkZqVJ4+pdtd48sSh2tOYPcoZF
7hSFYpNpV5XD0ub3DvtRaR4AiWoZM35mlDweKMh84K4SuuWkKgVzvijtvpk4lUtd
fVrilFQmjkf90EHO9PQ2NHMgRjv+dNtxgU23hWKcIQUEnnTQqnEAEQEAAbRARGFu
IE1jR2VlIChBcmNoIExpbnV4IE1hc3RlciBLZXkpIDxkYW5AbWFzdGVyLWtleS5h
cmNobGludXgub3JnPohGBBARAgAGBQJO1UDTAAoJEFwuRqD1OnbtmqwAn1cddaxo
mquo3HXT4Aj4XrvSEeHVAJ463LSUBFk3XD8HofVg9cPxdWKXK4kBHAQQAQIABgUC
Tta2BgAKCRAGCWpq0c7drDjGCACkScWx0ATA7JSwqCR2NaQjLp5QiqHMABqg4rvr
MsJ5UGZZfiDfjrZ4b3FhM9cMEWgZvo9a8PYLuObCV6gB8yDYftk+HFSHw5SsuGrF
DC11p5M+Zb7sxj1rbkMNO70odsMVytGhlmh0rdt6f4RUWEB4assY+WSr9xQZlNZY
M8bUNlvF24qJNdbItfyaToDTdYX+CAfU1pmX0/JHzYduhfHI8eNsYLFg7BQqgP5J
Sy2sCjBuzALxfdZb2gekvygazYeeqzX5+KUleuZ/A63mQV6dJlSXWtpF1Heihxyi
J58N3dK3y01KcGPY615fZCd1kvyd0AxyXYFFQBF5EAFywaDyiQG3BBMBAgAhBQJO
1T6QAhsDBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEKBPk5fN/Wuw5gsL/A4X
CEk/GgIjF9PE5j3HWcOyX5E+T2TyTTUZd9+hrHRKDPJzx3Zor5Md611jvCeigvY/
1oJJfEju+s0GbvkmqfKVwDbrPLdp2Z7AYbODX+1tBJT8my33INfCexviEgX1IRnU
V4eaM58CN+k2VSbiKuUJI68N8Qg/3CKI3O28AYWxvAOrZocbUbEY32VqCd91UyxL
IlYFt0mKQSKPdoBDhUiS9qmyWYgl4UlNu1gBsW02F8TiBW/61FJOGrZ7vySu0Md4
u3LqC36iKpJ3pk0it0tOrGepD8EouTI1CL/BjG7QAiygGDX8uD0d3m3wjJ88EOmL
rrVZJcQ4ClNWZRTNlvalILmRvjSc28JaMiOx8J8AF+KjrTyn3+JJewm5Pyfn598Y
iyAzDOZMaOg2oQu+Tm3LwCu9JhvVJGtXRrGpO0y1tYbuzqGSAC8zHNehc74uhjlW
sllMWCOXcFy9cKs0BETme+WZv4KSyhDm8MUcoWdpkxcTUsZliReDu1gteXIK8bkB
jQRO1T6QAQwAgXh0avLiHb3yyXspQA5IvUau28UvEw+IUE9BSCWQbxAPMYRzQkCV
vRwd2dVmhRoZBK+uxg0Kw66PG/8hhr+KhN02UGKi66wVHLzevOAUS2DWPfj5aRcx
08iB1gEsv7qt0nqIt3Aw5STv0CYpY/mYV1XeVuet2nL94t1GXS0UzYMJk5zG2lyp
q3wDgGsMRUAJafNRJokH2j30eclzrhxN9lnP7+Skj3QFGZ3u1eOGGTV7jNo9WJCp
bvkOj11evLwcYw0tiZc6c057i4rFrN39a7g6/zdZrjwwZrHMLy4L0YnrQskVvXSc
4O7KFhlOc+6Mu1daufjJINzBPK1F11uCbrjwD5q6Ocm57Ff3vUZ++VI3YxeP6MiO
uh7thrfaPZjiVz/i9vqEDhtLuWx0gd9nqYCDzRm7Uh4bwbSdQ9hZvoapTpHa1PwA
GIniKj1KG1Yb6KsI36aWUQRU2bGl+kBsaPtZkwX2xEkrGDH6ea3XKasSsiqnYyIn
GxdiH9EpPfe/ABEBAAGJAZ8EGAECAAkFAk7VPpACGwwACgkQoE+Tl839a7C8vQv+
Nd1KT9SLcsWGP8gSuK0SnCxSBQ1ls/NChDdw5YNjWT7SZt2zrmaeLafStGgMT2oD
72g6kYHiKZJqHKdfgrbQ+TqYTugytOvgymq97T/66gbHiN4VXCbc9qdRsBqY+cnf
biK0YK+odD00IVbggy097cvTWzELuAQfoKkyOT0OwoTmxCNe1kmnKHkWsrp7E6TN
6LpqDS8ht60kjY2CYOfytXNeulMh5yfj4O/8Sa/NcoWYwB6OGx0IdOB/Ibs41i4M
dKkiI3Le/dgfJGQNR+c3njWn6Z4R1ZrNhuWmYpca9Dd3tDG0+CF4qVKf1/QJxd9n
x8ERAUIGH2cfuyflt871o2FsUI/lsj1GOzB+Nyf++HgX5364Lk0zOk/JZFpOmHdP
2YR0ZS3ECxwd8meS75JmEi27/eBVIuOoEInYFz9Gw5YdK66UJJIqi+VwmFfn/JjE
6+HDeWXbzHhEdff3S9Rn3K8u9dPw/Ha8Fdka9Q1EKp8McydRo0hgPXKmKC7nw6qG
mQENBE2heeUBCADDi8aOa7BFXWVCO/Ygol5pHptu1I9Cndg7OLj4enLeSoRFBgc2
pOrIu8beFMeEVRWq8DsIgS6s2tSp+booatUyw6wMTLp59SNJsuHwJM5JfLtOlvP2
0hTBpy72HaBo16t2xfqZnboq9Zb4kGKhvGnakQXsbJLnth6Ln0Z3ykJtO9JrOb0a
pu86N+EHKrYH/ir/grcn5or6yJUTYDNvvFVWmP99yNhXp8Y1c8FozmQo0wEhWq+O
AM010hDVmU1WjpsSJR5XQuKEgxJoxKl5bltcnzJnB1tquFRLFggWOzWi4Hf20V4w
d7uMG8S7hgK70CHtznOAsDcL3LcvTeSIvGF3ABEBAAG0JFBpZXJyZSBTY2htaXR6
IDxwaWVycmVAYXJjaGxpbnV4LmRlPohGBBERAgAGBQJQVIKvAAoJEAkDlndWGeN9
rkoAniBqpZnSv74hmmipGT33alQOJqx/AJ9/py8IBh/GWCIPxASNs/a0tLtumYhr
BBARAgArBQJNowLKBYMB4oUAHhpodHRwOi8vd3d3LmNhY2VydC5vcmcvY3BzLnBo
cAAKCRDSuw0BZdD9WL7SAKCXL8CAlY0gPjfysjjthkdgl4aGsQCZAZcQHRd5jN6/
WqRTq6239aErU/+IawQQEQIAKwUCT66mmQWDAeKFAB4aaHR0cDovL3d3dy5jYWNl
cnQub3JnL2Nwcy5waHAACgkQ0rsNAWXQ/VgvuwCfYhxPP9CxVEo75giCnVm7n4ei
4xgAn3js+ZEm+94RV04ZDVm6nG18+esniQEcBBABAgAGBQJOvnvXAAoJEDP9cVf+
zmZOPXEH/izNOwQXhiXVr/0xH0IlgFqE2tnOvoTy+1rTIUj31/OaZ2M6yw6+OZDp
AN9rAn/JlVuuhWp1QwxKeA5bF2ij2vHCQ0DNZIZWd34sgulVElKn2b55UicZu5sH
rpYzugLaBi/54evaYrFC7dbySj2ufPh26ZZAIsfGQTkWF6gXyoZqUMfRiiKSfKQc
3kx4AP7xMZLpNpBotzp5nkrnGSqWpw66sDVBuqfd4wsbtH1ofaacbsZN+bcRAazF
LteTG+fzasP4ARjdbx4mjdZ3gKLwSHqJ7vBnmFlk1UHVzWuIIObvv/ZGSYC4g2xz
BBrPBs8Wyl/spA8FgYXOqe7dALbuiLqJARwEEAECAAYFAk8uTnQACgkQpekojE+k
FfqcEAgAq7E7YKJmTM32NK7UrOXChFV3fp46oVvsp5f576e9XvbpRup8mt9DNYKL
N2ylZmk9Jw1zTjl0f/CNkxVk9UCCF3uS2Td75lZAFZ7JJo2e8eNbIwstl9zfqbhx
4+g4ZkFDXsFVspOtCRpM33F1jBlP8e53LFQHFvuE+8bQ6QthLjmjUCeUoEZKbjHl
xz38Uid6d9aczoWg64rDAcVHPtqtj0133Ncc74cQoZOT5bWc7kw5eIYALXFHLa3z
RMTSKYl06vi7dTavDRWcE6UQzNLDi0p1yieyTeVJrAdzwqPFzYALXGTQ1l2+HxYw
3VLFN6QtZZoCvs8n4aa4jwCVWe12kYkBHAQQAQIABgUCTy5TbAAKCRDy27STGYWp
kujuCACl43oi9MO06Y006g4IFhZVBxHuH6dMRthUbY43807zemK5W3JkxsuRyMtQ
NSqjsrASujMKAUkxkc1dAhf/T9Ek/qJxI+2JTsW5mznw110vb1DWFwwTRvivUXtI
HjgYdZWt+SYkJPrN8BnOIMVtsaA7+tCDCAW/3GOEqhYQSgm3bLPqtR9vidzQjzxK
Zp3a2pnEwOddmosqKzSbzl9tgjanx2+U4m4Ee20yZl9jInxPFO7kwXubm4Qq5xbv
qVXWlpp0I8i7rdgzaCCtvxgu4tAU7SvfR/IXOa20ViZ0dKw8j3jtEFU3W5hOrF2b
zWLWGd/ga7A2NfvzJxmYGupWf1gkiQEcBBABAgAGBQJPLniYAAoJEMiICmQGNhgz
HaEIAJRl6fQndtCTBxbQb9KiTaH/eBeAVpC+U9pZxuN5Acw1Va/zyMwSvMIS6hrD
4947Rmr9V7reY8W9q0DDJVMe5OmNeh2o6alP652cMXv4cXpHGajUP36/up6B2qOH
R+WiMKwV7RJvtZfKe3aqXIzy06dRl/lPyNo50bpOlbsFd9vf1UAxK6hMYtiG+ycu
KhKZVKQ+BHtzRpz3BHiYMBD3Ew3wXUwhfDW51hbR9+SFcDpbNkBauXqvJFV6kgsf
CzGtVnhSDHMv9A8IwPVrs9cp/zgv/jWdwyhvrtqNodWSVSaM9TmjSpmR2OPDQBF+
xu7KJJPE1mMZKNIsmVWZuqkPD12JATgEEwECACIFAk2heeUCGwMGCwkIBwMCBhUI
AgkKCwQWAgMBAh4BAheAAAoJEH8tQ0uXQeis+QgH/A/WRDC+dOHgLejlSXFj7rIZ
HOHxZuXwjF8++nKYMZFK/+HGtEWWLYzcNSaU+I6K+2LaWgxIYcXOo16inuxNJVWD
7riyQI+DQ9c4T2Is37DYDOnvD/lXz4v3xTE8iD7/teFs3N8ppXlKquK1qFB4Din7
/FHAANUt1HgZzF1dHQTTYouNSBOpsfvhIi4qngoQ8V/rBkbVGG5UZnWqX4v4JV/7
EgLo25sJ6g4CDv5SksVl5JclyI48T10qBZ/xHtDXPpJb9zEo4hWKAqKjQ0eqyChn
HOPTopAWoFm9kiLf/VFkmTiO2ArEfaRkSn+28QljKlAN0lcIsjBZjjb7y8aP87mJ
AZwEEAECAAYFAk7GwlkACgkQM0iIL2rGpMIFQQv/fm/ZljKrOHVMUCPSES+NZbrv
prYlmutbi5SJz+HkWZd7g9qWoxJoE4EodNQ9bZaxmHx/6c8qZfcQShfQ6mBDILms
L3aQE9D2vAZRaaaMTShsZXXcNqueU+BF4D/JI+V+04bsByFd8gRqMpZ5i+BGZllf
0UiCL1vHKECJwrEVOI//VnnckYn0mTaDGCij9D2sQJZvyNE1EM7LwbAZ/ilT17QG
eP0wrEmt6oWzzH0H7lIMMep/VPBzHrVxBr0XM8CCSkC/R9Xj/OwlvO2nSNZMAaIv
Kxnb8zOGC9o6JVLrXnOFYKM4wxIHmxQnoqI586YySw5OsBzfH0Wy/mvIDJLiTf2G
i/alcZXOP3ZRUGtbAf5KAOoOihu6zsA8ntxT3PeJz3ThJJIAteoNtkxnd3ETEA96
/MhDF7nb14dIMmi3Dv21Pifz2vTz2JYmiMcCcmOoA1W0zKvbnlvCG7Xw0jJsqIm8
ZsVaXPfqf6AJ10DtgztpeODaLwqvG52qcBpT0edwiQGcBBABAgAGBQJOx6xkAAoJ
EFGEJS2CSxjokl8L/1+xhMjsf2Sz+EvXk525kqkzL/6XVUtHTFw/gOL70WNLgrrK
68gXDaAFYg8ZFmIEjvjc7kjUivwAQB8IYXE9nE+07KeCyx6bYRH89xB9mzBAvAb5
KGXC0zlDB/ehPCeEg9duAlL3tnwl1HVvdGpahg3wPDcJXCNzzH0hYCBdWTY/Eb0v
XOXSE+b+l1L/PDNTWNtQ/jemxsc5ZkwMlOT5pCxF0D5NMO5zkV/BcII8S0whpZFQ
rxVGz4z7YNd5zbZVMzSUciA8Wl8tKTFtW2v8m4ao4Q1vOSElGdCd24BpHaPhfdep
J48SiNeUIH3A0L8ha0rqU76m1zGnk3TP3F69RErbbrKHPtLqsM8FCZyHagLUN+sm
2MHBsWQr1mOBQSUdPRx8poMk0/p+qkBFeB05Br2p6g82wUMlz6sI6/hjA3rb08di
Zlkz3bNH1fUTse2O4uXiEpGQuecTUg8SyOhGPE9N+Usa1UNqVTeYCS1K8d1pKLmv
1/3ZTIC/D9Srwfp664kBnAQQAQIABgUCTs/wGAAKCRB+/VZ9TH6oh1gLDACA6t2q
veevNM+IXxoLIi10LSltaisRV53hpGw02DqKZrnDV15iCG6uLPj5P2sUP2SBJRNU
kMPAZMeLQ8Z03VV3/PTGdnbq6Jqt7SzOre1RrU0juYM52qHJccElSbW3ptH0xXGq
SoIAPFbrgXMZr+w/CC5NG3t5Hy/HYowCMjz4DWK5B7k8poE2DiGpGak/6La+h8ZR
JxKvflihRhNfSi4sdhXsjLKX7BuY7htrHMABrQZKQfxgXw0wlPy2lZx58PzmaGoX
rA4frU4d8akkSzQ2XQWlgs65hiAIbJ/70dQYWv7+yTmRQVaKqJsTKKC6FMnqwZ6d
BhUkBkulC3Kw9NOD13dQUQCs61tZjj7SmjZ00BKxhz9FbbZxTuSNoGmJhisDWIeN
0rUQ5stc1EUaIjez9ONLPZxCroupsAyuc7nCCjYhCDU68aWIG3n29ncA7NJ/0Q5+
KOZyRxtuNIuBDB/sBrnJSW94gCmy5PG0cALVPCJJP0TihXHGiNxpFi3daRCJAZwE
EAECAAYFAk7Xuv8ACgkQoE+Tl839a7B1EwwAnnMUQuORJ+FQrbD+uNKHRrZ2Pyug
8l7HgrC9/WOcJJONSAqpgifV2jkbmGJDQoEPv8vHLnJsNZtMH1esiCBKoyxGnL+m
TxT1lEpjM3hZakXH6TC1D5ewXCbH63ThA27goNtBnnL7Ml9fLiPDtFRV0BrfQ65G
7Sp1JwqrOq6EwQcj6hT8+DBpC7ck3TDDnCAivfI3iPV/TmMR1iB91BZVFdoV5GUT
YsnPLESgBYZICE6az/lWdrFUwTfNTVtJcTTIk5oTMWEw1tGDqHkp2oprQfbHL0XN
msfDVaJygKhpKN2qWWUExgJLe2Z+lTq/zgL5RBtKEz+ReMQeOnV6C+JbqmbgBPw2
1voQKAfLaEYDkBYHac4mTF90FdZn4K2SedKVnbUUAUhtmzzzhvvC2R7uSt120Qwy
2h2bp19Ot55sbQNpgqzeBzPCBkG5zcv99NytzIPyxC7Jfo5mwu8UG0gpxSLYR9+L
ByE9thYCXiNOP/ZF7YuE6R4VJXlqg6tmZeTHiQIcBBABAgAGBQJOwE4IAAoJEChP
w0yOSxol1y4QAIzLUT1v6Ot9m2SyDOXMc6Qk2/e0at1jplSeG9dczC6nAlLufr3u
OP4OxbDk+sFwmPm1eZ7qwWoguTTmhHBq8u1qCQ+GMUY9BUS7gTxmOVfIM1ieZ+GD
rLrAK+sPKUuIypJR7p2yrH5FPsYTrUpTnA4e0OkFZ8uwk+m723VE00SsX6k2+K4k
MloWiALRvwFBEiXalOjQ8JJZ5Qom/eudwxGLtwoQn+g0lD5FppMPILTIGz9hPp9N
Y1qXvVh4XOixwBW6wnYzQ/k/7eHgx0HP/N3iTkdnFxF+i4+BPnkfyP6oCFQwx34V
KqO0aJPQecl0TU8MWIOg3RoYG+7lW4keY356iQE1icm8N/1TVJgvPTi7qNLH1MKo
V3FB0o0exwGVWvXlwfOpp9dAz36hil7fdVjkdzfncfiTbK0l0h3zv4SA08bg0WwY
X6h6uJ2DrEByb8H66KdqctrvBJrqeIPDhHtGQgMs/HY2MlGF+2VXls+5njcYGWGz
5DxTas1c+amVpD/7PbpTuT/Xa8EF3Bv6kn193eJwLTdFXQop/n+Z+MOYnIa2oof5
kDhkBn75MUMckZFOFzuq0cMfZ6B48BTboK8ZJJ7QSDWUSqIzeljmaALD1njCisIV
YCzquW0BmPQhV9tmq7hdj4nwPmLOrra2g+f2VwqF30QFBadvtIS1jz8uiQIcBBAB
AgAGBQJOwE4IAAoJEChPw0yOSxol1y4QAIzLUT1v6Ot9m2SyDOXMc6Qk2/e0at1j
plSeG9dczC6nAlLufr3uOP4OxbDk+sFwmPm1eZ7qwWoguTTmhHBq8u1qCQ+GMUY9
BUS7gTxmOVfIM1ieZ+GDrLrAK+sPKUuIypJR7p2yrH5FPsYTrUpTnA4e0OkFZ8uw
k+m723VE00SsX6k2+K4kMloWiALRvwFBEiXalOjQ8JJZ5Qom/eudwxGLtwoQn+g0
lD5FppMPILTIG///////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////iQIcBBABAgAGBQJO3LhzAAoJELod+2T/+XnnaQgQALWwLfHCi/9Q
FLHXgQ5+QYnpoJoxvsgC0iosmgjmB1MMXK+rwMqAZtgr3cajBJ+XNq7XZriFliFV
4oXHiFdR3zjjuvvIJhYn51079YKhZV2tQqZt9NO+rvns2fMwx2iXMou1+g7byOUp
inIkNXtTi3i3HxX+4nKjL3Hk42Qdf+wRFLSl3+DpIx9qrB5ReL8XYhMvlCodjNWP
UNi3LcsLEl47+m4qBSBmQb0mvy1oobaNLXT8+0cT5UHQAqQkB1LIWcC8Hek0iJ4o
TjwpmU/36NH71fif6ypDWU28pbuRxHvXjrYuSi4C++110ShQdTEMe2wt9MpRIkp3
0aIfWUCq6uCmUR5DO8QJM3CPtwlpEzXIXojp4ALfKOYx5xg1UOGxILErCE4O4EYz
QM7pLBqFvMg3rdEu7vrnRrilzHZVWPeeXbJG+uzYbhicydh4UULF2Hz6L/vMEJ/i
rxdELV/h8fykJKE5wFigxZL1VgmWMIAISGZ+N4Npr19u1UmT3GyM4q+ImLOubWHU
3VqVGs5alZQWZvi72sYEKUBqUY7/wfIvFPdXJ4BCPJZqxSCuLy5mpLEeaGpnhFSB
gZHzBwwPyvl3Zc9P21rJD0p8NbMp+shCteWfadMnmBfLGkHUhP6rGZk7g2cjuFas
Tndpuv8+lS9NipNt6uejrg/G+NWFAEH5uQENBE2heeUBCADDxPCizcrOhH12RbIk
8enSsrbATbQnSgpU3DHF76j2gVItsBzpfjYgQCeD5KasXuFmFFph2pY73qCuoDQx
FTo4gJNZt90/oV7C/vPEwMY5MkHdK2bB3BlZznshkpHNmWRBKvCrHJ09jZxmCICe
NymhMyAYBGWM7MTCzEsKk9CuplxF5QApCbWwtlZVpgxra90MzBVlQT+ErXiLlXt8
RG673RlGeFpOdxWK4USbr1AvqYxMV6Y4s/mKpcAJQBdL5IeRT8BnaG5mVjS0UgN8
MeN6c+NlvfnFBZF9XFZXfFJ1QrDaneyT181guKB4apxmvtyXxD9OYdW/EXGbGpdb
F3OxABEBAAGJAR8EGAECAAkFAk2heeUCGwwACgkQfy1DS5dB6Ky85gf9HtPMsnJI
qizJd5s2oRkpYxPiyLKpq+0lH2R+yPo1Qyt7zpR1SV8iSVDaTiaxfF4BwZQz0Qt0
FnIprzWuIw2FjElE/tVFH+Fw9SW5t31ly+v/jXa+iGcMXIblDX5I0gqffXVJRGzZ
zPQDV0Yv4zyP/2Hsv0F250N2N8/cZqPaX5J0dKrOhDmi5yc5WoYJzzZVzXRuXwzC
ncn0ymZteOGwcaW4kmaTQPb33idmTE89pXnskgQFpftAdvPw9Qf/zjVhTtFX95wt
oNPcYOtMIARp/OejazBHaRW+NIWyCvj78MRoy9s0TOAzwcyOCWpjzHuPvslg/U0H
ErbDGhNsa8/dnA==
=TmI0
-----END PGP PUBLIC KEY BLOCK-----

@ -1 +0,0 @@
NETWORKING=yes

@ -1,25 +0,0 @@
xorg
xterm
python2
artwiz-fonts
ethtool
font-bitstream-speedo
net-tools
sudo
ttf-dejavu
ttf-freefont
wget
zsh
networkmanager
network-manager-applet
linux-firmware
gnome-settings-daemon
gvfs
lxappearance
gtk-engines
firefox
thunderbird
xfce4-terminal
leafpad
thunar
thunar-volman

@ -1,8 +0,0 @@
xorg
xterm
python2
sudo
wget
zsh
ethtool
net-tools

Binary file not shown.

@ -1 +0,0 @@
# This file intentionally left blank

@ -1,82 +0,0 @@
#!/bin/bash -e
# vim: set ts=4 sw=4 sts=4 et :
# Source external scripts
source "${SCRIPTSDIR}/vars.sh"
source "${SCRIPTSDIR}/distribution.sh"
INSTALLDIR="$(readlink -m mnt)"
# Make sure ${INSTALLDIR} is not mounted
umount_all "${INSTALLDIR}" || true
# ==============================================================================
# Execute any template flavor or sub flavor 'pre' scripts
# ==============================================================================
buildStep "${0}" "pre"
# ==============================================================================
# Use a snapshot of the debootstraped debian image
# ==============================================================================
manage_snapshot() {
local snapshot="${1}"
umount_kill "${INSTALLDIR}" || true
mount -o loop "${IMG}" "${INSTALLDIR}" || exit 1
# Remove old snapshots if groups completed
if [ -e "${INSTALLDIR}/${TMPDIR}/.prepared_groups" ]; then
outputc stout "Removing stale snapshots"
umount_kill "${INSTALLDIR}" || true
rm -rf "${debootstrap_snapshot}"
rm -rf "${packages_snapshot}"
return
fi
outputc stout "Replacing ${IMG} with snapshot ${snapshot}"
umount_kill "${INSTALLDIR}" || true
cp -f "${snapshot}" "${IMG}"
}
# ==============================================================================
# Determine if a snapshot should be used, reuse an existing image or
# delete the existing image to start fresh based on configuration options
#
# SNAPSHOT=1 - Use snapshots; Will remove after successful build
# If debootstrap did not complete, the existing image will be deleted
# ==============================================================================
splitPath "${IMG}" path_parts
packages_snapshot="${path_parts[dir]}${path_parts[base]}-packages${path_parts[dotext]}"
debootstrap_snapshot="${path_parts[dir]}${path_parts[base]}-debootstrap${path_parts[dotext]}"
if [ -f "${IMG}" ]; then
if [ -f "${packages_snapshot}" -a "${SNAPSHOT}" == "1" ]; then
# Use 'packages' snapshot
manage_snapshot "${packages_snapshot}"
elif [ -f "${debootstrap_snapshot}" -a "${SNAPSHOT}" == "1" ]; then
# Use 'debootstrap' snapshot
manage_snapshot "${debootstrap_snapshot}"
else
# Use '$IMG' if debootstrap did not fail
mount -o loop "${IMG}" "${INSTALLDIR}" || exit 1
# Assume a failed debootstrap installation if .prepared_debootstrap does not exist
if [ -e "${INSTALLDIR}/${TMPDIR}/.prepared_debootstrap" ]; then
debug "Reusing existing image ${IMG}"
else
outputc stout "Removing stale or incomplete ${IMG}"
umount_kill "${INSTALLDIR}" || true
rm -f "${IMG}"
fi
# Umount image; don't fail if its already umounted
umount_kill "${INSTALLDIR}" || true
fi
fi
# ==============================================================================
# Execute any template flavor or sub flavor 'post' scripts
# ==============================================================================
buildStep "${0}" "post"

@ -1,61 +0,0 @@
#!/bin/bash -e
# vim: set ts=4 sw=4 sts=4 et :
# Source external scripts
source "${SCRIPTSDIR}/vars.sh"
source "${SCRIPTSDIR}/distribution.sh"
##### '-------------------------------------------------------------------------
debug ' Installing base system using debootstrap'
##### '-------------------------------------------------------------------------
# ==============================================================================
# Execute any template flavor or sub flavor 'pre' scripts
# ==============================================================================
buildStep "${0}" "pre"
if ! [ -f "${INSTALLDIR}/${TMPDIR}/.prepared_debootstrap" ]; then
#### "------------------------------------------------------------------
info " $(templateName): Installing base '${DISTRIBUTION}-${DIST}' system"
#### "------------------------------------------------------------------
COMPONENTS="" debootstrap \
--arch=amd64 \
--include="ncurses-term locales tasksel" \
--components=main \
--keyring="${SCRIPTSDIR}/keys/${DIST}-${DISTRIBUTION}-archive-keyring.gpg" \
"${DIST}" "${INSTALLDIR}" "${DEBIAN_MIRROR}" || {
error "Debootstrap failed!";
exit 1;
}
#### '----------------------------------------------------------------------
info ' Configure keyboard'
#### '----------------------------------------------------------------------
configureKeyboard
#### '----------------------------------------------------------------------
info ' Update locales'
#### '----------------------------------------------------------------------
updateLocale
#### '----------------------------------------------------------------------
info 'Link mtab'
#### '----------------------------------------------------------------------
chroot rm -f /etc/mtab
chroot ln -s /proc/self/mounts /etc/mtab
# TMPDIR is set in vars. /tmp should not be used since it will be cleared
# if building template with LXC contaniners on a reboot
mkdir -p "${INSTALLDIR}/${TMPDIR}"
# Mark section as complete
touch "${INSTALLDIR}/${TMPDIR}/.prepared_debootstrap"
# If SNAPSHOT=1, Create a snapshot of the already debootstraped image
createSnapshot "debootstrap"
fi
# ==============================================================================
# Execute any template flavor or sub flavor 'post' scripts
# ==============================================================================
buildStep "${0}" "post"

@ -1,84 +0,0 @@
#!/bin/bash -e
# vim: set ts=4 sw=4 sts=4 et :
source "${SCRIPTSDIR}/vars.sh"
source "${SCRIPTSDIR}/distribution.sh"
##### "=========================================================================
debug " Configuring and Installing packages for ${DIST}"
##### "=========================================================================
# If .prepared_debootstrap has not been completed, don't continue
exitOnNoFile "${INSTALLDIR}/${TMPDIR}/.prepared_debootstrap" "prepared_debootstrap installataion has not completed!... Exiting"
# Create system mount points
prepareChroot
# Make sure there is a resolv.conf with network of this AppVM for building
createResolvConf
# ==============================================================================
# Execute any template flavor or sub flavor 'pre' scripts
# ==============================================================================
buildStep "${0}" "pre"
# ==============================================================================
# Configure base system and install any adddtional packages which could
# include +TEMPLATE_FLAVOR such as gnome as set in configuration file
# ==============================================================================
if ! [ -f "${INSTALLDIR}/${TMPDIR}/.prepared_groups" ]; then
#### '----------------------------------------------------------------------
info ' Trap ERR and EXIT signals and cleanup (umount)'
#### '----------------------------------------------------------------------
trap cleanup ERR
trap cleanup EXIT
#### '----------------------------------------------------------------------
info 'Install standard Debian packages'
#### '----------------------------------------------------------------------
if ! [ -f "${INSTALLDIR}/${TMPDIR}/.debian_packages" ]; then
packages="$(chroot tasksel --new-install --task-packages standard)"
aptInstall ${packages}
touch "${INSTALLDIR}/${TMPDIR}/.debian_packages"
fi
#### '----------------------------------------------------------------------
info ' Distribution specific steps (install systemd, add sources, etc)'
#### '----------------------------------------------------------------------
buildStep "$0" "${DIST}"
#### '----------------------------------------------------------------------
info " Installing extra packages in script_${DIST}/packages.list file"
#### '----------------------------------------------------------------------
installPackages
createSnapshot "packages"
touch "${INSTALLDIR}/${TMPDIR}/.prepared_packages"
#### '----------------------------------------------------------------------
info ' Execute any template flavor or sub flavor scripts after packages are installed'
#### '----------------------------------------------------------------------
buildStep "$0" "packages_installed"
#### '----------------------------------------------------------------------
info ' apt-get dist-upgrade'
#### '----------------------------------------------------------------------
aptDistUpgrade
#### '----------------------------------------------------------------------
info ' Cleanup'
#### '----------------------------------------------------------------------
touch "${INSTALLDIR}/${TMPDIR}/.prepared_groups"
trap - ERR EXIT
trap
fi
# ==============================================================================
# Execute any template flavor or sub flavor 'post' scripts
# ==============================================================================
buildStep "${0}" "post"
# ==============================================================================
# Kill all processes and umount all mounts within ${INSTALLDIR}, but not
# ${INSTALLDIR} itself (extra '/' prevents ${INSTALLDIR} from being umounted)
# ==============================================================================
umount_all "${INSTALLDIR}/" || true

@ -1,36 +0,0 @@
#!/bin/bash -e
# vim: set ts=4 sw=4 sts=4 et :
source "${SCRIPTSDIR}/vars.sh"
source "${SCRIPTSDIR}/distribution.sh"
##### "=========================================================================
debug " Installing custom packages and customizing ${DIST}"
##### "=========================================================================
#### '--------------------------------------------------------------------------
info ' Adding contrib, non-free and Debian security to repository.'
#### '--------------------------------------------------------------------------
updateDebianSourceList
aptUpdate
##### '=========================================================================
debug ' Replacing sysvinit with systemd'
##### '=========================================================================
#### '--------------------------------------------------------------------------
info ' Remove sysvinit'
#### '--------------------------------------------------------------------------
aptRemove sysvinit
#### '--------------------------------------------------------------------------
info ' Install Systemd'
#### '--------------------------------------------------------------------------
aptUpdate
aptInstall systemd-sysv
#### '--------------------------------------------------------------------------
info ' Set multu-user.target as the default target (runlevel 3)'
#### '--------------------------------------------------------------------------
chroot rm -f /etc/systemd/system/default.target
chroot ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target

@ -1,89 +0,0 @@
#!/bin/bash -e
# vim: set ts=4 sw=4 sts=4 et :
source "${SCRIPTSDIR}/vars.sh"
source "${SCRIPTSDIR}/distribution.sh"
##### "=========================================================================
debug " Installing custom packages and customizing ${DIST}"
##### "=========================================================================
#### '--------------------------------------------------------------------------
info ' Adding contrib, non-free and Debian security to repository.'
#### '--------------------------------------------------------------------------
updateDebianSourceList
#### '----------------------------------------------------------------------
info ' Adding wheezy backports repository.'
#### '----------------------------------------------------------------------
source="deb ${DEBIAN_MIRROR} wheezy-backports main"
if ! grep -r -q "$source" "${INSTALLDIR}/etc/apt/sources.list"*; then
touch "${INSTALLDIR}/etc/apt/sources.list"
echo "$source" >> "${INSTALLDIR}/etc/apt/sources.list"
fi
aptUpdate
##### '=========================================================================
debug ' Replace sysvinit with systemd'
##### '=========================================================================
#### '----------------------------------------------------------------------
info ' Remove sysvinit'
#### '----------------------------------------------------------------------
echo 'Yes, do as I say!' | aptRemove sysvinit
#### '----------------------------------------------------------------------
info ' Preventing sysvinit re-installation'
#### '----------------------------------------------------------------------
chroot apt-mark hold sysvinit
#### '----------------------------------------------------------------------
info ' Pin sysvinit to prevent being re-installed'
#### '----------------------------------------------------------------------
cat > "${INSTALLDIR}/etc/apt/preferences.d/qubes_sysvinit" <<EOF
Package: sysvinit
Pin: version *
Pin-Priority: -100
EOF
chmod 0644 "${INSTALLDIR}/etc/apt/preferences.d/qubes_sysvinit"
#### '----------------------------------------------------------------------
info ' Install Systemd'
#### '----------------------------------------------------------------------
aptUpdate
aptInstall systemd-sysv
#### '----------------------------------------------------------------------
info ' Set multu-user.target as the default target (runlevel 3)'
#### '----------------------------------------------------------------------
chroot rm -f /etc/systemd/system/default.target
chroot ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
# ==============================================================================
# Install backports
#
# NOTE: This needs to be done after systemd has been installed or risk backport
# being un-installed
# ==============================================================================
#### '----------------------------------------------------------------------
info ' Installing init-system-helpers'
#### '----------------------------------------------------------------------
aptUpdate
DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true \
chroot apt-get ${APT_GET_OPTIONS} -t wheezy-backports install init-system-helpers
#### '----------------------------------------------------------------------
info ' Installing pulseaudo backport'
#### '----------------------------------------------------------------------
# /usr/lib/pulse-4.0/modules/
# start-pulseaudio-with-vchan
#DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true \
# chroot apt-get ${APT_GET_OPTIONS} -t wheezy-backports install pulseaudio \
# libpulse0 \
# pulseaudio-utils \
# libpulse-mainloop-glib0 \
# pulseaudio-module-x11

@ -1,61 +0,0 @@
#!/bin/bash -e
# vim: set ts=4 sw=4 sts=4 et :
source "${SCRIPTSDIR}/vars.sh"
source "${SCRIPTSDIR}/distribution.sh"
##### '-------------------------------------------------------------------------
debug ' Installing Qubes packages'
##### '-------------------------------------------------------------------------
# If .prepared_debootstrap has not been completed, don't continue
exitOnNoFile "${INSTALLDIR}/${TMPDIR}/.prepared_groups" "prepared_groups installataion has not completed!... Exiting"
# Create system mount points
prepareChroot
# ==============================================================================
# Execute any template flavor or sub flavor 'pre' scripts
# ==============================================================================
buildStep "${0}" "pre"
if ! [ -f "${INSTALLDIR}/${TMPDIR}/.prepared_qubes" ]; then
#### '----------------------------------------------------------------------
info ' Trap ERR and EXIT signals and cleanup (umount)'
#### '----------------------------------------------------------------------
trap cleanup ERR
trap cleanup EXIT
#### '----------------------------------------------------------------------
info ' Install Qubes packages listed in packages_qubes.list file(s)'
#### '----------------------------------------------------------------------
installQubesRepo
aptUpdate
installPackages packages_qubes.list
uninstallQubesRepo
#### '----------------------------------------------------------------------
info ' Re-update locales'
# Locales get reset during package installation sometimes
#### '----------------------------------------------------------------------
updateLocale
#### '----------------------------------------------------------------------
info ' Cleanup'
#### '----------------------------------------------------------------------
umount_all "${INSTALLDIR}/" || true
touch "${INSTALLDIR}/${TMPDIR}/.prepared_qubes"
trap - ERR EXIT
trap
fi
# ==============================================================================
# Execute any template flavor or sub flavor 'post' scripts
# ==============================================================================
buildStep "${0}" "post"
# ==============================================================================
# Kill all processes and umount all mounts within ${INSTALLDIR}, but not
# ${INSTALLDIR} itself (extra '/' prevents ${INSTALLDIR} from being umounted)
# ==============================================================================
umount_all "${INSTALLDIR}/" || true

@ -1,27 +0,0 @@
#!/bin/bash -e
# vim: set ts=4 sw=4 sts=4 et :
source "${SCRIPTSDIR}/vars.sh"
source "${SCRIPTSDIR}/distribution.sh"
##### '=========================================================================
debug ' Cleaning up...'
##### '=========================================================================
# ==============================================================================
# Execute any template flavor or sub flavor 'pre' scripts
# ==============================================================================
buildStep "${0}" "pre"
#### '-------------------------------------------------------------------------
info ' Cleaning up any left over files from installation'
#### '-------------------------------------------------------------------------
rm -rf "${INSTALLDIR}/var/cache/apt/archives"
rm -f "${INSTALLDIR}/etc/apt/sources.list.d/qubes-builder.list"
rm -f "${INSTALLDIR}/etc/apt/trusted.gpg.d/qubes-builder.gpg"
rm -rf "${INSTALLDIR}/${TMPDIR}"
# ==============================================================================
# Execute any template flavor or sub flavor 'post' scripts
# ==============================================================================
buildStep "${0}" "post"

@ -1,75 +0,0 @@
issues
------
Think it makes most sense to run whonix setup right after qubes, then whonix can install qubes-whonix last.
hook into bfore qubes removes its links to repo
installing whonix after qubes-whonix; wq thinks its a template; tries to use proxy. Need to add
a chroot option maybe' touch /var/run/qubes/qubes-service/choot and ignore everything; maybe even
in postinit? -- gotta be sure IP addresses don't get changed
tests
-----
test all the vms listed below plus make sure each works with:
- netvm
- proxyvm
- sound
- notifications
NOTE: Backup EXISTING jessie-gnome; its what I use for web access!
Make a special version name; test with that and copy my root.img to it after test as my future template to keep
wheezy
wheezy+gnome
jessie
jessie+gnome
whonix-gateway
whonix-workstation
# Before building ubuntu again; combine code base again
trusty
trusty+gnome
utopic
utopic+gnome
test qubes-whonix package update... at first just add a local file base repo in appvm
ubuntu fixups
-------------
network manager
application menus
- can I convert the hvm? -- or install real ubuntu from live but automated?
- combine codebase of ubuntu / debian
whonix fixups
-------------
move code to qhonix-qubes that can go there
see if I can get rid of grub yet with new APT-opts command
review all snapshot code; remove remerences to /run; swap with tmp
todo
----
add firfox, etc to installed apps like fedora has - gnome only build; keep minimum debian builds
flashplayer
mirror list
automated test? build, deploy to dom0, install guest + appvm, run some tests in appvm
add in qubes-apps-linux-* during qubes-setup; maybe need to remove thunderbird?
duplicate 01proxy
fix the gui-linux commmit
restore dash -- fix any qubes scripts to use dash or indicated they need bash
fix any qubes scripts that use sysconfig; since we dont
condsider
---------
salt module; maybe can use for tests
merge
-----
merge to debian first
then from debian to master
then from master to ubuntu -- rebase whonix again

@ -1,385 +0,0 @@
#!/bin/bash -e
# vim: set ts=4 sw=4 sts=4 et :
source ./functions.sh >/dev/null
source ./umount_kill.sh >/dev/null
setVerboseMode
output "${bold}${under}INFO: ${SCRIPTSDIR}/distribution.sh imported by: ${0}${reset}"
# ==============================================================================
# Cleanup function
# ==============================================================================
function cleanup() {
errval=$?
trap - ERR EXIT
trap
error "${1:-"${0}: Error. Cleaning up and un-mounting any existing mounts"}"
umount_all || true
# Return xtrace to original state
[[ -n "${XTRACE}" ]] && [[ "${XTRACE}" -eq 0 ]] && set -x || set +x
exit $errval
}
# ==============================================================================
# If .prepared_debootstrap has not been completed, don't continue
# ==============================================================================
function exitOnNoFile() {
file="${1}"
message="${2}"
if ! [ -f "${file}" ]; then
error "${message}"
umount_all || true
exit 1
fi
}
# ==============================================================================
# Umount everthing within INSTALLDIR or $1 but kill all processes within first
# ==============================================================================
function umount_all() {
directory="${1:-"${INSTALLDIR}"}"
# Only remove dirvert policies, etc if base INSTALLDIR mount is being umounted
if [ "${directory}" == "${INSTALLDIR}" -o "${directory}" == "${INSTALLDIR}/" ]; then
if [ -n "$(mountPoints)" ]; then
removeDbusUuid
removeDivertPolicy
fi
fi
umount_kill "${directory}" || true
}
# ==============================================================================
# Create snapshot
# ==============================================================================
function createSnapshot() {
snapshot_name="${1}"
if [ "${SNAPSHOT}" == "1" ]; then
splitPath "${IMG}" path_parts
snapshot_path="${path_parts[dir]}${path_parts[base]}-${snapshot_name}${path_parts[dotext]}"
# create snapshot
info "Creating snapshot of ${IMG} to ${snapshot_path}"
sync
cp -f "${IMG}" "${snapshot_path}"
fi
}
# ==============================================================================
# Create DBUS uuid
# ==============================================================================
function createDbusUuid() {
outputc green "Creating DBUS uuid..."
removeDbusUuid
if [ -e "${INSTALLDIR}/bin/dbus-uuidgen" ]; then
chroot dbus-uuidgen --ensure 1>/dev/null 2>&1
fi
}
# ==============================================================================
# Remove DBUS uuid
# ==============================================================================
function removeDbusUuid() {
if [ -e "${INSTALLDIR}"/var/lib/dbus/machine-id ]; then
outputc red "Removing generated machine uuid..."
rm -f "${INSTALLDIR}/var/lib/dbus/machine-id"
fi
}
# ==============================================================================
# Set up a temporary dpkg-divert policy to prevent apt from starting services
# on package installation
# ==============================================================================
function addDivertPolicy() {
outputc green "Deactivating initctl..."
chroot dpkg-divert --local --rename --add /sbin/initctl || true
# utopic systemd install still broken...
outputc green "Hacking invoke-rc.d to ignore missing init scripts..."
chroot sed -i -e "s/exit 100/exit 0 #exit 100/" /usr/sbin/invoke-rc.d
}
# ==============================================================================
# Remove temporary dpkg-divert policy
# ==============================================================================
function removeDivertPolicy() {
outputc red "Reactivating initctl..."
chroot dpkg-divert --local --rename --remove /sbin/initctl || true
outputc red "Restoring invoke-rc.d..."
chroot sed -i -e "s/exit 0 #exit 100/exit 100/" /usr/sbin/invoke-rc.d
}
# ==============================================================================
# Create system mount points
# ==============================================================================
function prepareChroot() {
# Make sure nothing is mounted within $INSTALLDIR
umount_kill "${INSTALLDIR}/"
mount -t tmpfs none "${INSTALLDIR}/run"
if [ "${SYSTEMD_NSPAWN_ENABLE}" != "1" ]; then
mount -t proc proc "${INSTALLDIR}/proc"
mount -t sysfs sys "${INSTALLDIR}/sys"
fi
createDbusUuid
addDivertPolicy
}
# ==============================================================================
# apt-get upgrade
# ==============================================================================
function aptUpgrade() {
aptUpdate
DEBIAN_FRONTEND="noninteractive" DEBIAN_PRIORITY="critical" DEBCONF_NOWARNINGS="yes" \
chroot env APT_LISTCHANGES_FRONTEND=none apt-get dist-upgrade -u -y --force-yes
}
# ==============================================================================
# apt-get dist-upgrade
# ==============================================================================
function aptDistUpgrade() {
aptUpdate
DEBIAN_FRONTEND="noninteractive" DEBIAN_PRIORITY="critical" DEBCONF_NOWARNINGS="yes" \
chroot env APT_LISTCHANGES_FRONTEND=none apt-get dist-upgrade -u -y --force-yes
}
# ==============================================================================
# apt-get update
# ==============================================================================
function aptUpdate() {
debug "Updating system"
DEBIAN_FRONTEND="noninteractive" DEBIAN_PRIORITY="critical" DEBCONF_NOWARNINGS="yes" \
chroot apt-get update
}
# ==============================================================================
# apt-get remove
# ==============================================================================
function aptRemove() {
files="$@"
DEBIAN_FRONTEND="noninteractive" DEBIAN_PRIORITY="critical" DEBCONF_NOWARNINGS="yes" \
chroot apt-get ${APT_GET_OPTIONS} remove ${files[@]}
}
# ==============================================================================
# apt-get install
# ==============================================================================
function aptInstall() {
files="$@"
DEBIAN_FRONTEND="noninteractive" DEBIAN_PRIORITY="critical" DEBCONF_NOWARNINGS="yes" \
chroot apt-get ${APT_GET_OPTIONS} install ${files[@]}
}
# ==============================================================================
# Install extra packages in script_${DIST}/packages.list file
# -and / or- TEMPLATE_FLAVOR directories
# ==============================================================================
function installPackages() {
if [ -n "${1}" ]; then
# Locate packages within sub dirs
if [ ${#@} == "1" ]; then
getFileLocations packages_list "${1}" ""
else
packages_list="$@"
fi
else
getFileLocations packages_list "packages.list" "${DIST}"
if [ -z "${packages_list}" ]; then
error "Can not locate a package.list file!"
umount_all || true
exit 1
fi
fi
for package_list in ${packages_list[@]}; do
debug "Installing extra packages from: ${package_list}"
declare -a packages
readarray -t packages < "${package_list}"
info "Packages: "${packages[@]}""
aptInstall "${packages[@]}" || return $?
done
}
# ==============================================================================
# Install Systemd
# ==============================================================================
function installSystemd() {
buildStep "$0" "pre-systemd"
chroot apt-get update
aptInstall systemd
createDbusUuid
# Set multi-user.target as default target
chroot rm -f /etc/systemd/system/default.target
chroot ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
# XXX: TEMP lets see how stuff work with upstart in control for now
# Boot using systemd
chroot rm -f /sbin/init
chroot ln -sf /lib/systemd/systemd /sbin/init
buildStep "$0" "post-systemd"
}
# ==============================================================================
# ------------------------------------------------------------------------------
# C O N F I G U R A T I O N R E L A T E D
# ------------------------------------------------------------------------------
# ==============================================================================
# ==============================================================================
# Add universe to sources.list
# ==============================================================================
function updateDebianSourceList() {
# Add contrib and non-free component to repository
touch "${INSTALLDIR}/etc/apt/sources.list"
sed -i "s/${DIST} main$/${DIST} main contrib non-free/g" "${INSTALLDIR}/etc/apt/sources.list"
# Add Debian security repositories
source="deb http://security.debian.org ${DEBIANVERSION}/updates main"
if ! grep -r -q "$source" "${INSTALLDIR}/etc/apt/sources.list"*; then
touch "${INSTALLDIR}/etc/apt/sources.list"
echo "$source" >> "${INSTALLDIR}/etc/apt/sources.list"
fi
source="deb-src http://security.debian.org ${DEBIANVERSION}/updates main"
if ! grep -r -q "$source" "${INSTALLDIR}/etc/apt/sources.list"*; then
touch "${INSTALLDIR}/etc/apt/sources.list"
echo "$source" >> "${INSTALLDIR}/etc/apt/sources.list"
fi
}
# ==============================================================================
# Add universe to sources.list
# ==============================================================================
function updateQubuntuSourceList() {
sed -i "s/${DIST} main$/${DIST} main universe multiverse restricted/g" "${INSTALLDIR}/etc/apt/sources.list"
source="deb http://archive.canonical.com/ubuntu ${DIST} partner"
if ! grep -r -q "$source" "${INSTALLDIR}/etc/apt/sources.list"*; then
touch "${INSTALLDIR}/etc/apt/sources.list"
echo "$source" >> "${INSTALLDIR}/etc/apt/sources.list"
fi
source="deb-src http://archive.canonical.com/ubuntu ${DIST} partner"
if ! grep -r -q "$source" "${INSTALLDIR}/etc/apt/sources.list"*; then
touch "${INSTALLDIR}/etc/apt/sources.list"
echo "$source" >> "${INSTALLDIR}/etc/apt/sources.list"
fi
chroot apt-get update
}
# ==============================================================================
# Make sure there is a resolv.conf with network of this AppVM for building
# ==============================================================================
function createResolvConf() {
rm -f "${INSTALLDIR}/etc/resolv.conf"
cp /etc/resolv.conf "${INSTALLDIR}/etc/resolv.conf"
}
# ==============================================================================
# Ensure umask set in /etc/login.defs is used (022)
# ==============================================================================
function configureUmask() {
echo "session optional pam_umask.so" >> "${INSTALLDIR}/etc/pam.d/common-session"
}
# ==============================================================================
# Configure keyboard
# ==============================================================================
function configureKeyboard() {
debug "Setting keyboard layout"
cat > "${INSTALLDIR}/tmp/keyboard.conf" <<'EOF'
keyboard-configuration keyboard-configuration/variant select English (US)
keyboard-configuration keyboard-configuration/layout select English (US)
keyboard-configuration keyboard-configuration/model select Generic 105-key (Intl) PC
keyboard-configuration keyboard-configuration/modelcode string pc105
keyboard-configuration keyboard-configuration/layoutcode string us
keyboard-configuration keyboard-configuration/variantcode string
keyboard-configuration keyboard-configuration/optionscode string
EOF
chroot debconf-set-selections /tmp/keyboard.conf
}
# ==============================================================================
# Update locale
# ==============================================================================
function updateLocale() {
debug "Updating locales"
chroot localedef -f UTF-8 -i en_US -c en_US.UTF-8
chroot update-locale LC_ALL=en_US.UTF-8
}
# ==============================================================================
# ------------------------------------------------------------------------------
# Q U B E S S P E C I F I C F U N C T I O N S
# ------------------------------------------------------------------------------
# ==============================================================================
# ==============================================================================
# Install Keyrings
# ==============================================================================
function installKeyrings() {
if ! [ -e "${CACHEDIR}/repo-secring.gpg" ]; then
mkdir -p "${CACHEDIR}"
gpg --gen-key --batch <<EOF
Key-Type: RSA
Key-Length: 1024
Key-Usage: sign
Name-Real: Qubes builder
Expire-Date: 0
%pubring ${CACHEDIR}/repo-pubring.gpg
%secring ${CACHEDIR}/repo-secring.gpg
%commit
EOF
fi
if [ ! -e "${CUSTOMREPO}/dists/${DIST}/Release.gpg" ]; then
gpg -abs --no-default-keyring \
--secret-keyring "${CACHEDIR}/repo-secring.gpg" \
--keyring "${CACHEDIR}/repo-pubring.gpg" \
-o "${CUSTOMREPO}/dists/${DIST}/Release.gpg" \
"${CUSTOMREPO}/dists/${DIST}/Release"
cp "${CACHEDIR}/repo-pubring.gpg" "${INSTALLDIR}/etc/apt/trusted.gpg.d/qubes-builder.gpg"
fi
}
# ==============================================================================
# Install Qubes Repo
# ==============================================================================
installQubesRepo() {
info " Defining Qubes CUSTOMREPO Location: ${PWD}/yum_repo_qubes/${DIST}"
export CUSTOMREPO="${PWD}/yum_repo_qubes/${DIST}"
info "Mounting local qubes_repo"
mkdir -p "${INSTALLDIR}/tmp/qubes_repo"
mount --bind "${CUSTOMREPO}" "${INSTALLDIR}/tmp/qubes_repo"
cat > "${INSTALLDIR}/etc/apt/sources.list.d/qubes-builder.list" <<EOF
deb file:/tmp/qubes_repo ${DIST} main
EOF
# XXX: Moved keyring install last in process; not sure if mount was ready
# all the time in its previous place
info ' Installing keyrings' # Relies on $CUSTOMREPO
installKeyrings
}
# ==============================================================================
# Uninstall Qubes Repo
# ==============================================================================
uninstallQubesRepo() {
info ' Removing Quebes build repo from sources.list.d'
# Lets not umount; we do that anyway when 04 exits
umount_kill "${INSTALLDIR}/tmp/qubes_repo"
rm -f "${INSTALLDIR}/etc/apt/sources.list.d/qubes-builder.list"
}

@ -1,10 +0,0 @@
#!/bin/bash -e
# vim: set ts=4 sw=4 sts=4 et :
source "${SCRIPTSDIR}/vars.sh"
source "${SCRIPTSDIR}/distribution.sh"
#### '----------------------------------------------------------------------
info ' Installing flash plugin'
#### '----------------------------------------------------------------------
aptInstall flashplugin-nonfree

@ -1,13 +0,0 @@
#!/bin/bash -e
# vim: set ts=4 sw=4 sts=4 et :
source "${SCRIPTSDIR}/vars.sh"
source "${SCRIPTSDIR}/distribution.sh"
#### '----------------------------------------------------------------------
info ' Installing Gnome'
#### '----------------------------------------------------------------------
#packages="$(chroot tasksel --new-install --task-packages desktop)"
#packages+=" $(chroot tasksel --new-install --task-packages gnome-desktop)"
packages="$(chroot tasksel --new-install --task-packages gnome-desktop)"
aptInstall ${packages}

@ -1,22 +0,0 @@
ncurses-term
aptitude
tasksel
sudo
locales
dmsetup
psmisc
emacs
vim-nox
gnupg
iceweasel
icedove
keepassx
git
gnome-terminal
xterm
libfile-mimeinfo-perl
libglib2.0-bin
ltrace
strace
haveged
firmware-linux

@ -1,15 +0,0 @@
qubes-core-agent
qubes-gui-agent
xdg-user-dirs
gnome-themes-standard
xsettingsd
gnome-packagekit
chrony
ntpdate
libxvmc1
x11-session-utils
xfonts-100dpi
xfonts-75dpi
xfonts-scalable

@ -1,22 +0,0 @@
ncurses-term
aptitude
tasksel
sudo
locales
dmsetup
psmisc
emacs
vim-nox
gnupg
iceweasel
icedove
keepassx
git
gnome-terminal
xterm
libfile-mimeinfo-perl
libglib2.0-bin
ltrace
strace
haveged
firmware-linux

@ -1,36 +0,0 @@
#!/bin/bash -e
# vim: set ts=4 sw=4 sts=4 et :
source ./functions.sh
# ==============================================================================
# Global variables and functions
# ==============================================================================
# ------------------------------------------------------------------------------
# Temp directory to place installation files and progress markers
# (Do not use /tmp since if built in a real VM, /tmp will be empty on a reboot)
# ------------------------------------------------------------------------------
TMPDIR="/var/lib/qubes-whonix/install"
# ------------------------------------------------------------------------------
# The codename of the debian version to install.
# jessie = testing, wheezy = stable
# ------------------------------------------------------------------------------
DEBIANVERSION=${DIST}
# ------------------------------------------------------------------------------
# Location to grab Debian packages
# ------------------------------------------------------------------------------
DEBIAN_MIRROR=http://ftp.us.debian.org/debian
# TODO: Not yet implemented
DEBIAN_MIRRORS=('http://ftp.us.debian.org/debian',
'http://http.debian.net/debian,
'http://ftp.ca.debian.org/debian,
)
# ------------------------------------------------------------------------------
# apt-get configuration options
# ------------------------------------------------------------------------------
APT_GET_OPTIONS="-o Dpkg::Options::="--force-confnew" --force-yes --yes"

@ -1,246 +0,0 @@
#!/bin/bash -e
# vim: set ts=4 sw=4 sts=4 et :
source "${SCRIPTSDIR}/vars.sh"
source "${SCRIPTSDIR}/distribution.sh"
##### '-------------------------------------------------------------------------
debug ' Installing and building Whonix'
##### '-------------------------------------------------------------------------
#### '--------------------------------------------------------------------------
info ' Trap ERR and EXIT signals and cleanup (umount)'
#### '--------------------------------------------------------------------------
trap cleanup ERR
trap cleanup EXIT
if ! [ -f "${INSTALLDIR}/${TMPDIR}/.whonix_prepared_groups" ]; then
#### '----------------------------------------------------------------------
info ' Installing extra packages in packages_whonix.list file'
#### '----------------------------------------------------------------------
installPackages packages_whonix.list
touch "${INSTALLDIR}/${TMPDIR}/.whonix_prepared_groups"
fi
# ------------------------------------------------------------------------------
# chroot Whonix build script
# ------------------------------------------------------------------------------
read -r -d '' WHONIX_BUILD_SCRIPT <<'EOF' || true
################################################################################
# Pre Fixups
sudo mkdir -p /boot/grub2
sudo touch /boot/grub2/grub.cfg
sudo mkdir -p /boot/grub
sudo touch /boot/grub/grub.cfg
sudo mkdir --parents --mode=g+rw "/tmp/uwt"
# Whonix seems to re-install sysvinit even though there is a hold
# on the package. Things seem to work anyway. BUT hopfully the
# hold on grub* don't get removed
sudo apt-mark hold sysvinit
sudo apt-mark hold grub-pc grub-pc-bin grub-common grub2-common
# Whonix expects haveged to be started
sudo /etc/init.d/haveged start
################################################################################
# Whonix installation
export WHONIX_BUILD_UNATTENDED_PKG_INSTALL="1"
pushd ~/Whonix
sudo ~/Whonix/whonix_build \
--build $1 \
--64bit-linux \
--current-sources \
--enable-whonix-apt-repository \
--whonix-apt-repository-distribution $2 \
--install-to-root \
--skip-verifiable \
--minimal-report \
--skip-sanity-tests || { exit 1; }
popd
EOF
##### '-------------------------------------------------------------------------
debug ' Preparing Whonix for installation'
##### '-------------------------------------------------------------------------
if [ -f "${INSTALLDIR}/${TMPDIR}/.whonix_prepared_groups" ] && ! [ -f "${INSTALLDIR}/${TMPDIR}/.whonix_prepared" ]; then
info "Preparing Whonix system"
#### '----------------------------------------------------------------------
info ' Initializing Whonix submodules'
#### '----------------------------------------------------------------------
pushd "${WHONIX_DIR}"
{
git add Makefile || true
git commit Makefile -m 'Added Makefile' || true
su $(logname) -c "git submodule update --init --recursive";
}
popd
#### '----------------------------------------------------------------------
info ' Faking grub installation since Whonix has depends on grub-pc'
#### '----------------------------------------------------------------------
mkdir -p "${INSTALLDIR}/boot/grub"
cp "${INSTALLDIR}/usr/lib/grub/i386-pc/"* "${INSTALLDIR}/boot/grub"
rm -f "${INSTALLDIR}/usr/sbin/update-grub"
chroot ln -s /bin/true /usr/sbin/update-grub
#### '----------------------------------------------------------------------
info ' Adding a user account for Whonix to build with'
#### '----------------------------------------------------------------------
chroot id -u 'user' >/dev/null 2>&1 || \
{
# UID needs match host user to have access to Whonix sources
chroot groupadd -f user
[ -n "$SUDO_UID" ] && USER_OPTS="-u $SUDO_UID"
chroot useradd -g user $USER_OPTS -G sudo,audio -m -s /bin/bash user
if [ `chroot id -u user` != 1000 ]; then
chroot useradd -g user -u 1000 -M -s /bin/bash user-placeholder
fi
}
#### '----------------------------------------------------------------------
info ' Installing Whonix build scripts'
#### '----------------------------------------------------------------------
echo "${WHONIX_BUILD_SCRIPT}" > "${INSTALLDIR}/home/user/whonix_build.sh"
chmod 0755 "${INSTALLDIR}/home/user/whonix_build.sh"
#### '----------------------------------------------------------------------
info ' Removing apt-listchanges if it exists,so no prompts appear'
#### '----------------------------------------------------------------------
# Whonix does not handle this properly, but aptInstall packages will
aptRemove apt-listchanges || true
#### '----------------------------------------------------------------------
info ' Copying additional files required for build'
#### '----------------------------------------------------------------------
copyTree "files"
touch "${INSTALLDIR}/${TMPDIR}/.whonix_prepared"
fi
##### '-------------------------------------------------------------------------
debug ' Installing Whonix code base'
##### '-------------------------------------------------------------------------
if [ -f "${INSTALLDIR}/${TMPDIR}/.whonix_prepared" ] && ! [ -f "${INSTALLDIR}/${TMPDIR}/.whonix_installed" ]; then
if ! [ -d "${INSTALLDIR}/home/user/Whonix" ]; then
chroot su user -c 'mkdir /home/user/Whonix'
fi
mount --bind "../Whonix" "${INSTALLDIR}/home/user/Whonix"
if [ "${TEMPLATE_FLAVOR}" == "whonix-gateway" ]; then
BUILD_TYPE="--torgateway"
elif [ "${TEMPLATE_FLAVOR}" == "whonix-workstation" ]; then
BUILD_TYPE="--torworkstation"
else
error "Incorrent Whonix type \"${TEMPLATE_FLAVOR}\" selected. Not building Whonix modules"
error "You need to set TEMPLATE_FLAVOR environment variable to either"
error "whonix-gateway OR whonix-workstation"
exit 1
fi
# Whonix needs /dev/pts mounted during build
mount --bind /dev "${INSTALLDIR}/dev"
mount --bind /dev/pts "${INSTALLDIR}/dev/pts"
chroot su user -c "cd ~; ./whonix_build.sh ${BUILD_TYPE} ${DIST}" || { exit 1; }
touch "${INSTALLDIR}/${TMPDIR}/.whonix_installed"
fi
##### '-------------------------------------------------------------------------
debug ' Whonix Post Installation Configurations'
##### '-------------------------------------------------------------------------
if [ -f "${INSTALLDIR}/${TMPDIR}/.whonix_installed" ] && ! [ -f "${INSTALLDIR}/${TMPDIR}/.whonix_post" ]; then
#### '----------------------------------------------------------------------
info ' Restoring original network interfaces'
#### '----------------------------------------------------------------------
pushd "${INSTALLDIR}/etc/network"
{
rm -f interfaces;
ln -s interfaces.backup interfaces;
}
popd
#### '----------------------------------------------------------------------
info ' Temporarily retore original resolv.conf for remainder of install process'
info ' (Will be restored back in wheezy+whonix/04_qubes_install_post.sh)'
#### '----------------------------------------------------------------------
pushd "${INSTALLDIR}/etc"
{
rm -f resolv.conf;
cp -p resolv.conf.backup resolv.conf;
}
popd
#### '----------------------------------------------------------------------
info ' Temporarily retore original hosts for remainder of install process'
info ' (Will be restored on initial boot)'
#### '----------------------------------------------------------------------
pushd "${INSTALLDIR}/etc"
{
rm -f hosts;
cp -p hosts.anondist-orig hosts;
}
popd
#### '----------------------------------------------------------------------
info ' Restore default user UID set to so same in all builds regardless of build host'
#### '----------------------------------------------------------------------
if [ -n "`chroot id -u user-placeholder`" ]; then
chroot userdel user-placeholder
chroot usermod -u 1000 user
fi
#### '----------------------------------------------------------------------
info ' Enable some aliases in .bashrc'
#### '----------------------------------------------------------------------
sed -i "s/^# export/export/g" "${INSTALLDIR}/root/.bashrc"
sed -i "s/^# eval/eval/g" "${INSTALLDIR}/root/.bashrc"
sed -i "s/^# alias/alias/g" "${INSTALLDIR}/root/.bashrc"
sed -i "s/^#force_color_prompt/force_color_prompt/g" "${INSTALLDIR}/home/user/.bashrc"
sed -i "s/#alias/alias/g" "${INSTALLDIR}/home/user/.bashrc"
sed -i "s/alias l='ls -CF'/alias l='ls -l'/g" "${INSTALLDIR}/home/user/.bashrc"
#### '----------------------------------------------------------------------
info ' Remove apt-cacher-ng'
#### '----------------------------------------------------------------------
chroot service apt-cacher-ng stop || :
chroot update-rc.d apt-cacher-ng disable || :
DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true \
chroot apt-get.anondist-orig -y --force-yes remove --purge apt-cacher-ng
#### '----------------------------------------------------------------------
info ' Remove original sources.list (Whonix copied them to .../debian.list)'
#### '----------------------------------------------------------------------
rm -f "${INSTALLDIR}/etc/apt/sources.list"
DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true \
chroot apt-get.anondist-orig update
touch "${INSTALLDIR}/${TMPDIR}/.whonix_post"
fi
##### '-------------------------------------------------------------------------
debug ' Temporarily retore original apt-get for remainder of install process'
##### '-------------------------------------------------------------------------
pushd "${INSTALLDIR}/usr/bin"
{
rm -f apt-get;
cp -p apt-get.anondist-orig apt-get;
}
popd
#### '----------------------------------------------------------------------
info ' Cleanup'
#### '----------------------------------------------------------------------
trap - ERR EXIT
trap

@ -1,40 +0,0 @@
#!/bin/bash -e
# vim: set ts=4 sw=4 sts=4 et :
source "${SCRIPTSDIR}/vars.sh"
source "${SCRIPTSDIR}/distribution.sh"
##### '-------------------------------------------------------------------------
debug ' Installing qubes-whonix package(s)'
##### '-------------------------------------------------------------------------
# If .prepared_debootstrap has not been completed, don't continue
exitOnNoFile "${INSTALLDIR}/${TMPDIR}/.prepared_qubes" "prepared_qubes installataion has not completed!... Exiting"
# Create system mount points.
prepareChroot
#### '--------------------------------------------------------------------------
info ' Trap ERR and EXIT signals and cleanup (umount)'
#### '--------------------------------------------------------------------------
trap cleanup ERR
trap cleanup EXIT
#### '--------------------------------------------------------------------------
info ' Installing qubes-whonix and other required packages'
#### '--------------------------------------------------------------------------
# whonix-setup-wizard expects '/usr/local/share/applications' directory to exist
chroot mkdir -p '/usr/local/share/applications' # whonix-setup-wizard needs this
installQubesRepo
aptInstall python-guimessages whonix-setup-wizard qubes-whonix
uninstallQubesRepo
#### '--------------------------------------------------------------------------
info ' Cleanup'
#### '--------------------------------------------------------------------------
umount_all "${INSTALLDIR}/" || true
trap - ERR EXIT
trap

@ -1,40 +0,0 @@
#!/bin/bash -e
# vim: set ts=4 sw=4 sts=4 et :
source "${SCRIPTSDIR}/vars.sh"
source "${SCRIPTSDIR}/distribution.sh"
##### '-------------------------------------------------------------------------
debug ' Whonix post installation cleanup'
##### '-------------------------------------------------------------------------
#### '--------------------------------------------------------------------------
info ' Restoring Whonix apt-get'
#### '--------------------------------------------------------------------------
pushd "${INSTALLDIR}/usr/bin"
{
rm -f apt-get;
cp -p apt-get.anondist apt-get;
}
popd
#### '--------------------------------------------------------------------------
info ' Restoring Whonix resolv.conf'
#### '--------------------------------------------------------------------------
pushd "${INSTALLDIR}/etc"
{
rm -f resolv.conf;
cp -p resolv.conf.anondist resolv.conf;
}
popd
#### '--------------------------------------------------------------------------
info ' Removing files created during installation that are no longer required'
#### '--------------------------------------------------------------------------
rm -rf "${INSTALLDIR}/home.orig/user/Whonix"
rm -rf "${INSTALLDIR}/home.orig/user/whonix_binary"
rm -f "${INSTALLDIR}/home.orig/user/whonix_fix"
rm -f "${INSTALLDIR}/home.orig/user/whonix_build.sh"
rm -f "${INSTALLDIR}/etc/sudoers.d/whonix-build"
rm -f "${TMPDIR}/etc/sudoers.d/whonix-build"

@ -1,21 +0,0 @@
# file: etc/hostname
# owner: root
# group: root
user::rw-
group::r--
other::r--
# file: etc/sudoers.d
# owner: root
# group: root
user::rwx
group::--x
other::---
# file: etc/sudoers.d/whonix-build
# owner: root
# group: root
user::r--
group::r--
other::---

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save