| #!/bin/bash | |
| # Copyright 2012 The ChromiumOS Authors | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| # $1 = hostname, $2 = port | |
| # | |
| # Use socat to connect to the specified host and port via one of the proxies | |
| # defined in the environment, if the target host does not appear in the | |
| # no_proxy environment variable. | |
| DEST_HOST="$1" | |
| DEST_PORT="$2" | |
| # Determine whether the destination host is in the "no_proxy" list. | |
| use_proxy="true" | |
| GLOBIGNORE="*" | |
| for a_host in ${no_proxy//,/ } ; do | |
| case "${a_host}" in | |
| "*") # A "*" matches all hosts. | |
| use_proxy="false" | |
| break | |
| ;; | |
| .*) # Items of the form ".some.fqdn" imply match-at-end. | |
| if [[ "${DEST_HOST}" == *"${a_host}" ]]; then | |
| use_proxy="false" | |
| break | |
| fi | |
| ;; | |
| ${DEST_HOST}) # Items of the form "some.fqdn" imply exact-match. | |
| use_proxy="false" | |
| break | |
| ;; | |
| esac | |
| done | |
| if [[ -n "${all_proxy}" ]]; then | |
| PROXY="${all_proxy}" | |
| TYPE=SOCKS4 | |
| PORT_ATTR=socksport | |
| elif [[ -n "${https_proxy}" ]]; then | |
| PROXY="${https_proxy}" | |
| TYPE=PROXY | |
| PORT_ATTR=proxyport | |
| elif [[ -n "${http_proxy}" ]]; then | |
| PROXY="${http_proxy}" | |
| TYPE=PROXY | |
| PORT_ATTR=proxyport | |
| else | |
| use_proxy="false" | |
| fi | |
| if [[ "${use_proxy}" == "true" ]]; then | |
| PROXY="${PROXY#*://}" | |
| PROXY="${PROXY%%/*}" | |
| PROXY_HOST="${PROXY%%:*}" | |
| PROXY_PORT="${PROXY##*:}" | |
| PARMS="${PROXY_HOST}:${DEST_HOST}:${DEST_PORT},${PORT_ATTR}=${PROXY_PORT}" | |
| socat_args=( "${TYPE}:${PARMS}" ) | |
| else | |
| socat_args=( TCP:"${DEST_HOST}":"${DEST_PORT}" ) | |
| fi | |
| exec socat STDIO "${socat_args[@]}" |