3 # implements support for geni records
5 # TODO: Use existing PLC database methods? or keep this separate?
9 # Record is a tuple (Name, GID, Type, Info)
10 # info is implemented as a pointer to a PLC record
11 # privkey is stored for convenience on the registry for entities which
12 # the registry holds their private keys
15 def __init__(self, name=None, gid=None, type=None, pointer=None, privkey=None, dict=None):
24 self.set_pointer(pointer)
26 self.set_privkey(privkey)
28 self.set_name(dict['name'])
29 self.set_gid(dict['gid'])
30 self.set_type(dict['type'])
31 self.set_pointer(dict['pointer'])
32 self.set_privkey(dict['privkey'])
34 def set_name(self, name):
38 def set_gid(self, gid):
42 def set_type(self, type):
46 def set_pointer(self, pointer):
47 self.pointer = pointer
50 def set_privkey(self, privkey):
51 self.privkey = privkey
55 return self.name + "#" + self.type
57 def get_field_names(self):
58 return ["name", "gid", "type", "pointer", "privkey"]
60 def get_field_value_string(self, fieldname):
61 if fieldname == "key":
64 val = getattr(self, fieldname)
65 if isinstance(val, str):
66 return "'" + str(val) + "'"
70 def get_field_value_strings(self, fieldnames):
72 for fieldname in fieldnames:
73 strs.append(self.get_field_value_string(fieldname))
78 names = self.get_field_names()
80 dict[name] = self.getattr(name)
85 # Represents a single table on a registry for a single authority.
88 def __init__(self, create=False, hrn="unspecified.default.registry", cninfo=None, privkey=None, gid=None):
89 # XXX privkey/gid are necessary so the table can generate GIDs for its
90 # records; might move that out of here as it doesn't seem the right place
94 # pgsql doesn't like table names with "." in them, to replace it with "$"
95 self.tablename = self.hrn.replace(".", "$")
97 # establish a connection to the pgsql server
98 self.cnx = DB(cninfo['dbname'], cninfo['address'], port=cninfo['port'], user=cninfo['user'], passwd=cninfo['password'])[
100 # the private key is necessary for creation of GIDs
101 self.privkey = privkey
105 # if asked to create the table, then create it
110 querystr = "CREATE TABLE " + self.tablename + " ( \
118 self.cnx.query('DROP TABLE IF EXISTS ' + self.tablename)
119 self.cnx.query(querystr)
121 def insert(self, record):
122 fieldnames = ["key"] + record.get_field_names()
123 fieldvals = record.get_field_value_strings(fieldnames)
124 query_str = "INSERT INTO " + self.tablename + \
125 "(" + ",".join(fieldnames) + ") " + \
126 "VALUES(" + ",".join(fieldvals) + ")"
128 self.cnx.query(query_str)
130 def update(self, record):
131 names = record.get_field_names()
134 val = record.get_field_value_string(name)
135 pairs.append(name + " = " + val)
136 update = ", ".join(pairs)
138 query_str = "UPDATE " + self.tablename+ " SET " + update + " WHERE key = '" + record.get_key() + "'"
140 self.cnx.query(query_str)
142 def resolve_raw(self, type, hrn):
143 query_str = "SELECT * FROM " + self.tablename + " WHERE name = '" + hrn + "'"
144 dict_list = self.cnx.query(query_str).dictresult()
145 result_dict_list = []
146 for dict in dict_list:
147 if (type=="*") or (dict['type'] == type):
148 result_dict_list.append(dict)
149 return result_dict_list
151 def resolve(self, type, hrn):
152 result_dict_list = self.resolve_raw(type, hrn)
154 for dict in result_dict_list:
155 result_rec_list.append(GeniRecord(dict=dict))
156 return result_rec_list
158 def create_gid(self, hrn, uuid, pubkey):
159 gid = GID(subject=hrn, uuid=uuid, hrn=hrn)
160 gid.set_pubkey(pubkey)
161 gid.set_issuer(key=self.privkey, subject=self.hrn)
162 gid.set_parent(self.gid)
168 def update_gid(self, record)
169 old_gid = GID(string = record.get_gid())
170 pubkey = old_gid.get_pubkey()
172 gid = self.create_gid(old_gid.get_hrn(), old_gid.get_uuid(), old_gid.get_pubkey())
174 record.set_gid(gid.save_to_string())