mirror of
https://github.com/Zygo/bees.git
synced 2025-05-17 21:35:45 +02:00
Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> [trailing whitespace deleted] Signed-off-by: Zygo Blaxell <bees@furryterror.org>
148 lines
3.4 KiB
Bash
Executable File
148 lines
3.4 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
## Helpful functions
|
|
INFO(){ echo "INFO:" "$@"; }
|
|
ERRO(){ echo "ERROR:" "$@"; exit 1; }
|
|
YN(){ [[ "$1" =~ (1|Y|y) ]]; }
|
|
|
|
## Global vars
|
|
export BEESHOME BEESSTATUS
|
|
export WORK_DIR CONFIG_DIR
|
|
export CONFIG_FILE
|
|
export UUID AL16M AL128K
|
|
|
|
readonly AL128K="$((128*1024))"
|
|
readonly AL16M="$((16*1024*1024))"
|
|
readonly CONFIG_DIR=@ETC_PREFIX@/bees/
|
|
|
|
readonly bees_bin=$(realpath @LIBEXEC_PREFIX@/bees)
|
|
|
|
command -v "$bees_bin" &> /dev/null || ERRO "Missing 'bees' agent"
|
|
|
|
uuid_valid(){
|
|
if uuidparse -n -o VARIANT $1 | grep -i -q invalid; then
|
|
false
|
|
fi
|
|
}
|
|
|
|
help(){
|
|
echo "Usage: beesd [options] <btrfs_uuid>"
|
|
echo "- - -"
|
|
exec "$bees_bin" --help
|
|
}
|
|
|
|
get_bees_supp_opts(){
|
|
"$bees_bin" --help |& awk '/--../ { gsub( ",", "" ); print $1 " " $2}'
|
|
}
|
|
|
|
SUPPORTED_ARGS=(
|
|
$(get_bees_supp_opts)
|
|
)
|
|
NOT_SUPPORTED_ARGS=()
|
|
ARGUMENTS=()
|
|
|
|
for arg in "${@}"; do
|
|
supp=false
|
|
for supp_arg in "${SUPPORTED_ARGS[@]}"; do
|
|
if [ "$arg" == "$supp_arg" ]; then
|
|
supp=true
|
|
break
|
|
fi
|
|
done
|
|
if $supp; then
|
|
ARGUMENTS+=($arg)
|
|
else
|
|
NOT_SUPPORTED_ARGS+=($arg)
|
|
fi
|
|
done
|
|
|
|
for arg in "${ARGUMENTS[@]}"; do
|
|
case $arg in
|
|
-h) help;;
|
|
--help) help;;
|
|
esac
|
|
done
|
|
|
|
for arg in "${NOT_SUPPORTED_ARGS[@]}"; do
|
|
if uuid_valid $arg; then
|
|
[ ! -z "$UUID" ] && help
|
|
UUID=$arg
|
|
fi
|
|
done
|
|
|
|
[ -z "$UUID" ] && help
|
|
|
|
|
|
FILE_CONFIG="$(egrep -l '^[^#]*UUID\s*=\s*"?'"$UUID" "$CONFIG_DIR"/*.conf | head -1)"
|
|
[ ! -f "$FILE_CONFIG" ] && ERRO "No config for $UUID"
|
|
INFO "Find $UUID in $FILE_CONFIG, use as conf"
|
|
source "$FILE_CONFIG"
|
|
|
|
|
|
## Pre checks
|
|
{
|
|
[ ! -d "$CONFIG_DIR" ] && ERRO "Missing: $CONFIG_DIR"
|
|
[ "$UID" == "0" ] || ERRO "Must be run as root"
|
|
}
|
|
|
|
|
|
WORK_DIR="${WORK_DIR:-/run/bees/}"
|
|
MNT_DIR="${MNT_DIR:-$WORK_DIR/mnt/$UUID}"
|
|
BEESHOME="${BEESHOME:-$MNT_DIR/.beeshome}"
|
|
BEESSTATUS="${BEESSTATUS:-$WORK_DIR/$UUID.status}"
|
|
DB_SIZE="${DB_SIZE:-$((8192*AL128K))}"
|
|
MOUNT_OPTIONS="${MOUNT_OPTIONS-}"
|
|
|
|
INFO "Check: Disk exists"
|
|
if [ ! -b "/dev/disk/by-uuid/$UUID" ]; then
|
|
ERRO "Missing disk: /dev/disk/by-uuid/$UUID"
|
|
fi
|
|
|
|
is_btrfs(){ [ "$(blkid -s TYPE -o value "$1")" == "btrfs" ]; }
|
|
|
|
INFO "Check: Disk with btrfs"
|
|
if ! is_btrfs "/dev/disk/by-uuid/$UUID"; then
|
|
ERRO "Disk not contain btrfs: /dev/disk/by-uuid/$UUID"
|
|
fi
|
|
|
|
INFO "WORK DIR: $WORK_DIR"
|
|
mkdir -p "$WORK_DIR" || exit 1
|
|
|
|
INFO "MOUNT DIR: $MNT_DIR"
|
|
mkdir -p "$MNT_DIR" || exit 1
|
|
|
|
umount_w(){ mountpoint -q "$1" && umount -l "$1"; }
|
|
force_umount(){ umount_w "$MNT_DIR"; }
|
|
trap force_umount SIGINT SIGTERM EXIT
|
|
|
|
mount -osubvolid=5 -o "$MOUNT_OPTIONS" /dev/disk/by-uuid/$UUID "$MNT_DIR" || exit 1
|
|
|
|
if [ ! -d "$BEESHOME" ]; then
|
|
INFO "Create subvol $BEESHOME for store bees data"
|
|
btrfs sub cre "$BEESHOME"
|
|
else
|
|
btrfs sub show "$BEESHOME" &> /dev/null || ERRO "$BEESHOME MUST BE A SUBVOL!"
|
|
fi
|
|
|
|
# Check DB size
|
|
{
|
|
DB_PATH="$BEESHOME/beeshash.dat"
|
|
touch "$DB_PATH"
|
|
OLD_SIZE="$(du -b "$DB_PATH" | sed 's/\t/ /g' | cut -d' ' -f1)"
|
|
NEW_SIZE="$DB_SIZE"
|
|
if (( "$NEW_SIZE"%AL128K > 0 )); then
|
|
ERRO "DB_SIZE Must be multiple of 128K"
|
|
fi
|
|
if (( "$OLD_SIZE" != "$NEW_SIZE" )); then
|
|
INFO "Resize db: $OLD_SIZE -> $NEW_SIZE"
|
|
[ -f "$BEESHOME/beescrawl.$UUID.dat" ] && rm "$BEESHOME/beescrawl.$UUID.dat"
|
|
truncate -s $NEW_SIZE $DB_PATH
|
|
fi
|
|
chmod 700 "$DB_PATH"
|
|
}
|
|
|
|
MNT_DIR="$(realpath $MNT_DIR)"
|
|
|
|
cd "$MNT_DIR"
|
|
"$bees_bin" "${ARGUMENTS[@]}" $OPTIONS "$MNT_DIR"
|