set -eE -o pipefail
trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR
+# for calling outside of FAI, first
+# source /a/bin/fai-wrapper
+# then to set classes with: fai-setclass OPT1...
+# which sets CLASS_OPT1=true...
+#
+# OPTIONS:
+#
+# environment variables:
+#
+# HOSTNAME: if frodo, we exclude 2 devices from the /boot array, which
+# the bios does not see. if demohost, we set the luks password to just
+# 'x'.
+#
+# SPECIAL_DISK: For use outside of fai. A base disk name like
+# /dev/sdk. If set, we just cryptsetup and partition this one disk then
+# exit. This is useful for partitioning a disk in preparation to replace
+# a failed or failing disk from a raid10 array.
+#
+# classes:
+#
+# REPARTITION: forces repartitioning even if we detect the proper amount
+# of partitions already exist.
+#
+# ROTATIONAL: forces to install onto hdds instead of sdds. normally sdds
+# are chosen if they exist.
+#
+# PARTITION_PROMPT: command line prompt before partitioning
+#
+# RAID0: forces raid0 filesystem. Normally with 4+ devices, we use
+# raid10.
+
+if [[ $SPECIAL_DISK ]]; then
+ export CLASS_REPARTITION=true
+fi
+
# # fai's setup-storage won't do btrfs on luks,
# # so we do it ourself :)
# inspiration taken from files in fai-setup-storage package
+# if we are not running in fai, skiptask won't be defined, so carry on.
+skiptask partition || ! type skiptask
+
-skiptask partition || ! type skiptask # for running not in fai
#### begin configuration
local f
for f in $FAI/distro-install-common/devbyid \
/a/bin/fai/fai/config/distro-install-common/devbyid; do
- if [[ -e $f ]]; then $f "$@"; fi
+ if [[ -e $f ]]; then $f "$@"; break; fi
done
}
if [[ ! $DISTRO ]]; then
- if ifclass VOL_STABLE_BOOTSTRAP; then
- DISTRO=debianstable_bootstrap
+ if ifclass VOL_STRETCH_BOOTSTRAP; then
+ DISTRO=debianstretch_bootstrap
elif ifclass VOL_STRETCH; then
+ DISTRO=debianstretch
+ elif ifclass VOL_TESTING; then
DISTRO=debiantesting
- elif ifclass VOL_STABLE; then
- DISTRO=debianstable
elif ifclass VOL_XENIAL; then
DISTRO=ubuntuxenial
elif ifclass VOL_BELENOS; then
exit 1
fi
-if ifclass tp; then
- lukspw=$(cat $luks_dir/traci)
-else
- lukspw=$(cat $luks_dir/iank)
-fi
+lukspw=$(cat $luks_dir/iank)
+# # ian: disabled while I use the tp host.
+# if ifclass tp; then
+# lukspw=$(cat $luks_dir/traci)
+# fi
if ifclass demohost; then
lukspw=x
fi
done
shopt -s nullglob
if $partition; then
- for dev in ${devs[@]}; do
- # if we repartition to the same as an old partition,
- # we don't want any old fses hanging around.
- for (( i=1; i <= lastn; i++ )); do
- x=$(add-part $dev $i)
- [[ -e $x ]] || continue
- count_down=10
- # wipefs has failed, manual run works, google suggests timing issue
- while ! wipefs -a $x; do
- sleep 2
- count_down=$((count_down - 1))
- (( count_down > 0 )) || exit 1
+
+ ### begin wipefs
+ if [[ ! $SPECIAL_DISK ]]; then
+ for dev in ${devs[@]}; do
+ # if we repartition to the same as an old partition,
+ # we don't want any old fses hanging around.
+ for (( i=1; i <= lastn; i++ )); do
+ x=$(add-part $dev $i)
+ [[ -e $x ]] || continue
+ count_down=10
+ # wipefs has failed, manual run works, google suggests timing issue
+ while ! wipefs -a $x; do
+ sleep 2
+ count_down=$((count_down - 1))
+ (( count_down > 0 )) || exit 1
+ done
done
done
- done
+ fi
+ ### end wipefs
+
for dev in ${devs[@]}; do
+ if [[ $SPECIAL_DISK ]]; then
+ dev=$(devbyid $SPECIAL_DISK)
+ fi
+
# parted will round up the disk size. Do -1 so we can have
# fully 1MiB unit partitions for easy resizing of the last partition.
# Otherwise we would pass in -0 for the end argument for the last partition.
#
- # parted print error output is expected. example:
+ # Note: parted print error output is expected. example:
# Error: /dev/vda: unrecognised disk label
disk_mib=$(( $(parted -m $dev unit MiB print | \
sed -nr "s#^/dev/[^:]+:([0-9]+).*#\1#p") - 1))
cryptsetup luksOpen `rootdev` `root-cryptname` \
--key-file $luks_dir/host-$HOSTNAME
+
+ if [[ $SPECIAL_DISK ]]; then
+ exit 0
+ fi
done
ls -la /dev/btrfs-control # this was probably for debugging...
sleep 1
fi
-if [[ $DISTRO != debianstable_bootstrap ]]; then
+if [[ $DISTRO != debianstretch_bootstrap ]]; then
# bootstrap distro doesn't use separate encrypted root.
mount -o subvolid=0 $first_root_crypt /mnt
# systemd creates subvolumes we want to delete.
mkdir -p /mnt/grub2
cp $FAI/distro-install-common/libreboot_grub.cfg /mnt/grub2
-if [[ $DISTRO == debianstable_bootstrap ]]; then
+if [[ $DISTRO == debianstretch_bootstrap ]]; then
# this is just convenience for the libreboot_grub config
# so we can glob the other ones easier.
boot_vol=$DISTRO
grub-editenv /mnt/grubenv set last_boot=/$boot_vol
umount /mnt
-if [[ $DISTRO == debianstable_bootstrap ]]; then
+if [[ $DISTRO == debianstretch_bootstrap ]]; then
cat > /tmp/fai/fstab <<EOF
$first_boot_dev / btrfs noatime,subvol=$boot_vol 0 0
EOF