borgwarehouse/helpers/shells/recreateRepoConfigFile-v1.sh
2023-09-10 15:06:23 +02:00

137 lines
4.5 KiB
Bash

#!/usr/bin/env bash
################################################################################
# What is this script ?
# If you lose the repo.json file, this script will help you rebuild a new one.
# To do this, I've written this shell that reads the BorgWarehouse repository
# tree and generates a corresponding object.
# This script is only intended to be used in emergencies (data corruption,
# update problems...) and as a last resort to rebuild your repo.json file.
# Of course, certain parameters cannot be recovered, such as comments,
# repository size or aliases.
# You'll have to re-configure this from the web interface, but most of the work
# is done.
# This script should be used with the root user, as it is necessary to read
# authorized_keys files.
# This script simply displays a valid JSON object on your screen. Copy its
# entire content into the config/repo.json file.
# There's no need to restart BorgWarehouse, as this can be done on the fly.
# With the option `-a` or `--auto-size` the script calculates the current size
# of the repo and calculates the next largest two potency.
# By default the size is otherwise 2G.
# Examples for the calculation:
#
# | Size | Calc. |
# |-----:|------:|
# | <=2G | 2G |
# | 5G | 8G |
# | 9G | 16G |
# | 43G | 64G |
################################################################################
bwDataDir="/var/borgwarehouse"
directoriesList=$(ls -A $bwDataDir)
_AUTOSIZE=0
POSITIONAL_ARGS=()
# shellcheck disable=SC2221,SC2222
while [[ $# -gt 0 ]]; do
case $1 in
-a|--auto-size)
_AUTOSIZE=1; shift ;;
-*|--*)
echo "Unknown option $1"; exit 1 ;;
*)
POSITIONAL_ARGS+=("$1") ; shift ;;
esac
done
set -- "${POSITIONAL_ARGS[@]}" # restore positional parameters
function __repoSize() {
if [ $_AUTOSIZE -eq 1 ]; then
_repoSizeBytes=$(du --summarize --bytes "${1}" |
grep --perl-regexp --only-matching '^\d+')
if [ "$_repoSizeBytes" -le 2147483648 ]; then
# Under 2G
echo 2
else
# More than 2G, the next power of two is determined.
_factor=2
while true; do
_repoSize=$((2**i))
if [ 123 -lt $_repoSize ]; then
echo $_repoSize
break
fi
((i++))
done
fi
else
echo "2"
fi
}
finalObject="[]"
i=0
# Loop on each directory in bw-data
for directory in $directoriesList ; do
unixUser=$directory
repository=$(ls "$bwDataDir/$directory/repos/")
id=$i
alias="Repo to rename $i"
lastSave=0
alert=90000
storageSize=$(__repoSize "$bwDataDir/$directory/repos/$repository")
storageUsed=0
comment=""
displayDetails=true
status=false
sshPublicKey=$(grep --only-matching --perl-regexp \
'(?<=restrict ).*' \
"$bwDataDir/$directory/.ssh/authorized_keys")
# Create a valid JSON object with jq for each repo
objRepoJSON=$(jq -n --argjson id $id \
--arg alias "$alias" \
--arg repository "$repository" \
--argjson status $status \
--argjson lastSave $lastSave \
--argjson alert $alert \
--argjson storageSize "$storageSize" \
--argjson storageUsed $storageUsed \
--arg sshPublicKey "$sshPublicKey" \
--arg comment "$comment" \
--argjson displayDetails $displayDetails \
--arg unixUser "$unixUser" \
"{ \
id: \$id, \
alias: \$alias, \
repository: \$repository, \
status: \$status, \
lastSave: \$lastSave, \
alert: \$alert, \
storageSize: \$storageSize, \
storageUsed: \$storageUsed, \
sshPublicKey: \$sshPublicKey, \
comment: \$comment, \
displayDetails: \$displayDetails, \
unixUser: \$unixUser \
}")
# Insert objRepoJSON in finalObject with jq
finalObject=$(jq --argjson objRepoJSON \
"$objRepoJSON" '. += [$objRepoJSON]' \
<<< "$finalObject")
i=$((i+1))
done
#Display finalObject on screen to copy/paste it in repo.json file
echo "$finalObject"