def test_validate_and_normalize_ip(self): ipv4 = "10.0.0.1" self.assertEqual(ipv4, validate_and_normalize_ip(ipv4)) ipv6 = "fe80::204:61ff:fe9d:f156" self.assertEqual(ipv6, validate_and_normalize_ip(ipv6.upper())) hostname = "test.test.com" self.assertRaises(ValueError, validate_and_normalize_ip, hostname) hostname = "$blah#" self.assertRaises(ValueError, validate_and_normalize_ip, hostname)
def _parse_address(rest): if rest.startswith('['): # remove first [] for ip rest = rest.replace('[', '', 1).replace(']', '', 1) pos = 0 while (pos < len(rest) and not (rest[pos] == 'R' or rest[pos] == '/')): pos += 1 address = rest[:pos] rest = rest[pos:] port_start = address.rfind(':') if port_start == -1: raise ValueError('Invalid port in add value') ip = address[:port_start] try: port = int(address[(port_start + 1):]) except (TypeError, ValueError): raise ValueError( 'Invalid port %s in add value' % address[port_start:]) # if this is an ipv6 address then we want to convert it # to all lowercase and use its fully expanded representation # to make searches easier ip = validate_and_normalize_ip(ip) return (ip, port, rest)
def _parse_address(rest): if rest.startswith('['): # remove first [] for ip rest = rest.replace('[', '', 1).replace(']', '', 1) pos = 0 while (pos < len(rest) and not (rest[pos] == 'R' or rest[pos] == '/')): pos += 1 address = rest[:pos] rest = rest[pos:] port_start = address.rfind(':') if port_start == -1: raise ValueError('Invalid port in add value') ip = address[:port_start] try: port = int(address[(port_start + 1):]) except (TypeError, ValueError): raise ValueError('Invalid port %s in add value' % address[port_start:]) # if this is an ipv6 address then we want to convert it # to all lowercase and use its fully expanded representation # to make searches easier ip = validate_and_normalize_ip(ip) return (ip, port, rest)
def calculate_change_value(change_value, change, v_name, v_name_port): ip = '' if change_value and change_value[0].isdigit(): i = 1 while (i < len(change_value) and change_value[i] in '0123456789.'): i += 1 ip = change_value[:i] change_value = change_value[i:] elif change_value and change_value.startswith('['): i = 1 while i < len(change_value) and change_value[i] != ']': i += 1 i += 1 ip = change_value[:i].lstrip('[').rstrip(']') change_value = change_value[i:] if ip: change[v_name] = validate_and_normalize_ip(ip) if change_value.startswith(':'): i = 1 while i < len(change_value) and change_value[i].isdigit(): i += 1 change[v_name_port] = int(change_value[1:i]) change_value = change_value[i:] return change_value
def calculate_change_value(change_value, change, v_name, v_name_port): ip = "" if change_value and change_value[0].isdigit(): i = 1 while i < len(change_value) and change_value[i] in "0123456789.": i += 1 ip = change_value[:i] change_value = change_value[i:] elif change_value and change_value.startswith("["): i = 1 while i < len(change_value) and change_value[i] != "]": i += 1 i += 1 ip = change_value[:i].lstrip("[").rstrip("]") change_value = change_value[i:] if ip: change[v_name] = validate_and_normalize_ip(ip) if change_value.startswith(":"): i = 1 while i < len(change_value) and change_value[i].isdigit(): i += 1 change[v_name_port] = int(change_value[1:i]) change_value = change_value[i:] return change_value
def _parse_set_info_values(argvish): new_cmd_format, opts, args = validate_args(argvish) # We'll either parse the all-in-one-string format or the # --options format, # but not both. If both are specified, raise an error. if not new_cmd_format: if len(args) % 2 != 0: print(Commands.search.__doc__.strip()) exit(EXIT_ERROR) searches_and_changes = izip(islice(argvish, 0, len(argvish), 2), islice(argvish, 1, len(argvish), 2)) for search_value, change_value in searches_and_changes: devs = builder.search_devs(parse_search_value(search_value)) change = {} ip = '' if change_value and change_value[0].isdigit(): i = 1 while (i < len(change_value) and change_value[i] in '0123456789.'): i += 1 ip = change_value[:i] change_value = change_value[i:] elif change_value and change_value.startswith('['): i = 1 while i < len(change_value) and change_value[i] != ']': i += 1 i += 1 ip = change_value[:i].lstrip('[').rstrip(']') change_value = change_value[i:] if ip: change['ip'] = validate_and_normalize_ip(ip) if change_value.startswith(':'): i = 1 while i < len(change_value) and change_value[i].isdigit(): i += 1 change['port'] = int(change_value[1:i]) change_value = change_value[i:] if change_value.startswith('R'): change_value = change_value[1:] replication_ip = '' if change_value and change_value[0].isdigit(): i = 1 while (i < len(change_value) and change_value[i] in '0123456789.'): i += 1 replication_ip = change_value[:i] change_value = change_value[i:] elif change_value and change_value.startswith('['): i = 1 while i < len(change_value) and change_value[i] != ']': i += 1 i += 1 replication_ip = \ change_value[:i].lstrip('[').rstrip(']') change_value = change_value[i:] if replication_ip: change['replication_ip'] = \ validate_and_normalize_ip(replication_ip) if change_value.startswith(':'): i = 1 while i < len(change_value) and change_value[i].isdigit(): i += 1 change['replication_port'] = int(change_value[1:i]) change_value = change_value[i:] if change_value.startswith('/'): i = 1 while i < len(change_value) and change_value[i] != '_': i += 1 change['device'] = change_value[1:i] change_value = change_value[i:] if change_value.startswith('_'): change['meta'] = change_value[1:] change_value = '' if change_value or not change: raise ValueError('Invalid set info change value: %s' % repr(argvish[1])) _set_info_values(devs, change) else: devs = builder.search_devs(parse_search_values_from_opts(opts)) change = parse_change_values_from_opts(opts) _set_info_values(devs, change)
def _parse_set_info_values(argvish): new_cmd_format, opts, args = validate_args(argvish) # We'll either parse the all-in-one-string format or the # --options format, # but not both. If both are specified, raise an error. if not new_cmd_format: if len(args) % 2 != 0: print(Commands.search.__doc__.strip()) exit(EXIT_ERROR) searches_and_changes = izip(islice(argvish, 0, len(argvish), 2), islice(argvish, 1, len(argvish), 2)) for search_value, change_value in searches_and_changes: devs = builder.search_devs(parse_search_value(search_value)) change = {} ip = '' if len(change_value) and change_value[0].isdigit(): i = 1 while (i < len(change_value) and change_value[i] in '0123456789.'): i += 1 ip = change_value[:i] change_value = change_value[i:] elif len(change_value) and change_value[0] == '[': i = 1 while i < len(change_value) and change_value[i] != ']': i += 1 i += 1 ip = change_value[:i].lstrip('[').rstrip(']') change_value = change_value[i:] if ip: change['ip'] = validate_and_normalize_ip(ip) if change_value.startswith(':'): i = 1 while i < len(change_value) and change_value[i].isdigit(): i += 1 change['port'] = int(change_value[1:i]) change_value = change_value[i:] if change_value.startswith('R'): change_value = change_value[1:] replication_ip = '' if len(change_value) and change_value[0].isdigit(): i = 1 while (i < len(change_value) and change_value[i] in '0123456789.'): i += 1 replication_ip = change_value[:i] change_value = change_value[i:] elif len(change_value) and change_value[0] == '[': i = 1 while i < len(change_value) and change_value[i] != ']': i += 1 i += 1 replication_ip = \ change_value[:i].lstrip('[').rstrip(']') change_value = change_value[i:] if replication_ip: change['replication_ip'] = \ validate_and_normalize_ip(replication_ip) if change_value.startswith(':'): i = 1 while i < len(change_value) and change_value[i].isdigit(): i += 1 change['replication_port'] = int(change_value[1:i]) change_value = change_value[i:] if change_value.startswith('/'): i = 1 while i < len(change_value) and change_value[i] != '_': i += 1 change['device'] = change_value[1:i] change_value = change_value[i:] if change_value.startswith('_'): change['meta'] = change_value[1:] change_value = '' if change_value or not change: raise ValueError('Invalid set info change value: %s' % repr(argvish[1])) _set_info_values(devs, change) else: devs = builder.search_devs(parse_search_values_from_opts(opts)) change = parse_change_values_from_opts(opts) _set_info_values(devs, change)
def _parse_set_info_values(argvish): new_cmd_format, opts, args = validate_args(argvish) # We'll either parse the all-in-one-string format or the # --options format, # but not both. If both are specified, raise an error. if not new_cmd_format: if len(args) % 2 != 0: print(Commands.search.__doc__.strip()) exit(EXIT_ERROR) searches_and_changes = izip(islice(argvish, 0, len(argvish), 2), islice(argvish, 1, len(argvish), 2)) for search_value, change_value in searches_and_changes: devs = builder.search_devs(parse_search_value(search_value)) change = {} ip = "" if len(change_value) and change_value[0].isdigit(): i = 1 while i < len(change_value) and change_value[i] in "0123456789.": i += 1 ip = change_value[:i] change_value = change_value[i:] elif len(change_value) and change_value[0] == "[": i = 1 while i < len(change_value) and change_value[i] != "]": i += 1 i += 1 ip = change_value[:i].lstrip("[").rstrip("]") change_value = change_value[i:] if ip: change["ip"] = validate_and_normalize_ip(ip) if change_value.startswith(":"): i = 1 while i < len(change_value) and change_value[i].isdigit(): i += 1 change["port"] = int(change_value[1:i]) change_value = change_value[i:] if change_value.startswith("R"): change_value = change_value[1:] replication_ip = "" if len(change_value) and change_value[0].isdigit(): i = 1 while i < len(change_value) and change_value[i] in "0123456789.": i += 1 replication_ip = change_value[:i] change_value = change_value[i:] elif len(change_value) and change_value[0] == "[": i = 1 while i < len(change_value) and change_value[i] != "]": i += 1 i += 1 replication_ip = change_value[:i].lstrip("[").rstrip("]") change_value = change_value[i:] if replication_ip: change["replication_ip"] = validate_and_normalize_ip(replication_ip) if change_value.startswith(":"): i = 1 while i < len(change_value) and change_value[i].isdigit(): i += 1 change["replication_port"] = int(change_value[1:i]) change_value = change_value[i:] if change_value.startswith("/"): i = 1 while i < len(change_value) and change_value[i] != "_": i += 1 change["device"] = change_value[1:i] change_value = change_value[i:] if change_value.startswith("_"): change["meta"] = change_value[1:] change_value = "" if change_value or not change: raise ValueError("Invalid set info change value: %s" % repr(argvish[1])) _set_info_values(devs, change) else: devs = builder.search_devs(parse_search_values_from_opts(opts)) change = parse_change_values_from_opts(opts) _set_info_values(devs, change)