diff --git a/all/dev/backup/backup b/all/dev/backup/backup deleted file mode 100755 index 649ec1a..0000000 --- a/all/dev/backup/backup +++ /dev/null @@ -1,364 +0,0 @@ -#!/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 - echo Running Backup Command - - inspect_args - - # module_load ssh - module_load confirm - - local source=${args[source]} - local target=${args[target]} - 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 mirror=${args[--mirror]} - local options=$(echo ${args[--options]} | awk '{gsub(/\\/," ")}1') - local sudo=$([[ ${args[--sudo]} ]] && echo sudo) - local exclude=${args[--exclude_file]} - - if [[ ! $exclude ]]; then - [[ -f $source/exclude.bac ]] && exclude="$source/exclude.bac" - # ls $source - # [[ $EXCLUDE_BACKUP ]] && exclude="$BACKUP_EXCLUDE" - fi - echo making exclude - [[ $exclude ]] && exclude="--exclude-globbing-filelist $exclude" - - # local ssh="--remote-schema \"ssh -C %s /home/sysadmin/.local/bin/rdiff-backup --server\"" - - cmd="$sudo rdiff-backup $options $exclude $ssh ${suser}${shost}$source ${tuser}${thost}$target" - echo $cmd - confirm run this command? || return 1 - eval $cmd -} - -# :command.version_command -version_command() { - echo "$version" -} - -# :command.usage -backup_usage() { - if [[ -n $long_usage ]]; then - printf "backup - backup/mirror a directory using rdiff or rsync\n" - echo - else - printf "backup - backup/mirror a directory using rdiff or rsync\n" - echo - fi - - printf "Usage:\n" - printf " backup [SOURCE] [TARGET] [options]\n" - printf " backup --help\n" - printf " backup --version | -v\n" - echo - - if [[ -n $long_usage ]]; then - printf "Options:\n" - # :command.usage_fixed_flags - echo " --help" - printf " Show this help\n" - echo - echo " --version, -v" - printf " Show version number\n" - echo - # :command.usage_flags - # :flag.usage - echo " --host, -h THOST" - printf " host on remote to target to receive backup\n" - echo - - # :flag.usage - echo " --shost SHOST" - printf " remote to host of source\n" - echo - - # :flag.usage - echo " --user, -u TUSER" - printf " user on remote host\n" - echo - - # :flag.usage - echo " --suser SUSER" - printf " remote user on source host\n" - echo - - # :flag.usage - echo " --sshcfg SSHCFG" - printf " path to sshcfg file\n" - echo - - # :flag.usage - echo " --options, -o OPTIONS" - printf " rdiff options\n" - echo - - # :flag.usage - echo " --include_file, -i OPTIONS" - printf " rdiff options\n" - echo - - # :flag.usage - echo " --exclude_file, -e OPTIONS" - printf " rdiff options\n" - echo - - # :flag.usage - echo " --mirror, -m" - printf " make a mirror copy instead of a differential snapshot\n" - echo - - # :flag.usage - echo " --sudo, -s" - printf " run the backup as sudo\n" - echo - - # :flag.usage - echo " --no-dir, -n" - printf " don't make a directory of same name within the target, merge sub directories\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 - # :command.usage_examples - printf "Examples:\n" - - printf " backup -m -n -h thost --shost shost -u tuser --suser suser . /target/dir\n" - echo - - fi -} - -# :command.inspect_args -inspect_args() { - echo args: - for k in "${!args[@]}"; do echo "- \${args[$k]} = ${args[$k]}"; done -} - -# :command.command_functions - -# :command.parse_requirements -parse_requirements() { - # :command.fixed_flag_filter - case "$1" in - --version | -v ) - version_command - exit - ;; - - --help ) - long_usage=yes - backup_usage - exit 1 - ;; - - 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 - --host | -h ) - if [[ $2 && $2 != -* ]]; then - args[--host]="$2" - shift - shift - else - printf "%s\n" "--host requires an argument: --host, -h THOST" - exit 1 - fi - ;; - - # :flag.case - --shost ) - if [[ $2 && $2 != -* ]]; then - args[--shost]="$2" - shift - shift - else - printf "%s\n" "--shost requires an argument: --shost SHOST" - exit 1 - fi - ;; - - # :flag.case - --user | -u ) - if [[ $2 && $2 != -* ]]; then - args[--user]="$2" - shift - shift - else - printf "%s\n" "--user requires an argument: --user, -u TUSER" - exit 1 - fi - ;; - - # :flag.case - --suser ) - if [[ $2 && $2 != -* ]]; then - args[--suser]="$2" - shift - shift - else - printf "%s\n" "--suser requires an argument: --suser SUSER" - exit 1 - fi - ;; - - # :flag.case - --sshcfg ) - if [[ $2 && $2 != -* ]]; then - args[--sshcfg]="$2" - shift - shift - else - printf "%s\n" "--sshcfg requires an argument: --sshcfg SSHCFG" - exit 1 - fi - ;; - - # :flag.case - --options | -o ) - if [[ $2 && $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 && $2 != -* ]]; then - args[--include_file]="$2" - shift - shift - else - printf "%s\n" "--include_file requires an argument: --include_file, -i OPTIONS" - exit 1 - fi - ;; - - # :flag.case - --exclude_file | -e ) - if [[ $2 && $2 != -* ]]; then - args[--exclude_file]="$2" - shift - shift - else - printf "%s\n" "--exclude_file requires an argument: --exclude_file, -e OPTIONS" - exit 1 - fi - ;; - - # :flag.case - --mirror | -m ) - args[--mirror]=1 - shift - ;; - - # :flag.case - --sudo | -s ) - args[--sudo]=1 - shift - ;; - - # :flag.case - --no-dir | -n ) - args[--no-dir]=1 - shift - ;; - - - -* ) - 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.default_assignments -} - -# :command.initialize -initialize() { - version="0.1.0" - long_usage='' - set -e - - # :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. -} - -# :command.run -run() { - declare -A args - parse_requirements "$@" - - if [[ ${args[--version]} ]]; then - version_command - elif [[ ${args[--help]} ]]; then - long_usage=yes - backup_usage - elif [[ $action == "root" ]]; then - root_command - fi -} - -initialize -run "$@" diff --git a/all/dev/backup/dbackup b/all/dev/backup/dbackup index df88aab..0018f13 100755 --- a/all/dev/backup/dbackup +++ b/all/dev/backup/dbackup @@ -2,21 +2,27 @@ # This script was generated by bashly (https://github.com/DannyBen/bashly) # Modifying it manually is not recommended +# :script.bash3_bouncer +if [[ "${BASH_VERSINFO:-0}" -lt 4 ]]; then + printf "bash version 4 or higher is required\n" + exit 1 +fi + # :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 @@ -29,48 +35,47 @@ root_command() { 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#^[.]##")} @@ -81,42 +86,41 @@ root_command() { 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 @@ -132,16 +136,16 @@ root_command() { 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 @@ -156,10 +160,12 @@ version_command() { dbackup_usage() { if [[ -n $long_usage ]]; then printf "dbackup - differential backup using restic\n" - echo + echo + else printf "dbackup - differential backup using restic\n" - echo + echo + fi printf "Usage:\n" @@ -182,128 +188,128 @@ dbackup_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 @@ -360,32 +366,31 @@ inspect_args() { # :command.parse_requirements parse_requirements() { # :command.fixed_flag_filter - case "$1" in + 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 + if [[ -n ${2+x} ]]; then + # :flag.validations args[--password]="$2" shift shift @@ -394,16 +399,17 @@ parse_requirements() { exit 1 fi ;; - + # :flag.case --remote | -r ) args[--remote]=1 shift ;; - + # :flag.case --server ) - if [[ $2 ]]; then + if [[ -n ${2+x} ]]; then + # :flag.validations args[--server]="$2" shift shift @@ -412,28 +418,29 @@ parse_requirements() { 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 + if [[ -n ${2+x} ]]; then + # :flag.validations args[--view-path]="$2" shift shift @@ -442,10 +449,11 @@ parse_requirements() { exit 1 fi ;; - + # :flag.case --prune ) - if [[ $2 ]]; then + if [[ -n ${2+x} ]]; then + # :flag.validations args[--prune]="$2" shift shift @@ -454,10 +462,11 @@ parse_requirements() { exit 1 fi ;; - + # :flag.case --password | -p ) - if [[ $2 ]]; then + if [[ -n ${2+x} ]]; then + # :flag.validations args[--password]="$2" shift shift @@ -466,10 +475,11 @@ parse_requirements() { exit 1 fi ;; - + # :flag.case --settings | -s ) - if [[ $2 ]]; then + if [[ -n ${2+x} ]]; then + # :flag.validations args[--settings]="$2" shift shift @@ -478,10 +488,11 @@ parse_requirements() { exit 1 fi ;; - + # :flag.case --options | -o ) - if [[ $2 ]]; then + if [[ -n ${2+x} ]]; then + # :flag.validations args[--options]="$2" shift shift @@ -490,10 +501,11 @@ parse_requirements() { exit 1 fi ;; - + # :flag.case --include_file | -i ) - if [[ $2 ]]; then + if [[ -n ${2+x} ]]; then + # :flag.validations args[--include_file]="$2" shift shift @@ -502,10 +514,11 @@ parse_requirements() { exit 1 fi ;; - + # :flag.case --exclude_file | -e ) - if [[ $2 ]]; then + if [[ -n ${2+x} ]]; then + # :flag.validations args[--exclude_file]="$2" shift shift @@ -514,16 +527,17 @@ parse_requirements() { exit 1 fi ;; - + # :flag.case --sudo ) args[--sudo]=1 shift ;; - + # :flag.case --jq ) - if [[ $2 ]]; then + if [[ -n ${2+x} ]]; then + # :flag.validations args[--jq]="$2" shift shift @@ -532,19 +546,20 @@ parse_requirements() { exit 1 fi ;; - - + -* ) printf "invalid option: %s\n" "$key" exit 1 ;; - + * ) # :command.parse_requirements_case - if [[ ! ${args[source]} ]]; then + if [[ -z ${args[source]+x} ]]; then + # :argument.validations args[source]=$1 shift - elif [[ ! ${args[target]} ]]; then + elif [[ -z ${args[target]+x} ]]; then + # :argument.validations args[target]=$1 shift else @@ -552,9 +567,11 @@ parse_requirements() { exit 1 fi ;; - + esac done + # :command.required_args_filter + # :command.required_flags_filter # :command.catch_all_filter # :command.default_assignments # :command.whitelist_filter @@ -566,11 +583,6 @@ initialize() { 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 @@ -583,9 +595,9 @@ initialize() { # :command.run run() { - declare -A args - declare -a other_args - declare -a input + declare -A args=() + declare -a other_args=() + declare -a input=() normalize_input "$@" parse_requirements "${input[@]}" diff --git a/all/dev/backup/dbackup (copy) b/all/dev/backup/dbackup (copy) new file mode 100755 index 0000000..df88aab --- /dev/null +++ b/all/dev/backup/dbackup (copy) @@ -0,0 +1,598 @@ +#!/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 "$@" diff --git a/all/modules/chromium/chromium copy.sh b/all/modules/chromium/chromium copy.sh new file mode 100755 index 0000000..5565d47 --- /dev/null +++ b/all/modules/chromium/chromium copy.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +# user to start MUST be first in arguments +# if not supplied then will use default +chromium_() { + local DEFAULT=/opt/chromium + # local DEFAULT="$HOME/.local/share/chromium" + local exe="/usr/bin/chromium" + if [[ ! -f $exe ]]; then + echo deb chromium not installed, checking for flatpak version + flatpak=$(flatpak info com.github.Eloston.UngoogledChromium | grep error:) + if [[ $flatpak ]]; then + echo no flatpak version either - exiting && return 1 + else + flatpak=true + exe="/usr/bin/flatpak run --branch=stable --arch=x86_64 --filesystem= --command=/app/bin/chromium --file-forwarding com.github.Eloston.UngoogledChromium @@u" + fi + fi + # an instance gets it's own directory + local instance=${CHROMIUM_INSTANCE} + [[ $1 && (! $1 == -*) ]] && instance=$1 && shift + [[ $1 && (! $1 == -*) ]] && url=$1 && shift + if [[ $instance =~ http[s]?:\/\/ ]]; then + url=$instance + instance="" + if [[ $url =~ ^-+ ]]; then + url="" + set -- "$@" $url + url="" + fi + fi + + local dir + if [[ ! $instance ]]; then + unset CHROME_CONFIG_HOME + $HOME/.config/chromium + dir=$HOME/.config/chromium + exe="${exe//$dir}" + echo starting chromium for $USER in + else + [[ $instance == "incognito" ]] && set -- "$@" "-incognito" + dir=${CHROMIUM_HOME:-$DEFAULT}/$instance + exe="${exe//$dir}" + fi + echo $exe $@ --user-data-dir=$dir $url $([[ $flatpak ]] && echo "@@") + +} + +# # if script was executed then call the function +(return 0 2>/dev/null) || chromium_ $@ diff --git a/all/modules/chromium/chromium.sh b/all/modules/chromium/chromium.sh index 3421f18..2878e3c 100755 --- a/all/modules/chromium/chromium.sh +++ b/all/modules/chromium/chromium.sh @@ -4,11 +4,12 @@ # if not supplied then will use default chromium_() { local DEFAULT=/opt/chromium + local DEFAULT_USER=$HOME/.browsers # local DEFAULT="$HOME/.local/share/chromium" local exe="/usr/bin/chromium" [[ $1 == -g ]] && exe=$(command -v google-chrome) && shift - echo exe $exe + echo execuatble to be used: $exe if [[ ! -f $exe ]]; then echo chromium/chrome not installed, checking for flatpak version flatpak=$(flatpak info com.github.Eloston.UngoogledChromium | grep error:) @@ -40,11 +41,10 @@ chromium_() { echo starting chromium for $USER in dir=$HOME/.config/chromium exe="${exe//$dir}" - # echo $exe "$@" $([[ $flatpak ]] && echo " @@") - # $exe "$@" else [[ $instance == "incognito" ]] && set -- "$@" "-incognito" - dir=${CHROMIUM_HOME:-$DEFAULT}/$instance + dir=${DEFAULT_USER}/$instance + dir=$([[ -d "$dir" ]] && echo $dir || echo "${CHROMIUM_HOME:-$DEFAULT}/$instance") exe="${exe//$dir}" fi mkdir -p $dir diff --git a/all/modules/chromium/widevine.sh b/all/modules/chromium/widevine.sh new file mode 100755 index 0000000..a11c4f7 --- /dev/null +++ b/all/modules/chromium/widevine.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +# https://raw.githubusercontent.com/flathub/com.github.Eloston.UngoogledChromium/master/widevine-install.sh +# https://github.com/flathub/com.github.Eloston.UngoogledChromium +# Exit on error and forbid unset variables +set -eu + +# Get latest WideVine Version by getting last line in https://dl.google.com/widevine-cdm/versions.txt +_widevine_ver="$(wget -qO- https://dl.google.com/widevine-cdm/versions.txt | tail -n1)" + +# Get the architecture of the current machine +ARCH="$(uname -m)" +case "$ARCH" in +x86_64) + WIDEVINE_ARCH="x64" + CHROMIUM_ARCH="x64" + ;; + +*) + echo "The architecture $ARCH is not supported." >&2 + exit 1 + ;; +esac + +# Download WideVine into a temporary file and use trap to delete it on exit +widevine_zip="$(mktemp)" +trap 'rm -f "${widevine_zip:?}"' EXIT +wget -O "$widevine_zip" "https://dl.google.com/widevine-cdm/${_widevine_ver}-linux-${WIDEVINE_ARCH}.zip" + +# Install WideVine from zip file into UngoogledChromium flatpak +_install_prefix="/opt/chromium/$1/WidevineCdm/${_widevine_ver}" +unzip -p "$widevine_zip" libwidevinecdm.so | install -Dm644 "/dev/stdin" "${_install_prefix}/_platform_specific/linux_$CHROMIUM_ARCH/libwidevinecdm.so" +unzip -p "$widevine_zip" manifest.json | install -m644 "/dev/stdin" "${_install_prefix}/manifest.json" +unzip -p "$widevine_zip" LICENSE.txt | install -m644 "/dev/stdin" "${_install_prefix}/LICENSE.txt" diff --git a/all/modules/dbackup.func b/all/modules/dbackup.func new file mode 120000 index 0000000..7ca2e95 --- /dev/null +++ b/all/modules/dbackup.func @@ -0,0 +1 @@ +/shell/host/all/dev/backup/dbackup \ No newline at end of file diff --git a/all/modules/flatpak-make-bin b/all/modules/flatpak-make-bin new file mode 100644 index 0000000..ad4dcf7 --- /dev/null +++ b/all/modules/flatpak-make-bin @@ -0,0 +1,4 @@ +# will make a launch script at /usr/bin for a given flatpak application +# $1 is bin file name, $2 is flatpak application name +# --mount -m will mount any folders outside the sandbox +# this launch script will make is easier to start the app like it was a native debian app