Initial commit
This commit is contained in:
commit
969e19e14a
2 changed files with 76 additions and 0 deletions
20
README.md
Normal file
20
README.md
Normal file
|
@ -0,0 +1,20 @@
|
|||
# bacoid
|
||||
|
||||
## Purpose
|
||||
Sends incremental backups using syncoid and zfs config variables
|
||||
|
||||
## How to use
|
||||
* Set target machine with `zfs set syncoid:target_a=user@backup.com:22 rpool`
|
||||
* Set target pool with `zfs set syncoid:pool_a=bkppool rpool`
|
||||
* Set current machine with `zfs set syncoid:machine=hal rpool`
|
||||
|
||||
Due to zfs setting these values recursively, bacoid will then go down the
|
||||
pool and send whatever matches using the configured settings. In the last
|
||||
example, this means that syncoid will send `rpool` and all of its children
|
||||
to `user@backup.com:bkppool/user/hal/rpool`
|
||||
|
||||
If you want to certain children to be skipped, you can do the following:
|
||||
* `zfs set syncoid:pool_a='' rpool/skip-me`
|
||||
|
||||
## Dependencies
|
||||
* bash
|
56
bacoid.sh
Normal file
56
bacoid.sh
Normal file
|
@ -0,0 +1,56 @@
|
|||
#!/bin/bash
|
||||
|
||||
subvolArray=($(zfs get syncoid:pool_a -H -o name,value | grep -v '@' | awk '{if($2 != "-" && $2 != "") print $1}'))
|
||||
|
||||
COUNT=1
|
||||
for subvol in ${subvolArray[@]}; do
|
||||
targetArray[$COUNT]="$(zfs get syncoid:target_a ${subvol} | grep -v 'NAME' | awk '{print $3}')"
|
||||
COUNT=$(( ${COUNT} + 1 ))
|
||||
done
|
||||
targetArray=($(printf '%s\n' ${targetArray[@]} | awk '!a[$0]++'))
|
||||
|
||||
|
||||
for target in ${targetArray[@]}; do
|
||||
[[ ${target} != *@* ]] && continue
|
||||
echo "Testing SSH connection to ${target}"
|
||||
USERHOST="$(sed 's|:.*||' <<< ${target})"
|
||||
HOST="$(sed 's|.*@||' <<< ${USERHOST})"
|
||||
USER="$(sed 's|@.*||' <<< ${USERHOST})"
|
||||
PORT="$(sed 's|.*:||' <<< ${target})"
|
||||
if [[ ! -f "${HOME}/.ssh/bkp_rsa" ]]; then
|
||||
echo "Generating bkp_rsa key"
|
||||
ssh-keygen -N "" -f "${HOME}/.ssh/bkp_rsa"
|
||||
fi
|
||||
|
||||
ssh -i "${HOME}/.ssh/bkp_rsa" \
|
||||
-p ${PORT} \
|
||||
-o ControlPath=none \
|
||||
-o LogLevel=INFO \
|
||||
-o PreferredAuthentications=publickey \
|
||||
-o IdentitiesOnly=yes ${USERHOST} exit
|
||||
[[ $? -ne 0 ]] && ssh-copy-id -p ${PORT} -i "${HOME}/.ssh/bkp_rsa" ${USERHOST}
|
||||
done
|
||||
|
||||
|
||||
for subvol in ${subvolArray[@]}; do
|
||||
TARGET="$(zfs get syncoid:target_a ${subvol} | grep -v NAME | awk '{print $3}')"
|
||||
if [[ ${target} != "-" ]]; then
|
||||
USERHOST="$(sed 's|:.*||' <<< ${TARGET})"
|
||||
HOST="$(sed 's|.*@||' <<< ${USERHOST})"
|
||||
USER="$(sed 's|@.*||' <<< ${USERHOST})"
|
||||
PORT="$(sed 's|.*:||' <<< ${TARGET})"
|
||||
MACHINE="$(zfs get syncoid:machine ${subvol} | grep -v NAME | awk '{print $3}')"
|
||||
[[ ${MACHINE} == '-' ]] && { echo "syncoid:machine not set for ${subvol}"; continue; }
|
||||
POOL="$(zfs get syncoid:pool_a ${subvol} | grep -v NAME | awk '{print $3}')"
|
||||
[[ ${POOL} == '-' ]] && { echo "syncoid:pool_a not set for ${subvol}"; continue; }
|
||||
echo "Sending ${subvol} to ${USERHOST}:${POOL}/$USER/$MACHINE/$subvol"
|
||||
syncoid --sendoptions="w" --recvoptions="u" --sshport=${PORT} --sshkey="${HOME}/.ssh/bkp_rsa" --no-sync-snap --no-privilege-elevation ${subvol} ${USERHOST}:${POOL}/${USER}/${MACHINE}/${subvol}
|
||||
else
|
||||
MACHINE="$(zfs get syncoid:machine ${subvol} | grep -v NAME | awk '{print $3}')"
|
||||
[[ ${MACHINE} == '-' ]] && { echo "syncoid:machine not set for ${subvol}"; continue; }
|
||||
POOL="$(zfs get syncoid:pool_a ${subvol} | grep -v NAME | awk '{print $3}')"
|
||||
[[ ${POOL} == '-' ]] && { echo "syncoid:pool_a not set for ${subvol}"; continue; }
|
||||
echo "Sending ${subvol} to ${POOL}/$MACHINE/$subvol"
|
||||
syncoid --sendoptions="w" --recvoptions="u" --no-sync-snap ${subvol} ${POOL}/${MACHINE}/${subvol}
|
||||
fi
|
||||
done
|
Loading…
Reference in a new issue