From 917ca4a71b5c456b741456dc173c144ee7042d89 Mon Sep 17 00:00:00 2001 From: Ian Kelling Date: Mon, 8 Apr 2019 15:38:18 -0400 Subject: [PATCH] various fixes --- brc | 7 +- btrbk-run | 2 +- check-subvol-stale | 208 +++++++++++++++++++------------------- distro-begin | 9 ++ distro-end | 26 ++++- filesystem/etc/cron.d/ian | 2 +- mount-latest-remote | 15 +-- rootsshsync | 17 +++- 8 files changed, 163 insertions(+), 123 deletions(-) diff --git a/brc b/brc index 9851fe4..6cbc09a 100644 --- a/brc +++ b/brc @@ -332,9 +332,10 @@ b() { c - } -bkrun() { - # use -p from interactive shell - btrbk-run -p "$@" +bkr() { + # get latest + install-my-scripts + btrbk-run "$@" } bfg() { java -jar /a/opt/bfg-1.12.14.jar "$@"; } diff --git a/btrbk-run b/btrbk-run index 6ef3747..7070f20 100644 --- a/btrbk-run +++ b/btrbk-run @@ -302,7 +302,7 @@ fi if [[ $source ]]; then m mount-latest-subvol else - m mount-latest-remote ${targets[@]} + m /a/exe/mount-latest-remote ${targets[@]} fi # todo: move variable data we don't care about backing up diff --git a/check-subvol-stale b/check-subvol-stale index dcc0535..085025a 100644 --- a/check-subvol-stale +++ b/check-subvol-stale @@ -58,124 +58,128 @@ while true; do done if [[ ! $@ ]]; then - echo "$0: error: expected mountpoint argument" + echo "$0: error: expected mountpoint argument" fi stale-file() { - stale_dir=/nocow/btrfs-stale - stale_file=$stale_dir/$vol - if $stale; then - mkdir -p $stale_dir - printf "%s\n" $freshest_snap > $stale_file - else - rm -f $stale_file - fi + stale_dir=/nocow/btrfs-stale + stale_file=$stale_dir/$vol + if $stale; then + mkdir -p $stale_dir + printf "%s\n" $freshest_snap > $stale_file + else + rm -f $stale_file + fi } d() { if $debug; then printf "%s\n" "$*" - fi + fi } for d; do - vol=${d##*/} - # second field, non-comment line == $d - dev=$(sed -rn "s,^\s*([^#]\S*)\s+$d\s.*,\1,p" /etc/fstab /etc/mtab|head -n1) - d dev=$dev - subvol_dir=$(sed -rn "s,^\s*[^#]\S*\s+$d\s.*\bsubvol=([a-zA-A/]+).*,\1,p" /etc/fstab /etc/mtab|head -n1) - d subvol_dir=$subvol_dir - # note, we need $dev because $d might not be mounted, and we do this loop - # because the device in fstab for the rootfs can be different. - for devx in $(btrfs fi show $dev| sed -rn 's#.*path (/\S+)$#\1#p'); do - root_dir=$(sed -rn "s,^\s*$devx\s+(\S+).*\bsubvolid=[05]\b.*,\1,p" /etc/mtab|head -n1) - if [[ $root_dir ]]; then break; fi - done - if [[ ! $root_dir ]]; then - echo "$0: error could not find root subvol mount for $dev" >&2 - exit 1 - fi - svp=$root_dir/$subvol_dir - d "svp=$svp # subvolume path" - - snaps=($root_dir/btrbk/$subvol_dir.20*) # Assumes we are in the 21st century. - if [[ ! $snaps ]]; then - # no snapshots yet - echo "$0: warning: no snapshots found at $root_dir/btrbk/$subvol_dir.20*. this is expected for a brand new volume" - continue + vol=${d##*/} + # second field, non-comment line == $d + dev=$(sed -rn "s,^\s*([^#]\S*)\s+$d\s.*,\1,p" /etc/fstab /etc/mtab|head -n1) + d dev=$dev + subvol_dir=$(sed -rn "s,^\s*[^#]\S*\s+$d\s.*\bsubvol=([a-zA-A/]+).*,\1,p" /etc/fstab /etc/mtab|head -n1) + d subvol_dir=$subvol_dir + # note, we need $dev because $d might not be mounted, and we do this loop + # because the device in fstab for the rootfs can be different. + for devx in $(btrfs fi show $dev| sed -rn 's#.*path (/\S+)$#\1#p'); do + d devx=$devx + root_dir=$(sed -rn "s,^\s*$devx\s+(\S+).*\bsubvolid=[05]\b.*,\1,p" /etc/mtab|head -n1) + if [[ $root_dir ]]; then + d root_dir=$root_dir + break fi - - # get info on last received sub - last_received_cgen=0 - for f in ${snaps[@]}; do - show="$(btrfs sub show $f)" - if echo "$show" | grep -E "Received UUID:\s+[[:alnum:]]" &>/dev/null; then - cgen=$(echo "$show" | sed -rn 's,^\s*Gen at creation:\s+([0-9]+).*,\1,p') - if [[ $cgen -gt $last_received_cgen ]]; then - last_received_cgen=$cgen - last_received=$f - fi - fi - done - d last_received_cgen=$cgen - d last_received=$f - - # Get last_snap by date. - # when a btrbk bugfix makes it into the distro, - # we might replace this with btrbk list latest /mnt/root/$vol | ... - last_snap=$( - for s in ${snaps[@]}; do - f=${s##*/} - unix_time=$(date -d $(sed -r 's/(.{4})(..)(.{5})(..)(.*)/\1-\2-\3:\4:\5/' <<<${f#$vol.}) +%s) - printf "%s %s\n" $unix_time $s - done | sort -r | head -n 1 | awk '{print $2}' - ) - if [[ ! $last_snap ]]; then - # should not happen. - echo "$0: error: could not find latest snapshot for $svp among ${snaps[*]}" >&2 - exit 1 - fi - - if [[ ! -e $svp ]]; then - echo "$0: warning: subvol does not exist: $svp" - echo "$0 assuming this host was just for receiving and latest snap is freshest" - freshest_snap=$last_snap - stale=true - stale-file - continue + done + if [[ ! $root_dir ]]; then + echo "$0: error could not find root subvol mount for $dev" >&2 + exit 1 + fi + svp=$root_dir/$subvol_dir + d "svp=$svp # subvolume path" + + snaps=($root_dir/btrbk/$subvol_dir.20*) # Assumes we are in the 21st century. + if [[ ! $snaps ]]; then + # no snapshots yet + echo "$0: warning: no snapshots found at $root_dir/btrbk/$subvol_dir.20*. this is expected for a brand new volume" + continue + fi + + # get info on last received sub + last_received_cgen=0 + for f in ${snaps[@]}; do + show="$(btrfs sub show $f)" + if echo "$show" | grep -E "Received UUID:\s+[[:alnum:]]" &>/dev/null; then + cgen=$(echo "$show" | sed -rn 's,^\s*Gen at creation:\s+([0-9]+).*,\1,p') + if [[ $cgen -gt $last_received_cgen ]]; then + last_received_cgen=$cgen + last_received=$f + fi fi + done + d last_received_cgen=$cgen + d last_received=$f + + # Get last_snap by date. + # when a btrbk bugfix makes it into the distro, + # we might replace this with btrbk list latest /mnt/root/$vol | ... + last_snap=$( + for s in ${snaps[@]}; do + f=${s##*/} + unix_time=$(date -d $(sed -r 's/(.{4})(..)(.{5})(..)(.*)/\1-\2-\3:\4:\5/' <<<${f#$vol.}) +%s) + printf "%s %s\n" $unix_time $s + done | sort -r | head -n 1 | awk '{print $2}' + ) + if [[ ! $last_snap ]]; then + # should not happen. + echo "$0: error: could not find latest snapshot for $svp among ${snaps[*]}" >&2 + exit 1 + fi + + if [[ ! -e $svp ]]; then + echo "$0: warning: subvol does not exist: $svp" + echo "$0 assuming this host was just for receiving and latest snap is freshest" + freshest_snap=$last_snap + stale=true + stale-file + continue + fi - # if there is a last_received, we can assume stale or fresh if we are newer/older - if [[ $last_received ]]; then - svp_cgen=$(btrfs sub show $svp | sed -rn 's,^\s*Gen at creation:\s+([0-9]+).*,\1,p') - d svp_cgen=$svp_cgen - if [[ $svp_cgen -ge $last_received_cgen ]]; then - stale=false - else - echo "$svp stale: it's gen at creation, $svp_cgen, is earlier than the last received snapshot, $last_received's gen at creation: $last_received_cgen" - freshest_snap=$last_received - stale=true - fi - stale-file - continue + # if there is a last_received, we can assume stale or fresh if we are newer/older + if [[ $last_received ]]; then + svp_cgen=$(btrfs sub show $svp | sed -rn 's,^\s*Gen at creation:\s+([0-9]+).*,\1,p') + d svp_cgen=$svp_cgen + if [[ $svp_cgen -ge $last_received_cgen ]]; then + stale=false + else + echo "$svp stale: it's gen at creation, $svp_cgen, is earlier than the last received snapshot, $last_received's gen at creation: $last_received_cgen" + freshest_snap=$last_received + stale=true fi - - # fallback to using last_snap as the freshest - freshest_snap=$last_snap - stale=true - # fresh if $svp has $last_snap as a snapshot, - if btrfs sub show $svp 2>/dev/null | sed '0,/^\s*Snapshot(s):/d;s/^\s*//' | \ - grep -xF btrbk/$last_snap &>/dev/null; then - stale=false - else # or else $svp is a snapshot of $last_snap. we use a uuid - # comparison, which if I remember from the docs, is a bit more - # robust, perhaps to renames. - last_snap_uuid=$(btrfs sub show $last_snap| awk '$1 == "UUID:" {print $2}') - if btrfs sub show $svp| grep "^\s*Parent UUID:\s*$last_snap_uuid$" &>/dev/null; then - stale=false - fi + stale-file + continue + fi + + # fallback to using last_snap as the freshest + freshest_snap=$last_snap + stale=true + # fresh if $svp has $last_snap as a snapshot, + if btrfs sub show $svp 2>/dev/null | sed '0,/^\s*Snapshot(s):/d;s/^\s*//' | \ + grep -xF btrbk/$last_snap &>/dev/null; then + stale=false + else # or else $svp is a snapshot of $last_snap. we use a uuid + # comparison, which if I remember from the docs, is a bit more + # robust, perhaps to renames. + last_snap_uuid=$(btrfs sub show $last_snap| awk '$1 == "UUID:" {print $2}') + if btrfs sub show $svp| grep "^\s*Parent UUID:\s*$last_snap_uuid$" &>/dev/null; then + stale=false fi + fi - stale-file + stale-file done diff --git a/distro-begin b/distro-begin index 182a9d9..38fcd59 100755 --- a/distro-begin +++ b/distro-begin @@ -134,6 +134,15 @@ EOF sudo systemctl daemon-reload # needed if the file was already there sudo systemctl enable keyscriptoff.service sudo systemctl start keyscriptoff.service + + # from /usr/share/doc/dropbear-initramfs/README.initramfs.gz + while read m _; do /sbin/modinfo -F filename "$m"; done /lib/cryptsetup/passfifo fi ##### end setup encryption scripts ###### diff --git a/distro-end b/distro-end index d72adea..41b9104 100755 --- a/distro-end +++ b/distro-end @@ -922,11 +922,35 @@ deb http://us.archive.ubuntu.com/ubuntu/ xenial-updates main deb http://us.archive.ubuntu.com/ubuntu/ xenial-security main EOF curl http://archive.ubuntu.com/ubuntu/project/ubuntu-archive-keyring.gpg | s apt-key add - + + s dd of=/etc/apt/preferences.d/flidas-bionic </dev/null <&1 | /usr/local/bin/log-once -15 +*/10 * * * * iank /a/exe/rootsshsync 2>&1 | /usr/local/bin/log-once -15 diff --git a/mount-latest-remote b/mount-latest-remote index 406a1e9..2b5ca59 100755 --- a/mount-latest-remote +++ b/mount-latest-remote @@ -19,22 +19,17 @@ trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR script_dir=$(dirname $(readlink -f "$BASH_SOURCE")) if [[ ! $@ ]]; then - echo "mount-latest-remote: error: expected 1 or more host arguments" - exit 1 + echo "mount-latest-remote: error: expected 1 or more host arguments" + exit 1 fi ret=0 for tg; do - scp $script_dir/{mount-latest-subvol,check-subvol-stale} \ - root@$tg:/usr/local/bin - if ! ssh root@$tg bash <<'EOF' + scp $script_dir/{mount-latest-subvol,check-subvol-stale} \ + root@$tg:/usr/local/bin + ssh root@$tg bash <<'EOF' set -e chmod +x /usr/local/bin/{mount-latest-subvol,check-subvol-stale} /usr/local/bin/mount-latest-subvol EOF - then - echo "$0: warning: failed mount-latest-subvol on $tg" - ret=1 - fi done -exit $ret diff --git a/rootsshsync b/rootsshsync index 97d2d2f..a4db227 100755 --- a/rootsshsync +++ b/rootsshsync @@ -19,12 +19,12 @@ trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR [[ $EUID == 0 ]] || exec sudo "$BASH_SOURCE" "$@" if test -e /q/root/.ssh; then - dest=/q/root/.ssh - /a/exe/lnf $dest /root + dest=/q/root/.ssh + /a/exe/lnf $dest /root else - dest=/root/.ssh - mkdir -p $dest - chmod 700 $dest + dest=/root/.ssh + mkdir -p $dest + chmod 700 $dest fi user_ssh_dir=$(eval echo ~${SUDO_USER:-$USER})/.ssh @@ -35,3 +35,10 @@ find $user_ssh_dir -xtype l -exec rm '{}' \; # -L resolve links rsync -rtL --delete $user_ssh_dir/ $dest chown -R root:root /root/.ssh +d=/etc/initramfs-tools +if [[ -e $d ]] && ! diff -q /root/.ssh/authorized_keys $d/root/.ssh/authorized_keys &>/dev/null; then + mkdir -p /etc/initramfs-tools/root/.ssh + chmod 700 $d/root $d/root/.ssh + cp -p /root/.ssh/authorized_keys $d/root/.ssh/authorized_keys + update-initramfs -u -k all +fi -- 2.30.2