123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- #!/usr/bin/env python2
- """
- Automagically generate a .cjdnsadmin file.
- Searches around for cjdroute.conf and the cjdns executable, cleans the config
- into proper JSON, and saves just the RPC admin info to a file. By default this
- is ~/.cjdnsadmin, but you can specify any file you want.
- """
- import json
- import os
- import sys
- import subprocess
- # possibly search for running cjdroute processes and check the same folder as they're in
- # and/or running find on the home folder
- ## Wanted: Everyone's favorite place to store their shit.
- conflocations = ["/etc/cjdroute.conf",
- "~/cjdroute.conf",
- "~/cjdns/cjdroute.conf",
- "/usr/local/opt/cjdns/cjdroute.conf"]
- cjdroutelocations = ["/opt/cjdns",
- "~/cjdns",
- "~/cjdns-git",
- "/usr/local/opt/cjdns"]
- cjdroutelocations += os.getenv("PATH").split(":")
- if len(sys.argv) == 0:
- # Write the file in the default location
- cjdnsadmin_path = os.path.expanduser("~/.cjdnsadmin")
- else:
- # Write the file in some other location
- cjdnsadmin_path = sys.argv[1]
- def ask(question, default):
- while True:
- r = raw_input("%s " % question).lower() or default
- if r in "yn":
- return r == "y"
- else:
- print "Invalid response, please enter either y or n"
- def find_cjdroute_bin():
- for path in cjdroutelocations:
- path = os.path.expanduser(path) + "/cjdroute"
- if os.path.isfile(path):
- return path
- print "Failed to find cjdroute"
- print "Please tell me where it is"
- return raw_input("ie. <cjdns git>/cjdroute: ")
- def find_cjdroute_conf():
- for path in conflocations:
- path = os.path.expanduser(path)
- if os.path.isfile(path):
- return path
- return raw_input("Can't find cjdroute.conf, please give the path to it here: ")
- def load_cjdroute_conf(conf):
- print "Loading " + conf
- try:
- with open(conf) as conffile:
- return json.load(conffile)
- except ValueError:
- return cleanup_config(conf)
- except IOError:
- print "Error opening " + conf + ". Do we have permission to access it?"
- print "Hint: Try running this as root"
- sys.exit(1)
- def cleanup_config(conf):
- print "Making valid JSON out of " + conf
- print "First, we need to find the cleanconfig program"
- cjdroute = find_cjdroute_bin()
- print "Using " + cjdroute
- process = subprocess.Popen([cjdroute, "--cleanconf"], stdin=open(conf), stdout=subprocess.PIPE)
- try:
- return json.load(process.stdout)
- except ValueError:
- print "Failed to parse! Check:"
- print "-" * 8
- print "{} --cleanconf < {}".format(cjdroute, conf)
- print "-" * 8
- sys.exit(1)
- try:
- with open(cjdnsadmin_path) as cjdnsadmin_file:
- json.load(cjdnsadmin_file)
- if not ask("%s appears to be a valid JSON file. Update? [Y/n]" % cjdnsadmin_path, "y"):
- sys.exit()
- except ValueError:
- if not ask("%s appears to be a file. Overwrite? [y/N]" % cjdnsadmin_path, "n"):
- sys.exit()
- except IOError:
- print "This script will attempt to create " + cjdnsadmin_path
- conf = find_cjdroute_conf()
- cjdrouteconf = load_cjdroute_conf(conf)
- addr, port = cjdrouteconf['admin']['bind'].split(":")
- cjdnsadmin = {}
- cjdnsadmin["addr"] = addr
- cjdnsadmin["port"] = int(port)
- cjdnsadmin["password"] = cjdrouteconf['admin']['password']
- cjdnsadmin["config"] = conf
- with open(cjdnsadmin_path, "w+") as adminfile:
- json.dump(cjdnsadmin, adminfile, indent=4)
- print "Done! Give it a shot, why dont ya"
|