def GetAuthorizedHttp(flags):
  """Helper to create an http interface object and authorize it.

  Made simple by oauth2client library.  Because http object are NOT
  thread-safe, create a new one every time (assumes being created by multiple
  threads).

  Args:
    flags: argparse parsed flags object.

  Returns:
    Authorized httplib2 http interface object.
  """
  credentials = GetCredentials(flags, _SCOPES)
  try:
    cse_tool_version = _TOOL_USER_AGENT % FILE_MANAGER.ReadAppVersion()
    log_utils.LogDebug('user-agent: %s' % cse_tool_version)
    http = httplib2.Http(timeout=_EXTENDED_SOCKET_TIMEOUT_S)
    set_user_agent(http, cse_tool_version)
    http = credentials.authorize(http)
  except AccessTokenRefreshError:
    log_utils.LogError('The credentials have been revoked or expired, '
                       'please re-run the application to re-authorize')
    sys.exit(1)
  return http
def GetAuthorizedHttp(flags):
    """Helper to create an http interface object and authorize it.

  Made simple by oauth2client library.  Because http object are NOT
  thread-safe, create a new one every time (assumes being created by multiple
  threads).

  Args:
    flags: argparse parsed flags object.

  Returns:
    Authorized httplib2 http interface object.
  """
    credentials = GetCredentials(flags, _SCOPES)
    try:
        cse_tool_version = _TOOL_USER_AGENT % FILE_MANAGER.ReadAppVersion()
        log_utils.LogDebug('user-agent: %s' % cse_tool_version)
        http = httplib2.Http(timeout=_EXTENDED_SOCKET_TIMEOUT_S)
        set_user_agent(http, cse_tool_version)
        http = credentials.authorize(http)
    except AccessTokenRefreshError:
        log_utils.LogError('The credentials have been revoked or expired, '
                           'please re-run the application to re-authorize')
        sys.exit(1)
    return http
示例#3
0
    def test_set_user_agent_nested(self):
        http = HttpMockSequence([({"status": "200"}, "echo_request_headers")])

        http = set_user_agent(http, "my_app/5.5")
        http = set_user_agent(http, "my_library/0.1")
        resp, content = http.request("http://example.com")
        self.assertEqual("my_app/5.5 my_library/0.1", content["user-agent"])
示例#4
0
  def test_set_user_agent_nested(self):
    http = HttpMockSequence([
      ({'status': '200'}, 'echo_request_headers'),
      ])

    http = set_user_agent(http, "my_app/5.5")
    http = set_user_agent(http, "my_library/0.1")
    resp, content = http.request("http://example.com")
    self.assertEqual(content['user-agent'], 'my_app/5.5 my_library/0.1')
 def __init__(self, context, db_driver=None):
     self.check_gcs_options()
     backup_bucket = CONF.backup_gcs_bucket
     backup_credential = CONF.backup_gcs_credential_file
     self.gcs_project_id = CONF.backup_gcs_project_id
     chunk_size_bytes = CONF.backup_gcs_object_size
     sha_block_size_bytes = CONF.backup_gcs_block_size
     enable_progress_timer = CONF.backup_gcs_enable_progress_timer
     super(GoogleBackupDriver, self).__init__(context, chunk_size_bytes,
                                              sha_block_size_bytes,
                                              backup_bucket,
                                              enable_progress_timer,
                                              db_driver)
     credentials = client.GoogleCredentials.from_stream(backup_credential)
     self.reader_chunk_size = CONF.backup_gcs_reader_chunk_size
     self.writer_chunk_size = CONF.backup_gcs_writer_chunk_size
     self.bucket_location = CONF.backup_gcs_bucket_location
     self.storage_class = CONF.backup_gcs_storage_class
     self.num_retries = CONF.backup_gcs_num_retries
     http_user_agent = http.set_user_agent(httplib2.Http(),
                                           CONF.backup_gcs_user_agent)
     self.conn = discovery.build('storage',
                                 'v1',
                                 http=http_user_agent,
                                 credentials=credentials)
     self.resumable = self.writer_chunk_size != -1
示例#6
0
  def test_set_user_agent(self):
    http = HttpMockSequence([
      ({'status': '200'}, 'echo_request_headers'),
      ])

    http = set_user_agent(http, "my_app/5.5")
    resp, content = http.request("http://example.com")
    content = simplejson.loads(content.decode())
    self.assertEqual('my_app/5.5', content['user-agent'])
    def test_set_user_agent(self):
        http = HttpMockSequence([
            ({
                'status': '200'
            }, 'echo_request_headers'),
        ])

        http = set_user_agent(http, "my_app/5.5")
        resp, content = http.request("http://example.com")
        content = simplejson.loads(content.decode())
        self.assertEqual('my_app/5.5', content['user-agent'])
def GetAuthorizedHttp(flags):
  """Helper to create an http interface object and authorize it.

  Made simple by oauth2client library.  Because http object are NOT
  thread-safe, create a new one every time (assumes being created by multiple
  threads).

  Args:
    flags: argparse parsed flags object.

  Returns:
    Authorized httplib2 http interface object.
  """
  credentials = GetCredentials(flags)
  try:
    http = httplib2.Http()
    set_user_agent(http, _TOOL_USER_AGENT)
    http = credentials.authorize(http)
  except AccessTokenRefreshError:
    print ('The credentials have been revoked or expired, '
           'please re-run the application to re-authorize')
    sys.exit(1)
  return http
示例#9
0
def GetAuthorizedHttp(flags):
    """Helper to create an http interface object and authorize it.

  Made simple by oauth2client library.  Because http object are NOT
  thread-safe, create a new one every time (assumes being created by multiple
  threads).

  Args:
    flags: argparse parsed flags object.

  Returns:
    Authorized httplib2 http interface object.
  """
    credentials = GetCredentials(flags)
    try:
        http = httplib2.Http()
        set_user_agent(http, _TOOL_USER_AGENT)
        http = credentials.authorize(http)
    except AccessTokenRefreshError:
        print(
            'The credentials have been revoked or expired, '
            'please re-run the application to re-authorize')
        sys.exit(1)
    return http
def main():
  """Import multiple users' mbox files to Gmail.

  """
  httplib2.debuglevel = args.httplib2debuglevel
  # Use args.logging_level if defined.
  try:
    logging_level = args.logging_level
  except AttributeError:
    logging_level = 'INFO'

  # Default logging to standard output
  logging.basicConfig(
      level=logging_level,
      format='%(asctime)s %(levelname)s %(funcName)s@%(filename)s %(message)s',
      datefmt='%H:%M:%S')

  # More detailed logging to file
  file_handler = logging.handlers.RotatingFileHandler(args.log,
                                                      maxBytes=1024 * 1024 * 32,
                                                      backupCount=8)
  file_formatter = logging.Formatter(
      '%(asctime)s %(process)d %(levelname)s %(funcName)s '
      '(%(filename)s:%(lineno)d) %(message)s')
  file_formatter.datefmt = '%Y-%m-%dT%H:%M:%S (%z)'
  file_handler.setFormatter(file_formatter)
  logging.getLogger().addHandler(file_handler)

  logging.info('*** Starting %s %s ***', APPLICATION_NAME, APPLICATION_VERSION)
  logging.info('Arguments:')
  for arg, value in sorted(vars(args).items()):
    logging.info('\t%s: %r', arg, value)

  number_of_labels_imported_without_error = 0
  number_of_labels_imported_with_some_errors = 0
  number_of_labels_failed = 0
  number_of_messages_imported_without_error = 0
  number_of_messages_failed = 0
  number_of_users_imported_without_error = 0
  number_of_users_imported_with_some_errors = 0
  number_of_users_failed = 0

  for username in next(os.walk(args.dir))[1]:
    try:
      logging.info('Processing user %s', username)
      try:
        credentials = get_credentials(username)
        http = credentials.authorize(set_user_agent(
            httplib2.Http(),
            '%s-%s' % (APPLICATION_NAME, APPLICATION_VERSION)))
        service = discovery.build('gmail', 'v1', http=http)
      except Exception:
        logging.error("Can't get access token for user %s", username)
        raise

      try:
        results = service.users().labels().list(
            userId=username,
            fields='labels(id,name)').execute(num_retries=args.num_retries)
        labels = results.get('labels', [])
      except Exception:
        logging.error("Can't get labels for user %s", username)
        raise

      try:
        result = process_mbox_files(username, service, labels)
      except Exception:
        logging.error("Can't process mbox files for user %s", username)
        raise
      if result[2] == 0 and result[4] == 0:
        number_of_users_imported_without_error += 1
      elif result[0] > 0 or result[3] > 0:
        number_of_users_imported_with_some_errors += 1
      else:
        number_of_users_failed += 1
      number_of_labels_imported_without_error += result[0]
      number_of_labels_imported_with_some_errors += result[1]
      number_of_labels_failed += result[2]
      number_of_messages_imported_without_error += result[3]
      number_of_messages_failed += result[4]
      logging.info('Done importing user %s. Labels: %d succeeded, %d with some '
                   'errors, %d failed. Messages: %d succeeded, %d failed.',
                   username,
                   result[0],
                   result[1],
                   result[2],
                   result[3],
                   result[4])
    except Exception:
      number_of_users_failed += 1
      logging.exception("Can't process user %s", username)
  logging.info("*** Done importing all users from directory '%s'", args.dir)
  logging.info('*** Import summary:')
  logging.info('    %d users imported with no failures',
               number_of_users_imported_without_error)
  logging.info('    %d users imported with some failures',
               number_of_users_imported_with_some_errors)
  logging.info('    %d users failed',
               number_of_users_failed)
  logging.info('    %d labels (mbox files) imported with no failures',
               number_of_labels_imported_without_error)
  logging.info('    %d labels (mbox files) imported with some failures',
               number_of_labels_imported_with_some_errors)
  logging.info('    %d labels (mbox files) failed',
               number_of_labels_failed)
  logging.info('    %d messages imported successfully',
               number_of_messages_imported_without_error)
  logging.info('    %d messages failed\n',
               number_of_messages_failed)
  if (number_of_messages_failed + number_of_labels_failed +
      number_of_users_failed > 0):
    logging.info('*** Check log file %s for detailed errors.', args.log)
  logging.info('Finished.\n\n')
def main():
  """Import multiple users' mbox files to Gmail.

  """
  httplib2.debuglevel = args.httplib2debuglevel
  # Use args.logging_level if defined.
  try:
    logging_level = args.logging_level
  except AttributeError:
    logging_level = 'INFO'

  # Default logging to standard output
  logging.basicConfig(
      level=logging_level,
      format='%(asctime)s %(levelname)s %(funcName)s@%(filename)s %(message)s',
      datefmt='%H:%M:%S')

  # More detailed logging to file
  file_handler = logging.handlers.RotatingFileHandler(args.log,
                                                      maxBytes=1024 * 1024 * 32,
                                                      backupCount=8)
  file_formatter = logging.Formatter(
      '%(asctime)s %(process)d %(levelname)s %(funcName)s '
      '(%(filename)s:%(lineno)d) %(message)s')
  file_formatter.datefmt = '%Y-%m-%dT%H:%M:%S (%z)'
  file_handler.setFormatter(file_formatter)
  logging.getLogger().addHandler(file_handler)

  logging.info('*** Starting %s %s on Python %s ***',
               APPLICATION_NAME,
               APPLICATION_VERSION,
               sys.version)
  logging.info('Arguments:')
  for arg, value in sorted(vars(args).items()):
    logging.info('\t%s: %r', arg, value)

  number_of_labels_imported_without_error = 0
  number_of_labels_imported_with_some_errors = 0
  number_of_labels_failed = 0
  number_of_messages_imported_without_error = 0
  number_of_messages_failed = 0
  number_of_users_imported_without_error = 0
  number_of_users_imported_with_some_errors = 0
  number_of_users_failed = 0

  for username in next(os.walk(args.dir))[1]:
    try:
      logging.info('Processing user %s', username)
      try:
        credentials = get_credentials(username)
        http = credentials.authorize(set_user_agent(
            httplib2.Http(),
            '%s-%s' % (APPLICATION_NAME, APPLICATION_VERSION)))
        service = discovery.build('gmail', 'v1', http=http)
      except Exception:
        logging.error("Can't get access token for user %s", username)
        raise

      try:
        results = service.users().labels().list(
            userId=username,
            fields='labels(id,name)').execute(num_retries=args.num_retries)
        labels = results.get('labels', [])
      except Exception:
        logging.error("Can't get labels for user %s", username)
        raise

      try:
        result = process_mbox_files(username, service, labels)
      except Exception:
        logging.error("Can't process mbox files for user %s", username)
        raise
      if result[2] == 0 and result[4] == 0:
        number_of_users_imported_without_error += 1
      elif result[0] > 0 or result[3] > 0:
        number_of_users_imported_with_some_errors += 1
      else:
        number_of_users_failed += 1
      number_of_labels_imported_without_error += result[0]
      number_of_labels_imported_with_some_errors += result[1]
      number_of_labels_failed += result[2]
      number_of_messages_imported_without_error += result[3]
      number_of_messages_failed += result[4]
      logging.info('Done importing user %s. Labels: %d succeeded, %d with some '
                   'errors, %d failed. Messages: %d succeeded, %d failed.',
                   username,
                   result[0],
                   result[1],
                   result[2],
                   result[3],
                   result[4])
    except Exception:
      number_of_users_failed += 1
      logging.exception("Can't process user %s", username)
  logging.info("*** Done importing all users from directory '%s'", args.dir)
  logging.info('*** Import summary:')
  logging.info('    %d users imported with no failures',
               number_of_users_imported_without_error)
  logging.info('    %d users imported with some failures',
               number_of_users_imported_with_some_errors)
  logging.info('    %d users failed',
               number_of_users_failed)
  logging.info('    %d labels (mbox files) imported with no failures',
               number_of_labels_imported_without_error)
  logging.info('    %d labels (mbox files) imported with some failures',
               number_of_labels_imported_with_some_errors)
  logging.info('    %d labels (mbox files) failed',
               number_of_labels_failed)
  logging.info('    %d messages imported successfully',
               number_of_messages_imported_without_error)
  logging.info('    %d messages failed\n',
               number_of_messages_failed)
  if (number_of_messages_failed + number_of_labels_failed +
      number_of_users_failed > 0):
    logging.info('*** Check log file %s for detailed errors.', args.log)
  logging.info('Finished.\n\n')
示例#12
0
def Http():
    """Returns an instance of `httplib2.Http` with User-agent set."""
    http = httplib2.Http(memcache)
    return apiclient_http.set_user_agent(http, USER_AGENT)
示例#13
0
def main():

  # Set the default encoding for logger
  reload(sys)
  sys.setdefaultencoding('utf8')

  # Setup logging
  httplib2.debuglevel = 0

  # Increase log leven of file_cache error on oauth2client >= 4.0.0
  # https://github.com/google/google-api-python-client/issues/299
  logging.getLogger('googleapiclient.discovery_cache').setLevel(logging.ERROR)
  logging.getLogger('googleapiclient').setLevel(logging.ERROR)

  try:
      logging_level = args.logging_level
  except AttributeError:
      logging_level = 'INFO'

  logging.basicConfig(
      level=logging_level,
      format='%(asctime)s %(levelname)s %(message)s',
      datefmt='%H:%M:%S')

  # More detailed logging to file
  file_handler = logging.handlers.RotatingFileHandler(args.log,
                                                      maxBytes=1024 * 1024 * 32,
                                                      backupCount=8)
  file_formatter = logging.Formatter(
      '%(asctime)s '
      '(%(filename)s:%(lineno)d) %(message)s')
  file_formatter.datefmt = '%Y-%m-%dT%H:%M:%S (%z)'
  file_handler.setFormatter(file_formatter)
  logging.getLogger().addHandler(file_handler)

  for group_name in next(os.walk(args.dir))[1]:
      logging.info('Processing group %s', group_name)
      credentials = get_credentials(args.group_owner)
      http = credentials.authorize(set_user_agent(
          httplib2.Http(),
          '%s-%s' % (APPLICATION_NAME, APPLICATION_VERSION)))
      service_settings = discovery.build('groupssettings', 'v1', http=http)

      try:
          results = service_settings.groups().get(groupUniqueId=group_name, alt='json').execute()
          logging.info('Successfully found group %s', group_name)
      except Exception:
          logging.error("Can't get group %s", group_name)
          raise

      try:
          service_migration = discovery.build('groupsmigration', 'v1', http=http)
          result = process_mbox_files(group_name, service_migration)
          logging.info('Done importing user %s. Labels: %d succeeded, %d with some '
                  'errors, %d failed. Messages: %d succeeded, %d failed.',
                  group_name,
                  result[0],
                  result[1],
                  result[2],
                  result[3],
                  result[4])
      except Exception:
          logging.error("Can't process mbox files for group %s", group_name)
          raise
  logging.info('Finished.\n\n')
def user_worker(queue):
  global number_of_labels_imported_without_error
  global number_of_labels_imported_with_some_errors
  global number_of_labels_failed
  global number_of_messages_imported_without_error
  global number_of_messages_failed
  global number_of_users_imported_without_error
  global number_of_users_imported_with_some_errors
  global number_of_users_failed
  while True:
    username = queue.get(True)
    if username == sentinel:
      logging.info("Thread done")
      break
    ## temp bypass
    # time.sleep(5)
    # queue.task_done()
    # continue

    try:
      logging.info('Processing user %s', username)
      try:
        credentials = get_credentials(username)
        http = credentials.authorize(set_user_agent(
            httplib2.Http(),
            '%s-%s' % (APPLICATION_NAME, APPLICATION_VERSION)))
        service = discovery.build('gmail', 'v1', http=http)
      except Exception:
        logging.error("Can't get access token for user %s", username)
        raise

      try:
        results = service.users().labels().list(
            userId=username,
            fields='labels(id,name)').execute(num_retries=args.num_retries)
        labels = results.get('labels', [])
      except Exception:
        logging.error("Can't get labels for user %s", username)
        raise

      try:
        result = process_mbox_files(username, service, labels)
      except Exception:
        logging.error("Can't process mbox files for user %s", username)
        raise
      if result[2] == 0 and result[4] == 0:
        number_of_users_imported_without_error += 1
      elif result[0] > 0 or result[3] > 0:
        number_of_users_imported_with_some_errors += 1
      else:
        number_of_users_failed += 1
      number_of_labels_imported_without_error += result[0]
      number_of_labels_imported_with_some_errors += result[1]
      number_of_labels_failed += result[2]
      number_of_messages_imported_without_error += result[3]
      number_of_messages_failed += result[4]
      logging.info('Done importing user %s. Labels: %d succeeded, %d with some '
                   'errors, %d failed. Messages: %d succeeded, %d failed.',
                   username,
                   result[0],
                   result[1],
                   result[2],
                   result[3],
                   result[4])
      queue.task_done()
    except Exception:
      number_of_users_failed += 1
      logging.exception("Can't process user %s", username)
      queue.task_done()
def worker(queue):
  global number_of_successes_in_label
  global number_of_failures_in_label
  service = None
  while True:
    try:
      data = queue.get(True)
      # unpack json
      message = data['message']
      index = data['index']
      labelname = data['labelname']
      label_id = data['label_id']
      username = data['username']


      if service == None:
        # Trying 
        credentials = get_credentials(username)
        http = credentials.authorize(set_user_agent(
          httplib2.Http(),
          '%s-%s' % (APPLICATION_NAME, APPLICATION_VERSION)))
        service = discovery.build('gmail', 'v1', http=http)

    except Exception,e:
      if 'EOFError' in str(e):
        return
      else:
        logging.exception(e)
    # Process the message
    logging.info("%d : Processing message %d in label '%s'", thread.get_ident(), index, labelname)
    try:
      if (args.replace_quoted_printable and
          'Content-Type' in message and
          'text/quoted-printable' in message['Content-Type']):
        message.replace_header(
            'Content-Type', message['Content-Type'].replace(
                'text/quoted-printable', 'text/plain'))
        logging.info('Replaced text/quoted-printable with text/plain')
    except Exception:
      logging.exception(
          'Failed to replace text/quoted-printable with text/plain '
          'in Content-Type header')
    try:
      if args.fix_msgid and 'Message-ID' in message:
        msgid = message['Message-ID']
        if msgid[0] != '<':
          msgid = '<' + msgid
          logging.info('Added < to Message-ID: %s', msgid)
        if msgid[-1] != '>':
          msgid += '>'
          logging.info('Added > to Message-ID: %s', msgid)
        message.replace_header('Message-ID', msgid)
    except Exception:
      logging.exception('Failed to fix brackets in Message-ID header')
    for n in range(0, args.num_retries):
      try:
        metadata_object = {'labelIds': [label_id]}
        # Use media upload to allow messages more than 5mb.
        # See https://developers.google.com/api-client-library/python/guide/media_upload
        # and http://google-api-python-client.googlecode.com/hg/docs/epy/apiclient.http.MediaIoBaseUpload-class.html.
        message_data = io.BytesIO(message.as_string().encode('utf-8'))
        media = MediaIoBaseUpload(message_data,
                                  mimetype='message/rfc822')
        message_response = service.users().messages().insert(
            userId=username,
            internalDateSource='dateHeader',
            body=metadata_object,
            media_body=media).execute(num_retries=args.num_retries)
        number_of_successes_in_label += 1
        logging.debug("Imported mbox message '%s' to Gmail ID %s",
                      message.get_from(), message_response['id'])
        break
      except Exception,e:
        if 'Too many concurrent' in str(e):
          logging.info("Concurrency limit hit, waiting then retrying")
          time.sleep((2 ** n) + random.random())
          continue
        else:
          number_of_failures_in_label += 1
          logging.exception('Failed to import mbox message')