Adding script to manage moblab ssh tunnels

BUG=None
TEST=Used locally without issue.

Change-Id: I3f25cf59f00bbaafc1ac3ba96b5f1296ee67e044
Reviewed-on: https://chromium-review.googlesource.com/422960
Commit-Ready: Tyler Reid <twreid@chromium.org>
Tested-by: Andy Chan Yan Huang <andychanyan@chromium.org>
Reviewed-by: danny chan <dchan@chromium.org>
diff --git a/provingground/firmware/moblab_tunnel.sh b/provingground/firmware/moblab_tunnel.sh
new file mode 100755
index 0000000..6fd1a2a
--- /dev/null
+++ b/provingground/firmware/moblab_tunnel.sh
@@ -0,0 +1,144 @@
+#!/bin/bash
+#
+# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# Manage ssh tunnels to local mobalabs used for
+# firmware testing.
+
+declare -A MOBLABS=(
+["moblab1"]="100.107.195.215"
+["moblab2"]="100.107.195.212"
+["moblab3"]="100.107.195.210"
+["moblab4"]="100.107.195.217"
+["moblab5"]="100.107.195.214"
+["moblab6"]="100.107.195.211"
+["moblab7"]="100.107.195.216")
+
+BASE_PORT=908
+BASE_ADMIN_PORT=999
+MONITOR_PORT=0
+CLOSE=0
+OPEN=0
+STATUS=0
+
+SOCKET_DIR="${HOME}/.ssh/connections"
+
+function create_tunnel() {
+  local local_port=$1
+  local dest_port=$2
+  local sock_name="moblab-sock-$local_port-$dest_port"
+  local sock_path="$SOCKET_DIR/$sock_name"
+  local tunnel_options="-M -S $sock_path -fNT -o ExitOnForwardFailure=yes -L"
+  local user="moblab@$3"
+
+  local cmd="ssh $tunnel_options $local_port:localhost:$dest_port $user"
+
+  echo "Creating tunnel with: $cmd"
+  eval "$cmd"
+}
+
+function close_tunnel() {
+  local sock_name="moblab-sock-$1-$2"
+  local user="moblab@$3"
+  local cmd="ssh -S $SOCKET_DIR/$sock_name -O exit $user"
+
+  echo "Closing tunnel with: $cmd"
+  $cmd
+}
+
+function check_tunnel() {
+  local sock_name="moblab-sock-$1-$2"
+  local user="moblab@$3"
+  local cmd="ssh -S $SOCKET_DIR/$sock_name -O check $user"
+
+  echo "Checking tunnel with: $cmd"
+  $cmd
+}
+
+function start() {
+  local mobs=()
+
+  mkdir -p "$SOCKET_DIR"
+
+  if [[ -z "$1" ]] || [[ "$1" == "all" ]]; then
+    for i in {1..7}; do
+      mobs+=("moblab$i")
+    done
+  else
+    mobs+=("$@")
+  fi
+
+  if [[ "${OPEN}" -ne 0 ]]; then
+    echo "Creating tunnels for ${mobs[*]}"
+    for moblab in "${mobs[@]}"; do
+      index=${moblab: -1}
+      create_tunnel "$BASE_PORT$index" 80 "${MOBLABS[$moblab]}"
+      if [[ "${MONITOR_PORT}" -ne 0 ]]; then
+        create_tunnel "$BASE_ADMIN_PORT$index" 9991 "${MOBLABS[$moblab]}"
+      fi
+    done
+  elif [[ "${CLOSE}" -ne 0 ]]; then
+    echo "Closing tunnels for ${mobs[*]}"
+    for moblab in "${mobs[@]}"; do
+      index=${moblab: -1}
+      close_tunnel "$BASE_PORT$index" 80 "${MOBLABS[$moblab]}"
+      close_tunnel "$BASE_ADMIN_PORT$index" 9991 "${MOBLABS[$moblab]}"
+    done
+  elif [[ "${STATUS}" -ne 0 ]]; then
+    echo "Checking tunnels for ${mobs[*]}"
+    for moblab in "${mobs[@]}"; do
+      index=${moblab: -1}
+      check_tunnel "$BASE_PORT$index" 80 "${MOBLABS[$moblab]}"
+      check_tunnel "$BASE_ADMIN_PORT$index" 9991 "${MOBLABS[$moblab]}"
+    done
+  else
+    usage
+  fi
+}
+
+function usage() {
+  echo "$0 Usage:
+
+  $0 [-a|-c|-h|-o|-s|] <host1> <host2> ...
+
+  -a If port for Moblab Monitor should be used.
+  -c Close active or specified tunnels.
+  -h Print this.
+  -o Open all tunnels or only those specified.
+  -s Checks the status of each active tunnel."
+}
+
+OPTIND=1
+
+while getopts "achos" opt; do
+  case "$opt" in
+    a)
+      MONITOR_PORT=1
+      ;;
+    c)
+      CLOSE=1
+      ;;
+    h)
+      usage
+      exit 0
+      ;;
+    o)
+      OPEN=1
+      ;;
+    s)
+      STATUS=1
+      ;;
+    esac
+done
+
+shift $((OPTIND-1))
+
+[[ "$1" = "--" ]] && shift
+
+start "$@"
+
+
+
+