Commit 4807d8c9 authored by Nick Mathewson's avatar Nick Mathewson 🦀
Browse files

r15924@catbus: nickm | 2007-10-18 14:06:11 -0400

 Import tor-ctrl.sh by Stefan Behte into svn repository.


svn:r12028
parent b5fefbee
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -69,6 +69,11 @@ Changes in version 0.2.0.9-alpha - 2007-10-??
      earlier.
    - New convenience code to locate a file within the DataDirectory.

  o Utilities
    - Include the "tor-ctrl.sh" bash script by Stefan Behte to provide
      Unix users an easy way to script their Tor process (e.g. by adjusting
      bandwidth based on the time of the day).

Changes in version 0.2.0.8-alpha - 2007-10-12
  o Major features (router descriptor cache):
    - Store routers in a file called cached-descriptors instead of in

contrib/tor-ctrl.sh

0 → 100644
+201 −0
Original line number Diff line number Diff line
#!/bin/bash
#
# tor-ctrl is a commandline tool for executing commands on a tor server via the controlport.
# In order to get this to work, add "ControlPort 9051" and "CookieAuthentication 1" to your torrc and reload tor.
# Or - if you want a fixed password - leave out "CookieAuthentication 1" and use the following line to create
# the appropriate HashedControlPassword entry for your torrc (you need to change yourpassword, of course):
# echo "HashedControlPassword $(tor --hash-password yourpassword | tail -n 1)"
#
# tor-ctrl will return 0 if it was successful and 1 if not, 2 will be returned if something (telnet, xxd) is missing.
# 4 will be returned if it executed serveral commands from a file.
#
# For setting the bandwidth for specific times of the day, I suggest calling tor-ctrl via cron, e.g.:
# 0 22 * * * /path/to/tor-ctrl -c "SETCONF bandwidthrate=1mb"
# 0 7 * * *  /path/to/tor-ctrl -c "SETCONF bandwidthrate=100kb"
#
# This would set the bandwidth to 100kb at 07:00 and to 1mb at 22:00.
# You can use notations like 1mb, 1kb or the number of bytes.
#
# Many, many other things are possible, see http://tor.eff.org/svn/trunk/doc/spec/control-spec.txt
#
# Copyright (c) 2007 by Stefan Behte
#
# tor-ctrl is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# tor-ctrl is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with tor-ctrl; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
#
# Written by Stefan Behte
#
# Please send bugs, comments, wishes, thanks and success stories to:
# Stefan dot Behte at gmx dot net
#
# Also have a look at my page:
# http://ge.mine.nu/
#
# 2007-10-03: First version, only changing bandwidth possible
# 2007-10-04: Renaming to "tor-ctrl", added a lot of functions, it's now a general-purpose tool
#             added control_auth_cookie/controlpassword auth, getopts, program checks, readinf from file etc.

VERSION=v1
TORCTLIP=127.0.0.1
TORCTLPORT=9051
TOR_COOKIE="/var/lib/tor/data/control_auth_cookie"
SLEEP_AFTER_CMD=1
VERBOSE=0

usage()
{
cat <<EOF

tor-ctrl $VERSION by Stefan Behte (http://ge.mine.nu)
You should have a look at http://tor.eff.org/svn/trunk/doc/spec/control-spec.txt 

usage: tor-ctrl [-switch] [variable]

               [-c] [command] = command to execute
				notice: always "quote" your command

               [-f] [file]    = file to execute commands from
	                        notice: only one command per line

               [-a] [path]    = path to tor's control_auth_cookie
	                        default: /var/lib/tor/data/control_auth_cookie
                                notice: do not forget to adjust your torrc

               [-s] [time]    = sleep [var] seconds after each command sent
	                        default: 1 second
				notice: for GETCONF, you can use smaller pause times than for SETCONF
				        this is due to telnet's behaviour.

               [-p] [pwd]     = Use password [var] instead of tor's control_auth_cookie
	                        default: not used
				notice: do not forget to adjust your torrc
				
               [-P] [port]     = Tor ControlPort
	                        default: 9051

               [-v]           = verbose
	                        default: not set
                                notice: the default output is the return code ;)
			                You propably want to set -v when running manually

               Examples:      $0 -c "SETCONF bandwidthrate=1mb"
			      $0 -v -c "GETINFO version"
	                      $0 -v -s 0 -P 9051 -p foobar -c "GETCONF bandwidthrate"

EOF
exit 2
}

checkprogs()
{
	programs="telnet"
	if [ "$PASSWORD" = "" ]			# you only need xxd when using the control_auth_cookie
	then
		programs="$programs xxd"
	fi

	for p in $programs
	do
		which $p &>/dev/null		# are you there?
		if [ "$?" != "0" ]
		then
			echo "$p is missing."
			exit 2
		fi
	done
}

sendcmd()
{
	echo "$@"
	sleep ${SLEEP_AFTER_CMD}
}

login()
{
	if [ "$PASSWORD" = "" ]
	then
		sendcmd "AUTHENTICATE $(xxd -c 32 -g 0 ${TOR_COOKIE} | awk '{print $2}')"
	else
		sendcmd "AUTHENTICATE \"${PASSWORD}\""
	fi
}

cmdpipe()
{
	login
	sendcmd "$@"
	sendcmd "QUIT"
}

vecho()
{
	if [ $VERBOSE -ge 1 ]
	then
		echo "$@"
	fi
}

myecho()
{
	STR=$(cat)
	vecho "$STR"

	echo "$STR" | if [ "$(grep -c ^"250 ")" = 3 ]
	then
		exit 0
	else
		exit 1
	fi
}

filepipe()
{
	login
	cat "$1" | while read line
	do
		sendcmd "$line"
	done
	sendcmd "QUIT"
}

while getopts ":a:c:s:p:P:f:vh" Option
do
	case $Option in
		a) TOR_COOKIE="${OPTARG}";;
		c) CMD="${OPTARG}";;
		s) SLEEP_AFTER_CMD="${OPTARG}";;
		p) PASSWORD="${OPTARG}";;
		P) TORCTLPORT="${OPTARG}";;
		f) FILE="${OPTARG}";;
		v) VERBOSE=1;;
		h) usage;;
		*) usage;;
	esac
done

if [ -e "$FILE" ]
then
	checkprogs
	filepipe "$FILE" | telnet $TORCTLIP $TORCTLPORT 2>/dev/null | myecho
	exit 4
fi

if [ "$CMD" != "" ]
then
	checkprogs
	cmdpipe $CMD | telnet $TORCTLIP $TORCTLPORT 2>/dev/null | myecho
else
	usage
fi