Trying to conditionally set environment variables in ZSH using function - zsh

Using the following, I'm expecting the my vault provider token to be checked for existence, if it doesn't exist it should then login before setting the environment variables.
If $proxy_auth is set to default empty string, I want to then get it from the vauilt and set it. Then, using that env variable set the others.
I have another function that sets the others to a different proxy depending on what I'm doing.
Error I'm getting is 32: condition expected: "${proxy_auth}"
Yet to be able to figure out what I'm doing wrong here. Any assistance is appreciated.
export proxy_auth=""
function upenv() {
if [[ -v VAULTTOKEN ]]
then
if [[ "${proxy_auth}" != '']]
then
export http_proxy=$proxy_auth
export HTTP_PROXY=$proxy_auth
export https_proxy=$proxy_auth
export HTTPS_PROXY=$proxy_auth
else
export proxy_auth="$(getValueFromVault)"
export http_proxy=$proxy_auth
export HTTP_PROXY=$proxy_auth
export https_proxy=$proxy_auth
export HTTPS_PROXY=$proxy_auth
fi
else
oplogin
if [[ "${proxy_auth}" != '']]
then
export http_proxy=$proxy_auth
export HTTP_PROXY=$proxy_auth
export https_proxy=$proxy_auth
export HTTPS_PROXY=$proxy_auth
else
export proxy_auth="$(getValueFromVault)"
export http_proxy=$proxy_auth
export HTTP_PROXY=$proxy_auth
export https_proxy=$proxy_auth
export HTTPS_PROXY=$proxy_auth
fi
fi
}

if [[ "${proxy_auth}" != '']] should have whitespace between ' and ]
Fix:
if [[ "${proxy_auth}" != '' ]]

Related

Conditionally set global variables in a bash script [duplicate]

This question already has answers here:
Can a shell script set environment variables of the calling shell? [duplicate]
(20 answers)
Closed last month.
I am trying to write a bash script that will take a single argument("prod" or "staging"), and use that to conditionally set global environment variables, specifically to switch between my staging and prod AWS keys. However, even though my logs in the script show what I expect, running echo $AWS_ACCESS_KEY in my terminal after running the script, does not show it was updated. I have tried adding source ~/.zshrc but I don't think that is needed. What can I change to update the $AWS_ACCESS_KEY globally?
#!/bin/bash
tmpAccess="access"
tmpSecret="secret"
if [ $1 == "prod" ];
then
echo "Setting the AWS KEYS to $1 keys"
tmpAccess=$PROD_ACCESS_KEY
tmpSecret=$PROD_SECRET_KEY
elif [ $1 == "staging" ];
then
echo "Setting the AWS KEYS to $1 keys"
tmpAccess=$STAGING_ACCESS_KEY
tmpSecret=$STAGING_SECRET_KEY
else
echo "Unknown env passed in: $1"
fi
export AWS_ACCESS_KEY=$tmpAccess
export AWS_SECRETS_KEY=$tmpSecret
echo "Updated AWS_ACCESS_KEY: $AWS_ACCESS_KEY"
echo "Current tmpAccess: $tmpAccess"
echo "AWS_ACCESS_KEY has been updated to $AWS_ACCESS_KEY for env $1"
echo "AWS_SECRETS_KEY has been updated to $AWS_SECRETS_KEY for env $1"
source ~/.zshrc
My zshrc file looks similar to:
export STAGING_ACCESS_KEY=1234
export STAGING_SECRETS_KEY=abcd
export PROD_ACCESS_KEY=5678
export PROD_SECRETS_KEY=efgh
Clearly, it's not possible to put in a script a program to modify a variable in the current terminal except if you accept to source it (see Setting environment variable in shell script does not make it visible to the shell).
There is another solution. Put your script content in a function:
myfunctionName () {
tmpAccess="access"
tmpSecret="secret"
if [ $1 == "prod" ];
then
echo "Setting the AWS KEYS to $1 keys"
tmpAccess=$PROD_ACCESS_KEY
tmpSecret=$PROD_SECRET_KEY
elif [ $1 == "staging" ];
then
echo "Setting the AWS KEYS to $1 keys"
tmpAccess=$STAGING_ACCESS_KEY
tmpSecret=$STAGING_SECRET_KEY
else
echo "Unknown env passed in: $1"
fi
export AWS_ACCESS_KEY=$tmpAccess
export AWS_SECRETS_KEY=$tmpSecret
echo "Updated AWS_ACCESS_KEY: $AWS_ACCESS_KEY"
echo "Current tmpAccess: $tmpAccess"
echo "AWS_ACCESS_KEY has been updated to $AWS_ACCESS_KEY for env $1"
echo "AWS_SECRETS_KEY has been updated to $AWS_SECRETS_KEY for env $1"
}
and put this function in your .zshrc file.
After that, launch a new terminal and call your myfunctionName function like the script filename.

How to create shard&index in airflow mongohook?

I want to run mongo command with mongohook of airflow. How can I do it?
sh.shardCollection(db_name +, { _id: "hashed" }, false, { numInitialChunks: 128 });
db.collection.createIndex({ "field": 1 }, { field: true });
The pymongo client which the Mongohook provided in Airflow uses doesn't support the sh.shardCollection command in your script.
Though the createIndex collection method is supported in the pymongo client.
I recommend anyway to install the mongosh CLI binary and bake it into your container image for your workers.
You can write your shell command to a script such as /dags/templates/mongo-admin-create-index.js or some other location that it can be found.
Then can implement a custom operator using the SubprocessHook to run mongosh CLI command such as:
mongosh -f {mongosh_script} {db_address}
This custom operator would be along these lines
from airflow.compat.functools import cached_property
from airflow.hooks.subprocess import SubprocessHook
from airflow.providers.mongo.hooks import MongoHook
class MongoshScriptOperator(BaseOperator):
template_fields: Sequence[str] = ('mongosh_script')
def __init__(
self,
*,
mongosh_script: str,
**kwargs,
) -> None:
super().__init__(**kwargs)
self.mongosh_script = mongosh_script
#cached_property
def subprocess_hook(self):
"""Returns hook for running the shell command"""
return SubprocessHook()
def execute(self):
"""Executes a mongosh script"""
mh = MongoHook(self.conn_id)
self.subprocess_hook.run_command(
command=['mongosh', '-f', self.mongosh_script, mh.uri],
)
When creating the DagNode, you can pass the location of the script to your custom operator.

ZSH Custom function like repeat

I have a command which I want to repeat when a certain error occurs. To make this generic I would like to come up with a function that can take any other function to basically wrap that behaviour, very similar to repeat in ZSH.
So what I would like to have is something like this:
repeatWhenError { someFunction() }
This would repeat the function within the braces until it succeeds successfully. Is there an easy way to implement this in ZSH?
From my dotfiles:
retry () {
retry-limited 0 "$#"
}
retry-limited () {
retry-limited-eval "$1" "$(gquote "${#:2}")"
}
retry-limited-eval () {
local retry_sleep="${retry_sleep:-0.1}"
local limit=0
local ecode=0
until {
test "$1" -gt 0 && test $limit -ge "$1"
} || {
eval "${#:2}" && ecode=0
}
do
ecode="$?"
ecerr Tried eval "${#:2}" "..."
sleep $retry_sleep
limit=$((limit+1))
done
return "$ecode"
}
gquote () {
\noglob : Use this to control quoting centrally.
print -r -- "${(q+#)#}"
}
ecerr () {
print -r -- "$#" >&2
}
Usage:
retry someFunction

How to print return code conditionally in oh my zsh theme?

I'm trying to conditionally print return code in custom oh-my-zsh theme but somehow I'm failling. I'm stuck with:
function get_rc {
rc=$(echo -e "${return_code}" | tr -d '[:space:]' )
[[ "${rc}" == "130" ]] && echo "${rc}" && return
echo "'${rc}'"
}
Where it's printing the quouted version all the time.
What's wrong with my approach?

echo $PATH different from /etc/profile?

etc/profile:
if [ "$EUID" = "0" ] || [ "$USER" = "root" ] ; then
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${ROOTPATH}"
else
PATH="/usr/local/bin:/usr/bin:/bin:${PATH}"
fi
export PATH
unset ROOTPATH
echo $PATH:
/sbin:/bin:/usr/sbin:/usr/bin
So:
/usr/local/bin is not showing up, so I think it may be using a different file.
I have tried putting export PATH=$PATH:/usr/local/bin and it's fine but that is not permanent.
Check your shell init files, for bash that would be /etc/bashrc or /etc/bash.bashrc or something like that as well as ~/.bashrc and ~/.bash_profile. Most shells have similiar init scripts, check the manual.
Also check out /etc/env.d/* and /etc/environment.

Resources