diff --git a/achar b/achar new file mode 100644 index 0000000..3e529b5 --- /dev/null +++ b/achar @@ -0,0 +1,602 @@ +## Title : ACHAR - Auto Completion of Hosts Add/Remove script +## Version : 0.1 +## GIT Repo : https://git.zaks.web.za/zaks-web/achar +## Author : Ze'ev Schurmann +## Company : ZAKS Web +## Website : https://www.zaks.web.za/ +## Reddit : https://www.reddit.com/r/ZAKSWeb +## License : GPL3 or Later +## Description: This tool allows for the management of bash auto completion of +## hostnames when using SSH or RSync in Bash. +## +## USAGE +## +## From the bash terminal, type: +## $ achar {command} {hostname} +## +## COMMANDS +## +## add - adds a host to your list of common hosts +## $ achar add username@hostname.domainname.tld +## $ achar add username@1.2.3.4 +## +## disable - disables auto completion of hostnames for current system user +## $ achar disable +## +## enable - enables auto completion of hostnames for current system user +## $ achar enable +## +## help - displays this block of text +## $ achar help +## +## list - list all existing hosts from your list of common hosts +## $ achar list +## * You can use grep to search for a specific hostname or part there of +## $ achar list | grep username +## $ achar list | grep hostname +## +## remove - removes an existing host from your list of common hosts +## $ achar rem username@hostname.domainname.tld +## $ achar rem username@1.2.3.4 +## +## update - checks for an update to ACHAR and prompts you to install it +## $ achar update + +bashrc_array=("# enable host autocompletion for ssh and rsync" "[ -f ~/.achar/completions ] && [ -f ~/.achar/hosts ] && . ~/.achar/completions") +completions_array=("# Include existing rsync completions" ". /usr/share/bash-completion/completions/rsync" "" "# Include existing ssh completions" ". /usr/share/bash-completion/completions/ssh" "" "# Function to add custom user@hostname completions" "_custom_hosts()" "{" " local cur=\"\${COMP_WORDS[COMP_CWORD]}\"" " local hosts=\$(cat ~/.achar/hosts)" " COMPREPLY=( \$(compgen -W \"\$hosts\" -- \"\$cur\") )" "}" "" "# Function to handle extended rsync completions" "_extended_rsync_completions()" "{" " local cur=\"\${COMP_WORDS[COMP_CWORD]}\"" "" " # Use custom host completions if '@' is detected" " if [[ \"\$cur\" == *@* ]]; then" " _custom_hosts" " else" " # Fallback to default rsync completion" " _rsync" " fi" "}" "" "# Extend the existing ssh completion function to include custom hosts" "_extended_ssh_completions()" "{" " local cur=\"\${COMP_WORDS[COMP_CWORD]}\"" "" " # Use custom host completions if '@' is detected" " if [[ \"\$cur\" == *@* ]]; then" " _custom_hosts" " else" " # Fallback to default ssh completion" " _ssh" " fi" "}" "" "# Preserve the original rsync completion function" "if declare -F _rsync &>/dev/null; then" " complete -r rsync" " complete -F _extended_rsync_completions rsync" "fi" "" "# Preserve the original ssh completion function" "if declare -F _ssh &>/dev/null; then" " complete -r ssh" " complete -F _extended_ssh_completions ssh" "fi") +completions_md5="a148257d1f32705ef2c1f292e72d528c" + +function achar_add { + + local username_and_hostname + + username_and_hostname=$1 + + validate_achar_installation hosts + + validate_host "$username_and_hostname" + + if [[ -z $(cat ~/.achar/hosts | grep "$username_and_hostname") ]]; then + + echo $username_and_hostname >> ~/.achar/hosts + + else + + echo "$username_and_hostname is already added!" >&2 + + exit 1 + + fi + +} + +function achar_disable { + + validate_achar_installation disabled + + rm ~/.achar/completions + + for ((i=0; i<${#bashrc_array[@]}; i++)); do + + line=$(echo "${bashrc_array[$i]}" | sed 's/[]\/$*.^|[]/\\&/g') + sed -i "/^$line$/d" ~/.bashrc + + done + + echo "Please start a new Bash Terminal Session for the change to take affect." + +} + +function achar_enable { + + validate_achar_installation enabled + + if [[ ! -d ~/.achar ]]; then + + mkdir ~/.achar + + fi + + if [[ ! -f ~/.achar/hosts ]]; then + + touch ~/.achar/hosts + + fi + + touch ~/.achar/completions + + for ((i=0; i<${#completions_array[@]}; i++)); do + + echo "${completions_array[$i]}" >> ~/.achar/completions + + done + + for ((i=0; i<${#bashrc_array[@]}; i++)); do + + echo "${bashrc_array[$i]}" >> ~/.bashrc + + done + + echo "Please start a new Bash Terminal Session for the change to take affect." + +} + +function achar_help { + + local script_path + + script_path="${BASH_SOURCE[0]}" + echo + + while read -r line; do + + if [[ ${line:0:2} == "##" ]]; then + + echo "${line:3}" + + else + + echo + exit 0 + + fi + + done < "$script_path" + +} + +function achar_license { + + echo + + curl -s https://git.zaks.web.za/zaks-web/achar/raw/branch/main/LICENSE | fmt + + if [[ $? != 0 ]]; then + + echo "Could not get the license file." >&2 + echo "Either you are not connected to the Internet or the update server is down." >&2 + exit 1 + + fi + + echo + +} + +function achar_list { + + validate_achar_installation hosts + + if [[ -z $1 ]]; then + + cat ~/.achar/hosts | sort + + else + + cat ~/.achar/hosts | grep "$1" | sort + + fi + +} + +function achar_remove { + + local username_and_hostname + + username_and_hostname=$1 + validate_achar_installation hosts + validate_host $username_and_hostname + + if [[ -z $(cat ~/.achar/hosts | grep "$username_and_hostname") ]]; then + + echo "$username_and_hostname is not there!" >&2 + exit 1 + + else + + sed -i "/^$username_and_hostname$/d" ~/.achar/hosts + + fi + +} + +function achar_reset { + + validate_achar_installation hosts + + rm ~/.achar/hosts + + touch ~/.achar/hosts + +} + +function achar_uninstall { + + local script_path + local text + + script_path="${BASH_SOURCE[0]}" + + if [[ $(whoami) == "root" ]]; then + + echo "You are about to uninstall ACHAR." + echo + echo "If you want to disable the autocompletions, then" + echo "you must run \"achar disable\" for each user." + echo + echo "Press ENTER to continue or CTRL+C to STOP!" + read text + + rm $script_path + + else + + echo "Please run with root privilages (sudo) in order to uninstall." + exit 1 + + fi + +} + +function achar_update { + + local difference + local script_path + local stable_version_number + local -a stable_version_number_array + local test_stable + local test_version + local update_available + local -a version_line + local version_number + local -a version_number_array + + script_path="${BASH_SOURCE[0]}" + version_line=($(grep '^## Version' "$script_path")) + version_number=${version_line[3]} + stable_version_number=$(curl -s https://git.zaks.web.za/zaks-web/achar/raw/branch/main/stable_version) + + if [[ $? != 0 ]]; then + echo "Could not check for latest version." >&2 + echo "Either you are not connected to the Internet or the update server is down." >&2 + exit 1 + fi + + oldIFS=$IFS + IFS="." + version_number_array=($version_number) + stable_version_number_array=($stable_version_number) + IFS=$oldIFS + + if [[ ${#version_number_array[@]} -gt ${#stable_version_number_array[@]} ]]; then + + difference=$((${#version_number_array[@]}-${#stable_version_number_array[@]})) + + for ((i=0; i<$differnce; i++)); do + + $stable_version_number_array[${#stable_version_number_array[@]}]=0 + + done + + elif [[ ${#stable_version_number_array[@]} -gt ${#version_number_array[@]} ]]; then + + difference=$((${#version_number_array[@]}-${#stable_version_number_array[@]})) + + for ((i=0; i<$differnce; i++)); do + + $stable_version_number_array[${#stable_version_number_array[@]}]=0 + + done + + fi + + echo "current version is $version_number" + echo "latest version is $stable_version_number" + update_available="false" + + for ((i=0; i<${#version_number_array[@]}; i++)); do + + if [[ $update_available == "false" ]]; then + + test_stable=${stable_version_number_array[$i]##+(0)} + test_version=${version_number_array[$i]##+(0)} + + if [[ -z $test_stable ]]; then + + test_stable=0 + + fi + + if [[ -z $test_version ]]; then + + test_version=0 + + fi + + if [[ ${#stable_version_number_array[@]} -gt ${#version_number_array[@]} ]]; then + + update_available="true" + + fi + + fi + + done + + if [[ $update_available == "true" ]]; then + + echo "Update is avaiable!" + + else + + echo "You currently have the latest version!" + + fi + +} + +function validate_achar_installation { + + local achar_installation_error_code="" + local what_test + + what_test=$1 + + if [[ -d ~/.achar ]]; then + + achar_installation_error_code="A$achar_installation_error_code" + + else + + achar_installation_error_code="a$achar_installation_error_code" + + fi + + if [[ -f ~/.achar/hosts ]]; then + + achar_installation_error_code="H$achar_installation_error_code" + + else + + achar_installation_error_code="h$achar_installation_error_code" + + fi + + if [[ -f ~/.achar/completions ]]; then + + md5_test=$(cat ~/.achar/completions | md5sum) + + if [[ ${md5_test:0:32} == $completions_md5 ]]; then + + achar_installation_error_code="C$achar_installation_error_code" + + else + + echo "File corrupt: ~/.achar/completions" >&2 + + exit 1 + + fi + + else + + achar_installation_error_code="c$achar_installation_error_code" + + fi + + test=$(echo "${bashrc_array[1]}" | sed 's/[]\/$*.^|[]/\\&/g') + + if [[ -z $(cat ~/.bashrc | grep "${bashrc_array[0]}") ]] || [[ -z $(cat ~/.bashrc | grep "$test") ]]; then + + achar_installation_error_code="b$achar_installation_error_code" + + else + + achar_installation_error_code="B$achar_installation_error_code" + + fi + + if [[ $achar_installation_error_code == "BCHA" ]] && [[ $what_test == "enabled" ]]; then + + echo "ACHAR is already enabled!" + exit 1 + + elif [[ $achar_installation_error_code == "bcha" ]] && [[ $what_test == "disabled" ]]; then + + echo "ACHAR is already disabled!" + exit 1 + + elif [[ $achar_installation_error_code == "bcHA" ]] && [[ $what_test == "disabled" ]]; then + + echo "ACHAR is already disabled!" + exit 1 + + elif [[ $achar_installation_error_code == "bcha" ]] && [[ -z $what_test ]]; then + + echo "ACHAR is disabled!" + exit 1 + + elif [[ $achar_installation_error_code == "bcha" ]] && [[ $what_test == "hosts" ]]; then + + echo "ACHAR is disabled!" + exit 1 + + elif [[ $achar_installation_error_code != "BCHA" ]] && [[ $achar_installation_error_code != "bcha" ]] && [[ -z $what_test ]]; then + + echo "Something is wrong with your setup!" >&2 + + if [[ ${achar_installation_error_code:0:1} == "b" ]]; then + + echo "Required code missing from ~/.bashrc" >&2 + + fi + + if [[ ${achar_installation_error_code:1:1} == "c" ]]; then + + echo "File missing: ~/.achar/completions" >&2 + + fi + + if [[ ${achar_installation_error_code:2:1} == "h" ]]; then + + echo "File missing: ~/.achar/hosts" >&2 + + fi + + if [[ ${achar_installation_error_code:3:1} == "a" ]]; then + + echo "Folder missing: ~/.achar/" >&2 + + fi + + exit 1 + + fi + +} + +function validate_host { + + local hostname + local -a temp_array + local username_and_hostname + local username + + if [[ -z $1 ]]; then + + echo "Unexpected Error!" + + exit 1 + + fi + + username_and_hostname="$1" + temp_array=($username_and_hostname) + + if [[ ${#temp_array[@]} != 1 ]]; then + + echo "Invalid Hostname!" + + exit 1 + + fi + + old_ifs=$IFS + IFS="@" + temp_array=($username_and_hostname) + IFS=$old_ifs + + if [[ ${#temp_array[@]} != 2 ]]; then + + echo "Invalid Hostname!" + + exit 1 + + fi + + username=${temp_array[0]} + hostname=${temp_array[1]} + + if [[ $hostname =~ ^([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$ ]]; then + + donothing=0 + + elif nslookup "$hostname" > /dev/null 2>&1; then + + donothing=0 + + else + + echo "Hostname is not an valid!" + + exit 1 + + fi + + if [[ ${username:0:1} =~ ^[0-9]$ ]] || [[ ! $username =~ ^[A-Za-z0-9_.-]+$ ]]; then + + echo "Username is not a valid format!" + + exit 1 + + fi + +} + +if [[ -z $1 ]]; then + + achar_help + +elif [[ ${1,,} == "add" ]]; then + + if [[ -z $2 ]]; then + + echo "Please include a username@hostname" >&2 + exit 1 + + else + + achar_add $2 + + fi + +elif [[ ${1,,} == "disable" ]]; then + + achar_disable + +elif [[ ${1,,} == "enable" ]]; then + + achar_enable + +elif [[ ${1,,} == "help" ]]; then + + achar_help + +elif [[ ${1,,} == "license" ]]; then + + achar_license + +elif [[ ${1,,} == "list" ]]; then + + if [[ -z $2 ]]; then + + achar_list + + else + + achar_list $2 + + fi + +elif [[ ${1,,} == "remove" ]]; then + + if [[ -z $2 ]]; then + + echo "Please include a username@hostname" >&2 + exit 1 + + else + + achar_remove $2 + + fi + +elif [[ ${1,,} == "reset" ]]; then + + achar_reset + +elif [[ ${1,,} == "uninstall" ]]; then + + achar_uninstall + +elif [[ ${1,,} == "update" ]]; then + + achar_update + +else + + achar_help + +fi + +exit 0 diff --git a/install b/install new file mode 100644 index 0000000..12a0335 --- /dev/null +++ b/install @@ -0,0 +1,22 @@ +#!/bin/bash + +if [[ $(whoami) == "root" ]]; then + + if [[ -f /usr/bin/achar ]]; then + + echo "Something is already installed at /usr/bin/achar!" + exit 1 + + else + + curl -o /usr/bin/achar https://git.zaks.web.za/zaks-web/achar/raw/branch/main/achar + chmod +x /usr/bin/achar + + fi + +else + + echo "Please run with root privilages (sudo) in order to install to /usr/bin" + exit 1 + +fi diff --git a/src/achar.sh b/src/achar.sh new file mode 100644 index 0000000..3e529b5 --- /dev/null +++ b/src/achar.sh @@ -0,0 +1,602 @@ +## Title : ACHAR - Auto Completion of Hosts Add/Remove script +## Version : 0.1 +## GIT Repo : https://git.zaks.web.za/zaks-web/achar +## Author : Ze'ev Schurmann +## Company : ZAKS Web +## Website : https://www.zaks.web.za/ +## Reddit : https://www.reddit.com/r/ZAKSWeb +## License : GPL3 or Later +## Description: This tool allows for the management of bash auto completion of +## hostnames when using SSH or RSync in Bash. +## +## USAGE +## +## From the bash terminal, type: +## $ achar {command} {hostname} +## +## COMMANDS +## +## add - adds a host to your list of common hosts +## $ achar add username@hostname.domainname.tld +## $ achar add username@1.2.3.4 +## +## disable - disables auto completion of hostnames for current system user +## $ achar disable +## +## enable - enables auto completion of hostnames for current system user +## $ achar enable +## +## help - displays this block of text +## $ achar help +## +## list - list all existing hosts from your list of common hosts +## $ achar list +## * You can use grep to search for a specific hostname or part there of +## $ achar list | grep username +## $ achar list | grep hostname +## +## remove - removes an existing host from your list of common hosts +## $ achar rem username@hostname.domainname.tld +## $ achar rem username@1.2.3.4 +## +## update - checks for an update to ACHAR and prompts you to install it +## $ achar update + +bashrc_array=("# enable host autocompletion for ssh and rsync" "[ -f ~/.achar/completions ] && [ -f ~/.achar/hosts ] && . ~/.achar/completions") +completions_array=("# Include existing rsync completions" ". /usr/share/bash-completion/completions/rsync" "" "# Include existing ssh completions" ". /usr/share/bash-completion/completions/ssh" "" "# Function to add custom user@hostname completions" "_custom_hosts()" "{" " local cur=\"\${COMP_WORDS[COMP_CWORD]}\"" " local hosts=\$(cat ~/.achar/hosts)" " COMPREPLY=( \$(compgen -W \"\$hosts\" -- \"\$cur\") )" "}" "" "# Function to handle extended rsync completions" "_extended_rsync_completions()" "{" " local cur=\"\${COMP_WORDS[COMP_CWORD]}\"" "" " # Use custom host completions if '@' is detected" " if [[ \"\$cur\" == *@* ]]; then" " _custom_hosts" " else" " # Fallback to default rsync completion" " _rsync" " fi" "}" "" "# Extend the existing ssh completion function to include custom hosts" "_extended_ssh_completions()" "{" " local cur=\"\${COMP_WORDS[COMP_CWORD]}\"" "" " # Use custom host completions if '@' is detected" " if [[ \"\$cur\" == *@* ]]; then" " _custom_hosts" " else" " # Fallback to default ssh completion" " _ssh" " fi" "}" "" "# Preserve the original rsync completion function" "if declare -F _rsync &>/dev/null; then" " complete -r rsync" " complete -F _extended_rsync_completions rsync" "fi" "" "# Preserve the original ssh completion function" "if declare -F _ssh &>/dev/null; then" " complete -r ssh" " complete -F _extended_ssh_completions ssh" "fi") +completions_md5="a148257d1f32705ef2c1f292e72d528c" + +function achar_add { + + local username_and_hostname + + username_and_hostname=$1 + + validate_achar_installation hosts + + validate_host "$username_and_hostname" + + if [[ -z $(cat ~/.achar/hosts | grep "$username_and_hostname") ]]; then + + echo $username_and_hostname >> ~/.achar/hosts + + else + + echo "$username_and_hostname is already added!" >&2 + + exit 1 + + fi + +} + +function achar_disable { + + validate_achar_installation disabled + + rm ~/.achar/completions + + for ((i=0; i<${#bashrc_array[@]}; i++)); do + + line=$(echo "${bashrc_array[$i]}" | sed 's/[]\/$*.^|[]/\\&/g') + sed -i "/^$line$/d" ~/.bashrc + + done + + echo "Please start a new Bash Terminal Session for the change to take affect." + +} + +function achar_enable { + + validate_achar_installation enabled + + if [[ ! -d ~/.achar ]]; then + + mkdir ~/.achar + + fi + + if [[ ! -f ~/.achar/hosts ]]; then + + touch ~/.achar/hosts + + fi + + touch ~/.achar/completions + + for ((i=0; i<${#completions_array[@]}; i++)); do + + echo "${completions_array[$i]}" >> ~/.achar/completions + + done + + for ((i=0; i<${#bashrc_array[@]}; i++)); do + + echo "${bashrc_array[$i]}" >> ~/.bashrc + + done + + echo "Please start a new Bash Terminal Session for the change to take affect." + +} + +function achar_help { + + local script_path + + script_path="${BASH_SOURCE[0]}" + echo + + while read -r line; do + + if [[ ${line:0:2} == "##" ]]; then + + echo "${line:3}" + + else + + echo + exit 0 + + fi + + done < "$script_path" + +} + +function achar_license { + + echo + + curl -s https://git.zaks.web.za/zaks-web/achar/raw/branch/main/LICENSE | fmt + + if [[ $? != 0 ]]; then + + echo "Could not get the license file." >&2 + echo "Either you are not connected to the Internet or the update server is down." >&2 + exit 1 + + fi + + echo + +} + +function achar_list { + + validate_achar_installation hosts + + if [[ -z $1 ]]; then + + cat ~/.achar/hosts | sort + + else + + cat ~/.achar/hosts | grep "$1" | sort + + fi + +} + +function achar_remove { + + local username_and_hostname + + username_and_hostname=$1 + validate_achar_installation hosts + validate_host $username_and_hostname + + if [[ -z $(cat ~/.achar/hosts | grep "$username_and_hostname") ]]; then + + echo "$username_and_hostname is not there!" >&2 + exit 1 + + else + + sed -i "/^$username_and_hostname$/d" ~/.achar/hosts + + fi + +} + +function achar_reset { + + validate_achar_installation hosts + + rm ~/.achar/hosts + + touch ~/.achar/hosts + +} + +function achar_uninstall { + + local script_path + local text + + script_path="${BASH_SOURCE[0]}" + + if [[ $(whoami) == "root" ]]; then + + echo "You are about to uninstall ACHAR." + echo + echo "If you want to disable the autocompletions, then" + echo "you must run \"achar disable\" for each user." + echo + echo "Press ENTER to continue or CTRL+C to STOP!" + read text + + rm $script_path + + else + + echo "Please run with root privilages (sudo) in order to uninstall." + exit 1 + + fi + +} + +function achar_update { + + local difference + local script_path + local stable_version_number + local -a stable_version_number_array + local test_stable + local test_version + local update_available + local -a version_line + local version_number + local -a version_number_array + + script_path="${BASH_SOURCE[0]}" + version_line=($(grep '^## Version' "$script_path")) + version_number=${version_line[3]} + stable_version_number=$(curl -s https://git.zaks.web.za/zaks-web/achar/raw/branch/main/stable_version) + + if [[ $? != 0 ]]; then + echo "Could not check for latest version." >&2 + echo "Either you are not connected to the Internet or the update server is down." >&2 + exit 1 + fi + + oldIFS=$IFS + IFS="." + version_number_array=($version_number) + stable_version_number_array=($stable_version_number) + IFS=$oldIFS + + if [[ ${#version_number_array[@]} -gt ${#stable_version_number_array[@]} ]]; then + + difference=$((${#version_number_array[@]}-${#stable_version_number_array[@]})) + + for ((i=0; i<$differnce; i++)); do + + $stable_version_number_array[${#stable_version_number_array[@]}]=0 + + done + + elif [[ ${#stable_version_number_array[@]} -gt ${#version_number_array[@]} ]]; then + + difference=$((${#version_number_array[@]}-${#stable_version_number_array[@]})) + + for ((i=0; i<$differnce; i++)); do + + $stable_version_number_array[${#stable_version_number_array[@]}]=0 + + done + + fi + + echo "current version is $version_number" + echo "latest version is $stable_version_number" + update_available="false" + + for ((i=0; i<${#version_number_array[@]}; i++)); do + + if [[ $update_available == "false" ]]; then + + test_stable=${stable_version_number_array[$i]##+(0)} + test_version=${version_number_array[$i]##+(0)} + + if [[ -z $test_stable ]]; then + + test_stable=0 + + fi + + if [[ -z $test_version ]]; then + + test_version=0 + + fi + + if [[ ${#stable_version_number_array[@]} -gt ${#version_number_array[@]} ]]; then + + update_available="true" + + fi + + fi + + done + + if [[ $update_available == "true" ]]; then + + echo "Update is avaiable!" + + else + + echo "You currently have the latest version!" + + fi + +} + +function validate_achar_installation { + + local achar_installation_error_code="" + local what_test + + what_test=$1 + + if [[ -d ~/.achar ]]; then + + achar_installation_error_code="A$achar_installation_error_code" + + else + + achar_installation_error_code="a$achar_installation_error_code" + + fi + + if [[ -f ~/.achar/hosts ]]; then + + achar_installation_error_code="H$achar_installation_error_code" + + else + + achar_installation_error_code="h$achar_installation_error_code" + + fi + + if [[ -f ~/.achar/completions ]]; then + + md5_test=$(cat ~/.achar/completions | md5sum) + + if [[ ${md5_test:0:32} == $completions_md5 ]]; then + + achar_installation_error_code="C$achar_installation_error_code" + + else + + echo "File corrupt: ~/.achar/completions" >&2 + + exit 1 + + fi + + else + + achar_installation_error_code="c$achar_installation_error_code" + + fi + + test=$(echo "${bashrc_array[1]}" | sed 's/[]\/$*.^|[]/\\&/g') + + if [[ -z $(cat ~/.bashrc | grep "${bashrc_array[0]}") ]] || [[ -z $(cat ~/.bashrc | grep "$test") ]]; then + + achar_installation_error_code="b$achar_installation_error_code" + + else + + achar_installation_error_code="B$achar_installation_error_code" + + fi + + if [[ $achar_installation_error_code == "BCHA" ]] && [[ $what_test == "enabled" ]]; then + + echo "ACHAR is already enabled!" + exit 1 + + elif [[ $achar_installation_error_code == "bcha" ]] && [[ $what_test == "disabled" ]]; then + + echo "ACHAR is already disabled!" + exit 1 + + elif [[ $achar_installation_error_code == "bcHA" ]] && [[ $what_test == "disabled" ]]; then + + echo "ACHAR is already disabled!" + exit 1 + + elif [[ $achar_installation_error_code == "bcha" ]] && [[ -z $what_test ]]; then + + echo "ACHAR is disabled!" + exit 1 + + elif [[ $achar_installation_error_code == "bcha" ]] && [[ $what_test == "hosts" ]]; then + + echo "ACHAR is disabled!" + exit 1 + + elif [[ $achar_installation_error_code != "BCHA" ]] && [[ $achar_installation_error_code != "bcha" ]] && [[ -z $what_test ]]; then + + echo "Something is wrong with your setup!" >&2 + + if [[ ${achar_installation_error_code:0:1} == "b" ]]; then + + echo "Required code missing from ~/.bashrc" >&2 + + fi + + if [[ ${achar_installation_error_code:1:1} == "c" ]]; then + + echo "File missing: ~/.achar/completions" >&2 + + fi + + if [[ ${achar_installation_error_code:2:1} == "h" ]]; then + + echo "File missing: ~/.achar/hosts" >&2 + + fi + + if [[ ${achar_installation_error_code:3:1} == "a" ]]; then + + echo "Folder missing: ~/.achar/" >&2 + + fi + + exit 1 + + fi + +} + +function validate_host { + + local hostname + local -a temp_array + local username_and_hostname + local username + + if [[ -z $1 ]]; then + + echo "Unexpected Error!" + + exit 1 + + fi + + username_and_hostname="$1" + temp_array=($username_and_hostname) + + if [[ ${#temp_array[@]} != 1 ]]; then + + echo "Invalid Hostname!" + + exit 1 + + fi + + old_ifs=$IFS + IFS="@" + temp_array=($username_and_hostname) + IFS=$old_ifs + + if [[ ${#temp_array[@]} != 2 ]]; then + + echo "Invalid Hostname!" + + exit 1 + + fi + + username=${temp_array[0]} + hostname=${temp_array[1]} + + if [[ $hostname =~ ^([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$ ]]; then + + donothing=0 + + elif nslookup "$hostname" > /dev/null 2>&1; then + + donothing=0 + + else + + echo "Hostname is not an valid!" + + exit 1 + + fi + + if [[ ${username:0:1} =~ ^[0-9]$ ]] || [[ ! $username =~ ^[A-Za-z0-9_.-]+$ ]]; then + + echo "Username is not a valid format!" + + exit 1 + + fi + +} + +if [[ -z $1 ]]; then + + achar_help + +elif [[ ${1,,} == "add" ]]; then + + if [[ -z $2 ]]; then + + echo "Please include a username@hostname" >&2 + exit 1 + + else + + achar_add $2 + + fi + +elif [[ ${1,,} == "disable" ]]; then + + achar_disable + +elif [[ ${1,,} == "enable" ]]; then + + achar_enable + +elif [[ ${1,,} == "help" ]]; then + + achar_help + +elif [[ ${1,,} == "license" ]]; then + + achar_license + +elif [[ ${1,,} == "list" ]]; then + + if [[ -z $2 ]]; then + + achar_list + + else + + achar_list $2 + + fi + +elif [[ ${1,,} == "remove" ]]; then + + if [[ -z $2 ]]; then + + echo "Please include a username@hostname" >&2 + exit 1 + + else + + achar_remove $2 + + fi + +elif [[ ${1,,} == "reset" ]]; then + + achar_reset + +elif [[ ${1,,} == "uninstall" ]]; then + + achar_uninstall + +elif [[ ${1,,} == "update" ]]; then + + achar_update + +else + + achar_help + +fi + +exit 0 diff --git a/src/bashrc.sh b/src/bashrc.sh new file mode 100644 index 0000000..2df8e37 --- /dev/null +++ b/src/bashrc.sh @@ -0,0 +1,2 @@ +# enable host autocompletion for ssh and rsync +[ -f ~/.achar/completions ] && [ -f ~/.achar/hosts ] && . ~/.achar/completions diff --git a/src/completions.sh b/src/completions.sh new file mode 100644 index 0000000..1645080 --- /dev/null +++ b/src/completions.sh @@ -0,0 +1,53 @@ +# Include existing rsync completions +. /usr/share/bash-completion/completions/rsync + +# Include existing ssh completions +. /usr/share/bash-completion/completions/ssh + +# Function to add custom user@hostname completions +_custom_hosts() +{ + local cur="${COMP_WORDS[COMP_CWORD]}" + local hosts=$(cat ~/.achar/hosts) + COMPREPLY=( $(compgen -W "$hosts" -- "$cur") ) +} + +# Function to handle extended rsync completions +_extended_rsync_completions() +{ + local cur="${COMP_WORDS[COMP_CWORD]}" + + # Use custom host completions if '@' is detected + if [[ "$cur" == *@* ]]; then + _custom_hosts + else + # Fallback to default rsync completion + _rsync + fi +} + +# Extend the existing ssh completion function to include custom hosts +_extended_ssh_completions() +{ + local cur="${COMP_WORDS[COMP_CWORD]}" + + # Use custom host completions if '@' is detected + if [[ "$cur" == *@* ]]; then + _custom_hosts + else + # Fallback to default ssh completion + _ssh + fi +} + +# Preserve the original rsync completion function +if declare -F _rsync &>/dev/null; then + complete -r rsync + complete -F _extended_rsync_completions rsync +fi + +# Preserve the original ssh completion function +if declare -F _ssh &>/dev/null; then + complete -r ssh + complete -F _extended_ssh_completions ssh +fi diff --git a/src/install.sh b/src/install.sh new file mode 100644 index 0000000..12a0335 --- /dev/null +++ b/src/install.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +if [[ $(whoami) == "root" ]]; then + + if [[ -f /usr/bin/achar ]]; then + + echo "Something is already installed at /usr/bin/achar!" + exit 1 + + else + + curl -o /usr/bin/achar https://git.zaks.web.za/zaks-web/achar/raw/branch/main/achar + chmod +x /usr/bin/achar + + fi + +else + + echo "Please run with root privilages (sudo) in order to install to /usr/bin" + exit 1 + +fi