Merge remote-tracking branch 'git.kebler.net/master' into giskard
commit
b1a2275d88
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
backup () {
|
backup () {
|
||||||
DIR=$(dirname $(cd "$(dirname "$BASH_SOURCE")" >/dev/null 2>&1 ; pwd -P ))
|
DIR=$(dirname $(cd "$(dirname "$BASH_SOURCE")" >/dev/null 2>&1 ; pwd -P ))
|
||||||
$DIR/dev/backup/backup "$@"
|
$DIR/dev/backup/dbackup "$@"
|
||||||
#module_load backup
|
#module_load backup
|
||||||
#run "$@"
|
#run "$@"
|
||||||
}
|
}
|
|
@ -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 "$@"
|
|
@ -1,59 +1,97 @@
|
||||||
name: backup
|
name: dbackup
|
||||||
help: backup/mirror a directory using rdiff or rsync
|
help: differential backup using restic
|
||||||
version: 0.1.0
|
version: 0.1.0
|
||||||
|
|
||||||
environment_variables:
|
environment_variables:
|
||||||
- name: BACKUP_EXCLUDE
|
- name: BACKUP_EXCLUDE
|
||||||
help: path to file of excludes
|
help: path to file of excludes
|
||||||
- name: BACKUP_INCLUDE
|
- name: BACKUP_INCLUDE
|
||||||
help: path to directory of includes
|
help: path to directory of includes
|
||||||
|
- name: BACKUP_SETTINGS
|
||||||
|
help: path to default settings file
|
||||||
|
- name: BACKUP_PASSWORD
|
||||||
|
help: path to default settings file
|
||||||
|
- name: BACKUP_SERVER
|
||||||
|
help: URL of Restic rest server
|
||||||
|
- name: BACKUP_DIR
|
||||||
|
help: Backup Directory
|
||||||
|
- name: BACKUP_MOUNT_POINT
|
||||||
|
help: mount point of source if mounted external to host
|
||||||
|
|
||||||
args:
|
args:
|
||||||
- name: source
|
- name: source
|
||||||
# required: 1
|
help: source directory to be backed up, default is $PWD
|
||||||
help: source directory to be backed up, default is $PWD
|
- name: target
|
||||||
- name: target
|
help: "target directory for backup"
|
||||||
help: "target directory for backup"
|
|
||||||
|
|
||||||
flags:
|
flags:
|
||||||
- long: --host
|
- long: --password
|
||||||
short: -h
|
short: -p
|
||||||
arg: thost
|
arg: password
|
||||||
help: host on remote to target to receive backup
|
help: repo password (or file path) for backup repository
|
||||||
- long: --shost
|
- long: --remote
|
||||||
arg: shost
|
short: -r
|
||||||
help: remote to host of source
|
help: backup to a remote machine
|
||||||
- long: --user
|
- long: --server
|
||||||
short: -u
|
arg: url
|
||||||
arg: tuser
|
help: url of restic rest server
|
||||||
help: user on remote host
|
- long: --init
|
||||||
- long: --suser
|
help: initialize repo (default is backup)
|
||||||
arg: suser
|
- long: --snap
|
||||||
help: remote user on source host
|
help: list repo snapshots
|
||||||
- long: --sshcfg
|
- long: --view
|
||||||
arg: sshcfg
|
short: -v
|
||||||
help: path to sshcfg file
|
help: mount snapshot for viewing (default is BACKUP_MOUNT or /opt/backup/view)
|
||||||
- long: --options
|
- long: --view-path
|
||||||
short : -o
|
help: set custom mount point path for viewing of snapshot, --view not required if set
|
||||||
arg: options
|
arg: path
|
||||||
help: rdiff options
|
- long: --prune
|
||||||
- long: --include_file
|
arg: prune
|
||||||
short : -i
|
help: prune repo (default is backup). true for default prune or path to prune settings
|
||||||
arg: options
|
- long: --password
|
||||||
help: rdiff options
|
short: -p
|
||||||
- long: --exclude_file
|
arg: password
|
||||||
short : -e
|
help: repo password (or file path) for backup repository
|
||||||
arg: options
|
- long: --settings
|
||||||
help: rdiff options
|
short: -s
|
||||||
- long: --mirror
|
arg: syaml
|
||||||
short: -m
|
help: path to settings file (yaml). Keys are same as long
|
||||||
help: make a mirror copy instead of a differential snapshot
|
- long: --options
|
||||||
- long: --sudo
|
short: -o
|
||||||
short: -s
|
arg: options
|
||||||
help: run the backup as sudo
|
help: additional options to pass ot underlying command (restic), "quote"
|
||||||
- long: --no-dir
|
- long: --include_file
|
||||||
short: -n
|
short: -i
|
||||||
help: don't make a directory of same name within the target, merge sub directories
|
arg: include
|
||||||
|
help: include file
|
||||||
|
- long: --exclude_file
|
||||||
|
short: -e
|
||||||
|
arg: exclude
|
||||||
|
help: exclude file
|
||||||
|
- long: --sudo
|
||||||
|
help: run the backup as sudo
|
||||||
|
- long: --jq
|
||||||
|
arg: jq
|
||||||
|
help: pipe to jq command
|
||||||
|
|
||||||
|
# - long: --host
|
||||||
|
# short: -h
|
||||||
|
# arg: thost
|
||||||
|
# help: host on remote to target to receive backup
|
||||||
|
# - long: --shost
|
||||||
|
# arg: shost
|
||||||
|
# help: remote to host of source
|
||||||
|
# - long: --user
|
||||||
|
# short: -u
|
||||||
|
# arg: tuser
|
||||||
|
# help: user on remote host
|
||||||
|
# - long: --suser
|
||||||
|
# arg: suser
|
||||||
|
# help: remote user on source host
|
||||||
|
# - long: --sshcfg
|
||||||
|
# arg: sshcfg
|
||||||
|
# help: path to sshcfg file
|
||||||
|
|
||||||
examples:
|
examples:
|
||||||
- backup -m -n -h thost --shost shost -u tuser --suser suser . /target/dir
|
- backup -p password . /target/dir
|
||||||
|
- backup -s /path/to/settings/yaml/file
|
||||||
|
|
|
@ -4,3 +4,4 @@
|
||||||
# CONFIG_FILE=settings.ini
|
# CONFIG_FILE=settings.ini
|
||||||
#
|
#
|
||||||
# Feel free to empty (but not delete) this file.
|
# Feel free to empty (but not delete) this file.
|
||||||
|
echo running initialize function
|
|
@ -1,35 +1,140 @@
|
||||||
echo Running Backup Command
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "running root command"
|
||||||
|
|
||||||
inspect_args
|
inspect_args
|
||||||
|
|
||||||
# module_load ssh
|
# module_load ssh
|
||||||
module_load confirm
|
module_load confirm
|
||||||
|
module_load path
|
||||||
|
|
||||||
local source=${args[source]}
|
local settings=${args[--settings]}
|
||||||
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
|
if [[ $settings ]]; then
|
||||||
echo checking local excludes
|
if [[ -f $settings ]]; then
|
||||||
[[ -f $source/exclude.bac ]] && exclude="$source/exclude.bac"
|
echo loading settings file $settings
|
||||||
# ls $source
|
module_load yaml
|
||||||
# [[ $EXCLUDE_BACKUP ]] && exclude="$BACKUP_EXCLUDE"
|
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
|
fi
|
||||||
|
|
||||||
exclude=$([[ $exclude ]] && echo --exclude-globbing-filelist $exclude)
|
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
|
||||||
|
|
||||||
echo exclude file: $exclude
|
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 ssh="--remote-schema \"ssh -C %s /home/sysadmin/.local/bin/rdiff-backup --server\""
|
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
|
||||||
|
|
||||||
cmd="$sudo rdiff-backup $options $exclude $ssh ${suser}${shost}$source ${tuser}${thost}$target"
|
|
||||||
echo $cmd
|
echo $cmd
|
||||||
confirm run this command? || return 1
|
confirm run this command? || return 1
|
||||||
eval $cmd
|
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
|
|
@ -1,4 +1,4 @@
|
||||||
shopt -s expand_aliases
|
shopt -s expand_aliases
|
||||||
source ../../app/bashly
|
source ../../app/bashly
|
||||||
bashly generate
|
bashly generate
|
||||||
./backup "$@"
|
./dbackup -s /backup/local/jobs/remote/hacking.yml $1
|
|
@ -9,6 +9,7 @@ local exe="/usr/bin/chromium"
|
||||||
[[ ! $exe ]] && echo chromium not installed set && return 1
|
[[ ! $exe ]] && echo chromium not installed set && return 1
|
||||||
user=${CHROMIUM_USER}
|
user=${CHROMIUM_USER}
|
||||||
[[ $1 && ( ! $1 == -* ) ]] && user=$1 && shift
|
[[ $1 && ( ! $1 == -* ) ]] && user=$1 && shift
|
||||||
|
[[ $1 && ( ! $1 == -* ) ]] && url=$1 && shift
|
||||||
user=${user:-$USER}
|
user=${user:-$USER}
|
||||||
if [[ $user == "$USER" ]]; then
|
if [[ $user == "$USER" ]]; then
|
||||||
unset CHROME_CONFIG_HOME
|
unset CHROME_CONFIG_HOME
|
||||||
|
@ -19,7 +20,7 @@ if [[ $user == "$USER" ]]; then
|
||||||
[[ $user == "incognito" ]] && set -- "$@" "-incognito"
|
[[ $user == "incognito" ]] && set -- "$@" "-incognito"
|
||||||
dir=${CHROMIUM_HOME:-$DEFAULT}
|
dir=${CHROMIUM_HOME:-$DEFAULT}
|
||||||
echo "$exe $@ --user-data-dir=$dir/$user"
|
echo "$exe $@ --user-data-dir=$dir/$user"
|
||||||
"$exe" "$@" --user-data-dir="$dir"/"$user"
|
"$exe" "$@" --user-data-dir="$dir"/"$user" $url
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,139 +1,139 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
hugo_install () {
|
hugo_install () {
|
||||||
# inspried from this forum post https://discourse.gohugo.io/t/script-to-install-latest-hugo-release-on-macos-and-ubuntu/14774/10
|
# inspried from this forum post https://discourse.gohugo.io/t/script-to-install-latest-hugo-release-on-macos-and-ubuntu/14774/10
|
||||||
# if you have run into github api anonymous access limits which happens during debugging/dev then add user and token here or sourced from a separate file
|
# if you have run into github api anonymous access limits which happens during debugging/dev then add user and token here or sourced from a separate file
|
||||||
# . ~/githubapitoken
|
# . ~/githubapitoken
|
||||||
#GITHUB_USER=""
|
#GITHUB_USER=""
|
||||||
#GITHUB_TOKEN=""
|
#GITHUB_TOKEN=""
|
||||||
|
|
||||||
if [ "$GITHUB_TOKEN" != "" ]; then
|
if [ "$GITHUB_TOKEN" != "" ]; then
|
||||||
echo using access token with script
|
echo using access token with script
|
||||||
echo $GITHUB_USER $GITHUB_TOKEN
|
echo $GITHUB_USER $GITHUB_TOKEN
|
||||||
fi
|
fi
|
||||||
|
|
||||||
EXTENDED=false
|
EXTENDED=false
|
||||||
FORCE=false
|
FORCE=false
|
||||||
EFILE=""
|
EFILE=""
|
||||||
|
|
||||||
|
|
||||||
# options
|
# options
|
||||||
# e - download and install the extended version
|
# e - download and install the extended version
|
||||||
# c - use 'hugoe' as the install command for extended version otherwise 'hugo' will launch extended version
|
# c - use 'hugoe' as the install command for extended version otherwise 'hugo' will launch extended version
|
||||||
# f - force download/overwrite of same version
|
# f - force download/overwrite of same version
|
||||||
|
|
||||||
declare OPTION
|
declare OPTION
|
||||||
declare OPTARG
|
declare OPTARG
|
||||||
declare OPTIND
|
declare OPTIND
|
||||||
|
|
||||||
while getopts 'ecf' OPTION; do
|
while getopts 'ecf' OPTION; do
|
||||||
case "$OPTION" in
|
case "$OPTION" in
|
||||||
e)
|
e)
|
||||||
echo "installing extended hugo"
|
echo "installing extended hugo"
|
||||||
EXTENDED=true
|
EXTENDED=true
|
||||||
;;
|
;;
|
||||||
c)
|
c)
|
||||||
|
if [ $EXTENDED = true ]; then
|
||||||
|
EFILE="e"
|
||||||
|
echo using hugoe for extended command
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
f)
|
||||||
|
echo "FORCING download/overwrite"
|
||||||
|
FORCE=true
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
shift $(( OPTIND - 1 ))
|
||||||
|
|
||||||
|
DEFAULT_BIN_DIR="/usr/local/bin"
|
||||||
|
# Single optional argument is directory in which to install hugo
|
||||||
|
BIN_DIR=${1:-"$DEFAULT_BIN_DIR"}
|
||||||
|
|
||||||
|
BIN_PATH="$(which hugo$EFILE)"
|
||||||
|
declare -A ARCHES
|
||||||
|
ARCHES=( ["arm64"]="ARM64" ["aarch64"]="ARM64" ["x86_64"]="64bit" ["arm32"]="ARM" ["armhf"]="ARM" )
|
||||||
|
ARCH=$(arch)
|
||||||
|
|
||||||
|
if [ -z "${ARCHES[$ARCH]}" ]; then
|
||||||
|
echo Your machine kernel architecture $ARCH is not supported by this script, aborting
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
INSTALLED="$(hugo$EFILE version 2>/dev/null | cut -d'v' -f2 | cut -c 1-6)"
|
||||||
|
CUR_VERSION=${INSTALLED:-"None"}
|
||||||
|
echo $(curl -u $GITHUB_USER:$GITHUB_TOKEN -s https://api.github.com/repos/gohugoio/hugo/releases/latest | grep tag_name)
|
||||||
|
NEW_VERSION="$(curl -u $GITHUB_USER:$GITHUB_TOKEN -s https://api.github.com/repos/gohugoio/hugo/releases/latest \
|
||||||
|
| grep tag_name \
|
||||||
|
| cut -d'v' -f2 | cut -c 1-6)"
|
||||||
|
|
||||||
|
echo "Hugo `[ $EXTENDED == true ] && echo "Extended"`: Current Version : $CUR_VERSION => New Version: $NEW_VERSION"
|
||||||
|
|
||||||
|
if [ -z "$NEW_VERSION" ]; then
|
||||||
|
echo Unable to retrieve new version number - Likely you have reached github anonymous limit
|
||||||
|
echo set environment variable `$GITHUB_USER` and `$GITHUB_TOKEN` and try again
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
[[ $NEW_VERSION = $CUR_VERSION ]] && [[ $FORCE = false ]] && echo Latest version already installed at $BIN_PATH && return 0
|
||||||
|
|
||||||
|
pushd /tmp/ > /dev/null
|
||||||
|
|
||||||
|
URL=$(curl -u $GITHUB_USER:$GITHUB_TOKEN -s https://api.github.com/repos/gohugoio/hugo/releases/latest \
|
||||||
|
| grep "browser_download_url.*hugo.*._Linux-${ARCHES[$ARCH]}\.tar\.gz" \
|
||||||
|
| \
|
||||||
if [ $EXTENDED = true ]; then
|
if [ $EXTENDED = true ]; then
|
||||||
EFILE="e"
|
grep "_extended"
|
||||||
echo using hugoe for extended command
|
else
|
||||||
fi
|
grep -v "_extended"
|
||||||
;;
|
fi \
|
||||||
f)
|
| cut -d ":" -f 2,3 \
|
||||||
echo "FORCING download/overwrite"
|
| tr -d \" \
|
||||||
FORCE=true
|
)
|
||||||
;;
|
|
||||||
esac
|
echo $URL
|
||||||
done
|
|
||||||
|
echo "Installing version $NEW_VERSION `[ $EXTENDED == true ] && echo "Extended"` "
|
||||||
shift $(( OPTIND - 1 ))
|
echo "This machine's architecture is $ARCH"
|
||||||
|
echo "Downloading Tarball $URL"
|
||||||
DEFAULT_BIN_DIR="/usr/local/bin"
|
|
||||||
# Single optional argument is directory in which to install hugo
|
wget --user=-u $GITHUB_USER --password=$GITHUB_TOKEN -q $URL
|
||||||
BIN_DIR=${1:-"$DEFAULT_BIN_DIR"}
|
|
||||||
|
TARBALL=$(basename $URL)
|
||||||
BIN_PATH="$(which hugo$EFILE)"
|
# TARBALL="$(find . -name "*Linux-${ARCHES[$ARCH]}.tar.gz" 2>/dev/null)"
|
||||||
declare -A ARCHES
|
echo Expanding Tarball, $TARBALL
|
||||||
ARCHES=( ["arm64"]="ARM64" ["aarch64"]="ARM64" ["x86_64"]="64bit" ["arm32"]="ARM" ["armhf"]="ARM" )
|
tar -xzf $TARBALL hugo
|
||||||
ARCH=$(arch)
|
|
||||||
|
chmod +x hugo
|
||||||
if [ -z "${ARCHES[$ARCH]}" ]; then
|
|
||||||
echo Your machine kernel architecture $ARCH is not supported by this script, aborting
|
if [ -w $BIN_DIR ]; then
|
||||||
exit 1
|
echo "Installing hugo to $BIN_DIR"
|
||||||
fi
|
mv hugo -f $BIN_DIR/hugo$EFILE
|
||||||
|
else
|
||||||
|
echo "installing hugo to $BIN_DIR (sudo)"
|
||||||
INSTALLED="$(hugo$EFILE version 2>/dev/null | cut -d'v' -f2 | cut -c 1-6)"
|
sudo mv -f hugo $BIN_DIR/hugo$EFILE
|
||||||
CUR_VERSION=${INSTALLED:-"None"}
|
fi
|
||||||
echo $(curl -u $GITHUB_USER:$GITHUB_TOKEN -s https://api.github.com/repos/gohugoio/hugo/releases/latest | grep tag_name)
|
|
||||||
NEW_VERSION="$(curl -u $GITHUB_USER:$GITHUB_TOKEN -s https://api.github.com/repos/gohugoio/hugo/releases/latest \
|
rm $TARBALL
|
||||||
| grep tag_name \
|
|
||||||
| cut -d'v' -f2 | cut -c 1-6)"
|
popd > /dev/null
|
||||||
|
|
||||||
echo "Hugo `[ $EXTENDED == true ] && echo "Extended"`: Current Version : $CUR_VERSION => New Version: $NEW_VERSION"
|
echo Installing hugo `[ $EXTENDED == true ] && echo "extended"` as hugo$EFILE
|
||||||
|
|
||||||
if [ -z "$NEW_VERSION" ]; then
|
BIN_PATH="$(which hugo$EFILE)"
|
||||||
echo Unable to retrieve new version number - Likely you have reached github anonymous limit
|
|
||||||
echo set environment variable `$GITHUB_USER` and `$GITHUB_TOKEN` and try again
|
if [ -z "$BIN_PATH" ]; then
|
||||||
exit 1
|
printf "WARNING: Installed Hugo Binary in $BIN_DIR is not in your environment path\nPATH=$PATH\n"
|
||||||
fi
|
else
|
||||||
|
if [ "$BIN_DIR/hugo$EFILE" != "$BIN_PATH" ]; then
|
||||||
[[ $NEW_VERSION = $CUR_VERSION ]] && [[ $FORCE = false ]] && echo Latest version already installed at $BIN_PATH && return 0
|
echo "WARNING: Just installed Hugo binary hugo$EFILE to, $BIN_DIR , conflicts with existing Hugo in $BIN_PATH"
|
||||||
|
echo "add $BIN_DIR to path and delete $BIN_PATH"
|
||||||
pushd /tmp/ > /dev/null
|
else
|
||||||
|
echo "--- Installation Confirmation ---"
|
||||||
URL=$(curl -u $GITHUB_USER:$GITHUB_TOKEN -s https://api.github.com/repos/gohugoio/hugo/releases/latest \
|
printf "New Hugo binary version at $BIN_PATH is\n $($BIN_PATH version)\n"
|
||||||
| grep "browser_download_url.*hugo.*._Linux-${ARCHES[$ARCH]}\.tar\.gz" \
|
fi
|
||||||
| \
|
fi
|
||||||
if [ $EXTENDED = true ]; then
|
|
||||||
grep "_extended"
|
|
||||||
else
|
|
||||||
grep -v "_extended"
|
|
||||||
fi \
|
|
||||||
| cut -d ":" -f 2,3 \
|
|
||||||
| tr -d \" \
|
|
||||||
)
|
|
||||||
|
|
||||||
echo $URL
|
|
||||||
|
|
||||||
echo "Installing version $NEW_VERSION `[ $EXTENDED == true ] && echo "Extended"` "
|
|
||||||
echo "This machine's architecture is $ARCH"
|
|
||||||
echo "Downloading Tarball $URL"
|
|
||||||
|
|
||||||
wget --user=-u $GITHUB_USER --password=$GITHUB_TOKEN -q $URL
|
|
||||||
|
|
||||||
TARBALL=$(basename $URL)
|
|
||||||
# TARBALL="$(find . -name "*Linux-${ARCHES[$ARCH]}.tar.gz" 2>/dev/null)"
|
|
||||||
echo Expanding Tarball, $TARBALL
|
|
||||||
tar -xzf $TARBALL hugo
|
|
||||||
|
|
||||||
chmod +x hugo
|
|
||||||
|
|
||||||
if [ -w $BIN_DIR ]; then
|
|
||||||
echo "Installing hugo to $BIN_DIR"
|
|
||||||
mv hugo -f $BIN_DIR/hugo$EFILE
|
|
||||||
else
|
|
||||||
echo "installing hugo to $BIN_DIR (sudo)"
|
|
||||||
sudo mv -f hugo $BIN_DIR/hugo$EFILE
|
|
||||||
fi
|
|
||||||
|
|
||||||
rm $TARBALL
|
|
||||||
|
|
||||||
popd > /dev/null
|
|
||||||
|
|
||||||
echo Installing hugo `[ $EXTENDED == true ] && echo "extended"` as hugo$EFILE
|
|
||||||
|
|
||||||
BIN_PATH="$(which hugo$EFILE)"
|
|
||||||
|
|
||||||
if [ -z "$BIN_PATH" ]; then
|
|
||||||
printf "WARNING: Installed Hugo Binary in $BIN_DIR is not in your environment path\nPATH=$PATH\n"
|
|
||||||
else
|
|
||||||
if [ "$BIN_DIR/hugo$EFILE" != "$BIN_PATH" ]; then
|
|
||||||
echo "WARNING: Just installed Hugo binary hugo$EFILE to, $BIN_DIR , conflicts with existing Hugo in $BIN_PATH"
|
|
||||||
echo "add $BIN_DIR to path and delete $BIN_PATH"
|
|
||||||
else
|
|
||||||
echo "--- Installation Confirmation ---"
|
|
||||||
printf "New Hugo binary version at $BIN_PATH is\n $($BIN_PATH version)\n"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,171 +1,29 @@
|
||||||
#!/bin/bash
|
sudo rclone.bin
|
||||||
|
chmod 775 rclone.bin
|
||||||
rclone_install () {
|
touch $INSTALL_DIR/rclone
|
||||||
|
touch $INSTALL_DIR/rclone.conf
|
||||||
local INSTALL_DIR="/opt"
|
mkdir $INSTALL_DIR/cache 2> /dev/null || true
|
||||||
local BIN_DIR="/opt/bin"
|
echo '#!/bin/bash' > $INSTALL_DIR/rclone
|
||||||
local FORCE=false
|
CMD=$(echo $INSTALL_DIR/rclone.bin \
|
||||||
local VERSION=current
|
--config=$INSTALL_DIR/rclone.conf \
|
||||||
|
--cache-dir=$INSTALL_DIR/cache \
|
||||||
declare OPTION
|
'$@' \
|
||||||
declare OPTARG
|
|
||||||
declare OPTIND
|
|
||||||
|
|
||||||
while getopts 'i:b:v:f' OPTION; do
|
|
||||||
case "$OPTION" in
|
|
||||||
i)
|
|
||||||
INSTALL_DIR=$OPTARG
|
|
||||||
;;
|
|
||||||
b)
|
|
||||||
BIN_DIR=$OPTARG
|
|
||||||
;;
|
|
||||||
|
|
||||||
v)
|
|
||||||
echo "Installing Beta"
|
|
||||||
VERSION=$OPTARG
|
|
||||||
;;
|
|
||||||
f)
|
|
||||||
echo "FORCING download/overwrite"
|
|
||||||
FORCE=true
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
shift $(( OPTIND - 1 ))
|
|
||||||
|
|
||||||
# error codes
|
|
||||||
# 0 - exited without problems
|
|
||||||
# 1 - parameters not supported were used or some unexpected error occurred
|
|
||||||
# 2 - OS or Architecture not supported by this script
|
|
||||||
# 3 - installed version of rclone is up to date
|
|
||||||
# 4 - supported unzip tools are not available
|
|
||||||
# 5 - unable to install without sudo permission
|
|
||||||
|
|
||||||
[[ ! -w "$INSTALL_DIR" ]] && echo $INSTALL is not writable by user $USER, can\'t install there && exit 5
|
|
||||||
[[ ! -w "$BIN_DIR" ]] && echo $BIN_DIR is not writable by user $USER, won\'t be able to link binary there && exit 5
|
|
||||||
INSTALL_DIR=$INSTALL_DIR/rclone
|
|
||||||
# if [[ $EUID != 0 ]]; then
|
|
||||||
# sudo "$0" "$@"
|
|
||||||
# exit $?
|
|
||||||
# fi
|
|
||||||
|
|
||||||
#detect the platform
|
|
||||||
set +e
|
|
||||||
|
|
||||||
OS="`uname`"
|
|
||||||
case $OS in
|
|
||||||
Linux)
|
|
||||||
OS='linux'
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo 'Only Linux OS not supported by this script'
|
|
||||||
exit 2
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
OS_type="`uname -m`"
|
|
||||||
case $OS_type in
|
|
||||||
x86_64|amd64)
|
|
||||||
OS_type='amd64'
|
|
||||||
;;
|
|
||||||
i?86|x86)
|
|
||||||
OS_type='386'
|
|
||||||
;;
|
|
||||||
arm*)
|
|
||||||
OS_type='arm'
|
|
||||||
;;
|
|
||||||
aarch64)
|
|
||||||
OS_type='arm64'
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo 'OS architecture not supported'
|
|
||||||
exit 2
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
#when adding a tool to the list make sure to also add its corresponding command further in the script
|
|
||||||
|
|
||||||
# exit if no unzip tools available
|
|
||||||
[[ -z "unzip" ]] && printf "Please install unzip and try again.\n\n" && exit 4
|
|
||||||
|
|
||||||
# Make sure we don't create a root owned .config/rclone directory #2127
|
|
||||||
# export XDG_CONFIG_HOME=config
|
|
||||||
|
|
||||||
#check installed version of rclone to determine if update is necessary
|
|
||||||
# installed_version=`rclone --version 2>>errors | head -n 1`
|
|
||||||
# if [ -z "${install_beta}" ]; then
|
|
||||||
# current_version=`curl https://downloads.rclone.org/version.txt`
|
|
||||||
# else
|
|
||||||
# current_version=`curl https://beta.rclone.org/version.txt`
|
|
||||||
# fi
|
|
||||||
#
|
|
||||||
# if [ "$version" = "$current_version" ]; then
|
|
||||||
# printf "\nThe latest ${install_beta}version of rclone ${version} is already installed.\n\n"
|
|
||||||
# exit 3
|
|
||||||
# fi
|
|
||||||
|
|
||||||
echo Installing to $INSTALL_DIR
|
|
||||||
mkdir -p $INSTALL_DIR
|
|
||||||
cd $INSTALL_DIR
|
|
||||||
|
|
||||||
# mv rclone.bin rclone.bin.prev
|
|
||||||
|
|
||||||
#create tmp directory and move to it with macOS compatibility fallback
|
|
||||||
# mkdir $INSTALL_DIR/zip
|
|
||||||
# $(mktemp -d -f rclone-zip)
|
|
||||||
# cd $zip_dir
|
|
||||||
|
|
||||||
# echo made temp
|
|
||||||
#download and unzip
|
|
||||||
if [[ $VERSION = "current" ]]; then
|
|
||||||
download_link="https://downloads.rclone.org/rclone-current-$OS-$OS_type.zip"
|
|
||||||
rclone_zip="rclone-current-$OS-$OS_type.zip"
|
|
||||||
else
|
|
||||||
download_link="https://beta.rclone.org/rclone-beta-latest-$OS-$OS_type.zip"
|
|
||||||
rclone_zip="rclone-beta-latest-$OS-$OS_type.zip"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo downloading rclone binary archive $download_link
|
|
||||||
# curl -O $download_link
|
|
||||||
echo expanding archive
|
|
||||||
unzip -j -o -a $rclone_zip
|
|
||||||
mkdir -p $INSTALL_DIR/docs 2> /dev/null || true
|
|
||||||
rm $INSTALL_DIR/docs/*.* 2> /dev/null || true
|
|
||||||
echo moving documentation files to docs/
|
|
||||||
mv *.1 *.txt README.* $INSTALL_DIR/docs/ 2> /dev/null || true
|
|
||||||
# rm *.zip
|
|
||||||
echo preparing customized rclone command
|
|
||||||
rm -rf rclone.bin
|
|
||||||
mv rclone rclone.bin
|
|
||||||
chown :sudo rclone.bin
|
|
||||||
chmod 775 rclone.bin
|
|
||||||
touch $INSTALL_DIR/rclone
|
|
||||||
touch $INSTALL_DIR/rclone.conf
|
|
||||||
mkdir $INSTALL_DIR/cache 2> /dev/null || true
|
|
||||||
echo '#!/bin/bash' > $INSTALL_DIR/rclone
|
|
||||||
CMD=$(echo $INSTALL_DIR/rclone.bin \
|
|
||||||
--config=$INSTALL_DIR/rclone.conf \
|
|
||||||
--cache-dir=$INSTALL_DIR/cache \
|
|
||||||
'$@' \
|
|
||||||
)
|
)
|
||||||
echo "$CMD" >> $INSTALL_DIR/rclone
|
echo "$CMD" >> $INSTALL_DIR/rclone
|
||||||
chown :sudo rclone
|
chown :sudo rclone
|
||||||
chmod 775 rclone
|
chmod 775 rclone
|
||||||
rm $BIN_DIR/rclone
|
rm $BIN_DIR/rclone
|
||||||
ln -s $INSTALL_DIR/rclone $BIN_DIR/rclone
|
ln -s $INSTALL_DIR/rclone $BIN_DIR/rclone
|
||||||
echo -e "rclone customized command can be launched from echo where: $(command -v rclone) \n $CMD"
|
echo -e "rclone customized command can be launched from $(command -v rclone) \n $CMD"
|
||||||
cd ..
|
echo -e "uncustomized rclone can be run from $INSTALL_DIR/rclone.bin"
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
|
||||||
|
#update version variable post install
|
||||||
#update version variable post install
|
version=`rclone --version 2>>errors | head -n 1`
|
||||||
version=`rclone --version 2>>errors | head -n 1`
|
|
||||||
|
printf "\n${last_version} has successfully installed."
|
||||||
printf "\n${version} has successfully installed."
|
printf '\nNow run "rclone config" to set up remotes. Check https://rclone.org/docs/ for more details.\n\n'
|
||||||
printf '\nNow run "rclone config" for setup. Check https://rclone.org/docs/ for more details.\n\n'
|
return 0
|
||||||
exit 0
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Reference in New Issue