#!/bin/bash # vim: set ft=sh: OR_DIR="/var/lib/openreplay" APP_NS="${APP_NS:-app}" DB_NS="${DB_NS:-db}" OR_REPO="https://github.com/openreplay/openreplay" tmp_dir=$(mktemp -d) # For example HELM_OPTIONS="--set dbMigrationUpstreamBranch=dev" #HELM_OPTIONS="" # If you want to install the dev version. It can be any branch or tag. #OR_VERSION="dev" [[ -d $OR_DIR ]] || { sudo mkdir $OR_DIR } export PATH=$PATH:/var/lib/openreplay tools=( zyedidia/eget stern/stern derailed/k9s hidetatz/kubecolor ) # Ref: https://stackoverflow.com/questions/5947742/how-to-change-the-output-color-of-echo-in-linux RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' BWHITE='\033[1;37m' NC='\033[0m' # No Color # Checking whether the app exists or we do have to upgade. function exists() { which "${1}" &> /dev/null return $? } function err_cd() { if ! cd "$1" &> /dev/null ; then log err not able to cd to "$1" exit 100 fi } function log () { case "$1" in info) shift echo -e "${GREEN}[INFO]" "$@" "${NC}" return ;; debug) shift echo -e "${YELLOW}[DEBUG]" "$@" "${NC}" return ;; title) shift echo -e "\n${BWHITE}-" "$@" "${NC}" return ;; err) shift echo -e "${RED}[ERROR]" "$@" "${NC}" exit 100 ;; *) echo "Not supported log format" ;; esac echo "[Error]" "$@" exit 100 } function install_packages() { [[ -e "$OR_DIR/eget" ]] || { cd "$tmp_dir" || log err "Not able to cd to tmp dir $tmp_dir" curl --version &> /dev/null || log err "curl not found. Please install" curl https://zyedidia.github.io/eget.sh | sh sudo mv eget $OR_DIR err_cd - } for package in "${tools[@]}"; do log info Installing "$(awk -F/ '{print $2}' <<< $package)" sudo /var/lib/openreplay/eget -q --upgrade-only --to "${OR_DIR}" "$package" done log info Installing yq sudo /var/lib/openreplay/eget -q --upgrade-only --to "$OR_DIR" mikefarah/yq --asset=^tar.gz log info Installing helm sudo /var/lib/openreplay/eget -q --upgrade-only --to "$OR_DIR" https://get.helm.sh/helm-v3.10.2-linux-amd64.tar.gz -f helm log info Installing kubectl sudo /var/lib/openreplay/eget -q --upgrade-only --to "$OR_DIR" https://dl.k8s.io/release/v1.20.0/bin/linux/amd64/kubectl log info Installing Busybox sudo /var/lib/openreplay/eget -q --upgrade-only --to "$OR_DIR" https://busybox.net/downloads/binaries/1.35.0-x86_64-linux-musl/busybox date | sudo tee $OR_DIR/packages.lock &> /dev/null } function help() { echo -e ${BWHITE} cat <<"EOF" ___ ____ _ / _ \ _ __ ___ _ __ | _ \ ___ _ __ | | __ _ _ _ | | | | '_ \ / _ \ '_ \| |_) / _ \ '_ \| |/ _` | | | | | |_| | |_) | __/ | | | _ < __/ |_) | | (_| | |_| | \___/| .__/ \___|_| |_|_| \_\___| .__/|_|\__,_|\__, | |_| |_| |___/ EOF echo -e ${NC} log info ' Usage: openreplay [ -h | --help ] [ -s | --status ] [ -u | --upgrade ] [ -U | --deprecated-upgrade /path/to/old_vars.yaml] [ -r | --restart ] [ -R | --Reload ] [ -p | --install-packages ] [ -l | --logs SERVICE ] Services: alerts assets assist chalice db ender frontend heuristics http integrations nginx-controller peers sink sourcemapreader storage ' return } function status() { log info OpenReplay Version # awk '(NR<2)' < "$OR_DIR/vars.yaml" awk '/fromVersion/{print $2}' < "${OR_DIR}/vars.yaml" log info Disk df -h /var log info Memory free -mh log info CPU uname -a # Print only the fist line. awk '(NR<2)' < /etc/os-release echo "CPU Count: $(nproc)" log info Kubernetes kubecolor version --short log info Openreplay Component kubecolor get po -n "${APP_NS}" kubecolor get po -n "${DB_NS}" return } # Function to upgrade helm openreplay app. function or_helm_upgrade() { set -o pipefail log_file="${tmp_dir}/helm.log" chart_names=( toolings openreplay ) for chart in "${chart_names[@]}"; do [[ -z $OR_VERSION ]] || HELM_OPTIONS="--set dbMigrationUpstreamBranch=${OR_VERSION}" if ! helm upgrade --install "$chart" ./"$chart" -n "$APP_NS" --wait -f ./vars.yaml --atomic --debug $HELM_OPTIONS 2>&1 | tee -a "${log_file}"; then log err " Installation failed, run ${BWHITE}cat ${log_file}${RED} for more info If logs aren't verbose, run ${BWHITE}openreplay --status${RED} If pods are in failed state, run ${BWHITE}openreplay --logs ${RED} " fi done set +o pipefail return } function upgrade_old() { old_vars_path="$1" or_version=$(busybox awk '/fromVersion/{print $2}' < "${old_vars_path}") sudo cp "${old_vars_path}" ${OR_DIR}/vars.yaml.backup."${or_version//\"}"_"$(date +%Y%m%d-%H%M%S)" || log err "Not able to copy old vars.yaml" sudo cp "${old_vars_path}" ${OR_DIR}/vars.yaml || log err "Not able to copy old vars.yaml" upgrade } function upgrade() { # TODO: # 1. store vars.yaml in central place. # 3. In upgrade you'll have to clone the repo # 3. How to update package. Because openreplay -u will be done from old update script # 4. Update from Version exists git || log err "Git not found. Please install" log info "Working directory $tmp_dir" err_cd "$tmp_dir" or_version=$(busybox awk '/fromVersion/{print $2}' < "${OR_DIR}/vars.yaml") # Creating backup dir of current installation [[ -d "$OR_DIR/openreplay" ]] && sudo cp -rfb "$OR_DIR/openreplay" "$OR_DIR/openreplay_${or_version//\"}" && sudo rm -rf ${OR_DIR}/openreplay git_options="-b ${OR_VERSION:-main}" eval git clone "${OR_REPO}" --depth 1 $git_options err_cd openreplay/scripts/helmcharts install_packages [[ -d /openreplay ]] && sudo chown -R 1001:1001 /openreplay # Merge prefrerences cp $OR_DIR/vars.yaml old_vars.yaml or_new_version=$(awk '/fromVersion/{print $2}' < "vars.yaml") yq '(load("old_vars.yaml") | .. | select(tag != "!!map" and tag != "!!seq")) as $i ireduce(.; setpath($i | path; $i))' vars.yaml > new_vars.yaml mv new_vars.yaml vars.yaml or_helm_upgrade # Update the version busybox sed -i "s/fromVersion.*/fromVersion: ${or_new_version}/" vars.yaml sudo mv ./openreplay-cli /bin/ sudo mv ./vars.yaml "$OR_DIR" sudo cp -rf ../../../openreplay $OR_DIR/ log info "Configuration file is saved in /var/lib/openreplay/vars.yaml" log info "Run ${BWHITE}openreplay -h${GREEN} to see the cli information to manage OpenReplay." err_cd - return } function reload() { err_cd $OR_DIR/openreplay/scripts/helmcharts sudo cp -f $OR_DIR/vars.yaml . or_helm_upgrade return } function clean_tmp_dir() { [[ -z $SKIP_DELETE_TMP_DIR ]] && rm -rf "${tmp_dir}" } [[ -f $OR_DIR/packages.lock ]] || { log title Installing packages "${NC}" install_packages } PARSED_ARGUMENTS=$(busybox getopt -a -n openreplay -o Rrvpiuhsl:U: --long reload,restart,verbose,install-packages,install,upgrade,help,status,logs,deprecated-upgrade: -- "$@") VALID_ARGUMENTS=$? if [[ "$VALID_ARGUMENTS" != "0" ]]; then help exit 100 fi eval set -- "$PARSED_ARGUMENTS" while : do case "$1" in -v | --verbose) VERBOSE=1; echo $VERBOSE; clean_tmp_dir ; shift ;; -h | --help) help clean_tmp_dir exit 0 ;; -u | --upgrade) log title "Upgrading OpenReplay" upgrade clean_tmp_dir exit 0 ;; -U | --deprecated-upgrade) log title "[Deprected] Upgrading OpenReplay" upgrade_old "$2" clean_tmp_dir exit 0 ;; -r | --restart) log title "Restarting OpenReplay Components" kubectl rollout restart deployment -n "${APP_NS}" kubectl rollout status deployment -n "${APP_NS}" clean_tmp_dir exit 0 ;; -R | --reload) log title "Reloading OpenReplay Components" reload clean_tmp_dir exit 0 ;; -s | --status) log title "Checking OpenReplay Components Status" status clean_tmp_dir exit 0 ;; -l | --logs) # Skipping double quotes because we want globbing. For example # ./openreplay -l "chalice --tail 10" stern -A --container-state=running,terminated $2 clean_tmp_dir exit 0 ;; # -- means the end of the arguments; drop this, and break out of the while loop --) shift; break ;; # If invalid options were passed, then getopt should have reported an error, # which we checked as VALID_ARGUMENTS when getopt was called... *) echo "Unexpected option: $1 - this should not happen." help clean_tmp_dir ;; esac done [ $# -eq 0 ] && help clean_tmp_dir