#!/usr/bin/env bash # This script was generated by bashly (https://github.com/DannyBen/bashly) # Modifying it manually is not recommended # :command.root_command root_command() { # :src/root_command.sh #!/bin/bash echo "running root command" inspect_args # module_load ssh module_load confirm module_load path local settings=${args[--settings]} if [[ $settings ]]; then if [[ -f $settings ]]; then echo loading settings file $settings module_load yaml eval $(parse_yaml $settings "s_") echo $s_source echo $s_target echo $s_host else echo settings file $settings does not exist && return 1 fi fi if [[ $s_server_host ]]; then s_server="http$([[ $s_server_secure ]] && echo "s")://${s_server_host}$([[ $s_server_port ]] && echo :${s_server_port} || echo "")" fi local password=${args[--password]:-$BACKUP_PASSWORD} password=${password:-$s_password} [[ ! $password ]] && echo restic requires a backup repository password, exiting && return 2 password="RESTIC_PASSWORD=${password}" local server=${args[--server]:-$BACKUP_SERVER} server=${server:-$s_server} local hostname=${args[--hostname]:-$s_hostname} hostname=${hostname:-$s_host} hostname=${hostname:-$HOSTNAME} local options="${args[--options]:-$BACKUP_OPTIONS}" options="${options:-$s_options}" local smount=${args[--source_mount]:-$BACKUP_SOURCE_MOUNT} smount=${smount:-$s_source_mount} echo smount: $smount $s_source_mount local tmount=${args[--target_mount]:-$BACKUP_TARGET_MOUNT} tmount=${tmount:-$s_target_mount} echo tmount: $tmount $s_target_mount local source="${args[source]:-$s_source}" source="${source:-$s_source_path}" source=$(echo "${source:-$PWD}" | tr -s /) echo yaml source $s_source_path $s_source_mount echo source $source echo target $s_target echo target path $s_target_path local target=${args[target]:-$s_target} target=${target:-$s_target_path} target=${target:-$(echo "${source}" | tr -s / | sed -e "s#^[.]##")} target="$(echo "${target}" | tr -s /)" echo "target> $target" if [[ ${tmount} ]]; then target="${tmount}${target}" else target="/${hostname}${target}" fi if [[ $server ]]; then target="rest:${server}${target}" fi if [[ $smount ]]; then setpath="--set-path ${source} --tag mount-point:${smount}" source=${smount}${source} fi local exclude=${args[--exclude_file]:-$BACKUP_EXCLUDE} exclude=${exclude:-$s_exclude} exclude=${exclude:-"$source/exclude.bac"} # local shost=$([[ ${args[--shost]} ]] && echo ${args[--shost]}::) # local suser=$([[ ${args[--suser]} ]] && echo ${args[--suser]}@) # local thost=$([[ ${args[--host]} ]] && echo ${args[--host]}::) # local tuser=$([[ ${args[--user]} ]] && echo ${args[--user]}@) local options=$(echo ${args[--options]} | awk '{gsub(/\\/," ")}1') local bin=$(command -v restic) exclude=$([[ -f $exclude ]] && echo "--iexclude-file $exclude" || echo "") echo source: $source echo target $target echo exclude: $exclude local sudo=$([[ ${args[--sudo]} || $s_sudo || $BACKUP_SUDO ]] && echo "sudo" || echo "") local pcmd="${sudo} ${password} ${bin} ${options} -r ${target}" local cmd="${pcmd} -H ${hostname} ${setpath} backup ${source} ${exclude}" if [[ ${args[--init]} ]]; then cmd="${pcmd} init"; fi if [[ ${args[--snap]} ]]; then cmd="${pcmd} snapshots"; fi if [[ ${args[--prune]} ]]; then cmd="${pcmd} prune"; fi if [[ ${args[--view]} || ${args[--view-path]} ]]; then mount=${args[--view-path]:-$BACKUP_MOUNT} mount=${mount:-"/opt/backup/view/"} echo view mount point $mount if [[ -e ${mount} ]]; then cmd="${pcmd} mount $mount"; echo browse files at $mount/snapshots/latest${source} else echo $mount: directory for mounting snapshot for viewing does not exist. Create and try again return 3 fi fi echo jq argument ${args[--jq]} if [[ ${args[--jq]} ]];then cmd="${cmd} | jq ${args[--jq]}" fi echo $cmd confirm run this command? || return 1 eval $cmd # sudo chown -R $USER:$USER $target # sudo chown -R $USER:$USER /home/$USER/.cache/restic # sudo chmod -R g+rwX /home/$USER/.cache/restic } # :command.version_command version_command() { echo "$version" } # :command.usage dbackup_usage() { if [[ -n $long_usage ]]; then printf "dbackup - differential backup using restic\n" echo else printf "dbackup - differential backup using restic\n" echo fi printf "Usage:\n" printf " dbackup [SOURCE] [TARGET] [options]\n" printf " dbackup --help | -h\n" printf " dbackup --version\n" echo if [[ -n $long_usage ]]; then printf "Options:\n" # :command.usage_fixed_flags echo " --help, -h" printf " Show this help\n" echo echo " --version" printf " Show version number\n" echo # :command.usage_flags # :flag.usage echo " --password, -p PASSWORD" printf " repo password (or file path) for backup repository\n" echo # :flag.usage echo " --remote, -r" printf " backup to a remote machine\n" echo # :flag.usage echo " --server URL" printf " url of restic rest server\n" echo # :flag.usage echo " --init" printf " initialize repo (default is backup)\n" echo # :flag.usage echo " --snap" printf " list repo snapshots\n" echo # :flag.usage echo " --view, -v" printf " mount snapshot for viewing (default is BACKUP_MOUNT or /opt/backup/view)\n" echo # :flag.usage echo " --view-path PATH" printf " set custom mount point path for viewing of snapshot, --view not required if\n set\n" echo # :flag.usage echo " --prune PRUNE" printf " prune repo (default is backup). true for default prune or path to prune\n settings\n" echo # :flag.usage echo " --password, -p PASSWORD" printf " repo password (or file path) for backup repository\n" echo # :flag.usage echo " --settings, -s SYAML" printf " path to settings file (yaml). Keys are same as long\n" echo # :flag.usage echo " --options, -o OPTIONS" printf " additional options to pass ot underlying command (restic), \"quote\"\n" echo # :flag.usage echo " --include_file, -i INCLUDE" printf " include file\n" echo # :flag.usage echo " --exclude_file, -e EXCLUDE" printf " exclude file\n" echo # :flag.usage echo " --sudo" printf " run the backup as sudo\n" echo # :flag.usage echo " --jq JQ" printf " pipe to jq command\n" echo # :command.usage_args printf "Arguments:\n" # :argument.usage echo " SOURCE" printf " source directory to be backed up, default is $PWD\n" echo # :argument.usage echo " TARGET" printf " target directory for backup\n" echo # :command.usage_environment_variables printf "Environment Variables:\n" # :environment_variable.usage echo " BACKUP_EXCLUDE" printf " path to file of excludes\n" echo # :environment_variable.usage echo " BACKUP_INCLUDE" printf " path to directory of includes\n" echo # :environment_variable.usage echo " BACKUP_SETTINGS" printf " path to default settings file\n" echo # :environment_variable.usage echo " BACKUP_PASSWORD" printf " path to default settings file\n" echo # :environment_variable.usage echo " BACKUP_SERVER" printf " URL of Restic rest server\n" echo # :environment_variable.usage echo " BACKUP_DIR" printf " Backup Directory\n" echo # :environment_variable.usage echo " BACKUP_MOUNT_POINT" printf " mount point of source if mounted external to host\n" echo # :command.usage_examples printf "Examples:\n" printf " backup -p password . /target/dir\n" printf " backup -s /path/to/settings/yaml/file\n" echo fi } # :command.normalize_input normalize_input() { local arg flags while [[ $# -gt 0 ]]; do arg="$1" if [[ $arg =~ ^(--[a-zA-Z0-9_\-]+)=(.+)$ ]]; then input+=("${BASH_REMATCH[1]}") input+=("${BASH_REMATCH[2]}") elif [[ $arg =~ ^(-[a-zA-Z0-9])=(.+)$ ]]; then input+=("${BASH_REMATCH[1]}") input+=("${BASH_REMATCH[2]}") elif [[ $arg =~ ^-([a-zA-Z0-9][a-zA-Z0-9]+)$ ]]; then flags="${BASH_REMATCH[1]}" for (( i=0 ; i < ${#flags} ; i++ )); do input+=("-${flags:i:1}") done else input+=("$arg") fi shift done } # :command.inspect_args inspect_args() { readarray -t sorted_keys < <(printf '%s\n' "${!args[@]}" | sort) if (( ${#args[@]} )); then echo args: for k in "${sorted_keys[@]}"; do echo "- \${args[$k]} = ${args[$k]}"; done else echo args: none fi if (( ${#other_args[@]} )); then echo echo other_args: echo "- \${other_args[*]} = ${other_args[*]}" for i in "${!other_args[@]}"; do echo "- \${other_args[$i]} = ${other_args[$i]}" done fi } # :command.command_functions # :command.parse_requirements parse_requirements() { # :command.fixed_flag_filter case "$1" in --version ) version_command exit ;; --help | -h ) long_usage=yes dbackup_usage exit ;; esac # :command.environment_variables_filter # :command.dependencies_filter # :command.command_filter action="root" # :command.required_args_filter # :command.required_flags_filter # :command.parse_requirements_while while [[ $# -gt 0 ]]; do key="$1" case "$key" in # :flag.case --password | -p ) if [[ $2 ]]; then args[--password]="$2" shift shift else printf "%s\n" "--password requires an argument: --password, -p PASSWORD" exit 1 fi ;; # :flag.case --remote | -r ) args[--remote]=1 shift ;; # :flag.case --server ) if [[ $2 ]]; then args[--server]="$2" shift shift else printf "%s\n" "--server requires an argument: --server URL" exit 1 fi ;; # :flag.case --init ) args[--init]=1 shift ;; # :flag.case --snap ) args[--snap]=1 shift ;; # :flag.case --view | -v ) args[--view]=1 shift ;; # :flag.case --view-path ) if [[ $2 ]]; then args[--view-path]="$2" shift shift else printf "%s\n" "--view-path requires an argument: --view-path PATH" exit 1 fi ;; # :flag.case --prune ) if [[ $2 ]]; then args[--prune]="$2" shift shift else printf "%s\n" "--prune requires an argument: --prune PRUNE" exit 1 fi ;; # :flag.case --password | -p ) if [[ $2 ]]; then args[--password]="$2" shift shift else printf "%s\n" "--password requires an argument: --password, -p PASSWORD" exit 1 fi ;; # :flag.case --settings | -s ) if [[ $2 ]]; then args[--settings]="$2" shift shift else printf "%s\n" "--settings requires an argument: --settings, -s SYAML" exit 1 fi ;; # :flag.case --options | -o ) if [[ $2 ]]; then args[--options]="$2" shift shift else printf "%s\n" "--options requires an argument: --options, -o OPTIONS" exit 1 fi ;; # :flag.case --include_file | -i ) if [[ $2 ]]; then args[--include_file]="$2" shift shift else printf "%s\n" "--include_file requires an argument: --include_file, -i INCLUDE" exit 1 fi ;; # :flag.case --exclude_file | -e ) if [[ $2 ]]; then args[--exclude_file]="$2" shift shift else printf "%s\n" "--exclude_file requires an argument: --exclude_file, -e EXCLUDE" exit 1 fi ;; # :flag.case --sudo ) args[--sudo]=1 shift ;; # :flag.case --jq ) if [[ $2 ]]; then args[--jq]="$2" shift shift else printf "%s\n" "--jq requires an argument: --jq JQ" exit 1 fi ;; -* ) printf "invalid option: %s\n" "$key" exit 1 ;; * ) # :command.parse_requirements_case if [[ ! ${args[source]} ]]; then args[source]=$1 shift elif [[ ! ${args[target]} ]]; then args[target]=$1 shift else printf "invalid argument: %s\n" "$key" exit 1 fi ;; esac done # :command.catch_all_filter # :command.default_assignments # :command.whitelist_filter } # :command.initialize initialize() { version="0.1.0" long_usage='' set -e if [[ "${BASH_VERSINFO:-0}" -lt 4 ]]; then printf "bash version 4 or higher is required\n" exit 1 fi # :src/initialize.sh # Code here runs inside the initialize() function # Use it for anything that you need to run before any other function, like # setting environment vairables: # CONFIG_FILE=settings.ini # # Feel free to empty (but not delete) this file. echo running initialize function } # :command.run run() { declare -A args declare -a other_args declare -a input normalize_input "$@" parse_requirements "${input[@]}" if [[ $action == "root" ]]; then root_command fi } initialize run "$@"