220 lines
5.3 KiB
Plaintext
220 lines
5.3 KiB
Plaintext
_sod() {
|
|
if [ -d "$1" ] && [ -n "$(ls "$1")" ]; then
|
|
for FILENAME in $(ls "$1" | sort -n)
|
|
do
|
|
source "$1/$FILENAME"
|
|
done
|
|
fi
|
|
}
|
|
|
|
lt() {
|
|
du -h "${1:-.}" 2>/dev/null | sort -h | tac
|
|
}
|
|
|
|
destroy() {
|
|
test -n "$1" || return 1
|
|
test -e "$1" || return 1
|
|
|
|
echo -n "Sure want to destroy file '$1' with size $(du -hs "$1" | awk '{printf $1}') [y/N] "
|
|
read -r response
|
|
[[ $response == [yY] ]] && shred -zun 25 "$1"
|
|
}
|
|
|
|
workon() {
|
|
source /opt/pythonenv/"${1:-$(basename $PWD)}"/bin/activate
|
|
}
|
|
|
|
py() {
|
|
if [[ -z "$@" && -x "$(command -v ipython 2>/dev/null)" ]]; then
|
|
ipython -i -c "q = exit"
|
|
else
|
|
python3 $@
|
|
fi
|
|
}
|
|
|
|
ve() {
|
|
python3 -m virtualenv "${1:-venv}" && . "${1:-venv}/bin/activate"
|
|
}
|
|
|
|
va() {
|
|
local activate_venv
|
|
|
|
if [ -f "./venv/bin/activate" ]; then
|
|
source "./venv/bin/activate"
|
|
return 0
|
|
fi
|
|
|
|
activate_venv="$(find -P . -maxdepth 3 -type f -wholename '*/bin/activate' | sort | head -n 1)"
|
|
|
|
if [ -n "$activate_venv" ]; then
|
|
source "$activate_venv"
|
|
return 0
|
|
else
|
|
echo "va: error: virtual environment not found, use python3 -m virtualenv venv" >&2
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
|
|
extract() {
|
|
if [ -z "$1" ]; then # if string non-zero
|
|
# display usage if no parameters given
|
|
echo "extract: error: usage: extract <path/file_name>.<zip|rar|bz2|gz|tar|tbz2|tgz|Z|7z|xz|ex|tar.bz2|tar.gz|tar.xz>"
|
|
return 2
|
|
fi
|
|
|
|
if ! [ -f "$1" ]; then # if file not exist
|
|
echo "extract: error: '$1' file does not exist" >&2
|
|
return 1
|
|
fi
|
|
|
|
local NAME
|
|
NAME=${1%%.*} # removes extension from filename
|
|
|
|
|
|
if [ -e "$NAME" ]; then
|
|
echo "extract: error: '$NAME' exists" >&2
|
|
return 1
|
|
fi
|
|
|
|
mkdir "$NAME" && cd "$NAME" || return 1
|
|
|
|
case $1 in
|
|
*.tar.bz2) tar xjf ../"$1" ;;
|
|
*.tar.gz) tar xzf ../"$1" ;;
|
|
*.tar.xz) tar xJf ../"$1" ;;
|
|
*.lzma) unlzma ../"$1" ;;
|
|
*.bz2) bunzip2 ../"$1" ;;
|
|
*.rar) unrar x -ad ../"$1" ;;
|
|
*.gz) gunzip ../"$1" ;;
|
|
*.tar) tar xf ../"$1" ;;
|
|
*.tbz2) tar xjf ../"$1" ;;
|
|
*.tgz) tar xzf ../"$1" ;;
|
|
*.zip) unzip ../"$1" ;;
|
|
*.Z) uncompress ../"$1" ;;
|
|
*.7z) 7z x ../"$1" ;;
|
|
*.xz) unxz ../"$1" ;;
|
|
*.exe) cabextract ../"$1" ;;
|
|
*) echo "extract: error: '$1' - unknown archive method" >&2 ;;
|
|
esac
|
|
cd ..
|
|
}
|
|
|
|
|
|
mcd() {
|
|
if [ -z "$1" ]; then
|
|
cd "$(mktemp -d)"
|
|
else
|
|
mkdir -p "$1" && cd "$1"
|
|
fi
|
|
}
|
|
|
|
|
|
# toggle wireguard vpn with interface /etc/wireguard/wg0.conf
|
|
# to allow sudo user toggle vpn without password:
|
|
## sudo groupadd wireguard
|
|
## sudo usermod -aG wireguard $USER
|
|
vpn() {
|
|
local STATUS SERVICE CONFIG CONFIGFILE
|
|
CONFIG="${1:-wg0}"
|
|
|
|
CONFIGFILE="/etc/wireguard/$CONFIG.conf"
|
|
|
|
test -e "$CONFIGFILE" || (echo "Config '$CONFIGFILE' not exists" >&2; return 1) && (
|
|
|
|
SERVICE="wg-quick@$CONFIG.service"
|
|
|
|
systemctl --quiet is-active "$SERVICE" && \
|
|
(sudo systemctl stop "$SERVICE" && echo DOWN) || \
|
|
(sudo systemctl start "$SERVICE" && ip -br a | grep "$CONFIG" | awk '{print $1":\t"$3}')
|
|
)
|
|
}
|
|
|
|
toggle-ssh-proxy() {
|
|
SSH_PROXY_CONTROL_FILE="$XDG_RUNTIME_DIR/ssh_$1_proxy.control"
|
|
|
|
if [ -z "$1" ]; then
|
|
echo "Proxy ssh server hostname not specified" 1>&2
|
|
return 1
|
|
fi
|
|
|
|
if [ -e "$SSH_PROXY_CONTROL_FILE" ]; then
|
|
unset {http,https,ftp,rsync,no}_proxy
|
|
ssh -S "$SSH_PROXY_CONTROL_FILE" -O exit "$1"
|
|
unset SSH_PROXY_PID
|
|
echo "Disabled"
|
|
else
|
|
ssh -nCTN -S "$SSH_PROXY_CONTROL_FILE" -D 1080 "$1"
|
|
export {http,https,ftp,rsync}_proxy="socks5://127.0.0.1:1080" && \
|
|
export no_proxy="localhost,127.0.0.1/8,localaddress,.localdomain.com,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12"
|
|
echo "Enabled"
|
|
fi
|
|
}
|
|
|
|
open() {
|
|
test -e $1 || return 1
|
|
nohup xdg-open $1 1>/dev/null 2>&1 &
|
|
}
|
|
|
|
split-file() {
|
|
test -e "$1" || return 1
|
|
local _size="${2:-1G}"
|
|
|
|
if [ -d "$1" ]; then
|
|
(mkdir "$1.tar.gz.splitted" && cd "$1.tar.gz.splitted" && tar -cz "../$1" | split -d -b "$_size")
|
|
else
|
|
(mkdir "$1.splitted" && cd "$1.splitted" && split -d -b "$_size" "../$1")
|
|
fi
|
|
}
|
|
|
|
json() {
|
|
if [ -t 0 ]; then # argument
|
|
python -m json.tool <<< "$*"
|
|
else # pipe
|
|
python -m json.tool
|
|
fi
|
|
}
|
|
|
|
_get_full_file_extension() {
|
|
local filename
|
|
filename=$(basename "$1")
|
|
if [ "${filename:0:1}" = "." ]; then
|
|
filename="${filename:1}"
|
|
fi
|
|
echo ${filename#*.}
|
|
}
|
|
|
|
rmt() {
|
|
local TRASH
|
|
TRASH=~/.trash
|
|
|
|
local filename
|
|
for filename in $*
|
|
do
|
|
local filename_out_path="${TRASH}$(realpath "$filename")"
|
|
mkdir -p "$(dirname "$filename_out_path")"
|
|
mv "$filename" "${filename_out_path}_$(date +%s)"
|
|
done
|
|
}
|
|
|
|
showtips() {
|
|
TIPS_DIR="$HOME/.tips"
|
|
|
|
if [ ! -d "$TIPS_DIR" ]; then
|
|
mkdir "$TIPS_DIR" 2>/dev/null
|
|
git init "$TIPS_DIR"
|
|
fi
|
|
|
|
cat "$TIPS_DIR"/* 2>/dev/null
|
|
return 0
|
|
}
|
|
|
|
most-often-commands() {
|
|
history 0 | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn
|
|
}
|
|
|
|
# calculator
|
|
= () {
|
|
echo "$*" | bc -l
|
|
}
|