# Utility functions function copylastcmd() { echo -n $(fc -ln -1) | wl-copy } function getkernelpkg() { if [[ ${OS_ID} == "arch" ]]; then pacman -Qqo /usr/lib/modules/$(uname -r)/vmlinuz else echo "Unsupported OS" >&2 fi } # function docker() { # # Wrapper for docker command that executes it inside the systemd-nspawn docker container # # This container has our home directory bound, so we should cd to the current directory before running this command # ssh -t dockerbox "env ORIGINALWD=\"$(pwd)\" ~/.local/bin/dockerbox.sh $*" #} function random-xkcd() { blocklist=( "404" "631" # "Anatomy Text", don't want that coming up in public thanks ) link="https://xkcd.com/404/" while (( ${blocklist[(Ie)$(basename $link)]} )); do link=$(curl https://c.xkcd.com/random/comic/ -v |& grep location | cut -d' ' -f3 | sed 's/\r//') done html=$(curl -L ${link/http:/https:} 2>/dev/null) name=$(echo $html | xmllint --html --xpath 'string(//html/body/div[@id="middleContainer"]/div[@id="ctitle"])' - 2>/dev/null) title=$(echo $html | xmllint --html --xpath 'string(//html/body/div[@id="middleContainer"]/div[@id="comic"]/img/@title)' - 2>/dev/null) echo $link echo -e "\033[1;34m$name\033[0m" echo -e "\033[1;33m$title\033[0m" curl $(echo $html | (echo "https:"$(xmllint --html --xpath 'string(//html/body/div[@id="middleContainer"]/div[@id="comic"]/img/@src)' - 2>/dev/null))) 2>/dev/null | feh - } if [[ ${SYSTEM_INFO[Chassis]} == "container" ]]; then DEFAULT_WINDOW_NAME="[ Container Connection ] ${SYSTEM_INFO[PrettyHostname]:-${SYSTEM_INFO[Hostname]}} Console" elif [[ -z "${SSH_CONNECTION+x}" ]]; then DEFAULT_WINDOW_NAME="${SYSTEM_INFO[PrettyHostname]:-${SYSTEM_INFO[Hostname]}} Console" else DEFAULT_WINDOW_NAME="[ Remote Connection ] ${SYSTEM_INFO[PrettyHostname]:-${SYSTEM_INFO[Hostname]}} Console" fi function _rename_window() { echo -ne "\033]0;$@\007" } function _reset_window_name() { _rename_window "$DEFAULT_WINDOW_NAME" } function rename_window() { _rename_window "$@" DEFAULT_WINDOW_NAME="$@" } _rename_window "$DEFAULT_WINDOW_NAME" function ssh-clean() { # Clean up ssh connection sockets for i in $(find ~/.ssh/cm/ -type s); do fname=$(basename $i) conn=$(echo $fname | cut -d- -f2-) user=$(echo $conn | cut -d@ -f1) host=$(echo $conn | cut -d@ -f2 | cut -d: -f1) echo "Closing connection to $user@$host" ssh -O exit -S $i -q _ 2>/dev/null done } function lsssh() { # List active ssh connections for i in $(find ~/.ssh/cm/ -type s); do fname=$(basename $i) conn=$(echo $fname | cut -d- -f2-) user=$(echo $conn | cut -d@ -f1) host=$(echo $conn | cut -d@ -f2 | cut -d: -f1) echo "$user@$host" done } function bwunlock() { # Unlock Bitwarden vault and export session key local bwfd local bwpasswd local secretstore local bwcmd local skipkeyring # Use default Bitwarden account secretstore="bw" bwcmd="bw" skipkeyring=0 while [[ $# -gt 0 ]]; do case $1 in --personal) # Use personal Bitwarden account secretstore="bw-personal" bwcmd="env BITWARDENCLI_APPDATA_DIR=$HOME/.config/bw-cli-personal bw" ;; --debug) # Enable debug output set -x ;; --ask) # Prompt for Bitwarden password skipkeyring=1 ;; *) echo "Unknown option: $1" >&2 ;; esac shift done # Attempt to read Bitwarden password from keyring if ! (( skipkeyring )); then bwpasswd=$(kwallet-query -r bitwarden kdewallet 2>/dev/null) fi if [[ -z "${bwpasswd}" ]]; then # If password is not found in keyring, prompt for it read -s -p "Enter Bitwarden password: " bwpasswd echo fi # Unlock Bitwarden vault and export session key export BW_SESSION=$(eval $bwcmd unlock --raw "'$bwpasswd'" 2>/dev/tty) if [[ -z "${BW_SESSION}" ]]; then echo "Failed to unlock Bitwarden vault" >&2 return 1 else echo "Bitwarden vault unlocked" fi } if type machinectl &>/dev/null; then function su { local user user=$1 if [[ $user == '' ]]; then user=root fi machinectl -q shell "${user}@" } fi alias relog='exec machinectl -q shell "${USER}@"' function urlencode { # credit to https://stackoverflow.com/a/34407620 for the jq solution local multiline=0 if [[ "$1" == "-m" ]] || [[ "$1" == "--multiline" ]]; then # Multiline mode, read directly from stdin multiline=1 shift fi if [[ -z "$1" ]]; then # Read from stdin if (( multiline )); then jq -sRr '@uri' else # Treat each line as a separate argument, and encode them separately for line in $(cat); do echo -n "$line" | jq -sRr '@uri' done fi else # Read from arguments (use echo because arguments may contain spaces and --arg wasn't working) echo -n $@ | jq -sRr '@uri' fi } function ssh-copy-shell { # Copy shell config to the given SSH host local port=22 host while [ $# -gt 0 ]; do case $1 in -p|--port) port=$2 shift ;; --port=*) port=${1/--port=/} ;; *:*) host=${1/:*/} port=${1/*:/} ;; *) host=$1 ;; esac shift done if [[ ${host+x} != x ]]; then echo "Target host is required!" return 1 fi ssh -p ${port} ${host} mkdir -p .config .local/lib # Deploy files sftp -P ${port} ${host} <