mirror of
https://github.com/Ravinou/borgwarehouse
synced 2024-05-29 12:02:49 +02:00
137 lines
4.5 KiB
Bash
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"
|