diff --git a/ChangeLog b/ChangeLog index 37bbba9562..32c3ba76f5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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 diff --git a/contrib/tor-ctrl.sh b/contrib/tor-ctrl.sh new file mode 100644 index 0000000000..978d64f464 --- /dev/null +++ b/contrib/tor-ctrl.sh @@ -0,0 +1,201 @@ +#!/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 </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