[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] r12028: Import tor-ctrl.sh by Stefan Behte into svn repository. (in tor/trunk: . contrib)
Author: nickm
Date: 2007-10-18 14:15:04 -0400 (Thu, 18 Oct 2007)
New Revision: 12028
Added:
tor/trunk/contrib/tor-ctrl.sh
Modified:
tor/trunk/
tor/trunk/ChangeLog
Log:
r15924@catbus: nickm | 2007-10-18 14:06:11 -0400
Import tor-ctrl.sh by Stefan Behte into svn repository.
Property changes on: tor/trunk
___________________________________________________________________
svk:merge ticket from /tor/trunk [r15924] on 8246c3cf-6607-4228-993b-4d95d33730f1
Modified: tor/trunk/ChangeLog
===================================================================
--- tor/trunk/ChangeLog 2007-10-18 18:15:01 UTC (rev 12027)
+++ tor/trunk/ChangeLog 2007-10-18 18:15:04 UTC (rev 12028)
@@ -69,6 +69,11 @@
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
Added: tor/trunk/contrib/tor-ctrl.sh
===================================================================
--- tor/trunk/contrib/tor-ctrl.sh (rev 0)
+++ tor/trunk/contrib/tor-ctrl.sh 2007-10-18 18:15:04 UTC (rev 12028)
@@ -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 <<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