| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  | #!/usr/bin/env bash
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # These variable must be set before the main body is called | 
					
						
							|  |  |  | SOLANA_LOCK_FILE="${SOLANA_LOCK_FILE:?}" | 
					
						
							|  |  |  | SECONDARY_DISK_MOUNT_POINT="${SECONDARY_DISK_MOUNT_POINT:?}" | 
					
						
							|  |  |  | SSH_AUTHORIZED_KEYS="${SSH_AUTHORIZED_KEYS:?}" | 
					
						
							| 
									
										
										
										
											2020-03-10 11:25:44 -07:00
										 |  |  | FORCE_DELETE="${FORCE_DELETE}" | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | RC=false | 
					
						
							|  |  |  | if [[ -f "${SOLANA_LOCK_FILE}" ]]; then | 
					
						
							|  |  |  |   exec 9<>"${SOLANA_LOCK_FILE}" | 
					
						
							|  |  |  |   flock -x -n 9 || ( echo "Failed to acquire lock!" 1>&2 && exit 1 ) | 
					
						
							|  |  |  |   # shellcheck disable=SC1090 | 
					
						
							|  |  |  |   . "${SOLANA_LOCK_FILE}" | 
					
						
							| 
									
										
										
										
											2020-03-10 11:25:44 -07:00
										 |  |  |   if [[ "${SOLANA_LOCK_USER}" = "${SOLANA_USER}"  || -n "${FORCE_DELETE}" ]]; then | 
					
						
							| 
									
										
										
										
											2019-11-25 10:32:17 -07:00
										 |  |  |     # Begin running process cleanup | 
					
						
							|  |  |  |     CLEANUP_PID=$$ | 
					
						
							|  |  |  |     CLEANUP_PIDS=() | 
					
						
							|  |  |  |     CLEANUP_PPIDS=() | 
					
						
							|  |  |  |     get_pids() { | 
					
						
							|  |  |  |       CLEANUP_PIDS=() | 
					
						
							|  |  |  |       CLEANUP_PPIDS=() | 
					
						
							|  |  |  |       declare line maybe_ppid maybe_pid | 
					
						
							|  |  |  |       while read -r line; do | 
					
						
							|  |  |  |         read -r maybe_ppid maybe_pid _ _ _ _ _ _ _ _ <<<"${line}" | 
					
						
							|  |  |  |         CLEANUP_PIDS+=( "${maybe_pid}" ) | 
					
						
							|  |  |  |         CLEANUP_PPIDS+=( "${maybe_ppid}" ) | 
					
						
							|  |  |  |       done < <(ps jxh | sort -rn -k2,2) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     CLEANUP_PROC_CHAINS=() | 
					
						
							|  |  |  |     resolve_chains() { | 
					
						
							|  |  |  |       CLEANUP_PROC_CHAINS=() | 
					
						
							|  |  |  |       declare i pid ppid handled n | 
					
						
							|  |  |  |       for i in "${!CLEANUP_PIDS[@]}"; do | 
					
						
							|  |  |  |         pid=${CLEANUP_PIDS[${i}]} | 
					
						
							|  |  |  |         ppid=${CLEANUP_PPIDS[${i}]} | 
					
						
							|  |  |  |         handled=false | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for j in "${!CLEANUP_PROC_CHAINS[@]}"; do | 
					
						
							|  |  |  |           if grep -q "^${ppid}\b" <<<"${CLEANUP_PROC_CHAINS[${j}]}"; then | 
					
						
							|  |  |  |             CLEANUP_PROC_CHAINS[${j}]="${pid} ${CLEANUP_PROC_CHAINS[${j}]}" | 
					
						
							|  |  |  |             handled=true | 
					
						
							|  |  |  |             break | 
					
						
							|  |  |  |           elif grep -q "\b${pid}\$" <<<"${CLEANUP_PROC_CHAINS[${j}]}"; then | 
					
						
							|  |  |  |             CLEANUP_PROC_CHAINS[${j}]+=" ${ppid}" | 
					
						
							|  |  |  |             handled=true | 
					
						
							|  |  |  |             # Don't break, we may be the parent of may proc chains | 
					
						
							|  |  |  |           fi | 
					
						
							|  |  |  |         done | 
					
						
							|  |  |  |         if ! ${handled}; then | 
					
						
							|  |  |  |           n=${#CLEANUP_PROC_CHAINS[@]} | 
					
						
							|  |  |  |           CLEANUP_PROC_CHAINS[${n}]="${pid} ${ppid}" | 
					
						
							|  |  |  |         fi | 
					
						
							|  |  |  |       done | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Kill screen sessions | 
					
						
							|  |  |  |     while read -r SID; do | 
					
						
							|  |  |  |       screen -S "${SID}" -X quit | 
					
						
							|  |  |  |     done < <(screen -wipe 2>&1 | sed -e 's/^\s\+\([^[:space:]]\+\)\s.*/\1/;t;d') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Kill tmux sessions | 
					
						
							|  |  |  |     tmux kill-server &> /dev/null | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Kill other processes | 
					
						
							|  |  |  |     for SIG in INT TERM KILL; do | 
					
						
							|  |  |  |       get_pids | 
					
						
							|  |  |  |       if [[ ${#CLEANUP_PIDS[@]} -eq 0 ]]; then | 
					
						
							|  |  |  |         break | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         resolve_chains | 
					
						
							|  |  |  |         for p in "${CLEANUP_PROC_CHAINS[@]}"; do | 
					
						
							|  |  |  |           if ! grep -q "\b${CLEANUP_PID}\b" <<<"${p}"; then | 
					
						
							|  |  |  |             read -ra TO_KILL <<<"${p}" | 
					
						
							|  |  |  |             N=${#TO_KILL[@]} | 
					
						
							|  |  |  |             ROOT_PPID="${TO_KILL[$((N-1))]}" | 
					
						
							|  |  |  |             if [[ 1 -ne ${ROOT_PPID} ]]; then | 
					
						
							|  |  |  |               LAST_PID_IDX=$((N-2)) | 
					
						
							|  |  |  |               for I in $(seq 0 ${LAST_PID_IDX}); do | 
					
						
							|  |  |  |                 pid="${TO_KILL[${I}]}" | 
					
						
							|  |  |  |                 kill "-${SIG}" "${pid}" &>/dev/null | 
					
						
							|  |  |  |               done | 
					
						
							|  |  |  |             fi | 
					
						
							|  |  |  |           fi | 
					
						
							|  |  |  |         done | 
					
						
							|  |  |  |         get_pids | 
					
						
							|  |  |  |         if [[ ${#CLEANUP_PIDS[@]} -gt 0 ]]; then | 
					
						
							|  |  |  |           sleep 5 | 
					
						
							|  |  |  |         fi | 
					
						
							|  |  |  |       fi | 
					
						
							|  |  |  |     done | 
					
						
							|  |  |  |     # End running process cleanup | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Begin filesystem cleanup | 
					
						
							|  |  |  |     git clean -qxdff | 
					
						
							|  |  |  |     rm -f /solana-scratch/* /solana-scratch/.[^.]* | 
					
						
							|  |  |  |     cat > "${HOME}/.ssh/authorized_keys" <<EOAK | 
					
						
							|  |  |  | ${SSH_AUTHORIZED_KEYS} | 
					
						
							|  |  |  | EOAK | 
					
						
							|  |  |  |     EXTERNAL_CONFIG_DIR="${SECONDARY_DISK_MOUNT_POINT}/config/" | 
					
						
							|  |  |  |     if [[ -d "${EXTERNAL_CONFIG_DIR}" ]]; then | 
					
						
							|  |  |  |       rm -rf "${EXTERNAL_CONFIG_DIR}" | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  |     # End filesystem cleanup | 
					
						
							|  |  |  |     RC=true | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     echo "Invalid user: expected \"${SOLANA_LOCK_USER}\" got \"${SOLANA_USER}\"" 1>&2 | 
					
						
							|  |  |  |   fi | 
					
						
							|  |  |  |   exec 9>&- | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | ${RC} | 
					
						
							|  |  |  | 
 |