浏览代码

feat(aws): implement permanent state (#12018)

Co-authored-by: Rei Arifi <reiarifi@Reis-MacBook-Pro.local>
Co-authored-by: Hysen Ndregjoni <hndregjoni@hotmail.com>
0rxa 3 月之前
父节点
当前提交
05bf69c604
共有 2 个文件被更改,包括 41 次插入0 次删除
  1. 5 0
      plugins/aws/README.md
  2. 36 0
      plugins/aws/aws.plugin.zsh

+ 5 - 0
plugins/aws/README.md

@@ -47,6 +47,11 @@ plugins=(... aws)
   Some themes might overwrite the value of RPROMPT instead of appending to it, so they'll need to be fixed to
   Some themes might overwrite the value of RPROMPT instead of appending to it, so they'll need to be fixed to
   see the AWS profile/region prompt.
   see the AWS profile/region prompt.
 
 
+* Set `AWS_PROFILE_STATE_ENABLED=true` in your zshrc file if you want the aws profile to persist between shell sessions.
+  This option might slow down your shell startup time.
+  By default the state file path is `/tmp/.aws_current_profile`. This means that the state won't survive a reboot or otherwise GC.
+  You can control the state file path using the `AWS_STATE_FILE` environment variable.
+
 ## Theme
 ## Theme
 
 
 The plugin creates an `aws_prompt_info` function that you can use in your theme, which displays
 The plugin creates an `aws_prompt_info` function that you can use in your theme, which displays

+ 36 - 0
plugins/aws/aws.plugin.zsh

@@ -6,10 +6,26 @@ function agr() {
   echo $AWS_REGION
   echo $AWS_REGION
 }
 }
 
 
+# Update state file if enabled
+function _aws_update_state() {
+  if [[ "$AWS_PROFILE_STATE_ENABLED" == true ]]; then
+    test -d $(dirname ${AWS_STATE_FILE}) || exit 1
+    echo "${AWS_PROFILE} ${AWS_REGION}" > "${AWS_STATE_FILE}"
+  fi
+}
+
+function _aws_clear_state() {
+  if [[ "$AWS_PROFILE_STATE_ENABLED" == true ]]; then
+    test -d $(dirname ${AWS_STATE_FILE}) || exit 1
+    echo -n > "${AWS_STATE_FILE}"
+  fi
+}
+
 # AWS profile selection
 # AWS profile selection
 function asp() {
 function asp() {
   if [[ -z "$1" ]]; then
   if [[ -z "$1" ]]; then
     unset AWS_DEFAULT_PROFILE AWS_PROFILE AWS_EB_PROFILE AWS_PROFILE_REGION
     unset AWS_DEFAULT_PROFILE AWS_PROFILE AWS_EB_PROFILE AWS_PROFILE_REGION
+    _aws_clear_state
     echo AWS profile cleared.
     echo AWS profile cleared.
     return
     return
   fi
   fi
@@ -28,6 +44,8 @@ function asp() {
 
 
   export AWS_PROFILE_REGION=$(aws configure get region)
   export AWS_PROFILE_REGION=$(aws configure get region)
 
 
+  _aws_update_state
+
   if [[ "$2" == "login" ]]; then
   if [[ "$2" == "login" ]]; then
     if [[ -n "$3" ]]; then
     if [[ -n "$3" ]]; then
       aws sso login --sso-session $3
       aws sso login --sso-session $3
@@ -43,6 +61,7 @@ function asp() {
 function asr() {
 function asr() {
   if [[ -z "$1" ]]; then
   if [[ -z "$1" ]]; then
     unset AWS_DEFAULT_REGION AWS_REGION
     unset AWS_DEFAULT_REGION AWS_REGION
+    _aws_update_state
     echo AWS region cleared.
     echo AWS region cleared.
     return
     return
   fi
   fi
@@ -56,6 +75,7 @@ function asr() {
 
 
   export AWS_REGION=$1
   export AWS_REGION=$1
   export AWS_DEFAULT_REGION=$1
   export AWS_DEFAULT_REGION=$1
+  _aws_update_state
 }
 }
 
 
 # AWS profile switch
 # AWS profile switch
@@ -255,6 +275,22 @@ if [[ "$SHOW_AWS_PROMPT" != false && "$RPROMPT" != *'$(aws_prompt_info)'* ]]; th
   RPROMPT='$(aws_prompt_info)'"$RPROMPT"
   RPROMPT='$(aws_prompt_info)'"$RPROMPT"
 fi
 fi
 
 
+if [[ "$AWS_PROFILE_STATE_ENABLED" == true ]]; then
+  AWS_STATE_FILE="${AWS_STATE_FILE:-/tmp/.aws_current_profile}"
+  test -s "${AWS_STATE_FILE}" || return
+
+  aws_state=($(cat $AWS_STATE_FILE))
+  
+  export AWS_DEFAULT_PROFILE="${aws_state[1]}"
+  export AWS_PROFILE="$AWS_DEFAULT_PROFILE"
+  export AWS_EB_PROFILE="$AWS_DEFAULT_PROFILE"
+
+  test -z "${aws_state[2]}" && AWS_REGION=$(aws configure get region)
+
+  export AWS_REGION=${AWS_REGION:-$aws_state[2]}
+  export AWS_DEFAULT_REGION="$AWS_REGION"
+fi
+
 # Load awscli completions
 # Load awscli completions
 
 
 # AWS CLI v2 comes with its own autocompletion. Check if that is there, otherwise fall back
 # AWS CLI v2 comes with its own autocompletion. Check if that is there, otherwise fall back