diff --git a/load/01-basic b/load/01-basic index 231b727..ec13ffd 100644 --- a/load/01-basic +++ b/load/01-basic @@ -52,4 +52,6 @@ edit() { ${EDITOR:-nano} $@; } gedit() { ${GEDITOR:-xed} $@; } +unlocku () ( faillock --user $1 --reset ) + rsynchg() { rsync --help | grep "\-$1"; } diff --git a/make-module-base b/make-module-base index f2c6d0c..6523156 100755 --- a/make-module-base +++ b/make-module-base @@ -1,2 +1,5 @@ +#!/bin/bash module_load minimize -minimize module.base.src module.base \ No newline at end of file +pushd "$(dirname $(realpath "${BASH_SOURCE:-$0}"))" &> /dev/null || exit +minimize module.base.src module.base +popd &> /dev/null \ No newline at end of file diff --git a/module.base b/module.base index 01f8b9c..61f526e 100644 --- a/module.base +++ b/module.base @@ -4,7 +4,7 @@ local DIR local NAME DIR=$1 NAME=$2 -FILE="$(command find -L ${DIR} -type f -name "${NAME}.mod" -o -name "${NAME}".lib -o -name "${NAME}".func -o -name "${NAME}".sh -o -name "${NAME}".env)" +FILE="$(which find -L ${DIR} -type f -name "${NAME}.mod" -o -name "${NAME}".lib -o -name "${NAME}".func -o -name "${NAME}".sh -o -name "${NAME}".env)" COUNT=0 if [ "$FILE" ]; then COUNT=$(echo $FILE | xargs -n 1 | wc -l) diff --git a/module.base.src b/module.base.src index 03e93c9..629b77f 100644 --- a/module.base.src +++ b/module.base.src @@ -13,7 +13,7 @@ NAME=$2 # TODO use file instead for valid extensions # will look for valid module extensions and also look for duplicate modules with a directory which is not allowed -FILE="$(command find -L ${DIR} -type f -name "${NAME}.mod" -o -name "${NAME}".lib -o -name "${NAME}".func -o -name "${NAME}".sh -o -name "${NAME}".env)" +FILE="$(which find -L ${DIR} -type f -name "${NAME}.mod" -o -name "${NAME}".lib -o -name "${NAME}".func -o -name "${NAME}".sh -o -name "${NAME}".env)" # echo files found $FILE COUNT=0 if [ "$FILE" ]; then diff --git a/modules/utility/cache-trash-log.exc b/modules/utility/cache-trash-log.exc new file mode 100644 index 0000000..3c6a166 --- /dev/null +++ b/modules/utility/cache-trash-log.exc @@ -0,0 +1,7 @@ +*[Tt]rash/ +tmp/* +node_modules/* +*[Cc]ache/* +*[lL]ogs/* +[Ll]og/* +lost+found \ No newline at end of file diff --git a/modules/utility/copy.func b/modules/utility/copy.func new file mode 100644 index 0000000..6df53c2 --- /dev/null +++ b/modules/utility/copy.func @@ -0,0 +1,206 @@ +#!/bin/bash + +export COPY_MODULE_PATH="$(dirname $(realpath "${BASH_SOURCE:-$0}"))" +module_load debug +module_load confirm + +copy () { + + if ! which rsync &> /dev/null; then echo rsync must be installed to use this function; return 6; fi + + local SHOST; local DHOST; local sshargs; local args + local SRC; local DEST; local mirror; local quiet + local SPATH; local DPATH; local exec; local list; local verbose + local usesudo;local cmd;local noconfirm;local merge + + args=() + + help() { + + cat < source destination --- + +Available Script Options +-r, run the command by this script uses --dry-run. When ready pass this flag. +-s, run command as sudo +-l, list the rsync command that will be run instead of running it. removes --dry-run. + great for generating a rsync command to be used elsewhere +-p, make path at destination if need be. careful will creating missing subdirectories +-e, rsync --exclude , as many of these as desired +-m, merge source inside destination instead of making folder at destination, good for changing destination folder name +-M, copy as "mirror" uses options. -a --numeric-ids --delete --delete-excluded --force +-f, rsync --exclude-from , can have multiple +-F, copy a filesystem, uses -M mirror plus -xHAXS, and uses sudo (i.e. -s script option) +-n, no confirm, will always confirm command unless this is set +-q, quiet, suppress progress +-v, verbose, same as -v for rsync option, unset if -q is set +-a, archive, same as -a for rsync option, basic identical copy with recursion +-c, clean tranfer meaning will not transfer folder with trash, cache, log, nodemodules +-C, show excludes for clean transfer +-h, this help text + +source or destination may include a : prefix but not both + +use 'fcopy ' for fast copy uses -r -q -m -n -a +EOF + + } + + # parse sshcp options + local OPTION + local OPTARG + local OPTIND + while getopts 'avMqpf:le:rcCmd:s:hnF' OPTION; do + # echo OPTION $OPTION ARG $OPTARG INDX $OPTIND + case "$OPTION" in + s) + usesudo=sudo + ;; + c) + # clean out unneeded folders like cache, trash, log + args+=("--exclude-from=$COPY_MODULE_PATH/cache-trash-log.exc") + ;; + C) + echo "## clean transfer exclusions found in $COPY_MODULE_PATH/cache-trash-log.exc ##" + cat "$COPY_MODULE_PATH/cache-trash-log.exc" + echo -e "\n##############################################" + return 0 + ;; + q) + quiet=true + ;; + n) + noconfirm=true + ;; + e) + args+=("--exclude=$OPTARG") + ;; + f) + args+=("--exclude-from=$OPTARG") + ;; + F) + args+=("-xHAXS") + mirror=true + usesudo=sudo + ;; + p) + args+=("--mkpath") + ;; + m) + merge=true + ;; + M) + mirror=true + ;; + l) + list=true + ;; + v) + verbose="-v" + ;; + r) + exec=true + ;; + a) + args+=("-a") + ;; + h) + help + return 0 + ;; + *) + >&2 echo fatal: unknown remote script option $OPTION, aborting + help + return 1 + ;; + esac + done + + shift $((OPTIND - 1)) + + [ $# -lt 2 ] && echo both a source and destination need to be passed && return 2 + + # source parse + SRC=$1; shift + if [[ $SRC =~ ":" ]]; then + echo source is remote + SHOST=${SHOST:-$(sed 's/\(.*\):.*/\1/' <<< "$SRC")} + SPATH=$(sed 's/.*:\(.*\)/\1/' <<< "$SRC") + else + # echo source is local + SPATH=$SRC + fi + # destination parse + DEST=$1;shift + if [[ $DEST =~ ":" ]]; then + # echo destination is remote + DHOST=${DHOST:-$(sed 's/\(.*\):.*/\1/' <<< "$DEST")} + DPATH=$(sed 's/.*:\(.*\)/\1/' <<< "$DEST") + else + # echo destination is local + DPATH=$DEST + fi + [[ $DHOST && $SHOST ]] && echo this script can not process remote host to remote host transfer && return 5 + # is source or destination is remote, create -e ssh sync option + if [[ $DHOST || $SHOST ]]; then + if ! module_load ssh &>/dev/null; then + echo unable to load ssh module + echo likely the uci network repo has not been installed + echo to do a remote copy this repo which contains the ssh module + echo "must be installed. Try \"module_load uci-shell-install; install_shell_network\"" + return 6 + fi + if [[ ! $(get_user_host ${DHOST:-$SHOST}) ]]; then + >&2 echo fatal: the host ${DHOST:-$SHOST} is not valid, aborting remote copy + return 1 + fi + # parse ssh arguments from the rest + debug $( ( IFS=$','; echo all arguments: "$*" ) ) + for ((d=1; d<$#; ++d)); do + [[ ${!d} == "---" ]] && break + done + if [[ $d -lt $# ]]; then # if there are extra ssh arguments + debug found --- at $d + sshargs=("${@:$d+1:$#}") + debug $( ( IFS=$','; echo "ssh arguments: ${sshargs[*]}" ) ) + args+=("${@:1:$d-1}") + debug $( ( IFS=$','; echo remaining arguments to parse: "$*" ) ) + else + args+=("${@:1}") + fi + args+=( "$(remove_end_spaces "-e '$(ssh -l "${sshargs[*]}")'")") + fi + + # assemble options + [[ ! $exec ]] && args+=(--dry-run -v) + [[ ! $quiet ]] && args+=(--info=progress2 $verbose) + [[ $mirror ]] && args+=(-a --numeric-ids --delete --delete-excluded --force) + + [[ ! -v PS1 ]] && noconfirm=true + if [[ ! $noconfirm && ! $list ]]; then + if [[ $merge ]]; then + # todo mirror option + confirm The contents within $SPATH will be $([[ $mirror ]] && echo mirrored || echo placed ) inside $DPATH || return 0 + else + confirm the directory $(basename $SPATH) of $SPATH will be $([[ $mirror ]] && echo mirrored || echo put ) at destination $DPATH/$(basename $SPATH)? || return 0 + fi + fi + cmd="$usesudo $(which rsync) ${args[*]} $SRC$([[ $merge ]] && echo "/") $DEST" + [[ $list ]] && echo "$cmd" && return 0 + if [[ ! $quiet ]]; then [[ $exec ]] && echo executing the copy command || echo dry run of command, use -r to execute; fi + if eval $cmd; then + [[ ! $quiet ]] && echo copy success! + debug $cmd + else + >&2 echo remote copy failed + >&2 echo $cmd + return 1 + fi + } + + alias fcopy="copy -r -q -m -n -a " + # for copying chromium profile use + # --exclude=Singleton* + diff --git a/modules/utility/dir.lib b/modules/utility/dir.lib index 9ed5639..97f7a12 100644 --- a/modules/utility/dir.lib +++ b/modules/utility/dir.lib @@ -12,50 +12,6 @@ isDir() { fi } - - -function dir_copy () { - - [[ ! $(command -v rsync) ]] && { echo rsync must be installed to use this function; return 5; } - module_load confirm - local usesudo;local cmd;local src;local noconfirm;local merge - - declare OPTION - declare OPTARG - declare OPTIND - while getopts 'sem' OPTION; do - case "$OPTION" in - s) - usesudo=sudo - ;; - e) - noconfirm=true - ;; - m) - merge=true - ;; - *) - echo unknown option $OPTION - return 1 - ;; - esac - done - -shift $(( OPTIND - 1 )) - -[ $# -ne 2 ] && echo two directories source and destination need to be passed && return 2 -src=$(realpath -s $1) -dest=$(realpath -s $2) -[ ! -d "$src" ] && echo source: $src is not a directory && return 3 -[[ $merge ]] && src=${src}/ -cmd="$usesudo rsync --exclude *[C]ache* --progress -aAru $src $dest" -echo $cmd -[[ ! -v PS1 ]] && noconfirm=true -[[ ! $noconfirm ]] && { confirm Do you want to $([[ $merge ]] && echo merge $src into || echo copy $src within) $dest? || return 0; } -echo copying..... -eval $cmd -} - dir_size () { if sudo ls $1 >/dev/null ; then sudo du -h --apparent-size --max-depth=1 $1 | sort -rh diff --git a/modules/utility/sync.lib b/modules/utility/sync.lib deleted file mode 100644 index 8d33739..0000000 --- a/modules/utility/sync.lib +++ /dev/null @@ -1,92 +0,0 @@ -#!/bin/bash - - mirror_rootfs () { - local boot; local dest; local rootfs; local opts - [[ ! $(command -v rsync) ]] && { echo rsync must be installed to use this function; return 5; } - opts=" --dry-run" - [[ $1 == "--run" ]] && opts="" && shift - [[ $1 == "-v" ]] && opts+=" -v" && shift - [[ $1 == "-o" ]] && opts+=" $2" && shift - - dest=$(realpath -s $1) - rootfs=$2 - - [ ! -d "$dest" ] && echo destination $dest is not a directory && return 3 - [ ! -d "$rootfs/etc" ] && echo not root filesystem at $rootfs && return 3 - - echo making mirror of root filesystem at ${rootfs:-/} to $dest/rootfs - #TODO if destination is btrfs then make snapshot otherwise make directory - sudo btrfs subvol create $dest/rootfs >/dev/null - if sudo rsync -axHAWXS $opts --info=progress2 --numeric-ids --delete --delete-excluded --force --exclude-from="$(rootfs_excludes)" ${rootfs:-/} $dest/rootfs ; then - echo root parition mirror was made to $dest/rootfs - boot=$rootfs/boot - [[ ! $(mountpoint $boot) ]] && boot=$rootfs/boot/efi - [[ ! $(mountpoint $boot) ]] && echo neither $rootfs/boot nor $boot are mountpoints, no boot parition to mirror && return 2 - echo making mirror of boot $boot partition to $dest$boot - sudo btrfs subvol create $dest$boot >/dev/null - if sudo rsync -aHAWXS $opts --info=progress2 --numeric-ids --force --delete $boot/ $dest$boot; then - echo boot partion is mirrored - else - echo unable to sync a copy of $boot, aborted backup - fi - else - echo unable to sync a copy of root file system, backkup failed - fi -} - - rclone () { - local boot; local dest; local src; local opts - [[ ! $(command -v rsync) ]] && { echo rsync must be installed to use this function; return 5; } - opts=" --dry-run" - [[ $1 == "--run" ]] && opts="" && shift - [[ $1 == "-v" ]] && opts+=" -v" && shift - [[ $1 == "-o" ]] && opts+=" $2" && shift - - src=$(realpath $1) - dest=$(realpath $2) - mkdir -p $dest >/dev/null - echo making clone/mirror of $src to $dest - - if [ "$(ls -A $dest)" ]; then - echo WARNING: $dest is not empty but will be erased!, be sure before using --run - # TODO RUN CONFIRM - # if [[ $opt == *"--run"* ]]; then - fi - # if sudo rsync -axHAWXS $opts --info=progress2 --numeric-ids --delete --delete-excluded --force $src/ $dest/ ; then - cmd="sudo rsync -axHAWXS $opts --info=progress2 --numeric-ids --delete --force $src/ $dest/" - echo "$cmd" - if $cmd ; then - echo mirror/clone was successful - else - echo unable to make the clone - fi -} - -rootfs_excludes () { - -local list; local delete -[[ $1 == "-l" ]] && list=true && shift -[[ $1 == "-r" ]] && delete=true && shift -[[ "$1" == "-"* ]] && >&2 echo bad option, aborting && return 1 -rfse=${1:-/tmp/rootfs_excludes.lst} -touch $rfse -[[ $delete ]] && rm $rfse -cat < $rfse -.[Tt]rash* -tmp/* -node_modules -[Cc]ache/* -logs/* -log/* -lost+found -EOF -if [[ $list ]];then - cat $rfse; rm -f $rfse - else - echo $rfse -fi -} - -mountpoints () { -cat /proc/mounts | cut -d ' ' -f2 | sort -} \ No newline at end of file