diff --git a/plugins/yubikey/README.md b/plugins/yubikey/README.md new file mode 100644 index 000000000..ef8312dd8 --- /dev/null +++ b/plugins/yubikey/README.md @@ -0,0 +1,22 @@ +# YubiKey Plugin + +YubiKey plugin -- Provides aliases to help use YubiKey tokens comfortably + +## Usage + +This plugin will first try to detect location of the 'opensc-pkcs11.so' library, unless already specified in the $OPENSC env var. + +Afterwards, it will try to detect if a 'shared ssh-agent' is already running, through a file in /run (preferred, but must be pre-created with the proper permissions), or in /tmp (fallback). + +Then it will define several aliases. + +## Optional Parameters + +These parameters can be set before source-ing oh-my-zsh to customize the settings: + +`YUBI_SHOWKEYS` +> If set to '1' or 'y' or 'yes', will list the keys contained in the 'shared ssh-agent' + +`YUBI_SSHAGENT_AUTOINIT` +> If set to '1' or 'y' or 'yes', will automatically initialize the 'shared ssh-agent' if one is not found + diff --git a/plugins/yubikey/yubikey.plugin.zsh b/plugins/yubikey/yubikey.plugin.zsh new file mode 100644 index 000000000..7fff4f777 --- /dev/null +++ b/plugins/yubikey/yubikey.plugin.zsh @@ -0,0 +1,59 @@ + + +local _libname='opensc-pkcs11.so' +local _sshfiledir="/run/user/$UID" +local _sshfile='ssh_agent' +local _sshpath='' +local _ellipsis='......' + +if [[ -z $OPENSC ]]; then + for f in $(locate "/${_libname}"); do + [[ -L $f ]] && continue # Is a sublink + OPENSC="$f" + break + done +fi +export OPENSC + +if [[ -w $_sshfiledir ]]; then + _sshpath="$_sshfiledir/$_sshfile" +else + _sshpath="/tmp/$_sshfile" +fi + + +alias yubi-init="pkill ssh-agent; pkill gpg-agent; ssh-agent -s > $_sshpath; source $_sshpath" +alias yubi-insert="ssh-add -s $OPENSC && ssh-add -L" +alias yubi-eject="ssh-add -e $OPENSC && ssh-add -L" + +if [[ -r $_sshpath ]]; then + echo -n "Common SSH Agent detected. " + source $_sshpath +else + echo -n "Common SSH Agent not detected. " + case "${(U)YUBI_SSHAGENT_AUTOINIT}" in + 1|Y|YES) + echo -n "Auto-initializing... " + yubi-init + echo "done." + ;; + *) + echo "Autoinit not enabled. Use 'yubi-init' to manually init." + ;; + esac +fi + +case "${(U)YUBI_SHOWKEYS}" in + 1|Y|YES) + ssh-add -L | while read ln; do + if (( ${#ln} >= COLUMNS )); then + newlen=$(( COLUMNS - ${#_ellipsis} - 1 )) + halflen=$(( newlen / 2 )) + ln="${ln:0:$halflen}${_ellipsis}${ln: -$halflen}" + fi + echo "$ln" + done + ;; +esac + +# vim: set ft=zsh ts=4 sts=4 et ai : diff --git a/themes/ys-pep-2.zsh-theme b/themes/ys-pep-2.zsh-theme new file mode 100644 index 000000000..cefeef97e --- /dev/null +++ b/themes/ys-pep-2.zsh-theme @@ -0,0 +1,124 @@ +# ys-pep Theme version 2, based on ys Theme by Yad Smood +# +# ----- BEGIN Original Description ----- +# +# Clean, simple, compatible and meaningful. +# Tested on Linux, Unix and Windows under ANSI colors. +# It is recommended to use with a dark background. +# Colors: black, red, green, yellow, *blue, magenta, cyan, and white. +# +# Mar 2013 Yad Smood +# +# ----- END Original Description ----- +# +# Changes to ys theme: +# * Move timestamp to the front and make it darker +# * List current IP addresses +# * GCE hook (for controlling Google Cloud) +# * Virtualenv hook +# * Fix Mercurial detection +# +# Sep-Oct 2017 Pandu POLUAN +# +# Changes to ys-pep theme: +# * Split the prompt definition to 3 sections for better maintainability +# * Add "leftbar" to more easily identify the prompt after a monstrous scroll +# * Better IP address detection -- skips link-local, loopback, and DOWN ifaces +# +# Nov-Dec 2017 Pandu POLUAN + +# VCS +YS_VCS_PROMPT_PREFIX1=" %F{white}on%{$reset_color%} " +YS_VCS_PROMPT_PREFIX2=":%F{cyan}" +YS_VCS_PROMPT_SUFFIX="%{$reset_color%}" +YS_VCS_PROMPT_DIRTY=" %F{red}x" +YS_VCS_PROMPT_CLEAN=" %F{green}o" + +# Git info +local git_info='$(git_prompt_info)' +ZSH_THEME_GIT_PROMPT_PREFIX="${YS_VCS_PROMPT_PREFIX1}git${YS_VCS_PROMPT_PREFIX2}" +ZSH_THEME_GIT_PROMPT_SUFFIX="$YS_VCS_PROMPT_SUFFIX" +ZSH_THEME_GIT_PROMPT_DIRTY="$YS_VCS_PROMPT_DIRTY" +ZSH_THEME_GIT_PROMPT_CLEAN="$YS_VCS_PROMPT_CLEAN" + +# HG info +local hg_info='$(ys_hg_prompt_info)' +ys_hg_prompt_info() { + # make sure this is a Mercurial project + if [ -d '.hg' ] || $(hg summary > /dev/null 2>&1) ; then + echo -n "${YS_VCS_PROMPT_PREFIX1}hg${YS_VCS_PROMPT_PREFIX2}" + echo -n $(hg branch 2>/dev/null) + if [ -n "$(hg status 2>/dev/null)" ]; then + echo -n "$YS_VCS_PROMPT_DIRTY" + else + echo -n "$YS_VCS_PROMPT_CLEAN" + fi + echo -n "$YS_VCS_PROMPT_SUFFIX" + fi +} + +local exit_code="%(?,,C:%F{red}%?%{$reset_color%} )" + +### BEGIN: pepoluan changes ### +local dgrey="%B%F{black}" +local leftbar1="%F{148}┏%f" +local leftbar2="%F{148}┃%f" +local leftbar3="%F{148}┗%f" + +# Show my IP Address +ZSH_THEME_SHOW_IP=1 +ZSH_THEME_SHOW_IP6=0 +yspep_my_ip() { + [[ $ZSH_THEME_SHOW_IP != 1 ]] && return + echo -n "${dgrey}[%b%F{green}" + if [[ ${(L)_system_name} == cygwin ]]; then + echo -n $(ipconfig | awk '$1 ~ /IP/ && $2 ~ /[Aa]ddress/ {sub(/.*:/, "", $0); gsub(/[ \t\r]/, "", $0); print $0}') + else + addrs=() + while read num dev fam addr etc; do + [[ $dev =~ ^lo ]] && continue # skip loopback + [[ $fam =~ ^inet ]] || continue # skip non-inet addr's (what could they be?) + [[ $fam == inet6 && $ZSH_THEME_SHOW_IP6 != 1 ]] && continue + addrs+=( "%F{022}$dev:%F{green}${addr%/*}" ) + done < <(ip -d -o addr sh) + echo -n "${(j: :)addrs}" + fi + echo "${dgrey}]%b" +} +local ip_info='$(yspep_my_ip)' + +# Show Virtualenv +ZSH_THEME_VIRTUALENV_PREFIX=" V:" +ZSH_THEME_VIRTUALENV_SUFFIX=" " +local venv_info="%B%F{blue}\$(virtualenv_prompt_info)%b" + +# Other info, you can override this function in .zshrc +yspep_other_info() { + # Example: Show the GCE_PROJECT variable in yellow: + : echo "%{${GCE_PROJECT:+$fg[yellow] GCE:}$GCE_PROJECT%}" + + # IMPORTANT: You should *not* escape the vars in the above echo! +} +local other_info='$(yspep_other_info)' + +# First Line (notice the newline at end!) +PROMPT="$leftbar1$ip_info +" + +# Second Line (notice the newline at end!) +PROMPT+="$leftbar2${dgrey}[%*]%b \ +%(#,%K{yellow}%F{black}%n%k,%F{cyan}%n)\ +%F{white}@%F{green}%m$dgrey:%b\ +%B%F{yellow}%~%b\ +${hg_info}\ +${git_info}\ + $exit_code$venv_info$other_info +" + +# Third Line (NO newline!) +PROMPT+="$leftbar3%B%F{red}%#%b%f " + +unset RPROMPT + +# vim: set ai ts=2 sts=2 et ft=sh : +# diff --git a/themes/ys-pep.zsh-theme b/themes/ys-pep.zsh-theme new file mode 100644 index 000000000..4242d69ea --- /dev/null +++ b/themes/ys-pep.zsh-theme @@ -0,0 +1,106 @@ +# ys-pep Theme, based on ys Theme by Yad Smood +# +# ----- BEGIN Original Description ----- +# +# Clean, simple, compatible and meaningful. +# Tested on Linux, Unix and Windows under ANSI colors. +# It is recommended to use with a dark background. +# Colors: black, red, green, yellow, *blue, magenta, cyan, and white. +# +# Mar 2013 Yad Smood +# +# ----- END Original Description ----- +# +# Changes to ys theme: +# * Move timestamp to the front and make it darker +# * List current IP addresses +# * GCE hook (for controlling Google Cloud) +# * Virtualenv hook +# * Fix Mercurial detection +# +# Sep-Oct 2017 Pandu POLUAN + +# VCS +YS_VCS_PROMPT_PREFIX1=" %F{white}on%{$reset_color%} " +YS_VCS_PROMPT_PREFIX2=":%F{cyan}" +YS_VCS_PROMPT_SUFFIX="%{$reset_color%}" +YS_VCS_PROMPT_DIRTY=" %F{red}x" +YS_VCS_PROMPT_CLEAN=" %F{green}o" + +# Git info +local git_info='$(git_prompt_info)' +ZSH_THEME_GIT_PROMPT_PREFIX="${YS_VCS_PROMPT_PREFIX1}git${YS_VCS_PROMPT_PREFIX2}" +ZSH_THEME_GIT_PROMPT_SUFFIX="$YS_VCS_PROMPT_SUFFIX" +ZSH_THEME_GIT_PROMPT_DIRTY="$YS_VCS_PROMPT_DIRTY" +ZSH_THEME_GIT_PROMPT_CLEAN="$YS_VCS_PROMPT_CLEAN" + +# HG info +local hg_info='$(ys_hg_prompt_info)' +ys_hg_prompt_info() { + # make sure this is a Mercurial project + if [ -d '.hg' ] || $(hg summary > /dev/null 2>&1) ; then + echo -n "${YS_VCS_PROMPT_PREFIX1}hg${YS_VCS_PROMPT_PREFIX2}" + echo -n $(hg branch 2>/dev/null) + if [ -n "$(hg status 2>/dev/null)" ]; then + echo -n "$YS_VCS_PROMPT_DIRTY" + else + echo -n "$YS_VCS_PROMPT_CLEAN" + fi + echo -n "$YS_VCS_PROMPT_SUFFIX" + fi +} + +local exit_code="%(?,,C:%F{red}%?%{$reset_color%} )" + +### BEGIN: pepoluan changes ### +local dgrey="%B%F{black}" + +# Show my IP Address +ZSH_THEME_SHOW_IP=1 +yspep_my_ip() { + [[ $ZSH_THEME_SHOW_IP != 1 ]] && return + echo -n "${dgrey}[%b%F{green}" + if [[ ${(L)_system_name} == cygwin ]]; then + echo -n $(ipconfig | awk '$1 ~ /IP/ && $2 ~ /[Aa]ddress/ {sub(/.*:/, "", $0); gsub(/[ \t\r]/, "", $0); print $0}') + else + echo -n $(ip -o addr show | awk -v atype=${1:-inet} '$2 != "lo" && $3 == atype {gsub(/\/[0-9]+/, "", $4); print $4}') + fi + echo "${dgrey}]%b" +} +local ip_info='$(yspep_my_ip)' + +# Show Virtualenv +ZSH_THEME_VIRTUALENV_PREFIX=" V:" +ZSH_THEME_VIRTUALENV_SUFFIX=" " +local venv_info="%B%F{blue}\$(virtualenv_prompt_info)%b" + +# Other info, you can override this function in .zshrc +yspep_other_info() { + # Example: Show the GCE_PROJECT variable in yellow: + : echo "%{\${GCE_PROJECT:+$fg[yellow] GCE:}\$GCE_PROJECT%}" +} +local other_info='$(yspep_other_info)' + +# Prompt format: +# +# PRIVILEGES USER @ MACHINE in DIRECTORY on git:BRANCH STATE [TIME] C:LAST_EXIT_CODE V:VIRTUALENV +# $ COMMAND +# +# For example: +# +# % ys @ ys-mbp in ~/.oh-my-zsh on git:master x [21:47:42] C:0 +# $ +PROMPT=" +${dgrey}[%*]%b \ +%(#,%K{yellow}%F{black}%n%k,%F{cyan}%n)\ +%F{white}@%F{green}%m$ip_info$dgrey:%b\ +%B%F{yellow}%~%b\ +${hg_info}\ +${git_info}\ + $exit_code$venv_info$other_info +%B%F{red}%#%b%f " + +unset RPROMPT + +# vim: set ai ts=2 sts=2 et : +#