docs: def _extract_properties(config):
      """
      Parse a line within a lease block
      The line should basically match the expression:
      >>> r"\s+(?P<key>(?:option|set)\s+\S+|\S+) (?P<value>[\s\S]+?);"
      For easier seperation of the cases and faster parsing this is done using substrings etc..
      :param config:
      :return: tuple of properties dict, options dict and sets dict
      """
      general, options, sets = {}, {}, {}
      for line in config.splitlines():
  
          # skip empty & malformed lines
          if not line or not line[-1:] == ';' and '; #' not in line:
              continue
  
          # strip the trailing ';' and remove any whitespaces on the left side
          line = line[:-1].lstrip()
  
          # seperate the three cases
          if line[:6] == 'option':
              key, value = _extract_prop_option(line)
              options[key] = value
  
          elif line[:3] == 'set':
              key, value = _extract_prop_set(line)
              sets[key] = value
  
          else:
              # fall through to generic case
              key, value = _extract_prop_general(line)
              general[key] = value
  
      return general, options, sets