diff --git a/home/bash.nix b/home/bash.nix new file mode 100644 index 0000000..6167155 --- /dev/null +++ b/home/bash.nix @@ -0,0 +1,14 @@ +{ config, pkgs, ... }: +{ + home.file.".bash_aliases".source = files/bash_aliases; + home.file.".bash_functions".source = files/bash_functions; + home.file.".bash_hosts".source = files/bash_hosts; + home.file.".bash_keychain".source = files/bash_keychain; + home.file.".bash_logout".source = files/bash_logout; + home.file.".bash_motd".source = files/bash_motd; + home.file.".bash_motd_ownscript.sh".source = files/bash_motd_ownscript.sh; + home.file.".bash_profile".source = files/bash_profile; + home.file.".bashrc".source = files/bashrc; + home.file.".bash_ssh".source = files/bash_ssh; + +} diff --git a/home/default.nix b/home/default.nix index b41bed5..1679706 100644 --- a/home/default.nix +++ b/home/default.nix @@ -5,6 +5,7 @@ home-manager.useUserPackages = true; home-manager.users.don = { imports = [ + ./bash.nix ./packages-cli.nix ./packages-gui.nix ./services.nix diff --git a/home/files/bash_aliases b/home/files/bash_aliases new file mode 100755 index 0000000..2020128 --- /dev/null +++ b/home/files/bash_aliases @@ -0,0 +1,29 @@ +alias x="myX" +alias build='xmessage -buttons okay:0 -default okay "`hostname -s`: Build in `pwd` completed at `date`" || xmessage -buttons okay:0 -default okay "`hostname -s`: Build in `pwd` failed at `date`"' +alias tbuild='/usr/share/doc/Xdialog-2.0.6/samples/Xmessage "Build in `pwd` completed at `date`" || /usr/share/doc/Xdialog-2.0.6/samples/Xmessage "Build in `pwd` failed at `date`"' +alias mroe=more +alias moer=more +alias ls="ls -hCF" +alias l="ls -l" +alias df="df -h -x squashfs" +alias du="du -h" +if [ -x /home/don/.local/bin/dotdrop ] +then + alias dotdrop="/home/don/.local/bin/dotdrop -c ~/.dotfiles/config.yaml" +else + alias dotdrop="/usr/bin/dotdrop -c ~/.dotfiles/config.yaml" +fi +test -x /usr/bin/bat && alias cat='bat' +alias ip='COLORFGBG=";0" ip -c ' + +# Taskwarrior +alias t=task +alias ttoday="task +TODAY or +OVERDUE -BLOCKED" +alias ttom="task +OVERDUE or +TOMORROW -BLOCKED" +alias to="task list +OVERDUE" +alias turl="task nnext | urlview" +alias tfollow="task list +followup" +alias tnext="task list +nextactions" +alias open=xdg-open +alias tt=timew +alias top=btop diff --git a/home/files/bash_functions b/home/files/bash_functions new file mode 100755 index 0000000..7569e41 --- /dev/null +++ b/home/files/bash_functions @@ -0,0 +1,203 @@ +#!/usr/bin/env bash +#=============================================================================== +# +# FILE: .bash_functions +# +# USAGE: source ~/.bash_functions +# +# DESCRIPTION: bash functions for interactive shell +# +# OPTIONS: --- +# REQUIREMENTS: --- +# BUGS: --- +# NOTES: --- +# AUTHOR: Don Harper (), duckunix@gmail.com +# COMPANY: Don Harper +# VERSION: 1.2 +# CREATED: 06/11/2007 11:17:14 PM CDT +# REVISION: --- +#=============================================================================== + +function nssh () +{ + . ~/.bash_ssh + ssh-keygen -R "${1}" + ssh "${@}" +} + +function ss () +{ + tmux neww -n "${1}" ". ~/.bash_ssh ; ssh ${*}" +} + +function mss () +{ + tmux neww -n "${1}" ". ~/.bash_ssh ; mosh ${*}" +} + +function nss () +{ + ssh-keygen -R "${1}" + tmux neww -n "${1}" ". ~/.bash_ssh ; ssh ${*}" +} + +function pss () +{ + tmux split-window -h ". ~/.bash_ssh ; ssh ${*}" +} + +function pnss () +{ + ssh-keygen -R "${1}" + tmux split-window -h ". ~/.bash_ssh ; ssh ${*}" +} + +function yay () +{ + echo "$(pwd) : yay $*" | plod + unset LOGFILE + /usr/bin/yay "$@" +} + +function doas () +{ + echo "$(pwd) : doas $*" | plod + unset LOGFILE + /usr/bin/env doas "$@" +} + +function sudo () +{ + echo "$(pwd) : sudo $*" | plod + unset LOGFILE + /usr/bin/env sudo "$@" +} + +function pushnew () +{ + plod Pushing configs to "${1}" + cd "${HOME}" || exit + if [ -z "${1}" ] + then + echo "usage: pushnew " + return + fi + if [ -z "${2}" ] + then + echo "usage: pushnew " + return + fi + ssh-copy-id "${2}"@"${1}" + ssh "${2}"@"${1}" mkdir -p .ssh Nextcloud/bin Nextcloud/lib Nextcloud/dotfiles .config + scp .ssh/{authorized_keys,config,id_*} "${2}"@"${1}":.ssh + scp -r .dotfilesrc .myapps .tmux.conf "${2}"@"${1}": + ssh "${2}"@"${1}" which rsync + if [ $? == 1 ] + then + echo "${1} needs rsync. Press enter when installed" + read foo + fi + rsync -avt .config/polybar "${2}"@"${1}":.config + rsync -avt Nextcloud/bin "${2}"@"${1}":Nextcloud + rsync -avt Nextcloud/lib "${2}"@"${1}":Nextcloud + rsync -avt Nextcloud/dotfiles "${2}"@"${1}":Nextcloud + rsync -avt Nextcloud/sigs "${2}"@"${1}":Nextcloud + rsync -avt Nextcloud/ansible "${2}"@"${1}":Nextcloud + ssh "${2}"@"${1}" 'for dir in bin lib web sigs ansible; do ln -s ${HOME}/Nextcloud/${dir} ${HOME}/${dir};done' +} + +function crontab () +{ + CRONFILE=$HOME/lib/crontab/$HOSTNAME_SHORT + if which fcrontab > /dev/null 2>&1 + then + CTEXEC=$(which fcrontab) + elif which crontab > /dev/null 2>&1 + then + CTEXEC=$(which crontab) + fi + case "${1}" in + -e) + "${CTEXEC}" -e ; "${CTEXEC}" -l >| "${CRONFILE}" + ;; + *) + cat "${CRONFILE}" + ;; + esac +} + + +function add_cxoffice_path () +{ + if test -d ~/.cxoffice + then + OLDLANG=$LANG + export LANG=C + for cxdir in ~/.cxoffice/[A-Za-z]*/{desktopdata/cxmenu/StartMenu*/Programs,drive_c/users/*/Start*/Programs} + do + for dir in $(find "$cxdir" -type f -exec dirname {} \;) + do + buildpath PATH "$dir" + done + done + export LANG=$OLDLANG + fi +} + +cd_func () +{ + local x2 the_new_dir adir index + local -i cnt + + if [[ "${1}" == "--" ]]; then + dirs -v + return 0 + fi + + the_new_dir="${1}" + [[ -z "${1}" ]] && the_new_dir=$HOME + + if [[ ${the_new_dir:0:1} == '-' ]]; then + # + # Extract dir N from dirs + index=${the_new_dir:1} + [[ -z $index ]] && index=1 + adir=$(dirs +$index) + [[ -z $adir ]] && return 1 + the_new_dir=$adir + fi + + # + # '~' has to be substituted by ${HOME} + [[ ${the_new_dir:0:1} == '~' ]] && the_new_dir="${HOME}${the_new_dir:1}" + + # + # Now change to the new dir and add to the top of the stack + pushd "${the_new_dir}" > /dev/null + [[ $? -ne 0 ]] && return 1 + the_new_dir=$(pwd) + + # + # Trim down everything beyond 11th entry + popd -n +21 2>/dev/null 1>/dev/null + + # + # Remove any other occurence of this dir, skipping the top of the stack + for ((cnt=1; cnt <= 20; cnt++)); do + x2=$(dirs +${cnt} 2>/dev/null) + [[ $? -ne 0 ]] && return 0 + [[ ${x2:0:1} == '~' ]] && x2="${HOME}${x2:1}" + if [[ "${x2}" == "${the_new_dir}" ]]; then + popd -n +$cnt 2>/dev/null 1>/dev/null + cnt=$((cnt-1)) + fi + done + + return 0 +} +alias cd=cd_func + +tgrep () +{ + task info ${*} | egrep '(Parent|Due|Last)' +} diff --git a/home/files/bash_hosts b/home/files/bash_hosts new file mode 100755 index 0000000..7cf6a4f --- /dev/null +++ b/home/files/bash_hosts @@ -0,0 +1 @@ +${1} diff --git a/home/files/bash_keychain b/home/files/bash_keychain new file mode 100755 index 0000000..7b560db --- /dev/null +++ b/home/files/bash_keychain @@ -0,0 +1 @@ +test -x /usr/local/bin/keychain && /usr/local/bin/keychain -q ~/.ssh/id_dsa && . ~/.keychain/$HOSTNAME-sh diff --git a/home/files/bash_logout b/home/files/bash_logout new file mode 100755 index 0000000..4b7d200 --- /dev/null +++ b/home/files/bash_logout @@ -0,0 +1,11 @@ +# ~/.bash_logout: executed by bash(1) when login shell exits. + +# when leaving the console clear the screen to increase privacy + +if [ "$SHLVL" = 1 ]; then + if [ -x /usr/bin/clear_console ]; then + /usr/bin/clear_console -q + else + clear + fi +fi diff --git a/home/files/bash_motd b/home/files/bash_motd new file mode 100644 index 0000000..49a666e --- /dev/null +++ b/home/files/bash_motd @@ -0,0 +1,617 @@ +#!/bin/sh +# shellcheck disable=SC1090,SC1091 + +BAR_ELEMENT="-" +BAR_HEALTHY_COLOR="32" +BAR_WARNING_THRESHOLD=70 +BAR_WARNING_COLOR="33" +BAR_CRITICAL_THRESHOLD=90 +BAR_CRITICAL_COLOR="31" + +BANNER_KERNEL_ICON="#" +BANNER_KERNEL_COLOR="33" +BANNER_UPTIME_ICON="#" +BANNER_UPTIME_COLOR="94" +BANNER_DEBIAN_ICON="#" +BANNER_DEBIAN_COLOR="95" +BANNER_FEDORA_ICON="#" +BANNER_FEDORA_COLOR="34" +BANNER_ARCH_ICON="#" +BANNER_ARCH_COLOR="95" +BANNER_FONTPATH="standard" +BANNER_TEXT="$(hostnamectl | awk -F: '$1=/Static hostname/{print $2}' | sed 's/^ //')" + +PROCESSOR_LOADAVG_ICON="#" +PROCESSOR_LOADAVG_HEALTHY_COLOR="32" +PROCESSOR_LOADAVG_WARNING_THRESHOLD=2 +PROCESSOR_LOADAVG_WARNING_COLOR="33" +PROCESSOR_LOADAVG_CRITICAL_THRESHOLD=4 +PROCESSOR_LOADAVG_CRITICAL_COLOR="31" +PROCESSOR_MODEL_ICON="#" + +MEMORY_ICON="#" + +SWAP_ICON="#" + +DISKSPACE_ICON="#" + +SERVICES_UP_ICON="#" +SERVICES_UP_COLOR="32" +SERVICES_DOWN_ICON="#" +SERVICES_DOWN_COLOR="31" +SERVICES_FILE=".bashrc_motd_services.txt" + +PODMAN_VERSION_ICON="#" +PODMAN_IMAGES_ICON="#" +PODMAN_RUNNING_ICON="#" +PODMAN_RUNNING_COLOR="32" +PODMAN_OTHER_ICON="#" +PODMAN_OTHER_COLOR="90" + +DOCKER_VERSION_ICON="#" +DOCKER_IMAGES_ICON="#" +DOCKER_RUNNING_ICON="#" +DOCKER_RUNNING_COLOR="32" +DOCKER_OTHER_ICON="#" +DOCKER_OTHER_COLOR="90" + +UPDATES_ZERO_ICON="#" +UPDATES_ZERO_COLOR="32" +UPDATES_AVAILIABLE_ICON="#" +UPDATES_AVAILIABLE_COLOR="33" +UPDATES_SECURITY_ICON="#" +UPDATES_SECURITY_COLOR="31" + +LETSENCRYPT_VALID_ICON="#" +LETSENCRYPT_VALID_COLOR="32" +LETSENCRYPT_WARNING_ICON="#" +LETSENCRYPT_WARNING_COLOR="33" +LETSENCRYPT_INVALID_ICON="#" +LETSENCRYPT_INVALID_COLOR="31" +LETSENCRYPT_CERTPATH="/etc/letsencrypt/live" + +LOGIN_LOGIN_ICON="#" +LOGIN_LOGOUT_ICON="#" +LOGIN_IP_ICON="#" + +INCLUDE_FILE=".bash_motd_ownscript.sh" + +generate_unit_byte() { + # 1 - unit in M + + if [ "$1" -ge 1024 ]; then + unit_symbol="G" + unit_value=$(echo "$1/1024" | bc -l | LANG=C xargs printf "%.1f\n") + else + unit_symbol="M" + unit_value=$1 + fi + + echo "$unit_value$unit_symbol" +} + +generate_space() { + # 1 - already used + # 2 - total + + space_fill=$(( $2 - ${#1} )) + space_chars="" + + while [ $space_fill -ge 0 ]; do + space_chars="$space_chars " + space_fill=$(( space_fill - 1 )) + done + + echo "$space_chars" +} + +generate_bar() { + # 1 - icon + # 2 - total + # 3 - used_1 + # 4 - [ used_2 ] + + bar_percent=$(( $3 * 100 / $2 )) + bar_separator=$(( $3 * 100 * 10 / $2 / 25 )) + + if [ $bar_percent -ge "$BAR_WARNING_THRESHOLD" ]; then + bar_color=$BAR_WARNING_COLOR + elif [ $bar_percent -ge "$BAR_CRITICAL_THRESHOLD" ]; then + bar_color=$BAR_CRITICAL_COLOR + else + bar_color=$BAR_HEALTHY_COLOR + fi + + printf " %s \\033[%dm" "$1" "$bar_color" + + if [ -z "$4" ] ; then + bar_piece=0 + while [ $bar_piece -le 40 ]; do + if [ "$bar_piece" -ne "$bar_separator" ]; then + printf "%s" "$BAR_ELEMENT" + else + printf "%s\\033[1;30m" "$BAR_ELEMENT" + fi + + bar_piece=$(( bar_piece + 1 )) + done + else + bar_cached_val=$(( $3 + $4 )) + bar_cached_separator=$(( bar_cached_val * 100 * 10 / $2 / 25 )) + + bar_piece=0 + while [ $bar_piece -le 40 ]; do + if [ $bar_piece -eq $bar_separator ]; then + printf "%s\\033[1;36m" "$BAR_ELEMENT" + elif [ $bar_piece -eq $bar_cached_separator ]; then + printf "%s\\033[1;30m" "$BAR_ELEMENT" + else + printf "%s" "$BAR_ELEMENT" + fi + + bar_piece=$(( bar_piece + 1 )) + done + fi + + printf "\\033[0m\\n" +} + +generate_bar_memory() { + # 1 - icon + # 2 - total memory in M + # 3 - used memory in M + # 4 - cached memory in M + + bar_memory_used=$(generate_unit_byte "$3") + bar_memory_cached=$(generate_unit_byte "$4") + bar_memory_available=$(generate_unit_byte $(( $2 - $3 )) ) + + printf " %s used / %s cached / %s available\\n" "$bar_memory_used" "$bar_memory_cached" "$bar_memory_available" + generate_bar "$1" "$2" "$3" "$4" +} + +generate_bar_swap() { + # 1 - icon + # 2 - total swap in M + # 3 - used swap in M + + bar_swap_used=$(generate_unit_byte "$3") + + bar_swap_available=$(( $2 - $3 )) + bar_swap_available=$(generate_unit_byte "$bar_swap_available") + + printf " %s used / %s available\\n" "$bar_swap_used" "$bar_swap_available" + generate_bar "$1" "$2" "$3" +} + +generate_bar_disk() { + # 1 - icon + # 2 - total size in M + # 3 - used space in M + # 4 - mount path + + bar_disk_mount="$4$(generate_space "$4" 10)" + + bar_disk_used=$(generate_unit_byte "$3") + bar_disk_used="$(generate_space "$bar_disk_used" 5)$bar_disk_used used" + + bar_disk_available=$(( $2 - $3 )) + bar_disk_available="$(generate_unit_byte "$bar_disk_available") available" + + printf " %s %s / %s\\n" "$bar_disk_mount" "$bar_disk_used" "$bar_disk_available" + + generate_bar "$1" "$2" "$3" +} + +print_banner() { + printf "\\n%s\\n" "$(figlet -t -f "$BANNER_FONTPATH" " $BANNER_TEXT")" + + if [ -f /etc/os-release ]; then + . /etc/os-release + + if [ "$ID" = "debian" ]; then + banner_distro_icon=$BANNER_DEBIAN_ICON + banner_distro_color=$BANNER_DEBIAN_COLOR + banner_distro_name="Debian" + banner_distro_version=$(cat /etc/debian_version) + elif [ "$ID" = "ubuntu" ]; then + banner_distro_icon=$BANNER_DEBIAN_ICON + banner_distro_color=$BANNER_DEBIAN_COLOR + banner_distro_name="Ubuntu" + banner_distro_version=$VERSION_ID + elif [ "$ID" = "fedora" ]; then + banner_distro_icon=$BANNER_FEDORA_ICON + banner_distro_color=$BANNER_FEDORA_COLOR + banner_distro_name="Fedora" + banner_distro_version=$VERSION_ID + elif [ "$ID" = "arch" ] || [ "$ID_LIKE" = "arch" ]; then + banner_distro_icon=$BANNER_ARCH_ICON + banner_distro_color=$BANNER_ARCH_COLOR + banner_distro_name="Arch-Based" + banner_distro_version=$BUILD_ID + elif [ "$ID" = "nixos" ] || [ "$ID_LIKE" = "nixos" ]; then + banner_distro_icon=$BANNER_ARCH_ICON + banner_distro_color=$BANNER_ARCH_COLOR + banner_distro_name="NixOS" + banner_distro_version=$BUILD_ID + else + banner_distro_icon="?" + banner_distro_color="0" + banner_distro_name="Unknown" + banner_distro_version="?" + fi + + banner_distro_space=$(generate_space "$banner_distro_name" 13) + + printf " \\033[%sm%s %s\\033[0m%s%s\\n" "$banner_distro_color" "$banner_distro_icon" "$banner_distro_name" "$banner_distro_space" "$banner_distro_version" + printf " \\033[%sm%s Linux\\033[0m %s\\n\\n" "$BANNER_KERNEL_COLOR" "$BANNER_KERNEL_ICON" "$(cut -d ' ' -f 3 < /proc/version)" + printf " \\033[%sm%s Uptime\\033[0m %s\\n" "$BANNER_UPTIME_COLOR" "$BANNER_UPTIME_ICON" "$(awk '{printf("%d days, %d hours, %d minutes \n",($1/60/60/24),($1/60/60%24),($1/60%60))}' /proc/uptime)" + fi +} + +print_processor() { + printf "\\n" + printf " \\033[1;37mProcessor:\\033[0m\\n" + + processor_loadavg="$(cut -d " " -f 1,2,3 < /proc/loadavg)" + if [ "$(echo "$processor_loadavg" | cut -d "." -f 1)" -ge "$PROCESSOR_LOADAVG_CRITICAL_THRESHOLD" ]; then + processor_loadavg_color=$PROCESSOR_LOADAVG_CRITICAL_COLOR + elif [ "$(echo "$processor_loadavg" | cut -d "." -f 1)" -ge "$PROCESSOR_LOADAVG_WARNING_THRESHOLD" ]; then + processor_loadavg_color=$PROCESSOR_LOADAVG_WARNING_COLOR + else + processor_loadavg_color=$PROCESSOR_LOADAVG_HEALTHY_COLOR + fi + + processor_info=$(cat /proc/cpuinfo) + + processor_arch=$(uname -m) + + if [ "$processor_arch" = "x86_64" ]; then + processor_model="$(echo "$processor_info" | grep "model name" | sort -u | cut -d ':' -f 2)" + processor_count=$(echo "$processor_info" | grep "physical id" | sort -u | wc -l) + processor_cores=$(echo "$processor_info" | grep "cpu cores" | sort -u | cut -d ':' -f 2) + processor_threads=$(( $(echo "$processor_info" | grep "siblings" | tail -n 1 | cut -d ':' -f 2) )) + + if [ ! "$processor_cores" -eq $processor_threads ]; then + processor_threads=", $processor_threads Threads" + else + processor_threads="" + fi + elif [ "$processor_arch" = "mips64" ]; then + processor_model="$(echo "$processor_info" | grep "cpu model" | sort -u | cut -d ':' -f 2)" + processor_count=$(echo "$processor_info" | grep "package" | sort -u | wc -l) + processor_cores=$(echo "$processor_info" | grep -c processor) + processor_threads="" + else + processor_model="?" + processor_count=0 + processor_cores=0 + processor_threads=0 + fi + + processor_model=$(echo "$processor_model" | sed "s/(R)//g") + processor_model=$(echo "$processor_model" | sed "s/(tm)//g") + processor_model=$(echo "$processor_model" | sed "s/ @/,/") + processor_model=$(echo "$processor_model" | sed "s/ CPU//") + processor_model=$(echo "$processor_model" | sed "s/ / /") + processor_model=$(echo "$processor_model" | sed "s/^ //g") + + processor_cores=$(( processor_cores * processor_count )) + + if [ "$processor_count" -gt 1 ]; then + processor_count="$processor_count""x " + else + processor_count="" + fi + + printf " %s \\033[%dm%s\\033[0m\\n" "$PROCESSOR_LOADAVG_ICON" "$processor_loadavg_color" "$processor_loadavg" + printf " %s %s%s = %s Cores%s\\n" "$PROCESSOR_MODEL_ICON" "$processor_count" "$processor_model" "$processor_cores" "$processor_threads" +} + +print_memory() { + printf "\\n" + printf " \\033[1;37mMemory:\\033[0m\\n" + + memory_usage=$(LANG=C free --mega | grep "Mem:") + memory_total=$(echo "$memory_usage" | awk '{ print $2 }') + memory_used=$(echo "$memory_usage" | awk '{ print $3 }') + memory_cached=$(echo "$memory_usage" | awk '{ print $6 }') + + generate_bar_memory "$MEMORY_ICON" "$memory_total" "$memory_used" "$memory_cached" +} + +print_swap() { + swap_usage=$(LANG=C free --mega | grep "Swap:") + + swap_total=$(echo "$swap_usage" | awk '{ print $2 }') + swap_used=$(echo "$swap_usage" | awk '{ print $3 }') + + if [ "$swap_total" -ne 0 ]; then + printf "\\n" + printf " \\033[1;37mSwap:\\033[0m\\n" + + generate_bar_swap "$SWAP_ICON" "$swap_total" "$swap_used" + fi +} + +print_diskspace() { + printf "\\n" + printf " \\033[1;37mDiskspace:\\033[0m\\n" + + diskspace_partitions=$(df -tvfat -text4 -tbtrfs -tzfs -B M -P | sed -e "s/M//g" | grep -v "^Filesystem") + + diskspace_index=0 + echo "$diskspace_partitions" | while read -r line; do + + diskspace_disk_mount="$(echo "$line" | awk '{ print $1 }')" + diskspace_disk_size="$(echo "$line" | awk '{ print $2 }')" + diskspace_disk_used="$(echo "$line" | awk '{ print $3 }')" + + if [ "$diskspace_index" -ne 0 ]; then + printf "\\n" + fi + + diskspace_index=$(( diskspace_index + 1 )) + + generate_bar_disk "$DISKSPACE_ICON" "$diskspace_disk_size" "$diskspace_disk_used" "$diskspace_disk_mount" + done +} + +print_services() { + if [ -f $SERVICES_FILE ] && [ "$(wc -l < $SERVICES_FILE )" != 0 ]; then + printf "\\n" + printf " \\033[1;37mServices:\\033[0m \\033[1;37mVersion:\\033[0m\\n" + + while read -r line; do + service_description=$(echo "$line" | cut -d ';' -f 1) + + service_name=$(echo "$line" | cut -d ';' -f 2) + + service_package=$(echo "$line" | cut -d ';' -f 3) + + if [ -n "$service_description" ] && [ -n "$service_name" ]; then + if systemctl is-active --quiet "$service_name".service; then + service_icon=$SERVICES_UP_ICON + service_color=$SERVICES_UP_COLOR + else + service_icon=$SERVICES_DOWN_ICON + service_color=$SERVICES_DOWN_COLOR + fi + + service_space=$(generate_space "$service_description" 34) + + if [ -n "$service_package" ]; then + if [ -f /usr/bin/apt ]; then + package_version=$(dpkg -s "$service_package" | grep '^Version:' | cut -d ' ' -f 2 | cut -d ':' -f 2 | cut -d '-' -f 1) + elif [ -f /usr/bin/rpm ]; then + package_version=$(rpm -q --queryformat '%{VERSION}' "$service_package") + else + package_version="?" + fi + else + package_version="--" + fi + fi + + printf " \\033[%sm%s\\033[0m %s%s%s\\n" "$service_color" "$service_icon" "$service_description" "$service_space" "$package_version" + done < $SERVICES_FILE | grep -v '#' + fi +} + +print_podman() { + if ! which podman >> /dev/null 2>&1 + then + return + fi + printf "\\n" + printf " \\033[1;37mPodman:\\033[0m\\n" + + podman_version=$(podman version --format json | jq -r '.Client.Version') + podman_space=$(generate_space "$podman_version" 23) + podman_images=$(podman images --format json | jq '. | length') + + printf " %s Version %s%s%s %s Images\\n\\n" "$PODMAN_VERSION_ICON" "$podman_version" "$podman_space" "$PODMAN_IMAGES_ICON" "$podman_images" + + podman_list=$(podman pod ls --sort name --format json) + podman_pods=$(echo "$podman_list" | jq -r '.[] .Name') + + echo "$podman_pods" | while read -r pod; do + if [ "$(echo "$podman_list" | jq -r ".[] | select(.Name == \"$pod\") | .Status")" = "Running" ]; then + pod_space=$(generate_space "$pod" 34) + + pod_container_running="$(echo "$podman_list" | jq -r ".[] | select(.Name == \"$pod\") | .Containers[] | select(.Status == \"running\") | .Status" | wc -l)" + + if [ "$pod_container_running" -ne 0 ]; then + pod_container_running=$(printf "\\033[%um%u Running\\033[0m" "$PODMAN_RUNNING_COLOR" "$pod_container_running") + fi + + pod_container_other="$(echo "$podman_list" | jq -r ".[] | select(.Name == \"$pod\") | .Containers[] | select(.Status != \"running\") | .Status" | wc -l)" + + if [ "$pod_container_other" -ne 0 ]; then + pod_container_other=$(printf ", \\033[%um%u Other\\033[0m" "$PODMAN_OTHER_COLOR" "$pod_container_other") + else + pod_container_other="" + fi + + pod_status="$pod_container_running$pod_container_other" + + printf " \\033[%um%s\\033[0m %s%s%s\\n" "$PODMAN_RUNNING_COLOR" "$PODMAN_RUNNING_ICON" "$pod" "$pod_space" "$pod_status" + else + printf " \\033[%um%s\\033[0m \\033[%um%s\\033[0m\\n" "$PODMAN_OTHER_COLOR" "$PODMAN_OTHER_ICON" "$PODMAN_OTHER_COLOR" "$pod" + fi + done +} + +print_docker() { + if [ "$(systemctl is-active docker.service)" = "active" ]; then + printf "\\n" + printf " \\033[1;37mDocker:\\033[0m\\n" + + docker_info=$(sudo curl -sf --unix-socket /var/run/docker.sock http:/v1.40/info) + + docker_version=$(echo "$docker_info" | jq -r '.ServerVersion') + + docker_space=$(generate_space "$docker_version" 23) + + docker_images=$(echo "$docker_info" | jq -r '.Images') + + printf " %s Version %s%s%s %s Images\\n\\n" "$DOCKER_VERSION_ICON" "$docker_version" "$docker_space" "$DOCKER_IMAGES_ICON" "$docker_images" + + docker_list=$(sudo curl -sf --unix-socket /var/run/docker.sock "http://v1.40/containers/json?all=true" | jq -c ' .[]') + + echo "$docker_list" | while read -r line; do + container_name="$(echo "$line" | jq -r '.Names[]' | sed 's/\///')" + + container_status="$(echo "$line" | jq -r '.Status' | sed 's/.*/\l&/')" + + container_space=$(generate_space "$container_name" 34) + + if [ "$(echo "$line" | jq -r '.State')" = "running" ]; then + printf " \\033[%um%s\\033[0m %s%s%s\\n" "$DOCKER_RUNNING_COLOR" "$DOCKER_RUNNING_ICON" "$container_name" "$container_space" "$container_status" + else + printf " \\033[%um%s\\033[0m \\033[%um%s\\033[0m%s\\033[%um%s\\033[0m\\n" "$DOCKER_OTHER_COLOR" "$DOCKER_OTHER_ICON" "$DOCKER_OTHER_COLOR" "$container_name" "$container_space" "$DOCKER_OTHER_COLOR" "$container_status" + fi + done + fi +} + +print_updates() { + if [ -f /usr/bin/apt ]; then + printf "\\n" + printf " \\033[1;37mUpdates:\\033[0m\\n" + + updates_count_regular=$(apt-get upgrade -s | grep -c ^Inst) + updates_count_security=$(apt-get upgrade -s | grep ^Inst | grep -c Security) + + if [ -n "$updates_count_regular" ] && [ "$updates_count_regular" -ne 0 ]; then + if [ -n "$updates_count_security" ] && [ "$updates_count_security" -ne 0 ]; then + updates_icon=$UPDATES_SECURITY_ICON + updates_color=$UPDATES_SECURITY_COLOR + updates_message="$updates_count_regular packages can be updated, $updates_count_security are security updates." + else + updates_icon=$UPDATES_AVAILIABLE_ICON + updates_color=$UPDATES_AVAILIABLE_COLOR + updates_message="$updates_count_regular packages can be updated." + fi + else + updates_icon=$UPDATES_ZERO_ICON + updates_color=$UPDATES_ZERO_COLOR + updates_message="Everything is up to date!" + fi + + printf " \\033[%sm%s\\033[0m %s\\n" "$updates_color" "$updates_icon" "$updates_message" + elif [ -f /usr/bin/dnf ]; then + printf "\\n" + printf " \\033[1;37mUpdates:\\033[0m\\n" + + updates_count=$(dnf updateinfo -C -q --list) + updates_count_regular=$(echo "$updates_count" | wc -l) + updates_count_security=$(echo "$updates_count" | grep -c "Important/Sec") + + if [ -n "$updates_count_regular" ] && [ "$updates_count_regular" -ne 0 ]; then + if [ -n "$updates_count_security" ] && [ "$updates_count_security" -ne 0 ]; then + updates_icon=$UPDATES_SECURITY_ICON + updates_color=$UPDATES_SECURITY_COLOR + updates_message="$updates_count_regular packages can be updated, $updates_count_security are security updates." + else + updates_icon=$UPDATES_AVAILIABLE_ICON + updates_color=$UPDATES_AVAILIABLE_COLOR + updates_message="$updates_count_regular packages can be updated." + fi + else + updates_icon=$UPDATES_ZERO_ICON + updates_color=$UPDATES_ZERO_COLOR + updates_message="Everything is up to date!" + fi + + printf " \\033[%sm%s\\033[0m %s\\n" "$updates_color" "$updates_icon" "$updates_message" + fi +} + +print_letsencrypt() { + if [ -d $LETSENCRYPT_CERTPATH ] && [ "$(ls -a $LETSENCRYPT_CERTPATH)" ]; then + printf "\\n" + printf " \\033[1;37mSSL / let’s encrypt:\\033[0m\\n" + + cert_list=$(sudo find $LETSENCRYPT_CERTPATH -name cert.pem) + + for cert_file in $cert_list; do + sudo openssl x509 -checkend $((25 * 86400)) -noout -in "$cert_file" >> /dev/null + result=$? + + cert_name=$(echo "$cert_file" | rev | cut -d '/' -f 2 | rev) + + if [ "$result" -eq 0 ]; then + printf " \\033[%sm%s\\033[0m %s\\n" "$LETSENCRYPT_VALID_COLOR" "$LETSENCRYPT_VALID_ICON" "$cert_name" + else + sudo openssl x509 -checkend $((0 * 86400)) -noout -in "$cert_file" >> /dev/null + result=$? + + if [ "$result" -eq 0 ]; then + printf " \\033[%sm%s\\033[0m %s\\n" "$LETSENCRYPT_WARNING_COLOR" "$LETSENCRYPT_WARNING_ICON" "$cert_name" + else + printf " \\033[%sm%s\\033[0m %s\\n" "$LETSENCRYPT_INVALID_COLOR" "$LETSENCRYPT_INVALID_ICON" "$cert_name" + fi + fi + done + fi +} + +print_login() { + login_last=$(last -n 2 -a -d --time-format iso "$(whoami)" | head -n 2 | tail -n 1) + + if [ "$( echo "$login_last" | awk '{ print $1 }')" = "$(whoami)" ]; then + login_ip=$(echo "$login_last" | awk '{ print $7 }') + + login_login=$(date -d "$(echo "$login_last" | awk '{ print $3 }' | cut -d '+' -f 1 | sed "s/T/ /")" "+%a, %d.%m.%y %H:%M") + + login_space=$(generate_space "$login_login" 25) + + if [ "$(echo "$login_last" | awk '{ print $4 }')" = "still" ]; then + login_logout="still connected" + else + login_logout=$(date -d "$(echo "$login_last" | awk '{ print $5 }' | cut -d '+' -f 1 | sed "s/T/ /")" "+%a, %d.%m.%y %H:%M") + fi + + printf "\\n" + printf " \\033[1;37mLast login for %s:\\033[0m\\n" "$(echo "$login_last" | awk '{ print $1 }')" + printf " %s %s%s%s %s\\n" "$LOGIN_LOGIN_ICON" "$login_login" "$login_space" "$LOGIN_LOGOUT_ICON" "$login_logout" + printf " %s %s\\n" "$LOGIN_IP_ICON" "$login_ip" + fi +} + +print_include() { + . $INCLUDE_FILE +} + +bash_motd() { + for module in "$@"; do + if [ "$module" = "--banner" ]; then + print_banner + elif [ "$module" = "--processor" ]; then + print_processor + elif [ "$module" = "--memory" ]; then + print_memory + elif [ "$module" = "--swap" ]; then + print_swap + elif [ "$module" = "--diskspace" ]; then + print_diskspace + elif [ "$module" = "--services" ]; then + print_services + elif [ "$module" = "--podman" ]; then + print_podman + elif [ "$module" = "--docker" ]; then + print_docker + elif [ "$module" = "--updates" ]; then + print_updates + elif [ "$module" = "--letsencrypt" ]; then + print_letsencrypt + elif [ "$module" = "--login" ]; then + print_login + elif [ "$module" = "--include" ]; then + print_include + fi + done + + printf "\\n" +} diff --git a/home/files/bash_motd_ownscript.sh b/home/files/bash_motd_ownscript.sh new file mode 100644 index 0000000..846fbfe --- /dev/null +++ b/home/files/bash_motd_ownscript.sh @@ -0,0 +1,30 @@ +#!/bin/bash - +#=============================================================================== +# +# FILE: .bash_motd_ownscript.sh +# +# USAGE: ./.bash_motd_ownscript.sh +# +# DESCRIPTION: +# +# OPTIONS: --- +# REQUIREMENTS: --- +# BUGS: --- +# NOTES: --- +# AUTHOR: Don Harper (dmh), duck@duckland.org +# ORGANIZATION: duckland.org +# CREATED: 01/28/2022 21:23 +# REVISION: --- +#=============================================================================== + +set -o nounset # Treat unset variables as an error + +if [ "$(pgrep -c tailscaled)" = "1" ] +then + printf "\\n" + printf " \\033[1;37mTailScale:\\033[0m\\n" + tailscale status | while read -r line + do + printf " %s\n" "${line}" + done +fi diff --git a/home/files/bash_profile b/home/files/bash_profile new file mode 100644 index 0000000..31385f3 --- /dev/null +++ b/home/files/bash_profile @@ -0,0 +1,29 @@ +PATH="/run/wrappers/bin:${HOME}/.nix-profile/bin:/etc/profiles/per-user/don/bin:/nix/var/nix/profiles/default/bin:/run/current-system/sw/bin:${HOME}/bin:${HOME}/go/bin" +export PATH +umask 006 +if [ ! -z "${PS1}" ] +then + if [ "$TERM" = "linux" ]; then + echo -en "\e]P021222C" #black + echo -en "\e]P8282a36" #darkgrey + echo -en "\e]P1803232" #darkred + echo -en "\e]P9ff5555" #red + echo -en "\e]P25b762f" #darkgreen + echo -en "\e]PA50fa7b" #green + echo -en "\e]P3aa9943" #brown + echo -en "\e]PBf1fa8c" #yellow + echo -en "\e]P4324c80" #darkblue + echo -en "\e]PCbd93f9" #blue + echo -en "\e]P5627sa4" #darkmagenta + echo -en "\e]PDbd93f9" #magenta + echo -en "\e]P692b19e" #darkcyan + echo -en "\e]PE8be9fd" #cyan + echo -en "\e]P7ffffff" #lightgrey + echo -en "\e]PFf8f8f2" #white + clear #for background artifacting + fi + . ~/.bash_motd && bash_motd --banner --processor --memory --diskspace --podman --docker +fi + +cd "${HOME}" +source "${HOME}"/.bashrc diff --git a/home/files/bash_ssh b/home/files/bash_ssh new file mode 100755 index 0000000..fdfb6a1 --- /dev/null +++ b/home/files/bash_ssh @@ -0,0 +1,9 @@ +#!/bin/bash + +ARGS="-q --eval --systemd --agents ssh --nocolor --ignore-missing --quick git id_dsa id_ed25519 id_rsa 56913AD86A18257132AA9F03928BC0B78C1BF5AA" +#SSH_ASKPASS=/usr/bin/qt4-ssh-askpass +#export SSH_ASKPASS +eval $(keychain ${ARGS} ) +. ~/.keychain/"${HOSTNAME_SHORT}"-sh + +ssh-add -l | grep -q ED25519 || ssh-add diff --git a/home/files/bashrc b/home/files/bashrc new file mode 100755 index 0000000..1692951 --- /dev/null +++ b/home/files/bashrc @@ -0,0 +1,170 @@ +#!/usr/bin/env bash +#=============================================================================== +# +# FILE: .bashrc +# +# DESCRIPTION: Main bash init file +# +# OPTIONS: --- +# REQUIREMENTS: --- +# BUGS: --- +# NOTES: --- +# AUTHOR: Don Harper (), duckunix@gmail.com +# COMPANY: Don Harper +# VERSION: 1.0 +# CREATED: 06/11/2007 11:30:25 PM CDT +# REVISION: --- +#=============================================================================== + +# set some global stuff first + +# colors +GREEN='' +YELLOW='' +RED='' +NONE='' +export NONE GREEN YELLOW RED +PATH="/run/wrappers/bin:${HOME}/.nix-profile/bin:/etc/profiles/per-user/don/bin:/nix/var/nix/profiles/default/bin:/run/current-system/sw/bin:${HOME}/bin:${HOME}/go/bin" +export PATH +export GOPATH="${HOME}/go" + +if [ -f ${HOME}/.nix-profile/etc/profile.d/hm-session-vars.sh ] +then + . ${HOME}/.nix-profile/etc/profile.d/hm-session-vars.sh +fi + +HOSTNAME_SHORT=$(hostnamectl | awk -F: '$1=/Static hostname/{print $2}' | sed 's/^ //') +while [ "${HOSTNAME_SHORT}" == "localhost" ] +do + echo "${RED}@${GREEN}-,---${NONE}" + sleep 1 + HOSTNAME_SHORT=$(hostnamectl | awk -F: '$1=/Static hostname/{print $2}' | sed 's/^ //') +done +export HOSTNAME_SHORT +HISTNAME=$LOGNAME +if [ $EUID == 0 ];then HISTNAME=root;fi +HISTFILE="${HOME}/.bash_history.${HISTNAME}.${HOSTNAME_SHORT}.$(tty|cut -c10-)" +export HISTFILE +test -f "${HOME}/.bash_ssh" && source "${HOME}/.bash_ssh" + + +# set coredump size to 0 +ulimit -c 0 + +umask 0007 +if [ "$LOGNAME" ]; then + USER=$LOGNAME +fi + +OS_SYS=$(uname -s) +OS_REL=$(uname -r) +OS_CPU=$(uname -m) +OS_TYPE="$OS_SYS.$OS_REL" +export OS_SYS OS_REL OS_TYPE OS_CPU LESS + +# Set up path +test -f "${HOME}/.bash_functions" && source "${HOME}/.bash_functions" +test -d "${HOME}/bin/${HOSTNAME_SHORT}" && PATH="${PATH}:${HOME}/bin/${HOSTNAME_SHORT}" +test -d "${HOME}/bin/${OS_CPU}" && PATH="${PATH}:${HOME}/bin/${OS_CPU}" +test -d "${HOME}/bin" && PATH="${PATH}:${HOME}/bin" +test -d "${HOME}/.local/bin" && PATH="${PATH}:${HOME}/.local/bin" +test -d "${HOME}/.cargo/bin" && PATH="${PATH}:${HOME}/.cargo/bin" +test -d "${HOME}/.local/share/gem" && PATH="${PATH}:${HOME}/.local/share/gem/ruby/latest/bin" +test -d /usr/local/sbin && PATH="${PATH}:/usr/local/sbin" +test -d /usr/local/bin && PATH="${PATH}:/usr/local/bin" +test -d /sbin && PATH="${PATH}:/sbin" +test -d /usr/sbin && PATH="${PATH}:/usr/sbin" +test -d /usr/bin && PATH="${PATH}:/usr/bin" +test -d /bin && PATH="${PATH}:/bin" +export PATH + +test -f "${HOME}/.bash_ssh" && . ${HOME}/.bash_ssh + +#interactive login ? + +##################################### +######### ######### +######## Interactive stuff ######## +######### ######### +##################################### + +if [ "${PS1}" ]; +then + unset i + set -o noclobber + set -o notify + set bell-style visible + set nobeep + shopt -s autocd + shopt -s cdspell + shopt -s checkjobs + shopt -s checkwinsize + shopt -s dotglob + shopt -s extglob + shopt -s histappend + shopt -s histreedit + + PAGER=less + LESS="-s" + EXINIT="set wrapmargin=8 sh=$SHELL sw=4 report=2 tabstop=8" + export EXINIT EDITOR PAGER + EDITOR=vi + if [ -x /usr/bin/vim ] + then + EDITOR=vim + alias vi=/usr/bin/vim + elif [ -x /usr/local/bin/vim ] + then + EDITOR=vim + alias vi=/usr/local/bin/vim + elif [ $(which nvim 2>&1 >> /dev/null) ] + then + EDITOR=nvim + fi + export EDITOR + unset COMPHOSTS + export COMPHOSTS=() + + + unset pathmunge + # set up man path + MANPATH="${MANPATH}:${HOME}/man:${HOME}/share/man" + export MANPATH + + + test -f $(ls -1 /nix/store/*bash-completion-*/etc/profile.d/bash_completion.sh | tail -n1) && \ + source $(ls -1 /nix/store/*bash-completion-*/etc/profile.d/bash_completion.sh | tail -n1) + + export LOCKPRG=${HOME}/bin/myLock + export HISTCONTROL=ignoreboth + export HISTIGNORE='pwd:exit:clear:history' + + + [ -f /etc/profile.d/bash-completion.sh ] && source /etc/profile.d/bash-completion.sh + [ -f /usr/local/share/bash-completion/bash_completion.sh ] && source/usr/local/share/bash-completion/bash_completion.sh + [ -f /usr/share/bash-completion/bash_completion ] && source /usr/share/bash-completion/bash_completion + [ ! -v ${BASH_COMPLETION_VERSINFO} -a -d ${HOME}/.bash_completion.d ] && for i in $(ls -1 ${HOME}/.bash_completion.d/*.sh); do source $i; done + + export PROMPT_COMMAND='history -a' # Always append history files + PS1='\u@\h:\w> ' + + test -f "${HOME}/.bash_aliases" && . ${HOME}/.bash_aliases + test -f "${HOME}/.bash_local" && . ${HOME}/.bash_local + test -f "${HOME}/.liquidprompt/liquidprompt" && . ${HOME}/.liquidprompt/liquidprompt + # git completion + if [ ! -v BASH_COMPLETION_VERSINFO -a -f /usr/local/share/git-completion/git-completion.bash ]; then + source /usr/local/share/git-completion/git-completion.bash + fi + + export NVM_DIR="/usr/local/share/nvm" + [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm + [ ! -v BASH_COMPLETION_VERSINFO -a -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion" # This loads nvm bash_completion + export SASL_PATH=/usr/local/lib/sasl2 + #complete -C "${GOPATH}/bin/bitcomplete" bit + test -f "${HOME}/.bash_${HOSTNAME_SHORT}" && . ${HOME}/.bash_$HOSTNAME_SHORT + + # BEGIN_KITTY_SHELL_INTEGRATION + if test -n "$KITTY_INSTALLATION_DIR" -a -e "$KITTY_INSTALLATION_DIR/shell-integration/bash/kitty.bash"; then source "$KITTY_INSTALLATION_DIR/shell-integration/bash/kitty.bash"; fi + # END_KITTY_SHELL_INTEGRATION + complete -o nospace -F _task t +fi