147 lines
5.2 KiB
Java
147 lines
5.2 KiB
Java
// Copyright 2005 Nick Mathewson, Roger Dingledine
|
|
// See LICENSE file for copying information
|
|
package org.torproject.android.control.examples;
|
|
|
|
import org.torproject.android.control.*;
|
|
import java.io.EOFException;
|
|
import java.io.IOException;
|
|
import java.io.PrintWriter;
|
|
import java.net.Socket;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.Arrays;
|
|
import java.util.Map;
|
|
import java.util.Iterator;
|
|
|
|
public class Main implements TorControlCommands {
|
|
|
|
public static void main(String args[]) {
|
|
if (args.length < 1) {
|
|
System.err.println("No command given.");
|
|
return;
|
|
}
|
|
try {
|
|
if (args[0].equals("set-config")) {
|
|
setConfig(args);
|
|
} else if (args[0].equals("get-config")) {
|
|
getConfig(args);
|
|
} else if (args[0].equals("get-info")) {
|
|
getInfo(args);
|
|
} else if (args[0].equals("listen")) {
|
|
listenForEvents(args);
|
|
} else if (args[0].equals("signal")) {
|
|
signal(args);
|
|
} else if (args[0].equals("auth")) {
|
|
authDemo(args);
|
|
} else {
|
|
System.err.println("Unrecognized command: "+args[0]);
|
|
}
|
|
} catch (EOFException ex) {
|
|
System.out.println("Control socket closed by Tor.");
|
|
} catch (TorControlError ex) {
|
|
System.err.println("Error from Tor process: "+
|
|
ex+" ["+ex.getErrorMsg()+"]");
|
|
} catch (IOException ex) {
|
|
System.err.println("IO exception when talking to Tor process: "+
|
|
ex);
|
|
ex.printStackTrace(System.err);
|
|
}
|
|
}
|
|
|
|
private static TorControlConnection getConnection(String[] args,
|
|
boolean daemon) throws IOException {
|
|
Socket s = new Socket("127.0.0.1", 9100);
|
|
TorControlConnection conn = new TorControlConnection(s);
|
|
conn.launchThread(daemon);
|
|
conn.authenticate(new byte[0]);
|
|
return conn;
|
|
}
|
|
|
|
private static TorControlConnection getConnection(String[] args)
|
|
throws IOException {
|
|
return getConnection(args, true);
|
|
}
|
|
|
|
public static void setConfig(String[] args) throws IOException {
|
|
// Usage: "set-config [-save] key value key value key value"
|
|
TorControlConnection conn = getConnection(args);
|
|
ArrayList<String> lst = new ArrayList<String>();
|
|
int i = 1;
|
|
boolean save = false;
|
|
if (args[i].equals("-save")) {
|
|
save = true;
|
|
++i;
|
|
}
|
|
for (; i < args.length; i +=2) {
|
|
lst.add(args[i]+" "+args[i+1]);
|
|
}
|
|
conn.setConf(lst);
|
|
if (save) {
|
|
conn.saveConf();
|
|
}
|
|
}
|
|
|
|
public static void getConfig(String[] args) throws IOException {
|
|
// Usage: get-config key key key
|
|
TorControlConnection conn = getConnection(args);
|
|
List<ConfigEntry> lst = conn.getConf(Arrays.asList(args).subList(1,args.length));
|
|
for (Iterator<ConfigEntry> i = lst.iterator(); i.hasNext(); ) {
|
|
ConfigEntry e = i.next();
|
|
System.out.println("KEY: "+e.key);
|
|
System.out.println("VAL: "+e.value);
|
|
}
|
|
}
|
|
|
|
public static void getInfo(String[] args) throws IOException {
|
|
TorControlConnection conn = getConnection(args);
|
|
Map<String,String> m = conn.getInfo(Arrays.asList(args).subList(1,args.length));
|
|
for (Iterator<Map.Entry<String, String>> i = m.entrySet().iterator(); i.hasNext(); ) {
|
|
Map.Entry<String,String> e = i.next();
|
|
System.out.println("KEY: "+e.getKey());
|
|
System.out.println("VAL: "+e.getValue());
|
|
}
|
|
}
|
|
|
|
public static void listenForEvents(String[] args) throws IOException {
|
|
// Usage: listen [circ|stream|orconn|bw|newdesc|info|notice|warn|error]*
|
|
TorControlConnection conn = getConnection(args, false);
|
|
ArrayList<String> lst = new ArrayList<String>();
|
|
for (int i = 1; i < args.length; ++i) {
|
|
lst.add(args[i]);
|
|
}
|
|
conn.setEventHandler(
|
|
new DebuggingEventHandler(new PrintWriter(System.out, true)));
|
|
conn.setEvents(lst);
|
|
}
|
|
|
|
public static void signal(String[] args) throws IOException {
|
|
// Usage signal [reload|shutdown|dump|debug|halt]
|
|
TorControlConnection conn = getConnection(args, false);
|
|
// distinguish shutdown signal from other signals
|
|
if ("SHUTDOWN".equalsIgnoreCase(args[1])
|
|
|| "HALT".equalsIgnoreCase(args[1])) {
|
|
conn.shutdownTor(args[1].toUpperCase());
|
|
} else {
|
|
conn.signal(args[1].toUpperCase());
|
|
}
|
|
}
|
|
|
|
public static void authDemo(String[] args) throws IOException {
|
|
|
|
PasswordDigest pwd = PasswordDigest.generateDigest();
|
|
Socket s = new Socket("127.0.0.1", 9100);
|
|
TorControlConnection conn = new TorControlConnection(s);
|
|
conn.launchThread(true);
|
|
conn.authenticate(new byte[0]);
|
|
|
|
conn.setConf("HashedControlPassword", pwd.getHashedPassword());
|
|
|
|
s = new Socket("127.0.0.1", 9100);
|
|
conn = new TorControlConnection(s);
|
|
conn.launchThread(true);
|
|
conn.authenticate(pwd.getSecret());
|
|
}
|
|
|
|
}
|
|
|