#!/bin/bash # $HeadURL$ $LastChangedRevision$ # Modules . $(miniade) || { echo "${0##*/}: ERROR: miniade failed (hint: run 'miniade' to see error)" >&2; exit 1; } . <(rdw2-config --format=shell) || { echo "${0##*/}: INTERNAL ERROR: failed to run rdw2-config" >&2; exit 3; } # Configurable stuff # Other globals main() { local MY_ARGS local MODE LABEL_TYPE LABELEE PROGNAME # Defaults for options HOST= FORCE_FLAG=false # Process options special_opts_handler() { case $1 in --host=*) HOST=${1#*=} ;; --force) FORCE_FLAG=true ;; *) return 1 ;; esac } miniade_process_options --help-handler=help --special-opts-handler=special_opts_handler MY_ARGS "$@" && set -- "${MY_ARGS[@]}" # Process arguments [ $# -ge 3 ] || miniade_bad_usage MODE=$1 LABEL_TYPE=$2 LABELEE=$3 shift 3 miniade_debug 2 "main: MODE=$MODE, LABEL_TYPE=$LABEL_TYPE, LABELEE=$LABELEE" # Sanity checks and derivations [[ $MODE =~ ^(add|verify|is-labelled|read|delete|touch)$ ]] || miniade_bad_usage [[ $LABEL_TYPE =~ ^(medium|client|server|session|dle)$ ]] || miniade_bad_usage miniade_get_progname PROGNAME DB_FILE=$HOME/.$PROGNAME.sqlite # Guts # (delegated) mode_${MODE//-/_} "$@" } help() { local PROGNAME miniade_get_progname PROGNAME echo "Usage: $PROGNAME [ ] add " echo " $PROGNAME [ ] verify " echo " $PROGNAME [ ] is-labelled " echo " $PROGNAME [ ] read " echo " $PROGNAME [ ] delete " echo " $PROGNAME [ ] touch " echo echo ": client, dle, medium, session" echo exit 0 } mode_add() { [ $# = 1 ] || miniade_bad_usage DESIRED_LABEL=$1 [[ $DESIRED_LABEL =~ ^.{8}-.{4}-.{4}-.{4}-.{12}$ ]] || miniade_error "$DESIRED_LABEL: invalid label (hint: run 'uuidgen' to see what valid labels look like)" create_tables sqlite3 $DB_FILE "INSERT OR FAIL INTO labels VALUES ('$LABEL_TYPE', '$LABELEE', '$DESIRED_LABEL', $(date +%s));" } mode_verify() { local EXPECTED_LABEL ACTUAL_LABEL [ $# = 1 ] || miniade_bad_usage EXPECTED_LABEL=$1 [[ $EXPECTED_LABEL =~ ^.{8}-.{4}-.{4}-.{4}-.{12}$ ]] || miniade_error "$EXPECTED_LABEL: invalid label (hint: run 'uuidgen' to see what valid labels look like)" create_tables mode_read > /dev/null ACTUAL_LABEL=$(sqlite3 $DB_FILE "SELECT label FROM labels WHERE type = '$LABEL_TYPE' AND labelee = '$LABELEE';") [ "X$EXPECTED_LABEL" = "X$ACTUAL_LABEL" ] || miniade_error "$LABEL_TYPE has wrong label (expected: $EXPECTED_LABEL; found: $ACTUAL_LABEL)" } mode_is_labelled() { [ $# = 0 ] || miniade_bad_usage mode_read > /dev/null ACTUAL_LABEL=$(sqlite3 $DB_FILE "SELECT label FROM labels WHERE type = '$LABEL_TYPE' AND labelee = '$LABELEE';") [[ $ACTUAL_LABEL =~ ^.{8}-.{4}-.{4}-.{4}-.{12}$ ]] || miniade_error "$LABEL_TYPE: has corrupted label" } mode_read() { local ACTUAL_LABEL [ $# = 0 ] || miniade_bad_usage create_tables ACTUAL_LABEL=$(sqlite3 $DB_FILE "SELECT label FROM labels WHERE type = '$LABEL_TYPE' AND labelee = '$LABELEE';") || miniade_error "failed to read label" [ "X$ACTUAL_LABEL" != X ] || miniade_error "unlabelled" echo "$ACTUAL_LABEL" } mode_delete() { [ $# = 1 ] || miniade_bad_usage EXPECTED_LABEL=$1 mode_verify "$EXPECTED_LABEL" sqlite3 $DB_FILE "DELETE FROM labels WHERE type = '$LABEL_TYPE' AND labelee = '$LABELEE';" } mode_touch() { [ $# = 1 ] || miniade_bad_usage EXPECTED_LABEL=$1 mode_verify "$EXPECTED_LABEL" sqlite3 $DB_FILE "UPDATE labels SET touch_timestamp = $(date +%s) WHERE type = '$LABEL_TYPE' AND labelee = '$LABELEE';" } create_tables() { sqlite3 $DB_FILE <= 0) ); EOF } main "$@"