#!/usr/bin/python

# Copyright 2014 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.

import os.path
import sys
import argparse

from machine_manager import CrosMachine

def PrintUsage (msg):
    print msg
    print "Usage: "
    print ("\n compare_machines.py --chromeos_root=/path/to/chroot/ "
           "machine1 machine2 ...")


def Main (argv):

    parser = argparse.ArgumentParser()
    parser.add_argument("--chromeos_root", default="/path/to/chromeos",
                        dest="chromeos_root",
                        help="ChromeOS root checkout directory")
    parser.add_argument("remotes", nargs=argparse.REMAINDER)

    options = parser.parse_args(argv)

    false_arg = True
    machine_list = options.remotes
    if len(machine_list) < 2:
        PrintUsage("ERROR: Must specify at least two machines.")
        return 1
    elif not os.path.exists(options.chromeos_root):
        PrintUsage("Error: chromeos_root does not exist %s" %
                   options.chromeos_root)
        return 1

    chroot = options.chromeos_root
    cros_machines = []
    test_machine_checksum = None
    for m in machine_list:
        cm = CrosMachine(m, chroot, 'average')
        cros_machines = cros_machines + [ cm ]
        test_machine_checksum = cm.machine_checksum

    retval = 0
    for cm in cros_machines:
        print "checksum for %s : %s" % (cm.name, cm.machine_checksum)
        if cm.machine_checksum != test_machine_checksum:
                retval = 1
                print "Machine checksums do not all match"

    if retval == 0:
        print "Machines all match."

    return retval


if __name__ == '__main__':
    retval = Main(sys.argv[1:])
    sys.exit(retval)

