2f6fdb4142
Includes "Don't match editor backup files in environment" and "Order execution of environment.d scripts". These had to be squashed because the first change alone changes the order env.d scripts are sourced in. The current glob match for environment files can source editor backup files (foo.bash~) which will override the real changes you have made. Other parts use the regex to avoid matching such files, so do the same for environment file matching. Note this has to match "." unlike the other regex, as most env files are "foo.bash" Also sort the files before sourcing them to ensure a reliable order. This change should be in line with current expectations, given the convention is to numerically prefix scripts in this directory. Update of: I934486b3ff5884063d29c6d9b66fd9b11140464c Subsumes: Icc509f695d7a15a8026d8c7e463f06acf65499d7 Change-Id: Ibfb562c5970b40598fc95da1e8d4beb9d51d7612
113 lines
3.2 KiB
Bash
Executable File
113 lines
3.2 KiB
Bash
Executable File
#!/bin/bash
|
|
# Inspired by Debian and RedHat run-parts but portable and specific to di-b.
|
|
#
|
|
# Copyright 2012 Hewlett-Packard Development Company, L.P.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
allowed_regex=${RUN_PARTS_REGEX:-"^[0-9A-Za-z_-]+$"}
|
|
show_list=
|
|
|
|
set -ue
|
|
set -o pipefail
|
|
|
|
name=$(basename $0)
|
|
|
|
usage() {
|
|
echo "Usage: $name [OPTION] scripts_directory"
|
|
echo "Option:"
|
|
echo " --list print names of all valid files"
|
|
echo
|
|
echo "Examples:"
|
|
echo " dib-run-parts --list /opt/stack/os-config-refresh/configure.d/"
|
|
echo " dib-run-parts /opt/stack/os-config-refresh/configure.d/"
|
|
exit 1
|
|
} >&2
|
|
|
|
output () {
|
|
echo $name $(date) $* >&2
|
|
}
|
|
|
|
if [ $# -lt 1 ] ; then
|
|
usage
|
|
fi
|
|
|
|
if [ "$1" == "--list" ] ; then
|
|
show_list="1"
|
|
shift
|
|
fi
|
|
|
|
target_dir="${1:-}"
|
|
|
|
if ! [ -d "$target_dir" ] ; then
|
|
output "Scripts directory [$target_dir] must exist and be a directory"
|
|
usage
|
|
fi
|
|
|
|
# We specifically only want to sort *by the numbers*.
|
|
# Lexical sorting is not guaranteed, and identical numbers may be
|
|
# parallelized later
|
|
# Note: -maxdepth 1 ensures only files in the target directory (but not
|
|
# subdirectories) are run, which is the way run-parts behaves.
|
|
targets=$(find $target_dir -maxdepth 1 -xtype f -executable -printf '%f\n' | grep -E "$allowed_regex" | LANG=C sort -n || echo "")
|
|
|
|
if [ "$show_list" == "1" ] ; then
|
|
for target in $targets ; do
|
|
echo "${target_dir}/${target}"
|
|
done
|
|
exit 0
|
|
fi
|
|
|
|
PROFILE_DIR=$(mktemp -d /tmp/profiledir.XXXXXX)
|
|
|
|
ENVIRONMENT_D_DIR=$target_dir/../environment.d
|
|
|
|
if [ -d $ENVIRONMENT_D_DIR ] ; then
|
|
env_files=$(find $ENVIRONMENT_D_DIR -maxdepth 1 -xtype f | \
|
|
grep -E "/[0-9A-Za-z_\.-]+$" | \
|
|
LANG=C sort -n)
|
|
for env_file in $env_files ; do
|
|
source $env_file
|
|
done
|
|
fi
|
|
|
|
for target in $targets ; do
|
|
output "Running $target_dir/$target"
|
|
target_tag=${target//\//_}
|
|
date +%s.%N > $PROFILE_DIR/start_$target_tag
|
|
$target_dir/$target
|
|
target_tag=${target//\//_}
|
|
date +%s.%N > $PROFILE_DIR/stop_$target_tag
|
|
output "$target completed"
|
|
done
|
|
|
|
echo "----------------------- PROFILING -----------------------"
|
|
echo ""
|
|
echo "Target: $(basename $target_dir)"
|
|
echo ""
|
|
printf "%-40s %9s\n" Script Seconds
|
|
printf "%-40s %9s\n" --------------------------------------- ----------
|
|
echo ""
|
|
pushd $PROFILE_DIR > /dev/null
|
|
for target in $(find . -name 'start_*' -printf '%f\n') ; do
|
|
stop_file=stop_${target##start_}
|
|
start_seconds=$(cat $target)
|
|
stop_seconds=$(cat $stop_file)
|
|
duration=$(python -c "print($stop_seconds - $start_seconds)")
|
|
LC_NUMERIC=C LC_ALL=C printf "%-40s %10.3f\n" ${target##start_} $duration
|
|
done
|
|
popd > /dev/null
|
|
rm -rf $PROFILE_DIR
|
|
echo ""
|
|
echo "--------------------- END PROFILING ---------------------"
|