Compare commits

...

6 Commits

Author SHA1 Message Date
Andrew Williams
3620c5cf4d [shell-common] Add Dublin to TZ 2025-07-30 13:56:58 +01:00
Andrew Williams
8838fe8f42 [git] Fix includes 2025-07-30 13:50:41 +01:00
Andrew Williams
9e8e39db66 [shell-common] Break out AWS commands 2025-07-30 13:40:59 +01:00
Andrew Williams
2b3f64646c [macos] Combine macOS specific functions 2025-07-30 13:40:43 +01:00
Andrew Williams
fcc7918f7f [zsh] Show AWS profile on the prompt if active 2025-07-30 12:33:31 +01:00
Andrew Williams
ce9bfd8224 [shell-common] Add profile display name to awslogin/logout command 2025-07-30 12:33:14 +01:00
7 changed files with 223 additions and 195 deletions

View File

@@ -11,10 +11,6 @@
rh = reset --hard rh = reset --hard
dist = "!git archive --format=tar -v --prefix=$(git describe HEAD)/ $(git describe HEAD) | gzip -9 > ../$(git describe HEAD).tar.gz" dist = "!git archive --format=tar -v --prefix=$(git describe HEAD)/ $(git describe HEAD) | gzip -9 > ../$(git describe HEAD).tar.gz"
[include]
path = ~/.gitconfig-gpg
path = ~/.gitconfig-local
[init] [init]
defaultBranch = main defaultBranch = main
@@ -52,3 +48,8 @@
[url "ssh://git@github.com/2315-Media"] [url "ssh://git@github.com/2315-Media"]
insteadOf = "https://github.com/2315-Media" insteadOf = "https://github.com/2315-Media"
[include]
path = ~/.gitconfig-gpg
path = ~/.gitconfig-work
path = ~/.gitconfig-local

View File

@@ -1,4 +0,0 @@
# Updates Homebrew installation from the Brewfile
function update-brewfile() {
brew bundle check --file "$HOME/.config/Brewfile" || brew bundle --cleanup -f --file "$HOME/.config/Brewfile"
}

View File

@@ -1,3 +1,17 @@
# Tag the file as OK to run
function itsok() {
if [[ $(uname) == "Darwin" ]]; then
xattr -d com.apple.quarantine $1
else
echo 'This only works on macOS...'
fi
}
# Updates Homebrew installation from the Brewfile
function update-brewfile() {
brew bundle check --file "$HOME/.config/Brewfile" || brew bundle --cleanup -f --file "$HOME/.config/Brewfile"
}
# Updates the dock # Updates the dock
function update-dock() { function update-dock() {
idx=1 idx=1

View File

@@ -0,0 +1,193 @@
# Get the list of AWS profiles
function awsprofiles() {
profiles=$(aws --no-cli-pager configure list-profiles 2> /dev/null)
if [[ -z "$profiles" ]]; then
echo "No AWS profiles found in '$HOME/.aws/config, check if ~/.aws/config exists and properly configured.'"
return 1
else
echo $profiles
fi
}
# login via SSO to AWS
function awslogin() {
local profile=""
local region=""
# Parse optional arguments
while [[ $# -gt 0 ]]; do
case "$1" in
--profile)
profile="$2"
shift 2
;;
--region)
region="$2"
shift 2
;;
*)
echo "Unknown option: $1"
echo "Usage: awslogin --profile prof [--region region]"
return 1
;;
esac
done
# Check if profile is provided
if [[ -z "$profile" ]]; then
echo "Error: --profile parameter is required."
echo "Usage: awslogin --profile prof [--region region]"
return 1
fi
# Build AWS CLI options
local aws_opts=()
[[ -n "$profile" ]] && aws_opts+=(--profile "$profile")
[[ -n "$region" ]] && aws_opts+=(--region "$region")
# Login via SSO
aws sso login "${aws_opts[@]}"
# Export AWS credentials
while IFS= read -r line; do
[[ -n "$line" ]] && eval "export $line"
done < <(aws configure export-credentials --format env "${aws_opts[@]}")
if [[ $? -ne 0 ]]; then
echo "Failed to export AWS credentials."
return 2
fi
echo "AWS login successful. Credentials exported."
export AWS_PROFILE_ACTIVE="$profile"
if [[ -n "$profile" ]]; then
export AWS_PROFILE_DISPLAY="[aws: $profile]"
else
export AWS_PROFILE_DISPLAY=""
fi
}
function awslogout() {
unset AWS_PROFILE_ACTIVE
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset AWS_SESSION_TOKEN
export AWS_PROFILE_DISPLAY=""
echo "AWS profile and credentials cleared."
}
# easy access to SSH
function awsssh() {
local profile=""
local region=""
local username="ansible"
local search=""
# Parse arguments
while [[ $# -gt 0 ]]; do
case "$1" in
--profile)
profile="$2"
shift 2
;;
--region)
region="$2"
shift 2
;;
*)
search="$1"
shift
;;
esac
done
if [[ -z "$search" ]]; then
echo "Usage: awsssh [--profile prof] [--region reg] [user@]search-term"
return 1
fi
# Extract username if provided as user@search
if [[ "$search" == *@* ]]; then
username="${search%@*}"
search="${search#*@}"
fi
# Build AWS CLI options
local aws_opts=()
[[ -n "$profile" ]] && aws_opts+=(--profile "$profile")
[[ -n "$region" ]] && aws_opts+=(--region "$region")
# Get matching instances
local instances
instances=$(aws ec2 describe-instances \
--filters "Name=tag:Name,Values=*$search*" \
--query 'Reservations[].Instances[].{
Name: Tags[?Key==`Name`].Value | [0],
IP: PublicIpAddress,
InstanceId: InstanceId
}' \
--output json \
"${aws_opts[@]}")
if [[ $? -ne 0 || -z "$instances" || "$instances" == "[]" ]]; then
echo "Failed to retrieve instances or no match found."
return 2
fi
# Select instance using fzf
local selection
selection=$(echo "$instances" | jq -r '.[] | "\(.Name): \(.IP // "no-ip") (\(.InstanceId))"' |
fzf -1 -0 --header "Select an instance")
if [[ -z "$selection" ]]; then
echo "No valid instance selected."
return 3
fi
# Extract IP and InstanceId from selection
local ip instance_id
ip=$(echo "$selection" | sed -E 's/.*: (.*) \(.*/\1/')
instance_id=$(echo "$selection" | sed -E 's/.*\((i-[a-z0-9]+)\).*/\1/')
if [[ "$ip" != "no-ip" ]]; then
echo "Connecting to $username@$ip via SSH..."
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 "${username}@${ip}"
else
echo "No public IP found. Falling back to AWS Session Manager..."
aws ssm start-session --target "$instance_id" "${aws_opts[@]}"
fi
}
function instances() {
local profile=""
local region=""
# Parse optional arguments
while [[ $# -gt 0 ]]; do
case "$1" in
--profile)
profile="$2"
shift 2
;;
--region)
region="$2"
shift 2
;;
*)
echo "Unknown option: $1"
echo "Usage: list_ec2_instances [--profile prof] [--region region]"
return 1
;;
esac
done
# Build AWS CLI options
local aws_opts=()
[[ -n "$profile" ]] && aws_opts+=(--profile "$profile")
[[ -n "$region" ]] && aws_opts+=(--region "$region")
# Query EC2 for names and instance IDs
aws ec2 describe-instances \
--query 'Reservations[].Instances[].{Name: Tags[?Key==`Name`].Value | [0], InstanceId: InstanceId}' \
--output table \
"${aws_opts[@]}"
}

View File

@@ -34,7 +34,7 @@ fi
# https://github.com/oz/tz # https://github.com/oz/tz
if [ -x "$(command -v tz)" ]; then if [ -x "$(command -v tz)" ]; then
export TZ_LIST="America/New_York,WDW;America/Los_Angeles,DLR;Europe/Paris,DLP" export TZ_LIST="Europe/Dublin,Portwest HQ;America/New_York,WDW;America/Los_Angeles,DLR;Europe/Paris,DLP"
fi fi
# macOS Specific envs # macOS Specific envs

View File

@@ -1,15 +1,13 @@
# Git pulls latest dotfiles # Git pulls latest dotfiles
function update-dotfiles() { function update-dotfiles() {
prevdir=$PWD prevdir=$PWD
if [ -d "${HOME}/.dotfiles" ]; then for dir in "${HOME}/.dotfiles" "${HOME}/.dotfiles-private" "${HOME}/.dotfiles-work"; do
cd $HOME/.dotfiles if [ -d "$dir" ]; then
git pull --rebase --autostash cd "$dir"
fi git pull --rebase --autostash
if [ -d "${HOME}/.dotfiles-private" ]; then fi
cd $HOME/.dotfiles-private done
git pull --rebase --autostash cd "$prevdir"
fi
cd $prevdir
} }
# Wrapper around ssh-add to ease usage and also ensure basic timeouts # Wrapper around ssh-add to ease usage and also ensure basic timeouts
@@ -40,179 +38,3 @@ function demoprompt() {
clear clear
fi fi
} }
# Tag the file as OK to run
function itsok() {
if [[ $(uname) == "Darwin" ]]; then
xattr -d com.apple.quarantine $1
else
echo 'This only works on macOS...'
fi
}
# login via SSO to AWS
function awslogin() {
local profile=""
local region=""
# Parse optional arguments
while [[ $# -gt 0 ]]; do
case "$1" in
--profile)
profile="$2"
shift 2
;;
--region)
region="$2"
shift 2
;;
*)
echo "Unknown option: $1"
echo "Usage: awslogin --profile prof [--region region]"
return 1
;;
esac
done
# Check if profile is provided
if [[ -z "$profile" ]]; then
echo "Error: --profile parameter is required."
echo "Usage: awslogin --profile prof [--region region]"
return 1
fi
# Build AWS CLI options
local aws_opts=()
[[ -n "$profile" ]] && aws_opts+=(--profile "$profile")
[[ -n "$region" ]] && aws_opts+=(--region "$region")
# Login via SSO
aws sso login "${aws_opts[@]}"
# Export AWS credentials
while IFS= read -r line; do
[[ -n "$line" ]] && eval "export $line"
done < <(aws configure export-credentials --format env "${aws_opts[@]}")
if [[ $? -ne 0 ]]; then
echo "Failed to export AWS credentials."
return 2
fi
echo "AWS login successful. Credentials exported."
}
# easy access to SSH
function awsssh() {
local profile=""
local region=""
local username="ec2-user"
local search=""
# Parse arguments
while [[ $# -gt 0 ]]; do
case "$1" in
--profile)
profile="$2"
shift 2
;;
--region)
region="$2"
shift 2
;;
*)
search="$1"
shift
;;
esac
done
if [[ -z "$search" ]]; then
echo "Usage: awsssh [--profile prof] [--region reg] [user@]search-term"
return 1
fi
# Extract username if provided as user@search
if [[ "$search" == *@* ]]; then
username="${search%@*}"
search="${search#*@}"
fi
# Build AWS CLI options
local aws_opts=()
[[ -n "$profile" ]] && aws_opts+=(--profile "$profile")
[[ -n "$region" ]] && aws_opts+=(--region "$region")
# Get matching instances
local instances
instances=$(aws ec2 describe-instances \
--filters "Name=tag:Name,Values=*$search*" \
--query 'Reservations[].Instances[].{
Name: Tags[?Key==`Name`].Value | [0],
IP: PublicIpAddress,
InstanceId: InstanceId
}' \
--output json \
"${aws_opts[@]}")
if [[ $? -ne 0 || -z "$instances" || "$instances" == "[]" ]]; then
echo "Failed to retrieve instances or no match found."
return 2
fi
# Select instance using fzf
local selection
selection=$(echo "$instances" | jq -r '.[] | "\(.Name): \(.IP // "no-ip") (\(.InstanceId))"' |
fzf -1 -0 --header "Select an instance")
if [[ -z "$selection" ]]; then
echo "No valid instance selected."
return 3
fi
# Extract IP and InstanceId from selection
local ip instance_id
ip=$(echo "$selection" | sed -E 's/.*: (.*) \(.*/\1/')
instance_id=$(echo "$selection" | sed -E 's/.*\((i-[a-z0-9]+)\).*/\1/')
if [[ "$ip" != "no-ip" ]]; then
echo "Connecting to $username@$ip via SSH..."
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 "${username}@${ip}"
else
echo "No public IP found. Falling back to AWS Session Manager..."
aws ssm start-session --target "$instance_id" "${aws_opts[@]}"
fi
}
function instances() {
local profile=""
local region=""
# Parse optional arguments
while [[ $# -gt 0 ]]; do
case "$1" in
--profile)
profile="$2"
shift 2
;;
--region)
region="$2"
shift 2
;;
*)
echo "Unknown option: $1"
echo "Usage: list_ec2_instances [--profile prof] [--region region]"
return 1
;;
esac
done
# Build AWS CLI options
local aws_opts=()
[[ -n "$profile" ]] && aws_opts+=(--profile "$profile")
[[ -n "$region" ]] && aws_opts+=(--region "$region")
# Query EC2 for names and instance IDs
aws ec2 describe-instances \
--query 'Reservations[].Instances[].{Name: Tags[?Key==`Name`].Value | [0], InstanceId: InstanceId}' \
--output table \
"${aws_opts[@]}"
}

View File

@@ -4,4 +4,6 @@ HISTSIZE=2000
SAVEHIST=1000 SAVEHIST=1000
# Prompt # Prompt
export PS1="%F{8}[%F{white}%n@%m%F{8}] (%F{white}%1~%F{8}) %F{white}%#%f " setopt PROMPT_SUBST
export AWS_PROFILE_DISPLAY=''
export PS1='%F{8}[%F{white}%n@%m%F{8}] (%F{white}%1~%F{8}) %F{yellow}$AWS_PROFILE_DISPLAY%F{white} %#%f '