Merge branch 'master' of ssh://git.cyberstuff.me:222/T31M/dotfiles

This commit is contained in:
2021-11-19 15:47:51 +01:00
13 changed files with 22 additions and 39 deletions

View File

@ -0,0 +1,3 @@
function cdk -d "execute aws cdk" -w cdk
__nvm_run "cdk" $argv
end

View File

@ -0,0 +1,67 @@
# AWS Credential Management for FiSH
# TODO change your user
set AWS_IAM_USER ""
# TODO setup your aws-mfa credential keys in the credentials file
# AWS Account details
set DEV_ACCOUNT_ID ""
set STG_ACCOUNT_ID ""
set PROD_ACCOUNT_ID ""
set OPS_ACCOUNT_ID ""
export AWS_REGION=eu-west-1
export AWS_DEFAULT_REGION=eu-west-1
function envAWS --description 'switch to different aws account environments (-) with MFA'
if test (count $argv) -lt 1
echo "Provide an AWS Environment: dev, staging, prod, ops"
return
end
switch $argv[1]
case dev
echo "switching to /refreshing dev"
aws-mfa --assume-role arn:aws:iam::$DEV_ACCOUNT_ID:role/Administrator --duration 43200 --role-session-name $AWS_IAM_USER
getAWSenv
case stg
echo "switching to /refreshing staging"
aws-mfa --assume-role arn:aws:iam::$STG_ACCOUNT_ID:role/Administrator --duration 43200 --role-session-name $AWS_IAM_USER
getAWSenv
case prod
echo "switching to /refreshing prod"
aws-mfa --assume-role arn:aws:iam::$PROD_ACCOUNT_ID:role/Administrator --duration 3600 --role-session-name $AWS_IAM_USER
getAWSenv
case ops
echo "switching to /refreshing ops"
aws-mfa --assume-role arn:aws:iam::$OPS_ACCOUNT_ID:role/Administrator --duration 3600 --role-session-name $AWS_IAM_USER
getAWSenv
case '*'
echo "Wrong / Invalid Environment provided"
return 1
end
end
function getAWSenv --description 'verify and set environment'
set aws_account_id (aws sts get-caller-identity | jq -r '.Account')
if not test -n "$aws_account_id"
echo "aws sts could not get identify. Are you logged in ?"
set -ge env # clear env
return 1
end
if [ $aws_account_id = $DEV_ACCOUNT_ID ]
set -g env dev
else if [ $aws_account_id = $STG_ACCOUNT_ID ]
set -g env stg
else if [ $aws_account_id = $PROD_ACCOUNT_ID ]
set -g env prod
else if [ $aws_account_id = $OPS_ACCOUNT_ID ]
set -g env ops
else
set -ge env
return 1
end
end

View File

@ -0,0 +1,5 @@
set -g CMD_DURATION 0
function fish_greeting
echo "Welcome to "(uname -n)
end

View File

@ -0,0 +1,67 @@
function fish_prompt
set -l symbol "λ "
set -l code $status
set t31m_custom_right (t31m_prompt_right)
echo -ns "$t31m_custom_right"
if test -n "$ssh_client"
set -l host (hostname -s)
set -l who (whoami)
echo -n -s (red)"("(cyan)"$who"(red)":"(cyan)"$host"(red)") "(off)
end
if git::is_repo
set -l branch (git::branch_name ^/dev/null)
set -l ref (git show-ref --head --abbrev | awk '{print substr($0,0,7)}' | sed -n 1p)
printf '%s ' \U1F6E0
echo -n -s (red)"("(off)
if git::is_stashed
echo -n -s (white)"^"(off)
end
if git::is_dirty
printf (white)"*"(off)
end
if command git symbolic-ref HEAD > /dev/null ^/dev/null
if git::is_staged
printf (cyan)"$branch"(off)
else
printf (yellow)"$branch"(off)
end
else
printf (dim)"$ref"(off)
end
for remote in (git remote)
set -l behind_count (echo (command git rev-list $branch..$remote/$branch ^/dev/null | wc -l | tr -d " "))
set -l ahead_count (echo (command git rev-list $remote/$branch..$branch ^/dev/null | wc -l | tr -d " "))
if test $ahead_count -ne 0; or test $behind_count -ne 0; and test (git remote | wc -l) -gt 1
echo -n -s " "(orange)$remote(off)
end
if test $ahead_count -ne 0
echo -n -s (white)" +"$ahead_count(off)
end
if test $behind_count -ne 0
echo -n -s (white)" -"$behind_count(off)
end
end
echo -n -s (red)")"(off)
end
set t31m_custom (t31m_prompt)
# check if latest cmd resulted in exit code 0 (ok)
if test "$code" = 0
echo -e -n -s "$t31m_custom"(red)"\n$symbol"(off)
else
echo -e -n -s "$t31m_custom"(dim)"\n$symbol"(off)
end
end

View File

@ -0,0 +1,107 @@
# Colors
function orange
set_color -o ee5819
end
function yellow
set_color -o b58900
end
function red
set_color -o d30102
end
function cyan
set_color -o 2aa198
end
function white
set_color -o fdf6e3
end
function dim
set_color -o 4f4f4f
end
function off
set_color -o normal
end
# Git
function git::is_repo
test -d .git; or command git rev-parse --git-dir >/dev/null ^/dev/null
end
function git::ahead -a ahead behind diverged none
not git::is_repo; and return
set -l commit_count (command git rev-list --count --left-right "@{upstream}...HEAD" ^/dev/null)
switch "$commit_count"
case ""
# no upstream
case "0"\t"0"
test -n "$none"; and echo "$none"; or echo ""
case "*"\t"0"
test -n "$behind"; and echo "$behind"; or echo "-"
case "0"\t"*"
test -n "$ahead"; and echo "$ahead"; or echo "+"
case "*"
test -n "$diverged"; and echo "$diverged"; or echo "±"
end
end
function git::branch_name
git::is_repo; and begin
command git symbolic-ref --short HEAD ^/dev/null;
or command git show-ref --head -s --abbrev | head -n1 ^/dev/null
end
end
function git::is_dirty
git::is_repo; and not command git diff --no-ext-diff --quiet --exit-code
end
function git::is_staged
git::is_repo; and begin
not command git diff --cached --no-ext-diff --quiet --exit-code
end
end
function git::is_stashed
git::is_repo; and begin
command git rev-parse --verify --quiet refs/stash >/dev/null
end
end
function git::is_touched
git::is_repo; and begin
test -n (echo (command git status --porcelain))
end
end
function git::untracked
git::is_repo; and begin
command git ls-files --other --exclude-standard
end
end
function fish_right_prompt
if test "$theme_complete_path" = "yes"
set cwd (prompt_pwd)
else
set cwd (basename (prompt_pwd))
if git::is_repo
set root_folder (command git rev-parse --show-toplevel ^/dev/null)
set parent_root_folder (dirname $root_folder)
set cwd (echo $PWD | sed -e "s|$parent_root_folder/||")
end
end
# Because of having a two line promt now we dont need right anymore so we dont print anything here atm
#printf (yellow)"("(off)$cwd(yellow)") "(off)
#printf (off)(date +%H(yellow):(off)%M(yellow):(off)%S)(off)"\n"
end

View File

@ -0,0 +1,3 @@
function fish_title
echo "$PWD | $_" | sed "s|$HOME|~|g"
end

View File

@ -0,0 +1,38 @@
function ssm_tunnel --description 'access private AWS ressources via Bastion Host'
if test (count $argv) -lt 2
echo "Provide an Host:Port Mapping & an Local Port"
return
end
# Get bastion host ID using it's name
set INSTANCE_ID (aws ec2 describe-instances \
--filter 'Name=tag:Name,Values=ops-infrastructure-bastion'\
--query "Reservations[].Instances[?State.Name == 'running'].InstanceId[]"\
--output text)
# AWS Remote host i.e elastic.aws.com:80
set REMOTE_HOST $argv[1]
# Ports to bind for forwarding
set LOCAL_PORT $argv[2]
set REM_PORT (math (random) % 65535 + 2000)
set TIMEOUT 21600 #seconds until forwarding session times out (48h max)
# make sure jq is installed
# Start socat on the remote server
set CMD "'sudo socat TCP4-LISTEN:$REM_PORT,reuseaddr,fork TCP4:$REMOTE_HOST'"
set CMD_INVOC_ID (aws ssm send-command --instance-ids $INSTANCE_ID \
--document-name 'AWS-RunShellScript' \
--parameters "commands=$CMD,executionTimeout=$TIMEOUT" --output json | jq -r '.Command.CommandId')
# Start tunnel session
echo "Starting Tunnel"
aws ssm start-session --target $INSTANCE_ID \
--document-name "AWS-StartPortForwardingSession" \
--parameters "portNumber=$REM_PORT,localPortNumber=$LOCAL_PORT"
# stop socat on the bastion
aws ssm cancel-command --command-id $CMD_INVOC_ID
echo "Command Cancelled Successfully."
end

View File

@ -0,0 +1,45 @@
function prompt::awsenv
if test -n "$env"
if [ $env = "prod" ]
printf '%s ' \U2601
echo -n -s (yellow)"["(red)(string upper $env)(yellow)"]"(off)
else
printf '%s ' \U2601
echo -n -s (yellow)"["(off)(string upper $env)(yellow)"]"(off)
end
end
end
function prompt::pyenv
if test (command -v python)
set python_version (python -c "import sys;t='{v[0]}.{v[1]}.{v[2]}'.format(v=list(sys.version_info[:3]));sys.stdout.write(t)")
else
set python_version ""
end
if set -q VIRTUAL_ENV
set venv (echo "$VIRTUAL_ENV" | grep -Eo '[^/]+/?$' | cut -d / -f1)
echo -n -s (printf '%s' \U1F40D)(yellow)"["(cyan)"$venv"(yellow)"@"(off)"$python_version"(yellow)"]"(off)
else if test -n "$PYENV_VERSION"; and [ "$PYENV_VERSION" != "$python_version" ]
# echo -n -s (yellow)(printf '%s' \U1F40D)"["(cyan)(pyenv version-name | sed 's/:.*$//' )(off)"@$python_version"(yellow)"]"(off)
echo -n -s (yellow)(printf '%s' \U1F40D)"["(cyan)(pyenv version-name )(off)"@$python_version"(yellow)"]"(off)
else if test -n "$python_version"
echo -n -s (yellow)(printf '%s' \U1F40D)"["(off)$python_version(yellow)"]"(off)
end
end
function t31m_prompt
set awsenv (prompt::awsenv)
set pyenv (prompt::pyenv)
echo -n -s "$pyenv"
echo -n -s "$awsenv"
if test $CMD_DURATION
# Show duration of the last command in seconds
set duration (echo "$CMD_DURATION 1000" | awk '{printf "%.2fs", $1 / $2}')
printf '%s ' \U23F1
echo -n -s (yellow)"["(off)$duration(yellow)"]"(off)
end
end

View File

@ -0,0 +1,21 @@
# moved original theme right prompt to left as we are working with a new line promt now.
function t31m_prompt_right
if test "$theme_complete_path" = "yes"
set cwd (prompt_pwd)
else
set cwd (basename (prompt_pwd))
if git::is_repo
set root_folder (command git rev-parse --show-toplevel ^/dev/null)
set parent_root_folder (dirname $root_folder)
set cwd (echo $PWD | sed -e "s|$parent_root_folder/||")
end
end
printf '%s' \U231A
printf (yellow)"("(off)(date +%H(yellow):(off)%M(yellow):(off)%S)(yellow)")"(off)
printf '%s' \U1F4C1
printf (yellow)"("(off)$cwd(yellow)")"(off)
end