docs: def is_ipv6_ok(soft_fail=False):
      """
      Check if IPv6 support is present and ip6tables functional
  
      :param soft_fail: If set to True and IPv6 support is broken, then reports
                        that the host doesn't have IPv6 support, otherwise a
                        UFWIPv6Error exception is raised.
      :returns: True if IPv6 is working, False otherwise
      """
  
      # do we have IPv6 in the machine?
      if os.path.isdir('/proc/sys/net/ipv6'):
          # is ip6tables kernel module loaded?
          if not is_module_loaded('ip6_tables'):
              # ip6tables support isn't complete, let's try to load it
              try:
                  modprobe('ip6_tables')
                  # great, we can load the module
                  return True
              except subprocess.CalledProcessError as ex:
                  hookenv.log("Couldn't load ip6_tables module: %s" % ex.output,
                              level="WARN")
                  # we are in a world where ip6tables isn't working
                  if soft_fail:
                      # so we inform that the machine doesn't have IPv6
                      return False
                  else:
                      raise UFWIPv6Error("IPv6 firewall support broken")
          else:
              # the module is present :)
              return True
  
      else:
          # the system doesn't have IPv6
          return False