From f527f54eec41fe376aeec84fcf74927b8b10f154 Mon Sep 17 00:00:00 2001 From: David Howells Date: Tue, 8 Apr 2014 18:08:30 +0100 Subject: [PATCH] "vos listvldb -server xxx" takes a fileserver name, not a vlserver name "vos listvldb -server xxx" takes a fileserver name, not a vlserver name, so provide a class for that and change the argument list. Signed-off-by: David Howells --- suite/argparse.py | 12 ++----- suite/commands/vos/listvldb.py | 2 +- suite/lib/addrcache.py | 3 +- suite/lib/cell.py | 2 +- suite/lib/fileserver.py | 63 ++++++++++++++++++++++++++++++++++ suite/lib/vlserver.py | 28 +-------------- 6 files changed, 71 insertions(+), 39 deletions(-) create mode 100644 suite/lib/fileserver.py diff --git a/suite/argparse.py b/suite/argparse.py index f0ffcec..777b15f 100644 --- a/suite/argparse.py +++ b/suite/argparse.py @@ -17,9 +17,9 @@ def get_cell(switch, params): from afs.lib.cell import cell return cell(params[0]) -def get_vlserver(switch, params): - from afs.lib.vlserver import vlserver - return vlserver(params[0]) +def get_fileserver(switch, params): + from afs.lib.fileserver import fileserver + return fileserver(params[0]) def get_volume_name(switch, params): return params @@ -206,9 +206,3 @@ def parse_arguments(args, available_arguments): raise RuntimeError("Missing '-" + switch + "' argument") return result - - -#if len(sys.argv) < 2: -# raise RuntimeError("Need command name") -# -#print(parse_arguments(sys.argv[2:], fs_mkmount_arguments)) diff --git a/suite/commands/vos/listvldb.py b/suite/commands/vos/listvldb.py index 41aa96e..b0bb532 100644 --- a/suite/commands/vos/listvldb.py +++ b/suite/commands/vos/listvldb.py @@ -30,7 +30,7 @@ help = "Query the VLDB" command_arguments = [ [ "name", get_volume_name, "os", "" ], - [ "server", get_vlserver, "os", "" ], + [ "server", get_fileserver, "os", "" ], [ "partition", get_partition_id, "os", "" ], [ "locked", get_dummy, "fn" ], [ "quiet", get_dummy, "fn" ], diff --git a/suite/lib/addrcache.py b/suite/lib/addrcache.py index e83d318..d1e9919 100644 --- a/suite/lib/addrcache.py +++ b/suite/lib/addrcache.py @@ -55,12 +55,13 @@ def name2addr(name): except OSError: pass + name = name.lower().rstrip(".") if name in cache_n2a: return cache_n2a[name] try: for A in dns.resolver.query(name, 'A'): - addrcache.add(name, A.address) + add(name, A.address) except dns.resolver.NoAnswer: pass diff --git a/suite/lib/cell.py b/suite/lib/cell.py index 267c715..a721cec 100644 --- a/suite/lib/cell.py +++ b/suite/lib/cell.py @@ -58,7 +58,7 @@ class cell: return self.__name def add_server(self, dnstype, name): - n = str(name) + n = str(name).lower().rstrip(".") if n not in self.__vlserver_names: s = vlserver(n) self.__vlserver_names[n] = s diff --git a/suite/lib/fileserver.py b/suite/lib/fileserver.py new file mode 100644 index 0000000..2a7c6ee --- /dev/null +++ b/suite/lib/fileserver.py @@ -0,0 +1,63 @@ +# +# AFS Volume management toolkit: File server record +# -*- coding: utf-8 -*- +# + +__copyright__ = """ +Copyright (C) 2014 Red Hat, Inc. All Rights Reserved. +Written by David Howells (dhowells@redhat.com) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public Licence version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public Licence for more details. + +You should have received a copy of the GNU General Public Licence +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +""" + +from afs import exception +import afs.lib.addrcache as addrcache +from afs.lib.debug import debug +import dns.resolver + +class FileServerError(exception.AFSException): + """Error raised by L{fileserver} objects.""" + +class fileserver: + """Represents an AFS File server. We hold the server address here.""" + def __init__(self, name): + debug("New FileServer", name) + self.__name = name + self.__looked_up = False + + # We want to maintain the record order provided by the DNS to entry + # force rotation, so we don't want to use an unordered set here. + # + # Note that the addrs are stored as text strings of the form "a.b.c.d" + self.__addrs = [] + + def __repr__(self): + return "<" + "AFSFS:" + self.__name + ">" + + def __str__(self): + return self.__name + + def look_up_addresses(self): + self.__addrs = addrcache.name2addr(self.__name) + self.__looked_up = True + + def look_up(self): + if not self.__looked_up: + self.look_up_addresses() + if len(self.__addrs) == 0: + raise FileServerError("No FileServer addresses available") + return self.__addrs + + def addrs(self): + return self.look_up() diff --git a/suite/lib/vlserver.py b/suite/lib/vlserver.py index 9570fff..cf75631 100644 --- a/suite/lib/vlserver.py +++ b/suite/lib/vlserver.py @@ -50,33 +50,7 @@ class vlserver: return self.__name def look_up_addresses(self): - addr = False - - # Try parsing as a numeric IPv4 address - try: - addr = inet_pton(AF_INET, self.__name) - self.__addrs.append(self.__name) - except OSError: - pass - - # Try parsing as a numeric IPv6 address - if not addr: - try: - addr = inet_pton(AF_INET6, self.__name) - raise VLServerError("IPv6 is not currently supported") - except OSError: - pass - - # Try looking up in the DNS - if not addr: - try: - for A in dns.resolver.query(self.__name, 'A'): - if A.address not in self.__addrs: - self.__addrs.append(A.address) - addrcache.add(self.__name, A.address) - except dns.resolver.NoAnswer: - pass - + self.__addrs = addrcache.name2addr(self.__name) self.__looked_up = True def look_up(self): -- 2.49.0