#!/usr/bin/env bash set -eo pipefail # -------------------------------------------------------------------- # Script to run all install scripts contained in install.d # if [[ -t 1 && -n "$TERM" && "$TERM" != "dumb" ]]; then RED="\033[1;31m" GREEN="\033[1;32m" YELLOW="\033[1;33m" GREY="\033[1;30m" NC="\033[0m" else RED="" GREEN="" YELLOW="" GREY="" NC="" fi printf "\n\t${GREEN} <<< dots >>> ${NC}\n" printf "\t${GREY}==============${NC}\n\n" # Prevent running as root if [[ $EUID -eq 0 && -z "$SKIP_SUDO_CHECK" ]]; then echo -e "${RED}Failed: Running as sudo. Please run as user${NC}\n" exit 1 fi # Ensure sudo credentials are cached if [[ -z "$SKIP_SUDO_CHECK" ]]; then echo -e "${GREY}Checking sudo credentials...${NC}" sudo -v fi # Set up directory variables if [ -L "$0" ]; then dir=$(dirname $(readlink -f "$0")) else dir=$(dirname "$0") fi install_dir="$dir/install.d" export DOTFILES=$(dirname "$dir") # Set up log destination if [[ -z "$LOG_TARGET" ]]; then timestamp=$(date +%Y-%m-%dT%H:%M:%S) uuid=$( uuidgen 2> /dev/null \ || cat /proc/sys/kernel/random/uuid 2> /dev/null \ || echo $RANDOM ) log_dir="$dir/logs" mkdir -p "$log_dir" log_target=${LOG_TARGET:-"$log_dir/$uuid.log"} else log_target="$LOG_TARGET" fi touch "$log_target" if [[ ! -f "$log_target" ]]; then echo -e "${RED}Failed: Unable to create log file \"$log_target\"${NC}\n" exit 1 fi log_abs_target=$(readlink -f "$log_target") # Set up targets targets=($@) # Run install scripts run() { echo -e "${GREY}Running \"$(basename "$0")\" at \"$(date)\"${NC}" echo -e "${GREY}Running as \"$(whoami)\" on \"$(hostname)\"${NC}" if [[ -n "$targets" ]]; then echo -e "${GREY}Running ${#targets[@]} install target(s): ${targets[@]}${NC}" else echo -e "${GREY}Running all install targets${NC}" fi for script in $install_dir/*.sh; do if [[ -n "$targets" ]]; then script_name=$(basename $script .sh) script_name=${script_name#*-} if [[ ! " ${targets[*]} " =~ " $script_name " ]]; then continue fi fi local script_name=$(basename $script) printf "\n\n${GREY}<<< $script_name:${NC}\n" local start_time=$(date +%s.%N) source $script local end_time=$(date +%s.%N) local execution_time=$(echo "$end_time - $start_time" | bc) local execution_ms=$(echo "$execution_time * 1000" | bc | awk '{printf "%.0f", $0}') local execution_ms_formatted=$(printf "%'.0f" "$execution_ms") local time_color="$GREY" if (( execution_ms > 1000 )); then time_color="$RED" fi printf "\n${GREY}>>> $script_name, " printf "completed in ${time_color}${execution_ms_formatted}ms${NC}\n" done } echo -e "\n${GREY}install: Logging to \"$log_abs_target\"${NC}" start_time=$(date +%s.%N) run 2>&1 | tee "$log_abs_target" end_time=$(date +%s.%N) total_time_raw=$(echo "$end_time - $start_time" | bc) total_time=$(echo "$total_time_raw" | awk '{printf "%.3g", $1}') echo -e "\n${GREY}Thank you!${NC}" echo -e "${GREY}Total time: ${GREEN}${total_time}s${NC}\n"