oops, forgot to add earlier
This commit is contained in:
414
apps/q/java/src/net/i2p/i2ptunnel/I2PTunnelXMLWrapper.java
Normal file
414
apps/q/java/src/net/i2p/i2ptunnel/I2PTunnelXMLWrapper.java
Normal file
@ -0,0 +1,414 @@
|
|||||||
|
package net.i2p.i2ptunnel;
|
||||||
|
|
||||||
|
import org.apache.xmlrpc.*;
|
||||||
|
import java.lang.*;
|
||||||
|
import java.util.*;
|
||||||
|
import java.io.*;
|
||||||
|
import java.lang.reflect.*;
|
||||||
|
|
||||||
|
|
||||||
|
import net.i2p.*;
|
||||||
|
import net.i2p.client.*;
|
||||||
|
import net.i2p.client.streaming.*;
|
||||||
|
import net.i2p.data.Base64;
|
||||||
|
import net.i2p.util.*;
|
||||||
|
import net.i2p.util.*;
|
||||||
|
import net.i2p.data.*;
|
||||||
|
import net.i2p.i2ptunnel.*;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* subclasses I2PTunnel, adding some methods to facilitate
|
||||||
|
* the I2PTunnel XML-RPC server. We have to put this class
|
||||||
|
* into net.i2p.i2ptunnel, because there are some non-public
|
||||||
|
* methods we need to access. For doco on the methods in
|
||||||
|
* this class refer to the corresponding doco in I2PTunnelXMLObject
|
||||||
|
*/
|
||||||
|
public class I2PTunnelXMLWrapper extends I2PTunnel
|
||||||
|
{
|
||||||
|
public Hashtable xmlrpcLookup(String hostname)
|
||||||
|
{
|
||||||
|
String cmdOut;
|
||||||
|
String [] args;
|
||||||
|
BufferLogger log = new BufferLogger();
|
||||||
|
Hashtable result = new Hashtable();
|
||||||
|
|
||||||
|
System.out.println("xmlrpcLookup: hostname='" + hostname + "'");
|
||||||
|
|
||||||
|
args = new String[1];
|
||||||
|
args[0] = hostname;
|
||||||
|
|
||||||
|
//System.out.println("Invoking runLookup");
|
||||||
|
|
||||||
|
runLookup(args, log);
|
||||||
|
//System.out.println("Back from runLookup");
|
||||||
|
|
||||||
|
cmdOut = log.getBuffer().trim();
|
||||||
|
//System.out.println("cmdOut=" + cmdOut);
|
||||||
|
|
||||||
|
if (cmdOut.equals("Unknown host"))
|
||||||
|
{
|
||||||
|
result.put("status", "fail");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result.put("status", "ok");
|
||||||
|
result.put("dest", cmdOut);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Hashtable xmlrpcList()
|
||||||
|
{
|
||||||
|
Hashtable result = new Hashtable();
|
||||||
|
BufferLogger log = new BufferLogger();
|
||||||
|
Vector jobs = new Vector();
|
||||||
|
|
||||||
|
// run the listing
|
||||||
|
runList(log);
|
||||||
|
|
||||||
|
String raw = log.getBuffer();
|
||||||
|
//System.out.println("list: raw='"+raw+"'");
|
||||||
|
if (raw.equals(""))
|
||||||
|
{
|
||||||
|
System.out.println("list: no jobs");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// got 1 or more job lines, parse them and assemble into jobs array
|
||||||
|
String [] rawlines = raw.trim().split("\\n+");
|
||||||
|
|
||||||
|
int numLines = Array.getLength(rawlines);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
System.out.println("list: numLines="+numLines);
|
||||||
|
|
||||||
|
for (i = 0; i < numLines; i++)
|
||||||
|
{
|
||||||
|
String line = rawlines[i];
|
||||||
|
|
||||||
|
System.out.println("list: line["+i+"]="+line);
|
||||||
|
|
||||||
|
// carve up each job line into constituent fields
|
||||||
|
String [] flds = line.split("\\s+");
|
||||||
|
|
||||||
|
String jobFld = flds[0];
|
||||||
|
String tcpFld = flds[1];
|
||||||
|
String typeFld = flds[2];
|
||||||
|
String i2pFld = flds[3];
|
||||||
|
|
||||||
|
Integer portInt;
|
||||||
|
int port;
|
||||||
|
|
||||||
|
Hashtable job = new Hashtable();
|
||||||
|
|
||||||
|
// stick in jobnumber, as int
|
||||||
|
Integer jobNumInt = new Integer(jobFld.substring(1, jobFld.length()-1));
|
||||||
|
int jobNum = jobNumInt.intValue();
|
||||||
|
job.put("job", jobNumInt);
|
||||||
|
|
||||||
|
// rest is type-dependent
|
||||||
|
if (typeFld.equals("<-"))
|
||||||
|
{
|
||||||
|
//System.out.println("server");
|
||||||
|
|
||||||
|
// fill out dict for a 'server' result
|
||||||
|
job.put("type", "server");
|
||||||
|
|
||||||
|
// tcp side is in form "hostname/ipaddr:port", carve up
|
||||||
|
String hostsStr;
|
||||||
|
String hostStr;
|
||||||
|
String ipStr;
|
||||||
|
String portStr;
|
||||||
|
|
||||||
|
String [] tmpFlds = tcpFld.split(":");
|
||||||
|
|
||||||
|
//System.out.println("tmpFlds="+tmpFlds);
|
||||||
|
|
||||||
|
hostsStr = tmpFlds[0];
|
||||||
|
portStr = tmpFlds[1];
|
||||||
|
|
||||||
|
//System.out.println("hostsStr="+hostsStr+" portStr="+portStr);
|
||||||
|
|
||||||
|
portInt = new Integer(portStr);
|
||||||
|
port = portInt.intValue();
|
||||||
|
|
||||||
|
tmpFlds = hostsStr.split("/");
|
||||||
|
hostStr = tmpFlds[0];
|
||||||
|
ipStr = tmpFlds[1];
|
||||||
|
|
||||||
|
//System.out.println("hostStr="+hostStr+" ipStr="+ipStr);
|
||||||
|
|
||||||
|
job.put("host", hostStr);
|
||||||
|
job.put("ip", ipStr);
|
||||||
|
job.put("port", portInt);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//System.out.println("client");
|
||||||
|
|
||||||
|
// fill out dict for a 'client' result
|
||||||
|
job.put("type", "client");
|
||||||
|
|
||||||
|
portInt = new Integer(tcpFld);
|
||||||
|
port = portInt.intValue();
|
||||||
|
|
||||||
|
job.put("dest", i2pFld);
|
||||||
|
job.put("port", portInt);
|
||||||
|
}
|
||||||
|
|
||||||
|
jobs.add(job);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result.put("status", "ok");
|
||||||
|
//result.put("rawlist", raw);
|
||||||
|
//result.put("rawlines", rawlines);
|
||||||
|
result.put("jobs", jobs);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Hashtable xmlrpcClient(int portNum, String dest)
|
||||||
|
{
|
||||||
|
Hashtable result = new Hashtable();
|
||||||
|
BufferLogger log = new BufferLogger();
|
||||||
|
|
||||||
|
String [] args = new String[2];
|
||||||
|
|
||||||
|
Integer portNumInt = new Integer(portNum);
|
||||||
|
args[0] = portNumInt.toString();
|
||||||
|
args[1] = dest;
|
||||||
|
runClient(args, log);
|
||||||
|
|
||||||
|
String reply = log.getBuffer();
|
||||||
|
|
||||||
|
result.put("status", "ok");
|
||||||
|
result.put("result", reply);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Hashtable xmlrpcServer(String host, int port, String key)
|
||||||
|
{
|
||||||
|
Hashtable result = new Hashtable();
|
||||||
|
BufferLogger log = new BufferLogger();
|
||||||
|
|
||||||
|
File keyBinFile;
|
||||||
|
|
||||||
|
// create array for cli args
|
||||||
|
String [] args = new String[3];
|
||||||
|
|
||||||
|
// arg0 is host - easy
|
||||||
|
args[0] = host;
|
||||||
|
|
||||||
|
// arg1 is port, convert from int to string
|
||||||
|
Integer portInt = new Integer(port);
|
||||||
|
args[1] = portInt.toString();
|
||||||
|
|
||||||
|
// arg2 is key filename
|
||||||
|
// gotta convert base64 string to bin, write to
|
||||||
|
// a temporary file, and extract the file path
|
||||||
|
String keyBin = new String(net.i2p.data.Base64.decode(key));
|
||||||
|
try
|
||||||
|
{
|
||||||
|
keyBinFile = File.createTempFile("xmlrpc_", ".priv");
|
||||||
|
keyBinFile.createNewFile();
|
||||||
|
FileWriter keyBinFileWriter = new FileWriter(keyBinFile);
|
||||||
|
keyBinFileWriter.write(keyBin, 0, keyBin.length());
|
||||||
|
keyBinFileWriter.flush();
|
||||||
|
keyBinFileWriter.close();
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
result.put("status", "fail");
|
||||||
|
result.put("error", "IOException");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
args[2] = keyBinFile.getAbsolutePath();
|
||||||
|
|
||||||
|
// do the run cmd
|
||||||
|
runServer(args, log);
|
||||||
|
|
||||||
|
// finished with privkey bin file, delete it
|
||||||
|
keyBinFile.delete();
|
||||||
|
|
||||||
|
String reply = log.getBuffer().trim();
|
||||||
|
|
||||||
|
// Replies with 'Ready!' if ok, something else if not
|
||||||
|
if (reply.equals("Ready!"))
|
||||||
|
{
|
||||||
|
result.put("status", "ok");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result.put("status", "fail");
|
||||||
|
result.put("error", reply);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// generate a new keypair
|
||||||
|
//
|
||||||
|
|
||||||
|
public Hashtable xmlrpcGenkeys()
|
||||||
|
{
|
||||||
|
Hashtable result = new Hashtable();
|
||||||
|
BufferLogger log = new BufferLogger();
|
||||||
|
String reply = "";
|
||||||
|
|
||||||
|
// need a couple of output streams to collect the keys
|
||||||
|
ByteArrayOutputStream privStream = new ByteArrayOutputStream();
|
||||||
|
ByteArrayOutputStream destStream = new ByteArrayOutputStream();
|
||||||
|
|
||||||
|
// generate the keys
|
||||||
|
makeKey(privStream, destStream, log);
|
||||||
|
|
||||||
|
// extract keys from output streams and convert into base64 strings
|
||||||
|
String priv64 = net.i2p.data.Base64.encode(privStream.toByteArray());
|
||||||
|
String dest64 = net.i2p.data.Base64.encode(destStream.toByteArray());
|
||||||
|
|
||||||
|
// build up result map and bail
|
||||||
|
result.put("status", "ok");
|
||||||
|
result.put("priv", priv64);
|
||||||
|
result.put("dest", dest64);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// various front-ends for close
|
||||||
|
|
||||||
|
public Hashtable xmlrpcClose(int jobnum)
|
||||||
|
{
|
||||||
|
Hashtable result = new Hashtable();
|
||||||
|
BufferLogger log = new BufferLogger();
|
||||||
|
String [] args = new String[1];
|
||||||
|
|
||||||
|
String jobStr = String.valueOf(jobnum);
|
||||||
|
args[0] = jobStr;
|
||||||
|
|
||||||
|
runClose(args, log);
|
||||||
|
|
||||||
|
String logOut = log.getBuffer();
|
||||||
|
|
||||||
|
//System.out.println("close(int): got "+logOut);
|
||||||
|
|
||||||
|
result.put("status", "ok");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Hashtable xmlrpcClose(Hashtable criteria)
|
||||||
|
{
|
||||||
|
Hashtable result = new Hashtable();
|
||||||
|
BufferLogger log = new BufferLogger();
|
||||||
|
String [] args = new String[1];
|
||||||
|
|
||||||
|
// try special case, job==-1 means close all jobs
|
||||||
|
if (criteria.containsKey("job"))
|
||||||
|
{
|
||||||
|
Object j = criteria.get("job");
|
||||||
|
//System.out.println("job="+j);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (criteria.containsKey("job") && criteria.get("job").equals("all"))
|
||||||
|
{
|
||||||
|
// easy - just fire a 'close all'
|
||||||
|
//System.out.println("close: job=all");
|
||||||
|
return xmlrpcClose("all");
|
||||||
|
}
|
||||||
|
|
||||||
|
// harder - get joblist and match criteria
|
||||||
|
// get a list of running jobs
|
||||||
|
Hashtable jobs = xmlrpcList();
|
||||||
|
Vector jobsList = (Vector)(jobs.get("jobs"));
|
||||||
|
//int numJobs = Array.length(jobsList);
|
||||||
|
int numJobs = jobsList.size();
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < numJobs; i++)
|
||||||
|
{
|
||||||
|
boolean closing = false;
|
||||||
|
|
||||||
|
// fetch each job, and test if it matches our criteria
|
||||||
|
Hashtable job = (Hashtable)jobsList.get(i);
|
||||||
|
//System.out.println("close: existing job: "+job);
|
||||||
|
|
||||||
|
if (criteria.containsKey("job") && criteria.get("job").equals(job.get("job")))
|
||||||
|
{
|
||||||
|
//System.out.println("close: matched jobnum");
|
||||||
|
closing = true;
|
||||||
|
}
|
||||||
|
if (criteria.containsKey("type") && criteria.get("type").equals(job.get("type")))
|
||||||
|
{
|
||||||
|
//System.out.println("close: matched type");
|
||||||
|
closing = true;
|
||||||
|
}
|
||||||
|
if (criteria.containsKey("port") && criteria.get("port").equals(job.get("port")))
|
||||||
|
{
|
||||||
|
//System.out.println("close: matched port");
|
||||||
|
closing = true;
|
||||||
|
}
|
||||||
|
if (criteria.containsKey("host") && job.containsKey("host")
|
||||||
|
&& (criteria.get("host").equals(job.get("host"))))
|
||||||
|
{
|
||||||
|
//System.out.println("close: matched host="+criteria.get("host"));
|
||||||
|
closing = true;
|
||||||
|
}
|
||||||
|
if (criteria.containsKey("ip") && job.containsKey("ip")
|
||||||
|
&& (criteria.get("ip").equals(job.get("ip"))))
|
||||||
|
{
|
||||||
|
//System.out.println("close: matched ip="+criteria.get("ip"));
|
||||||
|
closing = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (closing)
|
||||||
|
{
|
||||||
|
String jobStr = String.valueOf(job.get("job"));
|
||||||
|
//System.out.println("close: matched criteria - closing job "+jobStr);
|
||||||
|
args[0] = jobStr;
|
||||||
|
runClose(args, log);
|
||||||
|
result.put("status", "ok");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result.put("status", "ok");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Hashtable xmlrpcClose(String job)
|
||||||
|
{
|
||||||
|
Hashtable result = new Hashtable();
|
||||||
|
BufferLogger log = new BufferLogger();
|
||||||
|
String [] args = new String[1];
|
||||||
|
|
||||||
|
// easy 'close all' case
|
||||||
|
if (job.equals("all"))
|
||||||
|
{
|
||||||
|
args[0] = "all";
|
||||||
|
runClose(args, log);
|
||||||
|
result.put("status", "ok");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// try to convert job to an int
|
||||||
|
try
|
||||||
|
{
|
||||||
|
int jobnum = new Integer(job).intValue();
|
||||||
|
return xmlrpcClose(jobnum);
|
||||||
|
}
|
||||||
|
catch (NumberFormatException e)
|
||||||
|
{
|
||||||
|
result.put("status", "error");
|
||||||
|
result.put("error", "cannot convert job number arg to an int");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Reference in New Issue
Block a user