From: David Howells Date: Tue, 13 May 2014 20:27:56 +0000 (+0100) Subject: Better iterate over list of ptservers upon failure X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=2b2bf80119baea55df339ff24ea498fdb31b3efd;p=users%2Fdhowells%2Fkafs-utils.git Better iterate over list of ptservers upon failure Separate out the iteration over a list of ptservers when one fails. We don't want to have to intermingle it with a loop over a list of calls to make (eg. a list of IDs to be deleted). Signed-off-by: David Howells --- diff --git a/suite/commands/pts/createuser.py b/suite/commands/pts/createuser.py index 2c8cc14..b8e8f20 100644 --- a/suite/commands/pts/createuser.py +++ b/suite/commands/pts/createuser.py @@ -55,7 +55,6 @@ Create a user or machine entry in the Protection Database def main(params): exitcode = 0 cell = params["cell"] - pt_conn = cell.open_pt_server(params) names = params["name"] if "id" in params: @@ -68,20 +67,11 @@ def main(params): verbose("Adding user ", name, "\n") if i < len(ids): new_id = int(ids[i]) - ret = kafs.PR_INewEntry(pt_conn, name, new_id, 0) + ret = cell.call_pt_server(params, kafs.PR_INewEntry, name, new_id, 0) else: - ret = kafs.PR_NewEntry(pt_conn, name, 0, 0) + ret = cell.call_pt_server(params, kafs.PR_INewEntry, name, 0, 0) new_id = ret.id output("User ", name, " has id ", new_id, "\n") - except ConnectionRefusedError: - # Move on to the next server - verbose("Connection refused\n"); - pt_conn = cell.open_pt_server(params) - continue - except kafs.AbortUNOTSYNC: - verbose("Server is not synchronised\n"); - pt_conn = cell.open_pt_server(params) - continue except kafs.AbortPREXIST: error("Entry for name already exists ; unable to create user ", name, "\n") if "force" not in params: @@ -90,10 +80,4 @@ def main(params): error("Entry for id already exists ; unable to create user ", name, " with id ", new_id, "\n") if "force" not in params: break - except kafs.RemoteAbort as e: - if str(e) == "Aborted 17": - error("failed to add user ", i, " (File exists)\n") - exitcode = 1 - else: - raise return exitcode diff --git a/suite/commands/pts/delete.py b/suite/commands/pts/delete.py index fa173fc..c49e42b 100644 --- a/suite/commands/pts/delete.py +++ b/suite/commands/pts/delete.py @@ -53,7 +53,6 @@ Delete a Protection Database entry def main(params): cell = params["cell"] - pt_conn = cell.open_pt_server(params) for name in params["nameorid"]: try: @@ -63,29 +62,21 @@ def main(params): # Convert the id to a name for message purposes - note that if # the entry does not exist, this will just stringify the ID for # us. - ret = kafs.PR_IDToName(pt_conn, [ uid ]) + ret = cell.call_pt_server(params, kafs.PR_IDToName, [ uid ]) name = ret.nlist[0].prname - verbose("Deleting user ", uid, " (", name, ")\n") - ret = kafs.PR_Delete(pt_conn, uid) else: verbose("Name ", name, "\n") - ret = kafs.PR_NameToID(pt_conn, [ name ]) + ret = cell.call_pt_server(params, kafs.PR_NameToID, [ name ]) uid = ret.ilist[0] if uid == kafs.PR_ANONYMOUSID and name != "anonymous": error("User or group doesn't exist so couldn't look up id for " + name + "\n") - else: - verbose("Deleting user ", uid, " (", name, ")\n") - ret = kafs.PR_Delete(pt_conn, uid) + if "force" not in params: + break + continue + + verbose("Deleting user ", uid, " (", name, ")\n") + ret = cell.call_pt_server(params, kafs.PR_Delete, uid) - except ConnectionRefusedError: - # Move on to the next server - verbose("Connection refused\n"); - pt_conn = cell.open_pt_server(params) - continue - except kafs.AbortUNOTSYNC: - verbose("Server is not synchronised\n"); - pt_conn = cell.open_pt_server(params) - continue except kafs.AbortPRNOENT: error("User or group doesn't exist deleting ", name, " (id ", uid, ")\n") if "force" not in params: diff --git a/suite/commands/pts/listentries.py b/suite/commands/pts/listentries.py index fb35ad6..7c04a8d 100644 --- a/suite/commands/pts/listentries.py +++ b/suite/commands/pts/listentries.py @@ -50,7 +50,6 @@ Display all users or groups in the Protection Database def main(params): cell = params["cell"] - pt_conn = cell.open_pt_server(params) if "users" in params and "groups" in params: flags = kafs.PRWANTUSERS | kafs.PRWANTGROUPS @@ -59,21 +58,8 @@ def main(params): else: flags = kafs.PRWANTUSERS - while True: - try: - ret = kafs.PR_ListEntries(pt_conn, flags, 0) + ret = cell.call_pt_server(params, kafs.PR_ListEntries, flags, 0) - output("Name ID Owner Creator\n") - for i in ret.entries: - outputf("{:24s} {:7d} {:7d} {:7d}\n", i.name, i.id, i.owner, i.creator) - - except ConnectionRefusedError: - # Move on to the next server - verbose("Connection refused\n"); - pt_conn = cell.open_pt_server(params) - continue - except kafs.AbortUNOTSYNC: - verbose("Server is not synchronised\n"); - pt_conn = cell.open_pt_server(params) - continue - break + output("Name ID Owner Creator\n") + for i in ret.entries: + outputf("{:24s} {:7d} {:7d} {:7d}\n", i.name, i.id, i.owner, i.creator) diff --git a/suite/commands/pts/listmax.py b/suite/commands/pts/listmax.py index 8660d8a..01c9e5e 100644 --- a/suite/commands/pts/listmax.py +++ b/suite/commands/pts/listmax.py @@ -48,20 +48,6 @@ Display the max user id and max group id counters def main(params): cell = params["cell"] - pt_conn = cell.open_pt_server(params) - while True: - try: - ret = kafs.PR_ListMax(pt_conn) - output("Max user id is ", ret.uid, " and max group id is ", ret.gid, ".\n") - - except ConnectionRefusedError: - # Move on to the next server - verbose("Connection refused\n"); - pt_conn = cell.open_pt_server(params) - continue - except kafs.AbortUNOTSYNC: - verbose("Server is not synchronised\n"); - pt_conn = cell.open_pt_server(params) - continue - break + ret = cell.call_pt_server(params, kafs.PR_ListMax) + output("Max user id is ", ret.uid, " and max group id is ", ret.gid, ".\n") diff --git a/suite/lib/cell.py b/suite/lib/cell.py index ca9d154..3e34621 100644 --- a/suite/lib/cell.py +++ b/suite/lib/cell.py @@ -51,7 +51,8 @@ class cell: self.__vlserver_names = dict() self.__vlservers = [] self.__vlconn = None - self.__ptservers = None + self.__ptserver_index = None + self.__ptconn = None def __repr__(self): return "<" + "AFS:" + self.__name + ">" @@ -213,13 +214,13 @@ class cell: # Open a Protection Server connection def open_pt_server(self, params=None): - if self.__ptservers == None: + if self.__ptserver_index == None: self.__ptservers = self.query_vl_addrs() + self.__ptserver_index = 0 - if len(self.__ptservers) == 0: + if self.__ptserver_index >= len(self.__ptservers): raise CellError("Couldn't connect to a PT server") - server = self.__ptservers[0] - self.__ptservers[0] = self.__ptservers[1:] + server = self.__ptservers[self.__ptserver_index] key, security = self.determine_security(params) @@ -230,3 +231,20 @@ class cell: kafs.PR_SERVICE, key, security) return pt_conn + + # Find and call out to a working protection server + def call_pt_server(self, params, rpc, *args): + while True: + if not self.__ptconn: + self.__ptconn = self.open_pt_server(params) + try: + return rpc(self.__ptconn, *args) + except ConnectionRefusedError: + # Move on to the next server + verbose("Connection refused\n"); + except kafs.AbortUNOTSYNC: + verbose("Server is not synchronised\n"); + except OSError as e: + verbose(e, "\n"); + self.__ptconn = None + self.__ptserver_index += 1