mirror of
https://github.com/Zygo/bees.git
synced 2025-05-17 21:35:45 +02:00
When bees is meant to be run mainly through the service frontend script, we should move the bees binary to the libexec directory.
129 lines
3.2 KiB
Bash
Executable File
129 lines
3.2 KiB
Bash
Executable File
#!/bin/bash
|
|
# /usr/bin/beesd
|
|
|
|
## 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
|
|
|
|
readonly AL16M="$((16*1024*1024))"
|
|
readonly CONFIG_DIR=/etc/bees/
|
|
|
|
## Pre checks
|
|
{
|
|
[ ! -d "$CONFIG_DIR" ] && ERRO "Missing: $CONFIG_DIR"
|
|
[ "$UID" == "0" ] || ERRO "Must be runned as root"
|
|
}
|
|
|
|
command -v /usr/libexec/bees &> /dev/null || ERRO "Missing 'bees' agent"
|
|
|
|
## Parse args
|
|
UUID="$1"
|
|
case "$UUID" in
|
|
*-*-*-*-*)
|
|
FILE_CONFIG=""
|
|
for file in "$CONFIG_DIR"/*.conf; do
|
|
[ ! -f "$file" ] && continue
|
|
if grep -q "$UUID" "$file"; then
|
|
INFO "Find $UUID in $file, use as conf"
|
|
FILE_CONFIG="$file"
|
|
fi
|
|
done
|
|
[ ! -f "$FILE_CONFIG" ] && ERRO "No config for $UUID"
|
|
source "$FILE_CONFIG"
|
|
;;
|
|
*)
|
|
echo "beesd <btrfs_uuid>"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
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:-$((64*AL16M))}"
|
|
LOG_SHORT_PATH="${LOG_SHORT_PATH:-N}"
|
|
LOG_FILTER_TIME="${LOG_FILTER_TIME:-N}"
|
|
|
|
INFO "Check: Disk exists"
|
|
if [ ! -b "/dev/disk/by-uuid/$UUID" ]; then
|
|
ERRO "Missing disk: /dev/disk/by-uuid/$UUID"
|
|
fi
|
|
|
|
it_btrfs(){ [ "$(blkid -s TYPE -o value "$1")" == "btrfs" ]; }
|
|
|
|
INFO "Check: Disk with btrfs"
|
|
if ! it_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 /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"%AL16M > 0 )); then
|
|
ERRO "DB_SIZE Must be multiple of 16M"
|
|
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="${MNT_DIR//\/\//\/}"
|
|
|
|
filter_time(){
|
|
if YN $LOG_FILTER_TIME; then
|
|
sed -e 's/^.*crawl:/crawl:/g' \
|
|
-e 's/^.*status:/status:/g' \
|
|
-e 's/^.*bees:/bees:/g' \
|
|
-e 's/^.*crawl_writeback:/crawl_writeback:/g' \
|
|
-e 's/^.*main:/main:/g' \
|
|
-e 's/^.*hash_prefetch:/hash_prefetch:/g'
|
|
else
|
|
cat
|
|
fi
|
|
}
|
|
|
|
filter_path(){
|
|
if YN $LOG_SHORT_PATH; then
|
|
sed -e "s#$MNT_DIR##g"
|
|
else
|
|
cat
|
|
fi
|
|
}
|
|
|
|
/usr/libexec/bees "$MNT_DIR" 3>&1 2>&1 | filter_time | filter_path
|
|
|
|
exit 0
|