#!/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 dut.use_icmp and 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)
