#!/usr/bin/python2
#
# Copyright 2016 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Collect network stats from the DUT.
# For now just collect the byte count from the default interface.

from autotest_lib.client.common_lib import utils

def get_network_stats(machine):
    try:
        dut = hosts.create_target_machine(machine)

        # The information is not critical, so ping the DUT first
        # and if it doesn't reply quickly, give up.
        if utils.ping(dut.hostname, tries=1, timeout=3) != 0:
            logging.info('ping failed: not collecting network stats')
            return

        # In a single ssh call, get list of network interfaces
        # and their byte counts.
        result = dut.run('route; echo SEPARATOR; cat /proc/net/dev')

        # Split output
        lines = result.stdout.splitlines()
        separator_index = lines.index('SEPARATOR')
        route_lines = lines[:separator_index]
        proc_lines = lines[separator_index+1:]

        for line in route_lines:
            fields = line.split()
            # look for default network interface
            if fields[0] == 'default':
                iface = fields[7]
                iface_prefix = iface + ':'
                break
        else:
            logging.info('get_network_stats: no default interface')
            return

        for line in proc_lines:
            fields = line.split()
            # Look for the interface in /proc/net/dev.
            if fields[0] == iface_prefix:
                logging.info('get_network_stats: %s RXbytes %s TXbytes %s',
                             network_stats_label, fields[1], fields[9])
                break
        else:
            logging.info('get_network_stats: iface %s not in /proc/net/dev',
                         iface)
    except Exception as e:
        logging.info('get_network_stats: ignoring exception: %s', e)


job.parallel_simple(get_network_stats, machines)
