152 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
		
		
			
		
	
	
			152 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| 
								 | 
							
								#!/usr/bin/env bash
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								__gce_sd_here="$(dirname "${BASH_SOURCE[0]}")"
							 | 
						||
| 
								 | 
							
								# shellcheck disable=SC1091
							 | 
						||
| 
								 | 
							
								__gce_sd_conf="${__gce_sd_here}/gce-self-destruct.conf"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								gce_metadata_req() {
							 | 
						||
| 
								 | 
							
								  declare endpoint url
							 | 
						||
| 
								 | 
							
								  endpoint="$1"
							 | 
						||
| 
								 | 
							
								  url="http://metadata.google.internal/computeMetadata/v1/$endpoint"
							 | 
						||
| 
								 | 
							
								  curl -sf -H Metadata-Flavor:Google "$url"
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								unix_to_at_time() {
							 | 
						||
| 
								 | 
							
								  declare unix="$1"
							 | 
						||
| 
								 | 
							
								  date --date="@$unix" "+%Y%m%d%H%M.%S"
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								timeout_to_destruct() {
							 | 
						||
| 
								 | 
							
								  declare timeout_sec now_unix
							 | 
						||
| 
								 | 
							
								  declare timeout_hrs=$1
							 | 
						||
| 
								 | 
							
								  timeout_sec=$((timeout_hrs * 60 * 60))
							 | 
						||
| 
								 | 
							
								  now_unix=$(date +%s)
							 | 
						||
| 
								 | 
							
								  echo $((now_unix + timeout_sec))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								relative_timespan()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  declare timeSpan="$1"
							 | 
						||
| 
								 | 
							
								  declare -a units divs
							 | 
						||
| 
								 | 
							
								  units+=( s ); divs+=( 60 )
							 | 
						||
| 
								 | 
							
								  units+=( m ); divs+=( 60 )
							 | 
						||
| 
								 | 
							
								  units+=( h ); divs+=( 24 )
							 | 
						||
| 
								 | 
							
								  units+=( d ); divs+=( 7 )
							 | 
						||
| 
								 | 
							
								  units+=( w ); divs+=( 52 )
							 | 
						||
| 
								 | 
							
								  numUnits="${#units[@]}"
							 | 
						||
| 
								 | 
							
								  units+=( y ); divs+=( 100 )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  declare -a outs
							 | 
						||
| 
								 | 
							
								  declare i div remain
							 | 
						||
| 
								 | 
							
								  for (( i=0; i < "$numUnits"; i++ )); do
							 | 
						||
| 
								 | 
							
								    div="${divs[$i]}"
							 | 
						||
| 
								 | 
							
								    [[ "$timeSpan" -lt "$div" ]] && break
							 | 
						||
| 
								 | 
							
								    remain="$((timeSpan % div))"
							 | 
						||
| 
								 | 
							
								    timeSpan="$((timeSpan / div))"
							 | 
						||
| 
								 | 
							
								    outs+=( "$remain" )
							 | 
						||
| 
								 | 
							
								  done
							 | 
						||
| 
								 | 
							
								  outs+=( "$timeSpan" )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  numOut="${#outs[@]}"
							 | 
						||
| 
								 | 
							
								  out1="$((numOut-1))"
							 | 
						||
| 
								 | 
							
								  out2="$((numOut-2))"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if [[ "$numOut" -eq 1 ]] || \
							 | 
						||
| 
								 | 
							
								    [[ "$numOut" -ge "$numUnits" && \
							 | 
						||
| 
								 | 
							
								      "${outs[out1]}" -ge "${divs[out1]}" ]]; then
							 | 
						||
| 
								 | 
							
								    printf "%d%s" "${outs[out1]}" "${units[out1]}"
							 | 
						||
| 
								 | 
							
								  else
							 | 
						||
| 
								 | 
							
								    printf "%d%s%02d%s" "${outs[out1]}" \
							 | 
						||
| 
								 | 
							
								      "${units[out1]}" "${outs[out2]}" "${units[out2]}"
							 | 
						||
| 
								 | 
							
								  fi
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								gce_self_destruct_ttl() {
							 | 
						||
| 
								 | 
							
								  declare colorize="${1:-true}"
							 | 
						||
| 
								 | 
							
								  declare prefix="${2}"
							 | 
						||
| 
								 | 
							
								  declare suffix="${3}"
							 | 
						||
| 
								 | 
							
								  declare output=0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if [[ -f "${__gce_sd_conf}" ]]; then
							 | 
						||
| 
								 | 
							
								    # shellcheck disable=SC1090
							 | 
						||
| 
								 | 
							
								    source "${__gce_sd_conf}"
							 | 
						||
| 
								 | 
							
								    declare ttl pttl color
							 | 
						||
| 
								 | 
							
								    ttl="$((destruct - $(date +%s)))"
							 | 
						||
| 
								 | 
							
								    if [[ "$ttl" -lt 0 ]]; then
							 | 
						||
| 
								 | 
							
								      ttl=0
							 | 
						||
| 
								 | 
							
								    fi
							 | 
						||
| 
								 | 
							
								    pttl="$(relative_timespan "$ttl")"
							 | 
						||
| 
								 | 
							
								    color=
							 | 
						||
| 
								 | 
							
								    if [[ ttl -lt 3600 ]]; then
							 | 
						||
| 
								 | 
							
								      color="\033[01;31m"
							 | 
						||
| 
								 | 
							
								    fi
							 | 
						||
| 
								 | 
							
								    output="${prefix}${pttl}${suffix}"
							 | 
						||
| 
								 | 
							
								    if $colorize; then
							 | 
						||
| 
								 | 
							
								      output="${color}${output}\033[01;00m"
							 | 
						||
| 
								 | 
							
								    fi
							 | 
						||
| 
								 | 
							
								  fi
							 | 
						||
| 
								 | 
							
								  echo -e "$output"
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								gce_self_destruct_setup() {
							 | 
						||
| 
								 | 
							
								  declare destruct at_time zone
							 | 
						||
| 
								 | 
							
								  destruct="$(timeout_to_destruct "$1")"
							 | 
						||
| 
								 | 
							
								  at_time="$(unix_to_at_time "$destruct")"
							 | 
						||
| 
								 | 
							
								  zone=$(gce_metadata_req "instance/zone")
							 | 
						||
| 
								 | 
							
								  zone=$(basename "$zone")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  cat >"${__gce_sd_conf}" <<EOF
							 | 
						||
| 
								 | 
							
								export destruct=$destruct
							 | 
						||
| 
								 | 
							
								export zone=$zone
							 | 
						||
| 
								 | 
							
								EOF
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  at -t "$at_time" <<EOF
							 | 
						||
| 
								 | 
							
								bash -i <<'EOF2'
							 | 
						||
| 
								 | 
							
								source /solana-scratch/gce-self-destruct.sh
							 | 
						||
| 
								 | 
							
								gce_self_destruct_check
							 | 
						||
| 
								 | 
							
								EOF2
							 | 
						||
| 
								 | 
							
								EOF
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								gce_self_destruct_check() {
							 | 
						||
| 
								 | 
							
								  if [[ -f "${__gce_sd_conf}" ]]; then
							 | 
						||
| 
								 | 
							
								    # shellcheck disable=SC1090
							 | 
						||
| 
								 | 
							
								    source "${__gce_sd_conf}"
							 | 
						||
| 
								 | 
							
								    declare now gcloudBin
							 | 
						||
| 
								 | 
							
								    now=$(date +%s)
							 | 
						||
| 
								 | 
							
								    if [[ "$now" -ge "$destruct" ]]; then
							 | 
						||
| 
								 | 
							
								      # gcloud is installed in /snap/bin, but /snap/bin isn't in root's PATH...
							 | 
						||
| 
								 | 
							
								      gcloudBin="$(command -v gcloud)"
							 | 
						||
| 
								 | 
							
								      gcloudBin="${gcloudBin:-/snap/bin/gcloud}"
							 | 
						||
| 
								 | 
							
								      "$gcloudBin" compute instances delete --quiet "$(hostname)" --zone "$zone"
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								      at -t "$(unix_to_at_time "$destruct")" <<EOF
							 | 
						||
| 
								 | 
							
								bash -i <<'OEF2'
							 | 
						||
| 
								 | 
							
								source /solana-scratch/gce-self-destruct.sh
							 | 
						||
| 
								 | 
							
								gce_self_destruct_check
							 | 
						||
| 
								 | 
							
								EOF2
							 | 
						||
| 
								 | 
							
								EOF
							 | 
						||
| 
								 | 
							
								    fi
							 | 
						||
| 
								 | 
							
								  fi
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								gce_self_destruct_motd() {
							 | 
						||
| 
								 | 
							
								  declare ttl
							 | 
						||
| 
								 | 
							
								  ttl="$(gce_self_destruct_ttl)"
							 | 
						||
| 
								 | 
							
								  echo -e '\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n'
							 | 
						||
| 
								 | 
							
								  if [[ -n "${ttl}" ]]; then
							 | 
						||
| 
								 | 
							
								    echo -e "\tThis instance will self-destruct in ${ttl}!"
							 | 
						||
| 
								 | 
							
								  else
							 | 
						||
| 
								 | 
							
								    echo -e "\tThis instance will NOT self-destruct. YOU are responsible for deleting it!"
							 | 
						||
| 
								 | 
							
								  fi
							 | 
						||
| 
								 | 
							
								  echo -e '\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n'
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								gce_self_destruct_ps1() {
							 | 
						||
| 
								 | 
							
								  declare ttl
							 | 
						||
| 
								 | 
							
								  ttl="$(gce_self_destruct_ttl true "[T-" "]")"
							 | 
						||
| 
								 | 
							
								  ttl="${ttl:-"[T-~~~~~]"}"
							 | 
						||
| 
								 | 
							
								  echo "!${ttl}"
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |