old_contents: """Tools file for HassIO."""
  import asyncio
  import json
  import logging
  import re
  import socket
  
  import aiohttp
  import async_timeout
  
  from .const import URL_HASSIO_VERSION, URL_HASSIO_VERSION_BETA
  
  _LOGGER = logging.getLogger(__name__)
  
  _RE_VERSION = re.compile(r"VERSION=(.*)")
  _IMAGE_ARCH = re.compile(r".*/([a-z0-9]*)-hassio-supervisor")
  
  
  async def fetch_current_versions(websession, beta=False):
      """Fetch current versions from github.
  
      Is a coroutine.
      """
      url = URL_HASSIO_VERSION_BETA if beta else URL_HASSIO_VERSION
      try:
          with async_timeout.timeout(10, loop=websession.loop):
              async with websession.get(url) as request:
                  return await request.json(content_type=None)
  
      except (aiohttp.ClientError, asyncio.TimeoutError, KeyError) as err:
          _LOGGER.warning("Can't fetch versions from %s! %s", url, err)
  
      except json.JSONDecodeError as err:
          _LOGGER.warning("Can't parse versions from %s! %s", url, err)
  
  
  def get_arch_from_image(image):
      """Return arch from hassio image name."""
      found = _IMAGE_ARCH.match(image)
      if found:
          return found.group(1)
  
  
  def get_version_from_env(env_list):
      """Extract Version from ENV list."""
      for env in env_list:
          found = _RE_VERSION.match(env)
          if found:
              return found.group(1)
  
      _LOGGER.error("Can't find VERSION in env")
      return None
  
  
  def get_local_ip(loop):
      """Retrieve local IP address.
  
      Return a future.
      """
      def local_ip():
          """Return local ip."""
          try:
              sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  
              # Use Google Public DNS server to determine own IP
              sock.connect(('8.8.8.8', 80))
  
              return sock.getsockname()[0]
          except socket.error:
              return socket.gethostbyname(socket.gethostname())
          finally:
              sock.close()
  
      return loop.run_in_executor(None, local_ip)
  
  
  def write_json_file(jsonfile, data):
      """Write a json file."""
      try:
          with open(jsonfile, 'w') as conf_file:
              conf_file.write(json.dumps(data))
      except OSError:
          return False
  
      return True
  
  
  def read_json_file(jsonfile):
      """Read a json file and return a dict."""
      with open(jsonfile, 'r') as cfile:
          return json.loads(cfile.read())
  
new_contents: """Tools file for HassIO."""
  import asyncio
  import json
  import logging
  import re
  import socket
  
  import aiohttp
  import async_timeout
  
  from .const import URL_HASSIO_VERSION, URL_HASSIO_VERSION_BETA
  
  _LOGGER = logging.getLogger(__name__)
  
  _RE_VERSION = re.compile(r"VERSION=(.*)")
  _IMAGE_ARCH = re.compile(r".*/([a-z0-9]*)-hassio-supervisor")
  
  
  async def fetch_current_versions(websession, beta=False):
      """Fetch current versions from github.
  
      Is a coroutine.
      """
      url = URL_HASSIO_VERSION_BETA if beta else URL_HASSIO_VERSION
      try:
          with async_timeout.timeout(10, loop=websession.loop):
              async with websession.get(url) as request:
                  return await request.json(content_type=None)
  
      except (aiohttp.ClientError, asyncio.TimeoutError, KeyError) as err:
          _LOGGER.warning("Can't fetch versions from %s! %s", url, err)
  
      except json.JSONDecodeError as err:
          _LOGGER.warning("Can't parse versions from %s! %s", url, err)
  
  
  def get_arch_from_image(image):
      """Return arch from hassio image name."""
      found = _IMAGE_ARCH.match(image)
      if found:
          return found.group(1)
  
  
  def get_version_from_env(env_list):
      """Extract Version from ENV list."""
      for env in env_list:
          found = _RE_VERSION.match(env)
          if found:
              return found.group(1)
  
      _LOGGER.error("Can't find VERSION in env")
      return None
  
  
  def get_local_ip(loop):
      """Retrieve local IP address.
  
      Return a future.
      """
      def local_ip():
          """Return local ip."""
          try:
              sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  
              # Use Google Public DNS server to determine own IP
              sock.connect(('8.8.8.8', 80))
  
              return sock.getsockname()[0]
          except socket.error:
              return socket.gethostbyname(socket.gethostname())
          finally:
              sock.close()
  
      return loop.run_in_executor(None, local_ip)
  
  
  def write_json_file(jsonfile, data):
      """Write a json file."""
      try:
          json_str = json.dumps(data, indent=2)
          with open(jsonfile, 'w') as conf_file:
              conf_file.write(json_str)
      except (OSError, json.JSONDecodeError):
          return False
  
      return True
  
  
  def read_json_file(jsonfile):
      """Read a json file and return a dict."""
      with open(jsonfile, 'r') as cfile:
          return json.loads(cfile.read())
  
subject: Fix severals things with json (#22)