2014-08-29 20:21:02 +00:00
|
|
|
# Library functions for bash scripts at Stack Exchange.
|
|
|
|
|
|
2015-06-02 15:37:06 +00:00
|
|
|
# NOTE: This file is open sourced. Do not put Stack-proprietary code here.
|
|
|
|
|
|
2014-08-29 20:21:02 +00:00
|
|
|
# Usage:
|
2015-06-02 15:37:06 +00:00
|
|
|
#
|
2014-09-08 20:25:38 +00:00
|
|
|
# set -e
|
2014-08-29 20:21:02 +00:00
|
|
|
# . _stack_lib.sh
|
|
|
|
|
|
|
|
|
|
# ----- Utility Functions -----
|
|
|
|
|
|
|
|
|
|
function debugmsg() {
|
|
|
|
|
# Log to stderr.
|
2015-06-12 13:27:42 -05:00
|
|
|
echo 1>&2 LOG: "$@"
|
2014-08-29 20:21:02 +00:00
|
|
|
:
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function logit() {
|
|
|
|
|
# Log to stderr.
|
2015-06-12 13:27:42 -05:00
|
|
|
echo 1>&2 LOG: "$@"
|
2014-08-29 20:21:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function fail_out() {
|
|
|
|
|
echo "FAILED:" "$*"
|
|
|
|
|
echo 'Exiting...'
|
|
|
|
|
exit 1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# on_exit and add_on_exit from http://www.linuxjournal.com/content/use-bash-trap-statement-cleanup-temporary-files
|
|
|
|
|
# Usage:
|
|
|
|
|
# add_on_exit rm -f /tmp/foo
|
|
|
|
|
# add_on_exit echo "I am exiting"
|
|
|
|
|
# tempfile=$(mktemp)
|
|
|
|
|
# add_on_exit rm -f "$tempfile"
|
|
|
|
|
function on_exit()
|
|
|
|
|
{
|
|
|
|
|
for i in "${on_exit_items[@]}"
|
|
|
|
|
do
|
|
|
|
|
eval $i
|
|
|
|
|
done
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function add_on_exit()
|
|
|
|
|
{
|
|
|
|
|
local n=${#on_exit_items[*]}
|
|
|
|
|
on_exit_items[$n]="$*"
|
|
|
|
|
if [[ $n -eq 0 ]]; then
|
|
|
|
|
trap on_exit EXIT
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-02 15:37:06 +00:00
|
|
|
function create_self_deleting_tempfile() {
|
|
|
|
|
local filename
|
|
|
|
|
|
|
|
|
|
case $(uname -s) in
|
2016-11-08 19:49:42 +01:00
|
|
|
Darwin | FreeBSD )
|
2016-02-29 17:22:12 +00:00
|
|
|
: "${TMPDIR:=/tmp}" ;
|
2015-07-28 08:21:52 -04:00
|
|
|
filename=$(mktemp -t _stacklib_.XXXXXXXX )
|
2015-06-02 15:37:06 +00:00
|
|
|
;;
|
2015-10-29 12:10:58 +01:00
|
|
|
Linux | CYGWIN* | MINGW* )
|
2015-06-02 15:37:06 +00:00
|
|
|
filename=$(mktemp)
|
|
|
|
|
;;
|
|
|
|
|
* )
|
2015-08-04 11:53:25 -04:00
|
|
|
echo 'ERROR: Unknown OS. Exiting. (create_self_deleting_tempfile)'
|
2015-06-02 15:37:06 +00:00
|
|
|
exit 1
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
add_on_exit rm -f "$filename"
|
|
|
|
|
echo "$filename"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function create_self_deleting_tempdir() {
|
|
|
|
|
local filename
|
|
|
|
|
|
|
|
|
|
case $(uname -s) in
|
2016-11-08 19:49:42 +01:00
|
|
|
Darwin | FreeBSD )
|
2016-02-29 17:22:12 +00:00
|
|
|
: "${TMPDIR:=/tmp}" ;
|
2015-10-16 14:59:15 +02:00
|
|
|
filename=$(mktemp -d -t _stacklib_.XXXXXXXX )
|
2015-06-02 15:37:06 +00:00
|
|
|
;;
|
2015-10-29 12:10:58 +01:00
|
|
|
Linux | CYGWIN* | MINGW* )
|
2015-06-02 15:37:06 +00:00
|
|
|
filename=$(mktemp -d)
|
|
|
|
|
;;
|
|
|
|
|
* )
|
2015-08-04 11:53:25 -04:00
|
|
|
echo 'ERROR: Unknown OS. Exiting. (create_self_deleting_tempdir)'
|
2015-06-02 15:37:06 +00:00
|
|
|
exit 1
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
add_on_exit rm -rf "$filename"
|
|
|
|
|
echo "$filename"
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-29 20:21:02 +00:00
|
|
|
# Securely and portably create a temporary file that will be deleted
|
|
|
|
|
# on EXIT. $1 is the variable name to store the result.
|
|
|
|
|
function make_self_deleting_tempfile() {
|
|
|
|
|
local __resultvar="$1"
|
|
|
|
|
local name
|
|
|
|
|
|
|
|
|
|
case $(uname -s) in
|
2016-11-08 19:49:42 +01:00
|
|
|
Darwin | FreeBSD )
|
2016-02-29 17:22:12 +00:00
|
|
|
: "${TMPDIR:=/tmp}" ;
|
2015-10-16 14:59:15 +02:00
|
|
|
name=$(mktemp -t _stacklib_.XXXXXXXX )
|
2014-08-29 20:21:02 +00:00
|
|
|
;;
|
2015-10-29 12:10:58 +01:00
|
|
|
Linux | CYGWIN* | MINGW* )
|
2014-08-29 20:21:02 +00:00
|
|
|
name=$(mktemp)
|
|
|
|
|
;;
|
|
|
|
|
* )
|
2015-08-04 11:53:25 -04:00
|
|
|
echo 'ERROR: Unknown OS. Exiting. (make_self_deleting_tempfile)'
|
2014-08-29 20:21:02 +00:00
|
|
|
exit 1
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
add_on_exit rm -f "$name"
|
|
|
|
|
eval $__resultvar="$name"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function make_tempdir() {
|
|
|
|
|
local __resultvar="$1"
|
|
|
|
|
local name
|
|
|
|
|
|
|
|
|
|
case $(uname -s) in
|
2016-11-08 19:49:42 +01:00
|
|
|
Darwin | FreeBSD )
|
2016-02-29 17:22:12 +00:00
|
|
|
: "${TMPDIR:=/tmp}" ;
|
2015-10-16 14:59:15 +02:00
|
|
|
name=$(mktemp -d -t _stacklib_.XXXXXXXX )
|
2014-08-29 20:21:02 +00:00
|
|
|
;;
|
2015-10-29 12:10:58 +01:00
|
|
|
Linux | CYGWIN* | MINGW* )
|
2014-08-29 20:21:02 +00:00
|
|
|
name=$(mktemp -d)
|
|
|
|
|
;;
|
|
|
|
|
* )
|
2015-08-04 11:53:25 -04:00
|
|
|
echo 'ERROR: Unknown OS. Exiting. (make_tempdir)'
|
2014-08-29 20:21:02 +00:00
|
|
|
exit 1
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
eval $__resultvar="$name"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function make_self_deleting_tempdir() {
|
|
|
|
|
local __resultvar="$1"
|
2015-06-02 15:37:06 +00:00
|
|
|
local dname
|
2014-08-29 20:21:02 +00:00
|
|
|
|
2015-06-02 15:37:06 +00:00
|
|
|
make_tempdir dname
|
2014-08-29 20:21:02 +00:00
|
|
|
|
2015-06-02 15:37:06 +00:00
|
|
|
add_on_exit rm -rf "$dname"
|
|
|
|
|
eval $__resultvar="$dname"
|
2014-08-29 20:21:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function fail_if_not_running_as_root() {
|
|
|
|
|
if [[ $EUID -ne 0 ]]; then
|
|
|
|
|
echo 'ERROR: This command should only be run as root.'
|
|
|
|
|
echo 'Exiting...'
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function fail_if_in_root_directory() {
|
|
|
|
|
# Verify nobody has tricked us into being in "/".
|
|
|
|
|
case $(uname -s) in
|
2016-11-08 19:49:42 +01:00
|
|
|
Darwin | FreeBSD )
|
2014-08-29 20:21:02 +00:00
|
|
|
if [[ $(stat -f'%i' / ) == $(stat -f'%i' . ) ]] ; then
|
|
|
|
|
echo 'SECURITY ALERT: The current directory is the root directory.'
|
|
|
|
|
echo 'Exiting...'
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
;;
|
2015-10-29 12:10:58 +01:00
|
|
|
Linux | CYGWIN* | MINGW* )
|
2014-08-29 20:21:02 +00:00
|
|
|
if [[ $(stat -c'%i' / ) == $(stat -c'%i' . ) ]] ; then
|
|
|
|
|
echo 'SECURITY ALERT: The current directory is the root directory.'
|
|
|
|
|
echo 'Exiting...'
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
;;
|
|
|
|
|
* )
|
2015-08-04 11:53:25 -04:00
|
|
|
echo 'ERROR: Unknown OS. Exiting. (fail_if_in_root_directory)'
|
2014-08-29 20:21:02 +00:00
|
|
|
exit 1
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
}
|