autotunnel / autotunnel

#!/bin/bash

#
# Read in the specified profile. The first argument is the profile name. If no
# profile is specified, use the default profile.
#
get_config() {
  CONFIG=$1
  if [[ -z ${CONFIG} ]]; then
    CONFIG=default
  fi

  # make sure the profile exists
  CFGFILE=/etc/autotunnel.d/${CONFIG}.conf
  [[ ! -f ${CFGFILE} ]] && echo "Invalid configuration file ${CFGFILE}" && exit 1

  echo "Reading config from ${CFGFILE}"
  source ${CFGFILE}
}

#
# See if we need to kill an existing set of tunnels. This is triggered when
# `autotunnel` is called with `-k` as the first argument. The second argument
# is taken as the profile name. If no profile name is specified, the default
# profile is used.
#
if [[ "$1" == "-k" ]]; then
  # kill mode
  get_config $2
  pkill -SIGKILL -f "autossh -M ${AUTOSSH_PORT}"
  exit 0
else
  # launch mode
  get_config $1
  DEBUG=$2
fi

# Make sure the profile has tunnels or a SOCKS proxy configured
if [[ -z ${TUNNELS} ]] && [[ -z ${REVERSE} ]] && [[ ${SOCKS_PORT} -eq 0 ]]; then
  echo "Nothing to do; aborting"
  exit 2
fi

# Establish the SOCKS proxy, if necessary
if [[ ${SOCKS_PORT} -gt 0 ]]; then
  DO_SOCKS="-D ${SOCKS_PORT}"
else
  DO_SOCKS=""
fi

# Set the default SSH port
if [[ -z ${SSH_PORT} ]]; then
  SSH_PORT=22
fi

# Setup the command
CMD="autossh -M ${AUTOSSH_PORT} -NT ${USER}@${HOST} -p ${SSH_PORT} ${DO_SOCKS}"

# add normal tunnels
for t in ${TUNNELS[@]}; do
    CMD="${CMD} -L ${t}"
done

# add reverse tunnels
for rt in ${REVERSE[@]}; do
    CMD="${CMD} -R ${rt}"
done

[[ ! -z ${DEBUG} ]] && echo ${CMD}

$CMD

# vim:set ts=2 sw=2 et:
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.