envmon added
parent
778571cd06
commit
4152425af3
|
@ -0,0 +1,98 @@
|
|||
#!/bin/bash
|
||||
# Environment monitor
|
||||
#
|
||||
# Copyright (C) 2014 Mike Gerwitz
|
||||
#
|
||||
# This file is part of pkgsh.
|
||||
#
|
||||
# pkgsh is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# It is highly recommended that you monitor a clean environment (e.g. using
|
||||
# `env -i`) to avoid as much overhead as possible.
|
||||
##
|
||||
|
||||
[ -z $__PKGSH_INC_ENVMON ] || return
|
||||
__PKGSH_INC_ENVMON=1
|
||||
|
||||
declare -A __pkgsh_envmon_env=()
|
||||
|
||||
|
||||
##
|
||||
# Map environment to a callback
|
||||
#
|
||||
# For each environment variable, $callback will be invoked with two
|
||||
# arguments: the variable name and its value.
|
||||
#
|
||||
_pkgsh-envmon-env-map()
|
||||
{
|
||||
local -r callback="$1"
|
||||
local var= val=
|
||||
|
||||
while read -d $'\0' env; do
|
||||
var="${env%%=*}"
|
||||
val="${env#*=}"
|
||||
|
||||
"$callback" "$var" "$val"
|
||||
done < <( env -0 )
|
||||
}
|
||||
|
||||
|
||||
##
|
||||
# Prepares the environment monitor for use
|
||||
#
|
||||
_pkgsh-envmon-init()
|
||||
{
|
||||
_pkgsh-envmon-env-map __pkgsh-envmon-envload
|
||||
}
|
||||
|
||||
|
||||
##
|
||||
# Load the provided variable name and value into the cache
|
||||
#
|
||||
# This produces a local copy of the environment in memory, which can be used
|
||||
# to check against a later environment state for changes.
|
||||
#
|
||||
__pkgsh-envmon-envload()
|
||||
{
|
||||
local -r var="$1" val="$2"
|
||||
__pkgsh_envmon_env[$var]="$val"
|
||||
}
|
||||
|
||||
|
||||
##
|
||||
# Output null-byte-delimited names and values of variables added to the
|
||||
# environment since the last diff and update the environment cache
|
||||
#
|
||||
_pkgsh-envmon-diff-adds()
|
||||
{
|
||||
_pkgsh-envmon-env-map __pkgsh-envmon-dodiff-adds
|
||||
}
|
||||
|
||||
|
||||
##
|
||||
# Output provided value with terminating null byte if $name does not exist
|
||||
# in the environment cache, then immediately add $name to the cache
|
||||
__pkgsh-envmon-dodiff-adds()
|
||||
{
|
||||
local -r var="$1" val="$2"
|
||||
|
||||
# ignore if it already exists (FIXME: this will fail if the in-memory
|
||||
# value is empty)
|
||||
[ -z "${__pkgsh_envmon_env[$var]}" ] || return 0
|
||||
|
||||
# output the difference and immediately add to the environment in memory
|
||||
echo -ne "$var=$val\000"
|
||||
__pkgsh_envmon_env[$var]="$val"
|
||||
}
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
#!/bin/bash
|
||||
# Tests monitoring for environment additions
|
||||
#
|
||||
# Copyright (C) 2014 Mike Gerwitz
|
||||
#
|
||||
# This file is part of pkgsh.
|
||||
#
|
||||
# pkgsh is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# Tests monitoring the environment for variable additions
|
||||
##
|
||||
|
||||
source src/envmon.sh
|
||||
|
||||
# initialize to the current state of the environment
|
||||
_pkgsh-envmon-init
|
||||
|
||||
# add two variables to the environment (note that one contains newlines to
|
||||
# ensure that they do not cause problems)
|
||||
export foo=a bar=newline$'\n'test
|
||||
declare -A found=()
|
||||
|
||||
# perform env addition diff
|
||||
while read -d $'\0' env; do
|
||||
var="${env%%=*}"
|
||||
val="${env#*=}"
|
||||
|
||||
found[$var]="$val"
|
||||
done < <( _pkgsh-envmon-diff-adds )
|
||||
|
||||
# ensure each was found
|
||||
for name in foo bar; do
|
||||
eval chk="\$$name"
|
||||
assert "${found[$name]}" == "$chk"
|
||||
done
|
||||
|
||||
# ensure that no others were found
|
||||
assert "${#found[@]}" -eq 2
|
||||
|
Loading…
Reference in New Issue