#!/usr/bin/env python
#
# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
#

# A script that copies a core file and binary to GCS
# We expect the dumps to be located in /tmp/coredump_PID directory
# After we copy out the core files we delete the dumps localy

import os
import shutil
import sys
import subprocess
import tarfile
import utils
import uuid

GCS_FOLDER = 'dart-crashes'

def CreateTarball(dir, tarname):
  print 'Creating tar file: %s' % (tarname)
  tar = tarfile.open(tarname, mode='w:gz')
  tar.add(dir)
  tar.close()

def CopyToGCS(filename):
  gs_location = 'gs://%s/%s/' % (GCS_FOLDER, uuid.uuid4())
  cmd = ['gsutil', 'cp', filename, gs_location]
  print 'Running command: %s' % (cmd)
  subprocess.check_call(cmd)
  archived_filename = '%s%s' % (gs_location, filename.split('/').pop())
  print 'Dump now available in %s' % (archived_filename) 

def Main():
  if utils.GuessOS() != 'linux':
    print 'Currently only archiving crash dumps on linux'
    return 0
  print 'Looking for crash dumps'
  num_dumps = 0
  for v in os.listdir('/tmp'):
    if v.startswith('coredump'):
      fullpath = '/tmp/%s' % (v)
      if os.path.isdir(fullpath):
        num_dumps += 1
        tarname = '%s.tar.gz' % fullpath
        CreateTarball(fullpath, tarname)
        CopyToGCS(tarname)
        os.unlink(tarname)
        shutil.rmtree(fullpath)
  print 'Found %s core dumps' % (num_dumps)

if __name__ == '__main__':
  sys.exit(Main())
