#!/bin/bash -e
################################################################################
##  File:  etc-environment.sh
##  Desc:  Helper functions for source and modify /etc/environment
################################################################################

# NB: sed expression use '%' as a delimiter in order to simplify handling
#     values containing slashes (i.e. directory path)
#     The values containing '%' will break the functions

function getEtcEnvironmentVariable {
    variable_name="$1"
    # remove `variable_name=` and possible quotes from the line
    grep "^${variable_name}=" /etc/environment |sed -E "s%^${variable_name}=\"?([^\"]+)\"?.*$%\1%"
}

function addEtcEnvironmentVariable {
    variable_name="$1"
    variable_value="$2"

    echo "$variable_name=$variable_value" | sudo tee -a /etc/environment
}

function replaceEtcEnvironmentVariable {
    variable_name="$1"
    variable_value="$2"

    # modify /etc/environment in place by replacing a string that begins with variable_name
    # removed quotes for the docker env metadata reader
    sudo sed -i -e "s%^${variable_name}=.*$%${variable_name}=${variable_value}%" /etc/environment
}

function setEtcEnvironmentVariable {
    variable_name="$1"
    variable_value="$2"

    if grep "$variable_name" /etc/environment > /dev/null; then
        replaceEtcEnvironmentVariable "$variable_name" "$variable_value"
    else
        addEtcEnvironmentVariable "$variable_name" "$variable_value"
    fi
}

function prependEtcEnvironmentVariable {
    variable_name="$1"
    element="$2"
    # TODO: handle the case if the variable does not exist
    existing_value=$(getEtcEnvironmentVariable "${variable_name}")
    setEtcEnvironmentVariable "${variable_name}" "${element}:${existing_value}"
}

function appendEtcEnvironmentVariable {
    variable_name="$1"
    element="$2"
    # TODO: handle the case if the variable does not exist
    existing_value=$(getEtcEnvironmentVariable "${variable_name}")
    setEtcEnvironmentVariable "${variable_name}" "${existing_value}:${element}"
}

function prependEtcEnvironmentPath {
    element="$1"
    prependEtcEnvironmentVariable PATH "${element}"
}

function appendEtcEnvironmentPath {
    element="$1"
    appendEtcEnvironmentVariable PATH "${element}"
}

# Process /etc/environment as if it were shell script with `export VAR=...` expressions
#    The PATH variable is handled specially in order to do not override the existing PATH
#    variable. The value of PATH variable read from /etc/environment is added to the end
#    of value of the exiting PATH variable exactly as it would happen with real PAM app read
#    /etc/environment
#
# TODO: there might be the others variables to be processed in the same way as "PATH" variable
#       ie MANPATH, INFOPATH, LD_*, etc. In the current implementation the values from /etc/environment
#       replace the values of the current environment
function  reloadEtcEnvironment {
    # add `export ` to every variable of /etc/environment except PATH and eval the result shell script
    eval "$(grep -v '^PATH=' /etc/environment | sed -e 's%^%export %')"
    # handle PATH specially
    etc_path=$(getEtcEnvironmentVariable PATH)
    export PATH="$PATH:$etc_path"
}

