#! /bin/sh # Wrapper script for use of the tsocks(8) transparent socksification library # See the tsocks(1) manpages. # Copyright (c) 2004, 2006 Peter Palfrader # Modified by Jacob Appelbaum April 16th 2006 # Modified by Felix Bechstein Dec 23th 2007 # Define and ensure we have tsocks # XXX: what if we don't have which? TSOCKS="`which tsocks`" if [ ! -x "$TSOCKS" ] then echo "$0: Can't find tsocks in PATH. Perhaps you haven't installed it?" >&2 exit 1 fi # Define TMPDIR TMPDIR=/tmp/ # Check for any argument list if [ "$#" = 0 ] then echo "Usage: $0 [...]" >&2 exit 1 fi if [ "$#" = 1 ] && ( [ "$1" = "-h" ] || [ "$1" = "--help" ] ) then echo "Usage: $0 [...]" exit 0 fi TSOCKS_PORT=$1 shift if [ "$#" = 0 ] then echo "Usage: $0 [...]" >&2 exit 1 fi if [ "$#" = 1 ] && ( [ "$1" = "-h" ] || [ "$1" = "--help" ] ) then echo "Usage: $0 [...]" exit 0 fi # generate config file for port/dev $TSOCKS_PORT if [ -r "${TMPDIR}routify.${TSOCKS_PORT}" ] ; then #conf file already generated. we should use that conf TSOCKS_CONF_FILE="${TMPDIR}routify.${TSOCKS_PORT}" fi if echo test | nc localhost ${TSOCKS_PORT} > /dev/null 2> /dev/null ; then if [ -z "$TSOCKS_CONF_FILE" ] ; then echo "server = 127.0.0.1" > ${TMPDIR}routify.${TSOCKS_PORT} echo "server_port = ${TSOCKS_PORT}" >> ${TMPDIR}routify.${TSOCKS_PORT} fi else /sbin/ifconfig | grep -o "^[a-zA-Z][^ ]*" | grep -v ^lo$ > "${TMPDIR}devlist" if echo ${TSOCKS_PORT} | grep -f "${TMPDIR}devlist" > /dev/null ; then TSOCKS_DEV=${TSOCKS_PORT} # found device as arg # but no proxy started for this device if [ -z "$TSOCKS_CONF_FILE" ] ; then TSOCKS_PORT=10080 while true ; do if echo test | nc localhost ${TSOCKS_PORT} > /dev/null 2> /dev/null ; then TSOCKS_PORT=$(expr ${TSOCKS_PORT} + 1) # search for free port else if fgrep "server_port = $TSOCKS_PORT" ${TMPDIR}routify.* > /dev/null 2> /dev/null ; then TSOCKS_PORT=$(expr ${TSOCKS_PORT} + 1) # search for free port else break fi fi done # generate conf file echo "server = 127.0.0.1" > ${TMPDIR}routify.${TSOCKS_DEV} echo "server_port = ${TSOCKS_PORT}" >> ${TMPDIR}routify.${TSOCKS_DEV} else # read port from conf file TSOCKS_PORT=$(grep server_port ${TMPDIR}routify.${TSOCKS_PORT} | tr -d 'a-zA-Z =#;_') fi # start nylon on $TSOCKS_DEV to listen on $TSOCKS_PORT echo test | nc localhost ${TSOCKS_PORT} 2> /dev/null > /dev/null || \ nylon -p $TSOCKS_PORT -I $TSOCKS_DEV -P ${TMPDIR}routify.${TSOCKS_DEV}.nylon TSOCKS_CONF_FILE="${TMPDIR}routify.${TSOCKS_DEV}" else # proxy down echo "socket-proxy is down!" rm "${TMPDIR}devlist" exit 1 fi rm "${TMPDIR}devlist" fi # Define our tsocks config file [ -z "$TSOCKS_CONF_FILE" ] && TSOCKS_CONF_FILE="${TMPDIR}routify.${TSOCKS_PORT}" export TSOCKS_CONF_FILE # Check that we've got a tsocks config file if [ -r "$TSOCKS_CONF_FILE" ] then exec tsocks "$@" echo "$0: Failed to exec tsocks $@" >&2 exit 1 else echo "$0: Missing tsocks configuration file \"$TSOCKS_CONF_FILE\"." >&2 exit 1 fi