Caleb James DeLisle 1332d295dd merged in master %!s(int64=10) %!d(string=hai) anos
..
cjdnsadmin 2aa5b0dbf2 add graph maker and made adminTools module for interactive analysis %!s(int64=11) %!d(string=hai) anos
README.md 98a9442894 Update README.md %!s(int64=11) %!d(string=hai) anos
cexec d21ec9877d cli added %!s(int64=11) %!d(string=hai) anos
cjdnsa 2bd89b45ea Refactor python scripts %!s(int64=11) %!d(string=hai) anos
cjdnsadminmaker.py 9557c68069 Add "config" entry to .cjdnsadmin file upon creation %!s(int64=11) %!d(string=hai) anos
cjdnslog 38eacb6963 Changed /usr/bin/python to /usr/bin/env python in the few python scripts that weren't already doing so to allow for python binaries in locations other than /usr/bin. In the dynamicEndpoints.py script, I also switched python2 to python, which breaks it on some distros (like Arch Linux) while making it work on others (like Debian;) more importantly however, is that doing this makes things consistant with the other scripts, which are configured to work with how Debian names things. %!s(int64=11) %!d(string=hai) anos
drawgraph 2aa5b0dbf2 add graph maker and made adminTools module for interactive analysis %!s(int64=11) %!d(string=hai) anos
dumpgraph 2aa5b0dbf2 add graph maker and made adminTools module for interactive analysis %!s(int64=11) %!d(string=hai) anos
dumptable 2aa5b0dbf2 add graph maker and made adminTools module for interactive analysis %!s(int64=11) %!d(string=hai) anos
dynamicEndpoints.py c8926fcf66 Fixed dynamicEndpoints.py %!s(int64=11) %!d(string=hai) anos
findnodes aaac048a2a Renaming custom scripts back %!s(int64=11) %!d(string=hai) anos
getLinks f30eccdbc8 Fixed getLinks %!s(int64=11) %!d(string=hai) anos
graphStats 2aa5b0dbf2 add graph maker and made adminTools module for interactive analysis %!s(int64=11) %!d(string=hai) anos
ip6topk 19d508131a [contrib] Find public key given IP6 %!s(int64=11) %!d(string=hai) anos
peerStats 2aa5b0dbf2 add graph maker and made adminTools module for interactive analysis %!s(int64=11) %!d(string=hai) anos
pingAll.py 38d3f8bbf1 Rewrite of RouterModule and fix of a minor DoS issue caused by a direct peer sending too many setup packets. %!s(int64=11) %!d(string=hai) anos
pktoip6 22a23168eb [contrib] Find IP6 given the public key %!s(int64=11) %!d(string=hai) anos
searches fa15457db8 leak in sctive search counter caused searches not to be run after the node had run a long time. %!s(int64=11) %!d(string=hai) anos
sessionStats 428d3f65a2 Added CryptoAuth session state and ipv6 address to sessionStats %!s(int64=11) %!d(string=hai) anos
trashroutes a52c99787e trashroutes should not stack overflow if there's an invalid route. %!s(int64=11) %!d(string=hai) anos

README.md

cjdnsadmin.py

Using cjdnsadmin.py is trivially simple, you can connect to a router and issue it commands in 3 steps:

from cjdnsadmin.cjdnsadmin import connect;

Make sure cjdnsadmin/cjdnsadmin.py and cjdnsadmin/bencode.py are in your path, the easiest thing to do is put cjdnsadmin/ in the same directory as your script.

connect()

This takes 3 parameters, the ip address of the listening router, it's port number, and the password to connect to it. These can be found in your cjdroute.conf here:

"admin":
{
    // Port to bind the admin RPC server to.
    "bind": "127.0.0.1:11234",

    // Password for admin RPC server.
    "password": "4s8mshm4hbb2lbdwz4bxfdn9w7"
},

To connect to this node, you would use:

cjdns = connect('127.0.0.1', 11234, '4s8mshm4hbb2lbdwz4bxfdn9w7');

The password will be checked when you connect and if it's incorrect you will get an exception.

Or just use

from cjdnsadmin.cjdnsadmin import connectWithAdminInfo;
cjdns = connectWithAdminInfo();

It get data from ~/.cjdnsadmin

Use it!

The cjdns object returned from connect() and connectWithAdminInfo() contains functions corrisponding to each of the RPC calls in the router. There is a field called cjdns.functions which contains a list of the functions and their parameters.

Example usage of cjdnsadmin/cjdnsadmin.py

user@debo8:~/wrk/play$ python
Python 2.7.2+ (default, Jan 20 2012, 17:51:10)
[GCC 4.6.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from cjdnsadmin.cjdnsadmin import connectWithAdminInfo;
>>> cjdns = connectWithAdminInfo();
>>> cjdns.functions();
RouterModule_pingNode(required String path)
UDPInterface_scrambleKeys(required String xorValue)
ping()
AuthorizedPasswords_add(Int authType, required String password)
AuthorizedPasswords_flush()
memory()
NodeStore_dumpTable()
UDPInterface_beginConnection(required String publicKey, String password, required String address)
>>> print cjdns.AuthorizedPasswords_add(1, 1);
{'error': 'Entry [password] is required and must be of type [String]'}
>>> print cjdns.AuthorizedPasswords_add(1, 'abcd');
{'error': 'none'}
>>> print cjdns.memory();
{'bytes': 750556}
>>> routes = cjdns.NodeStore_dumpTable();
>>> print routes;
{'routingTable': [{'ip': 'fc45:a51e:89eb:6d57:ad43:5723:e1d3:5d51', 'link': 4294967295, 'path': '0000.0000.0000.0001'}, {'ip': 'fcf1:a7a8:8ec0:589b:c64c:cc95:1ced:3679', 'link': 266287520, 'path': '0000.0000.0000.0006'}, {'ip': 'fce5:de17:cbde:c87b:5289:0556:8b83:c9c8', 'link': 0, 'path': '0000.0000.0000.0004'}]}
>>> for route in routes['routingTable']: print route['ip'] + "@" + route['path'] + "\n";
...
fc45:a51e:89eb:6d57:ad43:5723:e1d3:5d51@0000.0000.0000.0001

fcf1:a7a8:8ec0:589b:c64c:cc95:1ced:3679@0000.0000.0000.0006

fce5:de17:cbde:c87b:5289:0556:8b83:c9c8@0000.0000.0000.0004

>>> cjdns.disconnect();
>>> exit(0)

For convenience, you can directly start ./cjdnsa