# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Breakpad for Python.

Sends a notification when a process stops on an exception.

It is only enabled when all these conditions are met:
  1. hostname finishes with '.google.com' or 'chromium.org'
  2. main module name doesn't contain the word 'test'
  3. no NO_BREAKPAD environment variable is defined
"""

import atexit
import getpass
import os
import socket
import sys
import time
import traceback
import urllib
import urllib2


# Configure these values.
DEFAULT_URL = 'https://chromium-status.appspot.com'

# Global variable to prevent double registration.
_REGISTERED = False

_TIME_STARTED = time.time()

_HOST_NAME = socket.getfqdn()

# Skip unit tests and we don't want anything from non-googler.
IS_ENABLED = (
    not 'test' in getattr(sys.modules['__main__'], '__file__', '') and
    not 'NO_BREAKPAD' in os.environ and
    _HOST_NAME.endswith(('.google.com', '.chromium.org')))


# TODO(uzhilinsky): Disable breakpad to avoid spamming the Chromium team.
# Eventually this should be re-enabled and the exceptions should be forwarded
# to our own server.
IS_ENABLED = False


def post(url, params):
  """HTTP POST with timeout when it's supported."""
  if not IS_ENABLED:
    # Make sure to not send anything for non googler.
    return
  kwargs = {}
  if (sys.version_info[0] * 10 + sys.version_info[1]) >= 26:
    kwargs['timeout'] = 4
  try:
    request = urllib2.urlopen(url, urllib.urlencode(params), **kwargs)
    out = request.read()
    request.close()
    return out
  except IOError:
    return 'There was a failure while trying to send the stack trace. Too bad.'


def FormatException(e):
  """Returns a human readable form of an exception.

  Adds the maximum number of interesting information in the safest way."""
  try:
    out = repr(e)
  except Exception:
    out = ''
  try:
    out = str(e)
    if isinstance(e, Exception):
      # urllib exceptions, usually the HTTP headers.
      if hasattr(e, 'headers'):
        out += '\nHeaders: %s' % e.headers
      if hasattr(e, 'url'):
        out += '\nUrl: %s' % e.url
      if hasattr(e, 'msg'):
        out += '\nMsg: %s' % e.msg
      # The web page in some urllib exceptions.
      if hasattr(e, 'read') and callable(e.read):
        out += '\nread(): %s' % e.read()
      if hasattr(e, 'info') and callable(e.info):
        out += '\ninfo(): %s' % e.info()
  except Exception:
    pass
  return out


def SendStack(last_tb, stack, url=None, maxlen=50, verbose=True):
  """Sends the stack trace to the breakpad server."""
  if not IS_ENABLED:
    return
  def p(o):
    if verbose:
      print(o)
  p('Sending crash report ...')
  params = {
    'args': sys.argv,
    'cwd': os.getcwd(),
    'exception': FormatException(last_tb),
    'host': _HOST_NAME,
    'stack': stack[0:4096],
    'user': getpass.getuser(),
    'version': sys.version,
  }
  p('\n'.join('  %s: %s' % (k, params[k][0:maxlen]) for k in sorted(params)))
  p(post(url or DEFAULT_URL + '/breakpad', params))


def SendProfiling(duration, url=None):
  params = {
    'argv': ' '.join(sys.argv),
    # Strip the hostname.
    'domain': _HOST_NAME.split('.', 1)[-1],
    'duration': duration,
    'platform': sys.platform,
  }
  post(url or DEFAULT_URL + '/profiling', params)


def CheckForException():
  """Runs at exit. Look if there was an exception active."""
  last_value = getattr(sys, 'last_value', None)
  if last_value:
    if not isinstance(last_value, KeyboardInterrupt):
      last_tb = getattr(sys, 'last_traceback', None)
      if last_tb:
        SendStack(last_value, ''.join(traceback.format_tb(last_tb)))
  else:
    duration = time.time() - _TIME_STARTED
    if duration > 90:
      SendProfiling(duration)


def Register():
  """Registers the callback at exit. Calling it multiple times is no-op."""
  global _REGISTERED
  if _REGISTERED:
    return
  _REGISTERED = True
  atexit.register(CheckForException)


if IS_ENABLED:
  Register()

# Uncomment this line if you want to test it out.
#Register()
