#!/usr/bin/env python import sys, os, commands argv = sys.argv argc = len(argv) progname = argv[0] def sh(cmd): #print "running: %s" % cmd res = commands.getoutput(cmd) #print "GOT: %s" % repr(res) return res def usage(n=0, msg=None): if msg != None: print print '%s: %s' % (progname, msg) print print "Usage: %s domainname serverport clientport" % progname print print "Generates keyfiles, hosts.txt entry, and start script for" print "tunnelling a local service over i2p" print print "Example: to generate a keypair for myservice.mynick.i2p, for" print "which you are running a local server on port 1313, and which" print "you want to test by connecting your client to port 22313, you" print "simply type '%s myservice.mynick.i2p 1313 22313'" % progname print "This will create the following files:" print " myservice.mynick.i2p-pubKey.dat - binary pubkey" print " myservice.mynick.i2p-privKey.dat - binary privkey" print " myservice.mynick.i2p-pubKey.txt - base64 ASCII pubkey" print " myservice.mynick.i2p-hosts.txt - shareable hosts.txt entry" print " myservice.mynick.i2p-start.sh - shell script to launch tunnel for service" print " myservice.mynick.i2p-client.sh - shell script to launch client tunnel" sys.exit(n) def main(): if 1 in [(a in argv) for a in ['-h', '-help', 'help', '--help', '-?']]: usage(0) if argc != 4: usage(1, "Bad argument count") domain = argv[1] port = argv[2] clientport = argv[3] try: port = int(port) except: usage(1, "Bad port number") try: clientport = int(clientport) except: usage(1, "Bad client port number") domainparts = domain.split(".") if domainparts[-1] != 'i2p': usage(1, "Domain must end with '.i2p'") # gen filenames pubKeyBin = "%s-pubKey.dat" % domain privKeyBin = "%s-privKey.dat" % domain pubKeyAsc = "%s-pubKey.txt" % domain hostsTxtEntry = "%s-hosts.txt" % domain startScript = "%s-start.sh" % domain clientScript = "%s-client.sh" % domain # gen keypair res = sh("java -jar lib/i2ptunnel.jar -nogui -e 'genkeys %s %s'" % (privKeyBin, pubKeyBin)) # get base64 vers and write it out base64pubkey = sh("java -cp lib/i2p.jar net.invisiblenet.i2p.data.Base64 encode %s" % pubKeyBin) file(pubKeyAsc, "w").write(base64pubkey) # generate and write out hosts.txt entry file(hostsTxtEntry, "w").write("%s=%s" % (domain, base64pubkey)) # generate shell script to start the service file(startScript, "w").write("\n".join([ "#!/bin/sh", "java -cp lib/i2p.jar:lib/i2ptunnel.jar I2PTunnel -nogui -e 'server localhost %s %s'" % (port, privKeyBin), '', ])) sh("chmod ugo+x %s" % startScript) # generate shell script to start up a client tunnel for testing service file(clientScript, "w").write("\n".join([ "#!/bin/sh", "java -cp lib/i2p.jar:lib/i2ptunnel.jar I2PTunnel -nogui -e 'config localhost 7654' -e 'client %s %s'" % ( clientport, base64pubkey), '', ])) sh("chmod ugo+x %s" % clientScript) # all done print "Your new I2P Service data has been created." print "Details:" print " IIP Domain: %s" % domain print " Server Port: %s" % port print " Local Client Test Port %s" % clientport print " Shareable hosts.txt entry: %s" % hostsTxtEntry print " Tunnel Startup Script: %s" % startScript print " Tunnel Client Test Script: %s" % clientScript print print "Have fun with your new I2P service! :)" print if __name__ == '__main__': main()