#!/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] " 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))}" 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 /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"