Exemplo n.º 1
0
def CheckForMissingDevices(options, adb_online_devs):
    """Uses file of previous online devices to detect broken phones.

  Args:
    options: out_dir parameter of options argument is used as the base
             directory to load and update the cache file.
    adb_online_devs: A list of serial numbers of the currently visible
                     and online attached devices.
  """
    out_dir = os.path.abspath(options.out_dir)
    last_devices_path = os.path.join(out_dir, '.last_devices')
    last_devices = []
    try:
        with open(last_devices_path) as f:
            last_devices = f.read().splitlines()
    except IOError:
        # Ignore error, file might not exist
        pass

    missing_devs = list(set(last_devices) - set(adb_online_devs))
    if missing_devs:
        buildbot_report.PrintWarning()
        buildbot_report.PrintSummaryText('%d devices not detected.' %
                                         len(missing_devs))
        print 'Current online devices: %s' % adb_online_devs
        print '%s are no longer visible. Were they removed?\n' % missing_devs
        print 'SHERIFF: See go/chrome_device_monitor'
        print 'Cache file: %s\n\n' % last_devices_path
        print 'adb devices'
        print GetCmdOutput(['adb', 'devices'])
    else:
        new_devs = set(adb_online_devs) - set(last_devices)
        if new_devs and os.path.exists(last_devices_path):
            buildbot_report.PrintWarning()
            buildbot_report.PrintSummaryText('%d new devices detected' %
                                             len(new_devs))
            print(
                'New devices detected %s. And now back to your '
                'regularly scheduled program.' % list(new_devs))

    if not os.path.exists(out_dir):
        os.makedirs(out_dir)
    with open(last_devices_path, 'w') as f:
        # Write devices currently visible plus devices previously seen.
        f.write('\n'.join(set(adb_online_devs + last_devices)))
Exemplo n.º 2
0
def CheckForMissingDevices(options, adb_online_devs):
    """Uses file of previous online devices to detect broken phones.

  Args:
    options: out_dir parameter of options argument is used as the base
             directory to load and update the cache file.
    adb_online_devs: A list of serial numbers of the currently visible
                     and online attached devices.
  """
    # TODO(navabi): remove this once the bug that causes different number
    # of devices to be detected between calls is fixed.
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)

    out_dir = os.path.abspath(options.out_dir)

    def ReadDeviceList(file_name):
        devices_path = os.path.join(out_dir, file_name)
        devices = []
        try:
            with open(devices_path) as f:
                devices = f.read().splitlines()
        except IOError:
            # Ignore error, file might not exist
            pass
        return devices

    def WriteDeviceList(file_name, device_list):
        path = os.path.join(out_dir, file_name)
        if not os.path.exists(out_dir):
            os.makedirs(out_dir)
        with open(path, 'w') as f:
            # Write devices currently visible plus devices previously seen.
            f.write('\n'.join(set(device_list)))

    last_devices_path = os.path.join(out_dir, '.last_devices')
    last_devices = ReadDeviceList('.last_devices')

    missing_devs = list(set(last_devices) - set(adb_online_devs))
    if missing_devs:
        from_address = '*****@*****.**'
        to_address = '*****@*****.**'
        bot_name = os.environ['BUILDBOT_BUILDERNAME']
        slave_name = os.environ['BUILDBOT_SLAVENAME']
        num_online_devs = len(adb_online_devs)
        subject = 'Devices offline on %s, %s (%d remaining).' % (
            slave_name, bot_name, num_online_devs)
        buildbot_report.PrintWarning()
        devices_missing_msg = '%d devices not detected.' % len(missing_devs)
        buildbot_report.PrintSummaryText(devices_missing_msg)

        # TODO(navabi): Debug by printing both output from GetCmdOutput and
        # GetAttachedDevices to compare results.
        body = '\n'.join([
            'Current online devices: %s' % adb_online_devs,
            '%s are no longer visible. Were they removed?\n' % missing_devs,
            'SHERIFF: See go/chrome_device_monitor',
            'Cache file: %s\n\n' % last_devices_path,
            'adb devices: %s' % GetCmdOutput(['adb', 'devices']),
            'adb devices(GetAttachedDevices): %s' % GetAttachedDevices()
        ])

        print body

        # Only send email if the first time a particular device goes offline
        last_missing = ReadDeviceList('.last_missing')
        new_missing_devs = set(missing_devs) - set(last_missing)

        if new_missing_devs:
            msg_body = '\r\n'.join([
                'From: %s' % from_address,
                'To: %s' % to_address,
                'Subject: %s' % subject, '', body
            ])
            try:
                server = smtplib.SMTP('localhost')
                server.sendmail(from_address, [to_address], msg_body)
                server.quit()
            except Exception as e:
                print 'Failed to send alert email. Error: %s' % e
    else:
        new_devs = set(adb_online_devs) - set(last_devices)
        if new_devs and os.path.exists(last_devices_path):
            buildbot_report.PrintWarning()
            buildbot_report.PrintSummaryText('%d new devices detected' %
                                             len(new_devs))
            print(
                'New devices detected %s. And now back to your '
                'regularly scheduled program.' % list(new_devs))
    WriteDeviceList('.last_devices', (adb_online_devs + last_devices))
    WriteDeviceList('.last_missing', missing_devs)
def CheckForMissingDevices(options, adb_online_devs):
    """Uses file of previous online devices to detect broken phones.

  Args:
    options: out_dir parameter of options argument is used as the base
             directory to load and update the cache file.
    adb_online_devs: A list of serial numbers of the currently visible
                     and online attached devices.
  """
    # TODO(navabi): remove this once the bug that causes different number
    # of devices to be detected between calls is fixed.
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)

    out_dir = os.path.abspath(options.out_dir)

    def ReadDeviceList(file_name):
        devices_path = os.path.join(out_dir, file_name)
        devices = []
        try:
            with open(devices_path) as f:
                devices = f.read().splitlines()
        except IOError:
            # Ignore error, file might not exist
            pass
        return devices

    def WriteDeviceList(file_name, device_list):
        path = os.path.join(out_dir, file_name)
        if not os.path.exists(out_dir):
            os.makedirs(out_dir)
        with open(path, 'w') as f:
            # Write devices currently visible plus devices previously seen.
            f.write('\n'.join(set(device_list)))

    last_devices_path = os.path.join(out_dir, '.last_devices')
    last_devices = ReadDeviceList('.last_devices')
    missing_devs = list(set(last_devices) - set(adb_online_devs))

    all_known_devices = list(set(adb_online_devs) | set(last_devices))
    WriteDeviceList('.last_devices', all_known_devices)
    WriteDeviceList('.last_missing', missing_devs)

    if not all_known_devices:
        # This can happen if for some reason the .last_devices file is not
        # present or if it was empty.
        return ['No online devices. Have any devices been plugged in?']
    if missing_devs:
        devices_missing_msg = '%d devices not detected.' % len(missing_devs)
        buildbot_report.PrintSummaryText(devices_missing_msg)

        # TODO(navabi): Debug by printing both output from GetCmdOutput and
        # GetAttachedDevices to compare results.
        return [
            'Current online devices: %s' % adb_online_devs,
            '%s are no longer visible. Were they removed?\n' % missing_devs,
            'SHERIFF: See go/chrome_device_monitor',
            'Cache file: %s\n\n' % last_devices_path,
            'adb devices: %s' % GetCmdOutput(['adb', 'devices']),
            'adb devices(GetAttachedDevices): %s' %
            android_commands.GetAttachedDevices()
        ]
    else:
        new_devs = set(adb_online_devs) - set(last_devices)
        if new_devs and os.path.exists(last_devices_path):
            buildbot_report.PrintWarning()
            buildbot_report.PrintSummaryText('%d new devices detected' %
                                             len(new_devs))
            print(
                'New devices detected %s. And now back to your '
                'regularly scheduled program.' % list(new_devs))