def add(self, entries=None, force=False): """ Add instances of HostsEntry to the instance of Hosts. :param entries: A list of instances of HostsEntry :param force: Remove matching before adding :return: The counts of successes and failures """ ipv4_count = 0 ipv6_count = 0 invalid_count = 0 duplicate_count = 0 replaced_count = 0 import_entries = [] existing_addresses = [x.address for x in self.entries if x.address] existing_names = [] for item in self.entries: if item.names: existing_names.extend(item.names) existing_names = dedupe_list(existing_names) for entry in entries: if entry.address in ('0.0.0.0', '127.0.0.1'): if set(entry.names).intersection(existing_names): if force: self.remove_all_matching(name=entry.names) import_entries.append(entry) else: duplicate_count += 1 else: import_entries.append(entry) elif entry.address in existing_addresses: if not force: duplicate_count += 1 elif force: self.remove_all_matching(address=entry.address) replaced_count += 1 import_entries.append(entry) elif set(entry.names).intersection(existing_names): if not force: duplicate_count += 1 else: self.remove_all_matching(name=entry.names) replaced_count += 1 import_entries.append(entry) else: import_entries.append(entry) for item in import_entries: if item.entry_type == 'ipv4': ipv4_count += 1 self.entries.append(item) elif item.entry_type == 'ipv6': ipv6_count += 1 self.entries.append(item) return { 'ipv4_count': ipv4_count, 'ipv6_count': ipv6_count, 'invalid_count': invalid_count, 'duplicate_count': duplicate_count, 'replaced_count': replaced_count }
def add(self, entries=None, force=False): """ Add instances of HostsEntry to the instance of Hosts. :param entries: A list of instances of HostsEntry :return: The counts of successes and failures """ ipv4_count = 0 ipv6_count = 0 invalid_count = 0 duplicate_count = 0 replaced_count = 0 import_entries = [] existing_addresses = [x.address for x in self.entries if x.address] existing_names = [] for item in self.entries: if item.names: existing_names.extend(item.names) existing_names = dedupe_list(existing_names) for entry in entries: if entry.address in ('0.0.0.0', '127.0.0.1'): if set(entry.names).intersection(existing_names): if force: self.remove_all_matching(name=entry.names) import_entries.append(entry) else: duplicate_count += 1 else: import_entries.append(entry) elif entry.address in existing_addresses: if not force: duplicate_count += 1 elif force: self.remove_all_matching(address=entry.address) replaced_count += 1 import_entries.append(entry) elif set(entry.names).intersection(existing_names): if not force: duplicate_count += 1 else: self.remove_all_matching(name=entry.names) replaced_count += 1 import_entries.append(entry) else: import_entries.append(entry) for item in import_entries: if item.entry_type == 'ipv4': ipv4_count += 1 self.entries.append(item) elif item.entry_type == 'ipv6': ipv6_count += 1 self.entries.append(item) return {'ipv4_count': ipv4_count, 'ipv6_count': ipv6_count, 'invalid_count': invalid_count, 'duplicate_count': duplicate_count, 'replaced_count': replaced_count}
def get_hosts(container: Container) -> List[str]: container_hosts = [container.name] expose_hosts = get_env(container, 'EXPOSE_HOSTS') if expose_hosts: container_hosts.extend( [host for host in expose_hosts.split("\n") if host]) from python_hosts import utils container_hosts = utils.dedupe_list(container_hosts) return container_hosts
def add(self, entries=None, force=False, allow_address_duplication=False, merge_names=False): """ Add instances of HostsEntry to the instance of Hosts. :param entries: A list of instances of HostsEntry :param force: Remove matching before adding :param allow_address_duplication: Allow using multiple entries for same address :param merge_names: Merge names where address already exists :return: The counts of successes and failures """ ipv4_count = 0 ipv6_count = 0 comment_count = 0 invalid_count = 0 duplicate_count = 0 replaced_count = 0 import_entries = [] existing_addresses = [x.address for x in self.entries if x.address] existing_names = [] for item in self.entries: if item.names: existing_names.extend(item.names) existing_names = dedupe_list(existing_names) for entry in entries: if entry.entry_type == 'comment': entry.comment = entry.comment.strip() if entry.comment[0] != "#": entry.comment = "# " + entry.comment import_entries.append(entry) elif entry.address in ('0.0.0.0', '127.0.0.1') or allow_address_duplication: # Allow duplicates entries for addresses used for adblocking if set(entry.names).intersection(existing_names): if force: for name in entry.names: self.remove_all_matching(name=name) import_entries.append(entry) else: duplicate_count += 1 else: import_entries.append(entry) elif entry.address in existing_addresses: if not any((force, merge_names)): duplicate_count += 1 elif merge_names: # get the last entry with matching address entry_names = list() for existing_entry in self.entries: if entry.address == existing_entry.address: entry_names = existing_entry.names break # merge names with that entry merged_names = list(set(entry.names + entry_names)) # remove all matching self.remove_all_matching(address=entry.address) # append merged entry entry.names = merged_names import_entries.append(entry) elif force: self.remove_all_matching(address=entry.address) replaced_count += 1 import_entries.append(entry) elif set(entry.names).intersection(existing_names): if not force: duplicate_count += 1 else: for name in entry.names: self.remove_all_matching(name=name) replaced_count += 1 import_entries.append(entry) else: import_entries.append(entry) for item in import_entries: if item.entry_type == 'comment': comment_count += 1 self.entries.append(item) elif item.entry_type == 'ipv4': ipv4_count += 1 self.entries.append(item) elif item.entry_type == 'ipv6': ipv6_count += 1 self.entries.append(item) return { 'comment_count': comment_count, 'ipv4_count': ipv4_count, 'ipv6_count': ipv6_count, 'invalid_count': invalid_count, 'duplicate_count': duplicate_count, 'replaced_count': replaced_count }