From 5f610a0af908137758992e2355c5ed6df2d71723 Mon Sep 17 00:00:00 2001 From: romkatv Date: Wed, 28 Aug 2019 18:55:33 +0200 Subject: [PATCH] fix network interface and ip parsing --- internal/p10k.zsh | 73 ++++++++++++++++++++++------------------------- 1 file changed, 34 insertions(+), 39 deletions(-) diff --git a/internal/p10k.zsh b/internal/p10k.zsh index fc262ade..7c1f1945 100755 --- a/internal/p10k.zsh +++ b/internal/p10k.zsh @@ -212,44 +212,13 @@ _p9k_segment_in_use() { } function _p9k_parse_ip() { - local desiredInterface=${1:-'^[^ ]+'} - - if [[ $_p9k_os == OSX ]]; then - [[ -x /sbin/ifconfig ]] || return - local rawInterfaces && rawInterfaces="$(/sbin/ifconfig -l 2>/dev/null)" || return - local -a interfaces=(${(A)=rawInterfaces}) - local pattern="${desiredInterface}[^ ]?" - local -a relevantInterfaces - for rawInterface in $interfaces; do - [[ "$rawInterface" =~ $pattern ]] && relevantInterfaces+=$MATCH - done - local newline=$'\n' - local interfaceName interface - for interfaceName in $relevantInterfaces; do - interface="$(/sbin/ifconfig $interfaceName 2>/dev/null)" || continue - [[ "${interface}" =~ "lo[0-9]*" ]] && continue - if [[ "${interface//${newline}/}" =~ "<([^>]*)>(.*)inet[ ]+([^ ]*)" ]]; then - local ipFound="${match[3]}" - local -a interfaceStates=(${(s:,:)match[1]}) - if (( ${interfaceStates[(I)UP]} )); then - _p9k_ret=$ipFound - return - fi - fi - done - else - [[ -x /sbin/ip ]] || return - local -a interfaces=( "${(f)$(/sbin/ip -brief -4 a show 2>/dev/null)}" ) - local pattern="^${desiredInterface}[[:space:]]+UP[[:space:]]+([^/ ]+)" - local interface - for interface in "${(@)interfaces}"; do - if [[ "$interface" =~ $pattern ]]; then - _p9k_ret=$match[1] - return - fi - done - fi - + local iface_regex="^${1:-.*}\$" iface ip + for iface ip in "${(@kv)_p9k_iface}"; do + if [[ $iface =~ $iface_regex ]]; then + _p9k_ret=$ip + return 0 + fi + done return 1 } @@ -3075,6 +3044,23 @@ _p9k_preexec() { _p9k_timer_start=EPOCHREALTIME } +function _p9k_set_iface() { + if [[ ! -x /sbin/ifconfig ]]; then + _p9k_iface=() + return + fi + local line + local iface + for line in ${(f)"$(/sbin/ifconfig 2>/dev/null)"}; do + if [[ $line == (#b)([^[:space:]:]##):[[:space:]]##flags=(<->)'<'* ]]; then + [[ $match[2] == *[13579] ]] && iface=$match[1] || iface= + elif [[ -n $iface && $line == (#b)[[:space:]]##inet[[:space:]]##([0-9.]##)* ]]; then + _p9k_iface[$iface]=$match[1] + iface= + fi + done +} + function _p9k_build_segment() { _p9k_segment_name=${_p9k_segment_name%_joined} if [[ $_p9k_segment_name == custom_* ]]; then @@ -3093,6 +3079,8 @@ function _p9k_set_prompt() { PROMPT=$_p9k_prompt_prefix_left RPROMPT= + (( _p9k_fetch_iface )) && _p9k_set_iface + local -i left_idx=1 right_idx=1 num_lines=$#_p9k_line_segments_left i for i in {1..$num_lines}; do local right= @@ -3544,6 +3532,8 @@ _p9k_init_vars() { typeset -gi _p9k_num_cpus typeset -g _p9k_pwd typeset -g _p9k_pwd_a + typeset -gA _p9k_iface + typeset -gi _p9k_fetch_iface typeset -g P9K_VISUAL_IDENTIFIER typeset -g P9K_CONTENT @@ -3686,7 +3676,7 @@ _p9k_init_params() { _p9k_declare -i POWERLEVEL9K_SHORTEN_DELIMITER_LENGTH _p9k_declare -e POWERLEVEL9K_SHORTEN_DELIMITER _p9k_declare -i POWERLEVEL9K_SHORTEN_DIR_LENGTH - _p9k_declare -s POWERLEVEL9K_IP_INTERFACE "^[^ ]+" + _p9k_declare -s POWERLEVEL9K_IP_INTERFACE "" _p9k_declare -s POWERLEVEL9K_VPN_IP_INTERFACE "tun" _p9k_declare -i POWERLEVEL9K_LOAD_WHICH 5 _p9k_declare -b POWERLEVEL9K_NODENV_PROMPT_ALWAYS_SHOW 0 @@ -4328,6 +4318,11 @@ _p9k_init() { fi _p9k_wrap_zle_widget zle-keymap-select _p9k_zle_keymap_select + + if [[ -n $_POWERLEVEL9K_PUBLIC_IP_VPN_INTERFACE ]] && _p9k_segment_in_use public_ip || + _p9k_segment_in_use ip || _p9k_segment_in_use vpn_ip; then + _p9k_fetch_iface=1 + fi } _p9k_deinit() {