live-zfs-e23/live-zfs-e23.blend

570 lines
15 KiB
Bash

#!/usr/bin/env zsh
# Copyright (c) 2017 Dyne.org Foundation
# live-sdk is written and maintained by Ivan J. <parazyd@dyne.org>
#
# This file is part of live-sdk
# devuan-desktop-live.blend is maintained by fsmithred
#
# This source code is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This software is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this source code. If not, see <http://www.gnu.org/licenses/>.
BLENDPATH="${BLENDPATH:-$(dirname $0)}"
source $BLENDPATH/config
blend_release_path=$BLENDPATH/$release
blend_packages=${blend_release_path}/packages
blend_scripts=${blend_release_path}/scripts
blend_preinst() {
fn blend_preinst
req=(blend_name)
ckreq || return 1
notice "executing $blend_name preinst - copying blend debs and scripts."
if [[ -d "${blend_packages}" ]] ; then
notice "copying blend-specific debs"
mkdir -p "$R/extra/custom-packages"
cp -fv "$blend_packages"/*.deb "$R/extra/custom-packages"
else
notice "no blend-specific debs found in ${blend_release_path}/packages"
fi
if [[ -d "${blend_scripts}" ]] ; then
notice "copying blend-specific scripts"
mkdir -p "$R/extra/custom-scripts"
cp -fv "$blend_scripts"/*.sh "$R/extra/custom-scripts"
else
notice "no blend-specific scripts found in ${blend_release_path}/automate"
fi
enable_apt-proxy
}
blend_postinst() {
fn blend_postinst
req=(strapdir blend_name)
ckreq || return 1
notice "executing $blend_name postinst"
[[ $mkefi = yes ]] && {
iso_make_efi
iso_write_grub_cfg
}
install-custdebs || zerr
install-custscripts || zerr
blend_finalize || zerr
disable_apt-proxy
}
iso_write_isolinux_cfg() {
fn iso_write_isolinux_cfg "(override)"
req=(workdir arch username)
ckreq || return 1
notice "writing isolinux configuration"
cat <<EOF | sudo tee ${workdir}/binary/isolinux/isolinux.cfg >/dev/null
ui vesamenu.c32
prompt 0
menu title devuan-live boot menu
timeout 70
menu background /isolinux/splash.png
menu color title * #C6C2C2 *
menu color border * #00000000 #00000000 none
menu color sel * #ffffffff #5F1A1A *
menu color hotsel 1;7;37;40 #ffffffff #401111 *
menu color tabmsg * #D4D0D0 #00000000 *
menu color cmdline 0 #D4D0D0 #00000000
menu vshift 12
menu rows 12
# The help line must be at least one line from the bottom.
menu helpmsgrow 14
# The command line must be at least one line from the help line.
menu cmdlinerow 16
menu timeoutrow 16
menu tabmsgrow 18
menu tabmsg Press ENTER to boot or TAB to edit a menu entry
label live
menu label ${os}-live (${arch})
menu default
linux /live/vmlinuz
append initrd=/live/initrd.img boot=live username=${username}
label lang_gb
menu label en_GB locale (TAB to edit)
linux /live/vmlinuz
append initrd=/live/initrd.img boot=live username=${username} locales=en_GB.UTF-8 keyboard-layouts=gb
label lang_it
menu label it_IT locale (TAB to edit)
linux /live/vmlinuz
append initrd=/live/initrd.img boot=live username=${username} locales=en_IT.UTF-8 keyboard-layouts=it
label toram
menu label ${os}-live (${arch}) (load to RAM)
linux /live/vmlinuz
append initrd=/live/initrd.img boot=live username=${username} toram
label failsafe
menu label ${os}-live (${arch}) (failsafe)
kernel /live/vmlinuz noapic noapm nodma nomce nolapic nosmp nomodeset vga=normal
append initrd=/live/initrd.img boot=live
label memtest
menu label Memory test
kernel /live/memtest
label help
menu label ^Help
text help
Display help screens; type 'menu' at boot prompt to return to this menu
endtext
config prompt.cfg
endtext
EOF
notice "copying isolinux overlay"
sudo mkdir -p "$workdir"/binary/{live,isolinux}
sudo cp -rav "$blend_release_path"/isolinux-overlay/* "$workdir"/binary/isolinux/
notice "copying live overlay"
sudo cp -av "$blend_release_path"/live-overlay/* "$workdir"/binary/live/
# [[ -n "$hookscripts" ]] && {
# sudo cp -av "$blend_release_path"/hooks "$workdir"/binary/live/
# }
}
# create /boot and /efi for uefi.
# uefi code borrowed and adapted from David Hare, who borrowed and adapted it
# from similar scripts by Colin Watson and Patrick J. Volkerding.
iso_make_efi() {
fn iso_make_efi
req=(workdir efi_work)
ckreq || return 1
notice "creating efi boot files"
tempdir="$(mktemp -d /tmp/work_temp.XXXX)"
# for initial grub.cfg
mkdir -p "$tempdir"/boot/grub
if [ "$arch" = amd64 ] ; then
grubarch="x86_64-efi"
elif [ "$arch" = i386 ] ; then
grubarch="i386-efi"
fi
cat >"$tempdir"/boot/grub/grub.cfg <<EOF
search --file --set=root /isolinux/isolinux.cfg
set prefix=(\$root)/boot/grub
source \$prefix/${grubarch}/grub.cfg
EOF
mkdir -p "$efi_work"
pushd "$efi_work"
# start with empty directories.
rm -rf boot; mkdir -p boot/grub/${grubarch}
rm -rf efi ; mkdir -p efi/boot
# second grub.cfg file
for i in $(find ${strapdir}/usr/lib/grub/${grubarch} -name 'part_*.mod'); do
print "insmod $(basename $i)" >> boot/grub/${grubarch}/grub.cfg
done
# Additional modules so we don't boot in blind mode.
# I don't know which ones are really needed.
efimods=(
efi_gop
efi_uga
ieee1275_fb
vbe
vga
video_bochs
video_cirrus
jpeg
png
gfxterm
)
for i in $efimods; do
print "insmod $i" >> boot/grub/${grubarch}/grub.cfg
done
print "source /boot/grub/grub.cfg" >> boot/grub/${grubarch}/grub.cfg
pushd "$tempdir"
# make a tarred "memdisk" to embed in the grub image
tar -cvf memdisk boot
# make the grub images
grub-mkimage -O "x86_64-efi" -m "memdisk" -o "bootx64.efi" \
-p '(memdisk)/boot/grub' \
search iso9660 configfile normal memdisk tar cat \
part_msdos part_gpt fat ext2 ntfs ntfscomp hfsplus \
chain boot linux
grub-mkimage -O "i386-efi" -m "memdisk" -o "bootia32.efi" \
-p '(memdisk)/boot/grub' \
search iso9660 configfile normal memdisk tar cat \
part_msdos part_gpt fat ext2 ntfs ntfscomp hfsplus \
chain boot linux
popd
# copy the grub image to efi/boot (to go later in the device's root)
cp "$tempdir"/bootx64.efi efi/boot
cp "$tempdir"/bootia32.efi efi/boot
# Do the boot image "boot/grub/efiboot.img"
dd if=/dev/zero of=boot/grub/efiboot.img bs=1K count=1440
mkfs.vfat -F 12 boot/grub/efiboot.img
sudo mkdir img-mnt
sudo mount -o loop boot/grub/efiboot.img img-mnt
sudo mkdir -p img-mnt/efi/boot
sudo cp "$tempdir"/bootx64.efi img-mnt/efi/boot/
sudo cp "$tempdir"/bootia32.efi img-mnt/efi/boot/
# copy modules and font
cp ${strapdir}/usr/lib/grub/${grubarch}/* boot/grub/${grubarch}/
# if this doesn't work try another font from the same place (grub's default, unicode.pf2, is much larger)
# Either of these will work, and they look the same to me. Unicode seems to work with qemu. -fsr
# cp /usr/share/grub/ascii.pf2 boot/grub/font.pf2
cp ${strapdir}/usr/share/grub/unicode.pf2 boot/grub/font.pf2
# copy splash
sudo cp -rav "$blend_release_path"/isolinux-overlay/splash.png boot/grub/splash.png
# Cleanup efi temps
sudo umount img-mnt
sudo rmdir img-mnt
rm -rf "$tempdir"
popd
# Copy efi files to iso
pushd ${workdir}
sudo rsync -avx "${efi_work}"/boot binary/
sudo rsync -avx "${efi_work}"/efi binary/
popd
}
iso_write_grub_cfg() {
fn iso_write_grub_cfg "(override)"
req=(workdir arch username)
ckreq || return 1
notice "writing grub configuration"
# Do the main grub.cfg (which gets loaded last):
cat <<EOF | sudo tee ${workdir}/binary/boot/grub/grub.cfg
if loadfont $prefix/font.pf2 ; then
set gfxmode=640x480
insmod efi_gop
insmod efi_uga
insmod video_bochs
insmod video_cirrus
insmod gfxterm
insmod jpeg
insmod png
terminal_output gfxterm
fi
background_image /boot/grub/splash.png
set menu_color_normal=white/black
set menu_color_highlight=dark-gray/white
set timeout=6
menuentry "${os}-live (${arch})" {
set gfxpayload=keep
linux /live/vmlinuz boot=live username=${username} locales=en_GB.UTF-8 keyboard-layouts=gb
initrd /live/initrd.img
}
menuentry "Italian locale" {
set gfxpayload=keep
linux /live/vmlinuz boot=live username=${username} locales=it_IT.UTF-8 keyboard-layouts=it
initrd /live/initrd.img
}
menuentry "${os}-live (load to RAM)" {
set gfxpayload=keep
linux /live/vmlinuz boot=live username=${username} toram
initrd /live/initrd.img
}
menuentry "${os}-live (failsafe)" {
set gfxpayload=keep
linux /live/vmlinuz boot=live username=${username} noapic noapm nodma nomce nolapic nosmp vga=normal
initrd /live/initrd.img
}
menuentry "Memory test" {
linux16 /live/memtest86+.bin
}
EOF
}
blend_finalize() {
fn blend_finalize
req=(strapdir username userpass default_shell default_editor)
ckreq || return 1
# Add the default user and add groups
#add-user ${username} ${userpass} /tmp/skel
add-user ${username} ${userpass} /etc/skel
# apply the rootfs-overlay now so that it can override things like
# ssh certificates created by the custom scripts.
pushd "${strapdir}"
sudo rsync -avx --no-o --no-g "$blend_release_path"/rootfs-overlay/* . || zerr
popd
# Populate ssh keys, zgen and tmux plugins for the default user
sudo -u default ssh-keygen -A
sudo -u default zsh -c "exec zsh"
sudo -u default bash -c "/usr/share/tmux-plugin-manager/bin/install_plugins"
cat <<EOF | sudo tee ${strapdir}/finalize >/dev/null
#!/bin/sh
set -x
for i in cdrom floppy audio dip video plugdev netdev lpadmin scanner; do
gpasswd -a ${username} \$i
done
chsh -s "${default_shell}" ${username}
update-alternatives --set editor ${default_editor}
chown -R 1000:1000 /home/${username}
## This can go away when desktop-base is fixed to do the grub theme. (SEEMS TO BE FIXED-no it's not.)
#grep -q GRUB_THEME /etc/default/grub || {
# printf "\nGRUB_THEME=/usr/share/desktop-base/grub-themes/desktop-grub-theme/theme.txt\n" >> /etc/default/grub
#}
#
## This needs to stay
#cp /splash.png /usr/lib/refractasnapshot/iso/isolinux/
#rm -f /splash.png
# This has been fixed (in devuan-baseconf) in suites/ascii
#rm -rf /data
rm -f /etc/fstab
rm -f /etc/popularity-contest.conf
rm -f /vmlinuz.old
rm -f /initrd.img.old
# For ascii if no display manager is used. Maybe this should have a
# contitional that's turned on/off in the config?
# echo "needs_root_rights=yes" >> /etc/X11/Xwrapper.config
# Disable contrib and non-free after installing firmware.
# sed -i 's/contrib//g' /etc/apt/sources.list
# sed -i 's/non-free//g' /etc/apt/sources.list
# for amd64 only at this time
if ls /boot | grep amd64 ; then
apt-get download grub-pc
apt-get download grub-efi-ia32
fi
##### this should be temporary
if dpkg -l lightdm ; then
apt-get -y --purge remove lightdm lightdm-gtk-greeter liblightdm-gobject-1-0
echo "Removed lightdm" > /home/devuan/which_dm
fi
if dpkg -l grub-efi-amd64-signed ; then
apt-get -y remove grub-efi-amd64-signed
fi
## package list
dpkg -l | awk '/^ii/ { print \$2 " " \$3 }' > /home/${username}/package_list
# Enable encryption (e.g. for live-usb with persistence)
#sed -i 's/#CRYPTSETUP=/CRYPTSETUP=y/' /etc/cryptsetup-initramfs/conf-hook
CRYPTSETUP=y update-initramfs -u -k all
# Change sources.list to use deb.devuan.org
#sed -i 's/pkgmaster/deb/g' /etc/apt/sources.list
# Run zgen update as root and the user to bring in the extensions.
zgen update
su - default zgen update
apt-get update
apt-get clean
updatedb
EOF
chroot-script -d finalize || zerr
}
## Override the helper function:
# takes the 'apt-get -f' out of the loop so that dependency provided by other debs can be resolved.
# inside the loop it just uninstalls the deb because of unfullfilled deps.
install-custdebs() {
fn install-custdebs
req=(R strapdir custom_deb_packages)
ckreq || return 1
sudo mkdir -p ${strapdir}/debs
sudo cp $R/extra/custom-packages/*.deb ${strapdir}/debs/
cat <<EOF | sudo tee ${strapdir}/install-debs >/dev/null
#!/bin/sh
cd /debs
for deb in ${custom_deb_packages}; do
dpkg -i \$deb
done
apt-get --yes --force-yes -f install
cd /
apt-get --yes --force-yes autoremove
#rm -rf /debs
EOF
chroot-script -d install-debs
}
## Added function:
# In the style of install-custdebs above but for a collection of arbitrary scripts placed in a
# directory alongside the blend custom debs called automate.
# The scripts are copied from the automate directory to extra/custom-scripts in blend_preinst() above.
# Called after install-customdebs because some need checkinstall which disappears from archives.
install-custscripts() {
fn install-custscripts
req=(R strapdir custom_scripts)
ckreq || return 1
sudo mkdir -p ${strapdir}/var/tmp/automate
sudo cp $R/extra/custom-scripts/*.sh ${strapdir}/var/tmp/automate/
cat <<EOF | sudo tee ${strapdir}/install-scripts >/dev/null
#!/bin/sh
cd /var/tmp/automate
for script in ${custom_scripts}; do
touch \${script}.log
bash \$script
done
apt-get --yes --force-yes -f install
cd /
apt-get --yes --force-yes autoremove
#rm -rf /var/tmp/automate
EOF
chroot-script -d install-scripts
}
## Override the helper function:
# Allow an alternative skel directory
add-user() {
fn add-user $*
local user="$1"
local pass="$2"
local skel="$3"
req=(strapdir user pass skel)
ckreq || return 1
notice "adding user $user:$pass using $skel"
touch ${strapdir}/adduser.log
cat <<EOF | sudo tee ${strapdir}/adduser
#!/bin/sh
set -x
useradd -m ${user} -k ${skel:=/etc/skel}
echo "${user}:${pass}" | chpasswd
EOF
chroot-script adduser || zerr
}
enable_apt-proxy() {
fn enable_apt-proxy
req=(apt_proxy)
ckreq || return 1
cat << EOF | sudo tee ${strapdir}/addproxy
#!/bin/sh
cat > /etc/apt/apt.conf.d/02proxy << 'FOE'
Acquire::http { Proxy "${apt_proxy}"; };
FOE
EOF
chroot-script addproxy || zerr
}
disable_apt-proxy() {
fn enable_apt-proxy
req=(apt_proxy)
ckreq || return 1
cat << EOF | sudo tee ${strapdir}/delproxy
#!/bin/sh
#sed '/^${apt_proxy}/d' /etc/apt/apt.conf.d/02proxy
if [ -f /etc/apt/apt.conf.d/02proxy ]; then
rm /etc/apt/apt.conf.d/02proxy
fi
EOF
chroot-script delproxy || zerr
}
## Override to insert an apt-proxy before the main fetch of packages begins
#bootstrap_config_thirdstage() {
# fn bootstrap_config_thirdstage
# req=(core_packages base_packages apt_proxy)
# ckreq || return 1
#
# if [ -v ${apt_proxy} ]; then
# enable_apt-proxy
# fi
#
# cat << EOF
##!/bin/sh
#apt-get update
#debconf-set-selections /debconf.set
#
#echo "${rootcredentials}" | chpasswd
#sed -i -e 's/KERNEL\!=\"eth\*|/KERNEL\!=\"/' \
# /lib/udev/rules.d/75-persistent-net-generator.rules
#rm -f /etc/udev/rules.d/70-persistent-net.rules
#export DEBIAN_FRONTEND=noninteractive
#
#apt-get --yes --force-yes install ${core_packages_option} ${core_packages}
#apt-get --yes --force-yes install ${base_packages_option} ${base_packages}
#apt-get --yes --force-yes purge ${purge_packages_option} ${purge_packages}
#apt-get --yes --force-yes autoremove
#
#apt-get clean
#
#sed -e 's/# en_US.UTF-8/en_US.UTF-8/' -i /etc/locale.gen
#locale-gen
#
#rm -f /debconf.set
#rm -f /etc/ssh/ssh_host_*
#rm -f /root/.bash_history
#echo "1" > .keep
#EOF
#}