Пример #1
0
    def search_groups(self, group_type, query_dict):
        group_dict = self.groups.get(group_type)
        if group_dict is None:
            return defer.fail(
                DirectoryException("Invalid or unsupported group type '%s'" %
                                   group_type))
        if len(set(query_dict.keys()) - set(['name', 'name_glob'])):
            raise DirectoryException("Unsupported query in search_groups")
        groups = None
        if query_dict.has_key('name'):
            name = query_dict['name']
            if group_dict.has_key(name):
                groups = [name]
            elif name in self.restricted_names and len(query_dict) == 1:
                return defer.succeed([name])
            else:
                groups = []

        if query_dict.has_key('name_glob'):
            regex_str = glob_to_regex(query_dict['name_glob'])
            regex = re.compile(regex_str)
            if groups == None:
                groups = group_dict.keys()
            filter_list(groups, lambda group: not regex.search(group))

        if groups == None:
            return defer.succeed(group_dict.keys())
        return defer.succeed(groups)
Пример #2
0
    def search_groups(self, group_type, query_dict):
        group_dict = self.groups.get(group_type)
        if group_dict is None:
            return defer.fail(DirectoryException(
                    "Invalid or unsupported group type '%s'" %group_type))
        if len(set(query_dict.keys()) - set(['name', 'name_glob'])):
            raise DirectoryException("Unsupported query in search_groups")
        groups = None
        if query_dict.has_key('name'):
            name = query_dict['name']
            if group_dict.has_key(name):
                groups = [name]
            elif name in self.restricted_names and len(query_dict) == 1:
                return defer.succeed([name])
            else:
                groups = []

        if query_dict.has_key('name_glob'):
            regex_str = glob_to_regex(query_dict['name_glob'])
            regex = re.compile(regex_str)
            if groups == None:
                groups = group_dict.keys()
            filter_list(groups, lambda group : not regex.search(group) )

        if groups == None:
            return defer.succeed(group_dict.keys())
        return defer.succeed(groups)
Пример #3
0
    def search_users(self, query):
        checked = 0
        users = None
        if query.has_key('name'):
            name = query['name']
            if self.users.has_key(name):
                users = [self.users[name]]
            elif name in self.restricted_names and len(query) == 1:
                return defer.succeed([name])
            else:
                users = []
            checked = checked + 1

        if query.has_key('name_glob'):
            regex_str = glob_to_regex(query['name_glob'])
            regex = re.compile(regex_str)
            if users == None:
                users = self.users.values()
            filter_list(users, lambda user: not regex.search(user.name))
            checked = checked + 1

        if checked != len(query):
            raise DirectoryException('Unsupported query parameters',
                                     DirectoryException.INVALID_QUERY)
        elif users == None:
            return defer.succeed(self.users.keys())
        return defer.succeed([user.name for user in users])
Пример #4
0
    def search_users(self, query):
        checked = 0
        users = None
        if query.has_key('name'):
            name = query['name']
            if self.users.has_key(name):
                users = [ self.users[name] ]
            elif name in self.restricted_names and len(query) == 1:
                return defer.succeed([name])
            else:
                users = []
            checked = checked + 1
        
        if query.has_key('name_glob'):
            regex_str = glob_to_regex(query['name_glob']) 
            regex = re.compile(regex_str)
            if users == None:
                users = self.users.values()
            filter_list(users, lambda user : not regex.search(user.name) ) 
            checked = checked + 1

        if checked != len(query):
            raise DirectoryException('Unsupported query parameters',
                    DirectoryException.INVALID_QUERY)
        elif users == None:
            return defer.succeed(self.users.keys())
        return defer.succeed([user.name for user in users])
Пример #5
0
    def search_locations(self, query):
        checked = 0
        locations = None
        if query.has_key('name'):
            name = query['name']
            if self.locations.has_key(name):
                locations = [self.locations[name]]
            elif name in self.restricted_names and len(query) == 1:
                return defer.succeed([name])
            else:
                locations = []
            checked = checked + 1

        if query.has_key('dpid'):
            dpid = query['dpid']
            if query.has_key('port'):
                key = dpid.as_host() + (query['port'] << 48)
                if self.location_bindings.has_key(key):
                    match = self.location_bindings[key]
                    if locations == None or match in locations:
                        locations = [match]
                    else:
                        locations = []
                else:
                    locations = []
                checked = checked + 1
            else:
                if locations == None:
                    locations = self.locations.values()
                filter_list(locations, lambda location: location.dpid != dpid)
            checked = checked + 1
        elif query.has_key('port'):
            port = query['port']
            if locations == None:
                locations = self.locations.values()
            filter_list(locations, lambda location: location.port != port)
            checked = checked + 1

        if query.has_key('name_glob'):
            regex_str = glob_to_regex(query['name_glob'])
            regex = re.compile(regex_str)
            if locations == None:
                locations = self.locations.values()
            filter_list(locations, lambda loc: not regex.search(loc.name))
            checked = checked + 1

        if checked != len(query):
            raise DirectoryException('Unsupported query parameters',
                                     DiretoryException.INVALID_QUERY)
        elif locations == None:
            return defer.succeed(self.locations.keys())
        return defer.succeed([location.name for location in locations])
Пример #6
0
    def search_locations(self, query):
        checked = 0
        locations = None
        if query.has_key('name'):
            name = query['name']
            if self.locations.has_key(name):
                locations = [ self.locations[name] ]
            elif name in self.restricted_names and len(query) == 1:
                return defer.succeed([name])
            else:
                locations = []
            checked = checked + 1

        if query.has_key('dpid'):
            dpid = query['dpid']
            if query.has_key('port'):
                key = dpid.as_host() + (query['port'] << 48)
                if self.location_bindings.has_key(key):
                    match = self.location_bindings[key]
                    if locations == None or match in locations:
                        locations = [ match ]
                    else:
                        locations = []
                else:
                    locations = []
                checked = checked + 1
            else:
                if locations == None:
                    locations = self.locations.values()
                filter_list(locations, lambda location : location.dpid != dpid)
            checked = checked + 1
        elif query.has_key('port'):
            port = query['port']
            if locations == None:
                locations = self.locations.values()
            filter_list(locations, lambda location : location.port != port)
            checked = checked + 1
        
        if query.has_key('name_glob'):
            regex_str = glob_to_regex(query['name_glob']) 
            regex = re.compile(regex_str)
            if locations == None:
                locations = self.locations.values()
            filter_list(locations, lambda loc : not regex.search(loc.name) )
            checked = checked + 1
            
        if checked != len(query):
            raise DirectoryException('Unsupported query parameters',
                    DiretoryException.INVALID_QUERY)
        elif locations == None:
            return defer.succeed(self.locations.keys())
        return defer.succeed([location.name for location in locations])
Пример #7
0
   def query_bs_cb(res, dirname):
      # the binding storage query was not over names, so we have
      # to filter them manually
      if "name" in flat_args:
        name = flat_args["name"]
        filter_list(res,lambda n: demangle_name(n)[1] != name)
      if "name_glob" in flat_args:
        regex_str = glob_to_regex(flat_args['name_glob'])
        regex = re.compile(regex_str)
        filter_list(res, lambda n : not regex.search(demangle_name(n)[1]) )

      if dirname is not None:
        filter_list(res, lambda n: demangle_name(n)[0] != dirname)
       
      bs_set.update(res)
Пример #8
0
    def search_switches(self, query):
        checked = 0
        switches = None
        if query.has_key('name'):
            name = query['name']
            if self.switches.has_key(name):
                switches = [self.switches[name]]
            # FIXME
            elif name in self.restricted_names and len(query) == 1:
                return defer.succeed([name])
            else:
                switches = []
            checked = checked + 1

        if query.has_key('dpid'):
            dpid = query['dpid']
            if switches == None:
                key = dpid.as_host()
                if self.switch_bindings.has_key(key):
                    switches = [self.switch_bindings[key]]
                else:
                    switches = []
            else:
                filter_list(switches, lambda switch: switch.dpid != dpid)
            checked = checked + 1

        if query.has_key('name_glob'):
            regex_str = glob_to_regex(query['name_glob'])
            regex = re.compile(regex_str)
            if switches == None:
                switches = self.switches.values()
            filter_list(switches, lambda sw: not regex.search(sw.name))
            checked = checked + 1

        if checked != len(query):
            raise DirectoryException('Unsupported query parameters',
                                     DirectoryException.INVALID_QUERY)
        elif switches == None:
            return defer.succeed(self.switches.keys())
        return defer.succeed([switch.name for switch in switches])
Пример #9
0
    def search_switches(self, query):
        checked = 0
        switches = None
        if query.has_key('name'):
            name = query['name']
            if self.switches.has_key(name):
                switches = [ self.switches[name] ]
            # FIXME
            elif name in self.restricted_names and len(query) == 1:
                return defer.succeed([name])
            else:
                switches = []
            checked = checked + 1

        if query.has_key('dpid'):
            dpid = query['dpid']
            if switches == None:
                key = dpid.as_host()
                if self.switch_bindings.has_key(key):
                    switches = [ self.switch_bindings[key] ]
                else:
                    switches = []
            else:
                filter_list(switches, lambda switch : switch.dpid != dpid)
            checked = checked + 1
        
        if query.has_key('name_glob'):
            regex_str = glob_to_regex(query['name_glob'])
            regex = re.compile(regex_str)
            if switches == None:
                switches = self.switches.values()
            filter_list(switches, lambda sw : not regex.search(sw.name) )
            checked = checked + 1
            
        if checked != len(query):
            raise DirectoryException('Unsupported query parameters',
                    DirectoryException.INVALID_QUERY)
        elif switches == None:
            return defer.succeed(self.switches.keys())
        return defer.succeed([switch.name for switch in switches])
Пример #10
0
def filter_item_list(item_list, attr_list, args): 
  live_attrs = [] 
  regex_map = {} 
  for attr in attr_list:
    if attr in args:
        live_attrs.append(attr)
        r = re.compile(glob_to_regex(args[attr][-1]),re.IGNORECASE)
        regex_map[attr] = r

  if len(live_attrs) == 0: 
    return item_list # nothing to filter

  new_item_list = [] 
  for item in item_list: 
    matches = True
    for a in live_attrs:
      r = regex_map[a]
      if not r.match(item[a]):
        matches = False
        break
    if matches: 
      new_item_list.append(item) 
        
  return new_item_list
Пример #11
0
def filter_item_list(item_list, attr_list, args):
    live_attrs = []
    regex_map = {}
    for attr in attr_list:
        if attr in args:
            live_attrs.append(attr)
            r = re.compile(glob_to_regex(args[attr][-1]), re.IGNORECASE)
            regex_map[attr] = r

    if len(live_attrs) == 0:
        return item_list  # nothing to filter

    new_item_list = []
    for item in item_list:
        matches = True
        for a in live_attrs:
            r = regex_map[a]
            if not r.match(item[a]):
                matches = False
                break
        if matches:
            new_item_list.append(item)

    return new_item_list
Пример #12
0
    def search_hosts(self, query):
        checked = 0
        hosts = None
        if query.has_key('name'):
            name = query['name']
            if self.hosts.has_key(name):
                hosts = [self.hosts[name]]
            elif name in self.restricted_names and len(query) == 1:
                return defer.succeed([name])
            else:
                hosts = []
            checked = checked + 1

        if query.has_key('dpid'):
            dpid = query['dpid']
            if query.has_key('port'):
                key = dpid.as_host() + (query['port'] << 48)
                if self.host_loc_bindings.has_key(key):
                    match = self.host_loc_bindings[key]
                    if hosts == None or match in hosts:
                        hosts = [match]
                    else:
                        hosts = []
                else:
                    hosts = []
                checked = checked + 1
            else:
                if hosts == None:
                    hosts = self.hosts.values()
                filter_list(
                    hosts,
                    self.host_netinfo_nomatch(lambda info: info.dpid == dpid))
            checked = checked + 1
        elif query.has_key('port'):
            port = query['port']
            if hosts == None:
                hosts = self.hosts.values()
            filter_list(
                hosts,
                self.host_netinfo_nomatch(lambda info: info.port == port))
            checked = checked + 1

        if query.has_key('dladdr'):
            dladdr = query['dladdr'].hb_long()
            if self.host_dl_bindings.has_key(dladdr):
                match = self.host_dl_bindings[dladdr]
                if hosts == None or match in hosts:
                    hosts = [match]
                else:
                    hosts = []
            else:
                hosts = []
            checked = checked + 1

        if query.has_key('nwaddr'):
            nwaddr = query['nwaddr']
            if self.host_nw_bindings.has_key(nwaddr):
                match = self.host_nw_bindings[nwaddr]
                if hosts == None or match in hosts:
                    hosts = [match]
                else:
                    hosts = []
            else:
                hosts = []
            checked = checked + 1

        if query.has_key('is_gateway'):
            is_gway = query['is_gateway']
            if hosts == None:
                hosts = self.hosts.values()
            filter_list(
                hosts,
                self.host_netinfo_nomatch(
                    lambda info: info.is_gateway == is_gway))
            checked = checked + 1

        if query.has_key('is_router'):
            is_rter = query['is_router']
            if hosts == None:
                hosts = self.hosts.values()
            filter_list(
                hosts,
                self.host_netinfo_nomatch(
                    lambda info: info.is_router == is_rter))
            checked = checked + 1

        if query.has_key('alias'):
            alias = query['alias']
            if hosts == None:
                hosts = self.hosts.values()
            filter_list(hosts, lambda host: alias not in host.aliases)
            checked = checked + 1

        if query.has_key('name_glob'):
            regex_str = glob_to_regex(query['name_glob'])
            regex = re.compile(regex_str)
            if hosts == None:
                hosts = self.hosts.values()
            filter_list(hosts, lambda host: not regex.search(host.name))
            checked = checked + 1

        if checked != len(query):
            raise DirectoryException('Unsupported query parameters',
                                     DirectoryException.INVALID_QUERY)
        elif hosts == None:
            return defer.succeed(self.hosts.keys())
        return defer.succeed([host.name for host in hosts])
Пример #13
0
    def search_hosts(self, query):
        checked = 0
        hosts = None
        if query.has_key('name'):
            name = query['name']
            if self.hosts.has_key(name):
                hosts = [ self.hosts[name] ]
            elif name in self.restricted_names and len(query) == 1:
                return defer.succeed([name])
            else:
                hosts = []
            checked = checked + 1
        
        if query.has_key('dpid'):
            dpid = query['dpid']
            if query.has_key('port'):
                key = dpid.as_host() + (query['port'] << 48)
                if self.host_loc_bindings.has_key(key):
                    match = self.host_loc_bindings[key]
                    if hosts == None or match in hosts:
                        hosts = [ match ]
                    else:
                        hosts = []
                else:
                    hosts = []
                checked = checked + 1
            else:
                if hosts == None:
                    hosts = self.hosts.values()
                filter_list(hosts, self.host_netinfo_nomatch(lambda info : info.dpid == dpid))
            checked = checked + 1
        elif query.has_key('port'):
            port = query['port']
            if hosts == None:
                hosts = self.hosts.values()
            filter_list(hosts, self.host_netinfo_nomatch(lambda info : info.port == port))
            checked = checked + 1

        if query.has_key('dladdr'):
            dladdr = query['dladdr'].hb_long()
            if self.host_dl_bindings.has_key(dladdr):
                match = self.host_dl_bindings[dladdr]
                if hosts == None or match in hosts:
                    hosts = [ match ]
                else:
                    hosts = []
            else:
                hosts = []
            checked = checked + 1
            
        if query.has_key('nwaddr'):
            nwaddr = query['nwaddr']
            if self.host_nw_bindings.has_key(nwaddr):
                match = self.host_nw_bindings[nwaddr]
                if hosts == None or match in hosts:
                    hosts = [ match ]
                else:
                    hosts = []
            else:
                hosts = []
            checked = checked + 1

        if query.has_key('is_gateway'):
            is_gway = query['is_gateway']
            if hosts == None:
                hosts = self.hosts.values()
            filter_list(hosts, self.host_netinfo_nomatch(
                    lambda info : info.is_gateway == is_gway))
            checked = checked + 1

        if query.has_key('is_router'):
            is_rter = query['is_router']
            if hosts == None:
                hosts = self.hosts.values()
            filter_list(hosts, self.host_netinfo_nomatch(
                    lambda info : info.is_router == is_rter))
            checked = checked + 1

        if query.has_key('alias'):
            alias = query['alias']
            if hosts == None:
                hosts = self.hosts.values()
            filter_list(hosts, lambda host : alias not in host.aliases)
            checked = checked + 1
        
        if query.has_key('name_glob'):
            regex_str = glob_to_regex(query['name_glob'])
            regex = re.compile(regex_str)
            if hosts == None:
                hosts = self.hosts.values()
            filter_list(hosts, lambda host : not regex.search(host.name) )
            checked = checked + 1

        if checked != len(query):
            raise DirectoryException('Unsupported query parameters',
                    DirectoryException.INVALID_QUERY)
        elif hosts == None:
            return defer.succeed(self.hosts.keys())
        return defer.succeed([host.name for host in hosts])