def netmask(self): if self._values['netmask'] is None: return None try: result = int(self._values['netmask']) # CIDRs between 0 and 128 are allowed if 0 <= result <= 128: return result else: raise F5ModuleError( "The provided netmask must be between 0 and 32 for IPv4, or " "0 and 128 for IPv6." ) except ValueError: # not a number, but that's ok. Further processing necessary pass if not is_valid_ip(self._values['netmask']): raise F5ModuleError( 'The provided netmask {0} is neither in IP or CIDR format'.format(result) ) # Create a temporary address to check if the netmask IP is v4 or v6 addr = ip_address(u'{0}'.format(str(self._values['netmask']))) if addr.version == 4: # Create a more real v4 address using a wildcard, so that we can determine # the CIDR value from it. ip = ip_network(u'0.0.0.0/%s' % str(self._values['netmask'])) result = ip.prefixlen else: result = ipv6_netmask_to_cidr(self._values['netmask']) return result
def update(self): self.have = self.read_current_from_device() if not self.should_update(): return False if self.want.reverse == 'enabled': if not self.want.receive and not self.have.receive: raise F5ModuleError( "A 'receive' string must be specified when setting 'reverse'." ) if self.want.time_until_up != 0 and self.have.time_until_up != 0: raise F5ModuleError( "Monitors with the 'reverse' attribute are not currently compatible with 'time_until_up'." ) if self._address_type_matches_query_type('a', validate_ip_v6_address): raise F5ModuleError( "Monitor has a IPv6 address. Only a 'query_type' of 'aaaa' is supported for IPv6." ) elif self._address_type_matches_query_type('aaaa', validate_ip_address): raise F5ModuleError( "Monitor has a IPv4 address. Only a 'query_type' of 'a' is supported for IPv4." ) if self.want.accept_rcode == 'anything': if self.want.receive is not None and is_valid_ip(self.want.receive) and self.have.receive is not None: raise F5ModuleError( "No 'receive' string may be specified, or exist, when 'accept_rcode' is 'anything'." ) elif self.want.receive is None and self.have.receive is not None: self.want.update({'receive': ''}) if self.module.check_mode: return True self.update_on_device() return True
def create(self): self._set_changed_options() if self.want.traffic_group is None: self.want.update({'traffic_group': '/Common/traffic-group-1'}) if self.want.arp is None: self.want.update({'arp': True}) if self.want.spanning is None: self.want.update({'spanning': False}) if self.want.netmask is None: if is_valid_ip(self.want.address, type='ipv4'): self.want.update({'netmask': '255.255.255.255'}) else: self.want.update({'netmask': 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'}) if self.want.arp and self.want.spanning: raise F5ModuleError( "'arp' and 'spanning' cannot both be enabled on virtual address." ) if self.module.check_mode: return True self.create_on_device() if self.exists(): return True else: raise F5ModuleError("Failed to create the virtual address")
def default_device_reference(self): if is_valid_ip(self.service_environment): # An IP address was specified filter = "address+eq+'{0}'".format(self.service_environment) else: # Assume a hostname was specified filter = "hostname+eq+'{0}'".format(self.service_environment) uri = "https://{0}:{1}/mgmt/shared/resolver/device-groups/cm-adccore-allbigipDevices/devices/?$filter={2}&$top=1&$select=selfLink".format( self.client.provider['server'], self.client.provider['server_port'], filter ) resp = self.client.api.get(uri) try: response = resp.json() except ValueError as ex: raise F5ModuleError(str(ex)) if resp.status == 200 and response['totalItems'] == 0: raise F5ModuleError( "The specified service_environment '{0}' was found.".format(self.service_environment) ) elif 'code' in response and response['code'] == 400: if 'message' in response: raise F5ModuleError(response['message']) else: raise F5ModuleError(resp._content) result = dict( link=response['items'][0]['selfLink'] ) return result
def peer_server(self): if self._values['peer_server'] is None: return None if is_valid_ip(self._values['peer_server']): return self._values['peer_server'] raise F5ModuleError( "The provided 'peer_server' parameter is not an IP address." )
def remote_host(self): if is_valid_ip(self._values['remote_host']): return self._values['remote_host'] elif is_valid_hostname(self._values['remote_host']): return str(self._values['remote_host']) raise F5ModuleError( "The provided 'remote_host' is not a valid IP or hostname" )
def _format_member_address(self, member): if is_valid_ip(member): address = '/{0}/{1}'.format(self.partition, member) return address else: raise F5ModuleError( 'The provided member address is not a valid IP address' )
def address(self): if self._values['address'] is None: return None if is_valid_ip(self._values['address']): return compress_address(self._values['address']) else: raise F5ModuleError( "The provided 'address' is not a valid IP address" )
def netmask(self): if self._values['netmask'] is None: return None if is_valid_ip(self._values['netmask']): return self._values['netmask'] else: raise F5ModuleError( "The provided 'netmask' is not a valid IP address" )
def address(self): if self._values['address'] is None: return None if is_valid_ip(self._values['address']): ip = str(ip_address(u'{0}'.format(self._values['address']))) return ip raise F5ModuleError( "Specified 'address' is not an IP address." )
def gateway(self): if self._values['gateway'] is None: return None if is_valid_ip(self._values['gateway']): return self._values['gateway'] else: raise F5ModuleError( "The 'gateway' must an IP address." )
def ip(self): if self._values['address'] is None: return None if is_valid_ip(self._values['address']): return self._values['address'] else: raise F5ModuleError( 'The provided address is not a valid IP address' )
def local_ip(self): if self._values['local_ip'] in [None, 'none']: return None if is_valid_ip(self._values['local_ip']): return self._values['local_ip'] else: raise F5ModuleError( "The provided 'local_ip' is not a valid IP address" )
def _validate_unicast_failover_address(self, address): if address != 'management-ip': if is_valid_ip(address): return address else: raise F5ModuleError( "'address' field in unicast failover is not a valid IP address" ) else: return address
def receive(self): if self._values['receive'] is None: return None if self._values['receive'] == '': return '' if is_valid_ip(self._values['receive']): return self._values['receive'] raise F5ModuleError( "The specified 'receive' parameter must be either an IPv4 or v6 address." )
def ip(self): if self._values['ip'] is None: return None elif self._values['ip'] in ['*', '0.0.0.0']: return '*' elif is_valid_ip(self._values['ip']): return self._values['ip'] raise F5ModuleError( "The provided 'ip' parameter is not an IP address." )
def ip(self): # lgtm [py/similar-function] if self._values['ip'] is None: return None if self._values['ip'] in ['*', '0.0.0.0']: return '*' elif is_valid_ip(self._values['ip']): return self._values['ip'] else: raise F5ModuleError( "The provided 'ip' parameter is not an IP address." )
def mgmt_route(self): if self._values['mgmt_route'] is None: return None elif self._values['mgmt_route'] == 'none': return 'none' if is_valid_ip(self._values['mgmt_route']): return self._values['mgmt_route'] else: raise F5ModuleError( "The specified 'mgmt_route' is not a valid IP address" )
def address(self): if self._values['destination'].count(':') >= 2: # IPv6 parts = self._values['destination'].split('.') else: # IPv4 parts = self._values['destination'].split(':') if is_valid_ip(parts[0]): return str(parts[0]) raise F5ModuleError( "'address' parameter from API was not an IP address." )
def fallback_ip(self): if self._values['fallback_ip'] is None: return None if self._values['fallback_ip'] == 'any': return 'any' if self._values['fallback_ip'] == 'any6': return 'any6' if is_valid_ip(self._values['fallback_ip']): return self._values['fallback_ip'] else: raise F5ModuleError( 'The provided fallback address is not a valid IPv4 address' )
def local_host_name(self): if self._values['local_host_name'] is None: return None if is_valid_ip(self._values['local_host_name']): return self._values['local_host_name'] elif is_valid_hostname(self._values['local_host_name']): # else fallback to checking reasonably well formatted hostnames return str(self._values['local_host_name']) raise F5ModuleError( "The provided 'local_host_name' value {0} is not a valid IP or hostname".format( str(self._values['local_host_name']) ) )
def source_mask(self): if self._values['source_mask'] is None: return None elif self._values['source_mask'] == 'any': return 0 try: int(self._values['source_mask']) raise F5ModuleError( "'source_mask' must not be in CIDR format." ) except ValueError: pass if is_valid_ip(self._values['source_mask']): return self._values['source_mask']
def addresses(self): if self._values['addresses'] is None: return None result = [] for x in self._values['addresses']: if is_valid_ip(x): result.append(str(ip_address(u'{0}'.format(x)))) elif is_valid_ip_interface(x): result.append(str(ip_interface(u'{0}'.format(x)))) else: raise F5ModuleError( "Address {0} must be either an IPv4 or IPv6 address or network.".format(x) ) result = sorted(result) return result
def netmask(self): if self.want.netmask is None: return None ip = self.have.ip if is_valid_ip(ip): if self.want.route_domain is not None: want = "{0}%{1}/{2}".format(ip, self.want.route_domain, self.want.netmask) have = "{0}%{1}/{2}".format(ip, self.want.route_domain, self.have.netmask) elif self.have.route_domain is not None: want = "{0}%{1}/{2}".format(ip, self.have.route_domain, self.want.netmask) have = "{0}%{1}/{2}".format(ip, self.have.route_domain, self.have.netmask) else: want = "{0}/{1}".format(ip, self.want.netmask) have = "{0}/{1}".format(ip, self.have.netmask) if want != have: return want else: raise F5ModuleError( 'The provided address/netmask value "{0}" was invalid'.format(self.have.ip) )
def netmask(self): if self._values['netmask'] is None: return None result = -1 try: result = int(self._values['netmask']) if 0 < result < 256: pass except ValueError: if is_valid_ip(self._values['netmask']): addr = ip_address(u'{0}'.format(str(self._values['netmask']))) if addr.version == 4: ip = ip_network(u'0.0.0.0/%s' % str(self._values['netmask'])) result = ip.prefixlen else: result = ipv6_netmask_to_cidr(self._values['netmask']) if result < 0: raise F5ModuleError( 'The provided netmask {0} is neither in IP or CIDR format'.format(result) ) return result
def create(self): self._set_changed_options() if self.want.reverse == 'enabled': if self.want.time_until_up != 0: raise F5ModuleError( "Monitors with the 'reverse' attribute are not currently compatible with 'time_until_up'." ) if not self.want.receive: raise F5ModuleError( "A 'receive' string must be specified when setting 'reverse'." ) if self.want.receive is not None and validate_ip_v6_address(self.want.receive) and self.want.query_type == 'a': raise F5ModuleError( "Monitor has a IPv6 address. Only a 'query_type' of 'aaaa' is supported for IPv6." ) elif self.want.receive is not None and validate_ip_address(self.want.receive) and self.want.query_type == 'aaaa': raise F5ModuleError( "Monitor has a IPv4 address. Only a 'query_type' of 'a' is supported for IPv4." ) if self.want.accept_rcode == 'anything': if self.want.receive is not None and is_valid_ip(self.want.receive): raise F5ModuleError( "No 'receive' string may be specified, or exist, when 'accept_rcode' is 'anything'." ) elif self.want.receive is None: self.want.update({'receive': ''}) if self.want.query_name is None: raise F5ModuleError( "'query_name' is required when creating a new DNS monitor." ) if self.module.check_mode: return True self.create_on_device() return True
def _get_validated_ip_address(self, address): if is_valid_ip(self._values[address]): return self._values[address] raise F5ModuleError( "The specified '{0}' is not a valid IP address".format(address) )
def device_is_address(self): if is_valid_ip(self.device): return True return False
def device_address(self): if is_valid_ip(self._values['device_address']): return self._values['device_address'] raise F5ModuleError( 'Provided device address: {0} is not a valid IP.'.format(self._values['device_address']) )