#!/usr/bin/python3
#
# Copyright 2016 The ChromiumOS Authors
# 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)
