2024-12-16 15:37:24 +01:00
|
|
|
#!/bin/bash
|
2024-12-16 22:29:54 +01:00
|
|
|
|
|
|
|
CONTS_LIST=$(incus list | grep "RUNNING\|STOPPED" | awk {'print $2'})
|
2024-12-16 15:37:24 +01:00
|
|
|
|
|
|
|
if [ $# -eq 0 ]
|
|
|
|
then
|
|
|
|
echo "No arguments supplied, doing interactive mode"
|
|
|
|
sleep 1
|
2024-12-16 22:29:54 +01:00
|
|
|
|
2024-12-16 15:37:24 +01:00
|
|
|
let i=0
|
|
|
|
W=()
|
|
|
|
while read -r line;
|
|
|
|
do
|
|
|
|
let i=$i+1
|
|
|
|
W+=($i "$line" off)
|
|
|
|
done < <( echo "$CONTS_LIST" )
|
2024-12-16 22:29:54 +01:00
|
|
|
|
2024-12-16 15:37:24 +01:00
|
|
|
CONTS=$(dialog --checklist "Choose containers to copy" 24 80 17 "${W[@]}" 3>&2 2>&1 1>&3)
|
|
|
|
DEST_IP=$(dialog --inputbox "Enter destination IP:" 25 25 --output-fd 1)
|
|
|
|
DEST_PORT=$(dialog --inputbox "Enter destination SSH port(leave blank for default 22):" 25 25 --output-fd 1)
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [[ ! -z "$1" ]]; then
|
|
|
|
if [[ ! -z "$2" ]]; then
|
|
|
|
CONTS=$(echo "$CONTS_LIST" | nl | grep "$1" | awk {'print $1'})
|
|
|
|
DEST_IP="$2"
|
|
|
|
DEST_PORT="$3"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
[ -z "$DEST_PORT" ] && DEST_PORT=22
|
|
|
|
|
|
|
|
|
|
|
|
DEST_ZPOOL=$(echo crypt)
|
|
|
|
DEST_ZPOOL_2=$(echo storage)
|
|
|
|
|
|
|
|
DATASETS=$(zfs list)
|
|
|
|
SNAPS=$(zfs list -t snapshot)
|
|
|
|
DEST_SNAPS=$(ssh $DEST_IP -p $DEST_PORT zfs list -t snapshot); (($? != 0)) && { echo "SSH command to fill DEST_SNAPS exited with non-zero"; exit 1; }
|
|
|
|
|
|
|
|
|
|
|
|
for CONT in $CONTS;
|
|
|
|
do
|
|
|
|
CONT_VAR=$(echo "$CONTS_LIST"| sed -n "`echo "$CONT p" | sed 's/ //'`")
|
|
|
|
SNAPS_CLEANED=$(echo "$SNAPS" | grep crypt | grep lxd | grep storage | grep containers | grep -E "....-..-.._........--.d" | awk {'print $1'} | grep "$CONT_VAR"@)
|
|
|
|
DEST_SNAPS_CLEANED=$(echo "$DEST_SNAPS" | grep crypt | grep lxd | grep storage | grep containers | grep -E "....-..-.._........--.d" | awk {'print $1'} | grep "$CONT_VAR"@)
|
|
|
|
SOURCE_DEST_IDENTICAL_SNAPS=$(grep -Fxf <(echo "$SNAPS_CLEANED") <(echo "$DEST_SNAPS_CLEANED"))
|
|
|
|
SNAP_TO_SEND_FIRST=$(echo "$SOURCE_DEST_IDENTICAL_SNAPS" | tail -n1)
|
|
|
|
DATASET_VAR=$(echo "$DATASETS" | grep crypt | grep lxd | grep storage | grep containers | awk {'print $1'} | grep -E "$CONT_VAR"$)
|
|
|
|
DATASET_RECORDSIZE_VAR=$(zfs get recordsize -H -o value "$DATASET_VAR")
|
|
|
|
DATASET_ATIME_VAR=$(zfs get atime -H -o value "$DATASET_VAR")
|
|
|
|
DATASET_RELATIME_VAR=$(zfs get relatime -H -o value "$DATASET_VAR")
|
|
|
|
DATASET_QUOTA_VAR=$(zfs get quota -H -o value "$DATASET_VAR")
|
|
|
|
SNAP_TO_SEND_FIRST_FOR_LATER_CHECK=$(echo "$SNAP_TO_SEND_FIRST")
|
|
|
|
IFS="
|
|
|
|
"
|
|
|
|
|
|
|
|
echo "Start move "$CONT_VAR""
|
|
|
|
|
|
|
|
if [ -z "$SNAP_TO_SEND_FIRST" ]
|
|
|
|
then
|
|
|
|
|
|
|
|
if [ -z "$SNAPS_CLEANED" ]
|
|
|
|
then
|
|
|
|
|
|
|
|
echo "Creating first snapshot"
|
|
|
|
for command in $(zfSnap -n -zpool28fix -a 7d "$DATASET_VAR" | grep snapshot | grep "$DATASET_VAR")
|
|
|
|
do
|
|
|
|
SNAP_TO_SEND_FIRST=$(echo "$command" | awk '{print $3}')
|
|
|
|
echo "Doing "$command""
|
|
|
|
eval "$command";
|
|
|
|
done
|
|
|
|
|
|
|
|
else
|
|
|
|
SNAP_TO_SEND_FIRST=$(echo "$SNAPS_CLEANED" | tail -n 48 | head -n 1)
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo "Sending first snapshot"
|
|
|
|
echo "Sending "$SNAP_TO_SEND_FIRST""
|
|
|
|
zfs send "$SNAP_TO_SEND_FIRST" | lzop | pv | ssh "$DEST_IP" -p $DEST_PORT "lzop -d | zfs recv -o recordsize="$DATASET_RECORDSIZE_VAR" -o atime="$DATASET_ATIME_VAR" -o relatime="$DATASET_RELATIME_VAR" -o quota="$DATASET_QUOTA_VAR" "$DEST_ZPOOL"/lxd/storage/containers/"$CONT_VAR""; (($? != 0)) && { echo "SSH command to send first snapshot exited with non-zero"; exit 1; }
|
|
|
|
|
|
|
|
echo "Sleep 2"
|
|
|
|
sleep 2
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo "Creating second snapshot"
|
|
|
|
for command in $(zfSnap -n -zpool28fix -a 7d "$DATASET_VAR" | grep snapshot | grep "$DATASET_VAR")
|
|
|
|
do
|
|
|
|
SNAP_TO_SEND_SECOND=$(echo "$command" | awk '{print $3}')
|
|
|
|
echo "Doing "$command""
|
|
|
|
eval "$command";
|
|
|
|
|
|
|
|
done
|
|
|
|
|
|
|
|
echo "Sending second snapshot"
|
|
|
|
echo "Sending "$SNAP_TO_SEND_FIRST" to "$SNAP_TO_SEND_SECOND" with -I parameter"
|
|
|
|
zfs send -I "$SNAP_TO_SEND_FIRST" "$SNAP_TO_SEND_SECOND" | lzop | pv | ssh "$DEST_IP" -p $DEST_PORT "lzop -d | zfs recv -o recordsize="$DATASET_RECORDSIZE_VAR" -o atime="$DATASET_ATIME_VAR" -o relatime="$DATASET_RELATIME_VAR" -o quota="$DATASET_QUOTA_VAR" "$DEST_ZPOOL"/lxd/storage/containers/"$CONT_VAR" -F"; (($? != 0)) && { echo "SSH command to send second snapshot exited with non-zero"; exit 1; }
|
|
|
|
|
|
|
|
echo "Sleep 2"
|
|
|
|
sleep 2
|
|
|
|
|
|
|
|
echo "Creating third snapshot"
|
|
|
|
for command in $(zfSnap -n -zpool28fix -a 7d "$DATASET_VAR" | grep snapshot | grep "$DATASET_VAR")
|
|
|
|
do
|
|
|
|
SNAP_TO_SEND_THIRD=$(echo "$command" | awk '{print $3}')
|
|
|
|
echo "Doing "$command""
|
|
|
|
eval "$command";
|
|
|
|
done
|
|
|
|
|
|
|
|
echo "Sending third snapshot"
|
|
|
|
echo "Sending "$SNAP_TO_SEND_SECOND" to "$SNAP_TO_SEND_THIRD""
|
|
|
|
zfs send -i "$SNAP_TO_SEND_SECOND" "$SNAP_TO_SEND_THIRD" | lzop | pv | ssh "$DEST_IP" -p $DEST_PORT "lzop -d | zfs recv -o recordsize="$DATASET_RECORDSIZE_VAR" -o atime="$DATASET_ATIME_VAR" -o relatime="$DATASET_RELATIME_VAR" -o quota="$DATASET_QUOTA_VAR" "$DEST_ZPOOL"/lxd/storage/containers/"$CONT_VAR" -F"; (($? != 0)) && { echo "SSH command to send third snapshot exited with non-zero"; exit 1; }
|
|
|
|
|
|
|
|
echo "Sleep 2"
|
|
|
|
sleep 2
|
|
|
|
|
|
|
|
echo "Creating fourth snapshot"
|
|
|
|
for command in $(zfSnap -n -zpool28fix -a 7d "$DATASET_VAR" | grep snapshot | grep "$DATASET_VAR")
|
|
|
|
do
|
|
|
|
SNAP_TO_SEND_FOURTH=$(echo "$command" | awk '{print $3}')
|
|
|
|
echo "Doing "$command""
|
|
|
|
eval "$command";
|
|
|
|
done
|
|
|
|
|
|
|
|
echo "Sending fourth snapshot"
|
|
|
|
echo "Sending "$SNAP_TO_SEND_THIRD" to "$SNAP_TO_SEND_FOURTH""
|
|
|
|
zfs send -i "$SNAP_TO_SEND_THIRD" "$SNAP_TO_SEND_FOURTH" | lzop | pv | ssh "$DEST_IP" -p $DEST_PORT "lzop -d | zfs recv -o recordsize="$DATASET_RECORDSIZE_VAR" -o atime="$DATASET_ATIME_VAR" -o relatime="$DATASET_RELATIME_VAR" -o quota="$DATASET_QUOTA_VAR" "$DEST_ZPOOL"/lxd/storage/containers/"$CONT_VAR" -F"; (($? != 0)) && { echo "SSH command to send fourth snapshot exited with non-zero"; exit 1; }
|
|
|
|
|
|
|
|
echo "Sleep 2"
|
|
|
|
sleep 2
|
|
|
|
|
|
|
|
echo "Stopping "$CONT_VAR" on source"
|
2024-12-16 22:29:54 +01:00
|
|
|
incus stop "$CONT_VAR" --timeout 30; (($? != 0)) && echo "incus stop timed-out after 30 seconds, doing with force parameter" && incus stop "$CONT_VAR" --force
|
2024-12-16 15:37:24 +01:00
|
|
|
|
|
|
|
echo "Sleep 2"
|
|
|
|
sleep 2
|
|
|
|
|
|
|
|
echo "Creating fifth snapshot"
|
|
|
|
for command in $(zfSnap -n -zpool28fix -a 7d "$DATASET_VAR" | grep snapshot | grep "$DATASET_VAR")
|
|
|
|
do
|
|
|
|
SNAP_TO_SEND_FIFTH=$(echo "$command" | awk '{print $3}')
|
|
|
|
echo "Doing "$command""
|
|
|
|
eval "$command";
|
|
|
|
done
|
|
|
|
|
|
|
|
echo "Sending fifth snapshot"
|
|
|
|
echo "Sending "$SNAP_TO_SEND_FOURTH" to "$SNAP_TO_SEND_FIFTH""
|
|
|
|
zfs send -i "$SNAP_TO_SEND_FOURTH" "$SNAP_TO_SEND_FIFTH" | lzop | pv | ssh "$DEST_IP" -p $DEST_PORT "lzop -d | zfs recv -o recordsize="$DATASET_RECORDSIZE_VAR" -o atime="$DATASET_ATIME_VAR" -o relatime="$DATASET_RELATIME_VAR" -o quota="$DATASET_QUOTA_VAR" "$DEST_ZPOOL"/lxd/storage/containers/"$CONT_VAR" -F"; (($? != 0)) && { echo "SSH command to send fifth snapshot exited with non-zero"; exit 1; }
|
|
|
|
|
|
|
|
if [ -z "$SNAP_TO_SEND_FIRST_FOR_LATER_CHECK" ]
|
|
|
|
then
|
2024-12-16 22:29:54 +01:00
|
|
|
echo "Doing incus admin recover"
|
|
|
|
ssh "$DEST_IP" -p $DEST_PORT "cat <<EOF | incus admin recover
|
2024-12-16 15:37:24 +01:00
|
|
|
no
|
|
|
|
yes
|
|
|
|
yes
|
2024-12-16 22:29:54 +01:00
|
|
|
EOF"; (($? != 0)) && { echo "SSH command incus admin recover exited with non-zero"; exit 1; }
|
2024-12-16 15:37:24 +01:00
|
|
|
fi
|
|
|
|
|
|
|
|
echo "Starting "$CONT_VAR" on destination"
|
2024-12-16 22:29:54 +01:00
|
|
|
ssh "$DEST_IP" -p $DEST_PORT incus start "$CONT_VAR"; (($? != 0)) && { echo "SSH command to start container exited with non-zero"; exit 1; }
|
2024-12-16 15:37:24 +01:00
|
|
|
|
|
|
|
echo " "
|
2024-12-16 22:29:54 +01:00
|
|
|
done
|