#! /usr/bin/env python from __future__ import with_statement # sfi -- slice-based facility interface import sys import os, os.path import getopt from util.cert import Keypair, Certificate from util.credential import Credential from util.geniclient import GeniClient from util.record import GeniRecord from util.gid import GID infile = None outfile = None gidfile = None email = None ip = None dns = None hrn = None type = None dump = False researcher = [] long_opts = ["infile=", "outfile=", "email=", "ip=", "dns=", "gidfile=", "hrn=", "type=", "addresearcher=", "delresearcher=", "dump"] def showhelp(): print "syntax: editRecord.py " print " --help ... show help" print " --infile ... read record from file" print " --outfile ... write record to file" print " --dump ... dump record to stdout" print " --gidfile ... load gid from file" print " --hrn ... set hrn" print " --type ... set type (user|slice|sa|ma|...)" print " --email ... user: set email address" print " --ip ... node: set ip address" print " --dns ... node: set hostname" print " --addresearcher ... slice: add researcher" print " --delresearcher ... slice: delete researcher" def process_options(): global infile, outfile global email, ip, dns, gidfile, hrn, type global researcher global dump (options, args) = getopt.getopt(sys.argv[1:], '', long_opts) for opt in options: name = opt[0] val = opt[1] if name == "--help": showhelp() sys.exit(0) elif name == "--infile": infile = val elif name == "--outfile": outfile = val elif name == "--email": email = val elif name == "--ip": ip = val elif name == "--dns": dns = val elif name == "--gidfile": gidfile = val elif name == "--hrn": hrn = val elif name == "--type": type = val elif name == "--dump": dump = True elif name == "--addresearcher": researcher.append(val) elif name == "--delresearcher": researcher.append("-" + val) def errorcheck(record): geni_info = record.get_geni_info() if not record.type: print "Warning: no type specified" if not record.type in ["user", "sa", "ma", "slice", "node"]: print "Warning: unknown record type" if not record.name: print "Warning: unknown record name" if not record.gid: print "Warning: unknown record gid" if record.type == "user": if not geni_info.get("email",None): print "Warning: unknown email in user record" if record.type == "node": if not geni_info.get("ip",None): print "Warning: unknown ip in node record" if not geni_info.get("dns",None): print "Warning: unknown dns in node record" # updates is a list of items to add or remove. If an item starts with "-", then # it will be removed. Otherwise it will be added def update_list(dict, listname, updates): list = dict.get(listname, []) for hrn in updates: if hrn.startswith("-"): real_hrn = hrn[1:] if real_hrn in list: list.delete(real_hrn) else: if not hrn in list: list.append(hrn) dict[listname] = list def main(): process_options() # if the user didn't tell us to do much of anything, then maybe he needs # some help if (not infile) and (not outfile) and (not dump): showhelp() return if infile: str = file(infile, "r").read() record = GeniRecord(string = str) else: record = GeniRecord() geni_info = record.get_geni_info() geni_info_orig = geni_info.copy() if email: geni_info["email"] = email if ip: geni_info["ip"] = ip if dns: geni_info["dns"] = dns if hrn: record.name = hrn if type: record.type = type if gidfile: gid_str = file(gidfile, "r").read() gid = GID(string=gid_str) record.set_gid(gid) if researcher: update_list(geni_info, "researcher", researcher) if (geni_info != geni_info_orig): record.set_geni_info(geni_info) errorcheck(record) if dump: record.dump(False) if outfile: str = record.save_to_string() file(outfile, "w").write(str) print "wrote record to", outfile if __name__=="__main__": main()