# vim: tabstop=4 shiftwidth=4 softtabstop=4

# Copyright 2011 Quanta Research Cambridge, Inc.
#
#    Licensed under the Apache License, Version 2.0 (the "License");
#    you may not use this file except in compliance with the License.
#    You may obtain a copy of the License at
#
#        http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS,
#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#    See the License for the specific language governing permissions and
#    limitations under the License.

import subprocess
import shlex

SSH_OPTIONS = (" -q" +
               " -o UserKnownHostsFile=/dev/null" +
               " -o StrictHostKeyChecking=no -i ")


def get_ssh_options(keypath):
    return SSH_OPTIONS + keypath


def scp(keypath, args):
    options = get_ssh_options(keypath)
    return subprocess.check_call(shlex.split("scp" + options + args))


def ssh(keypath, user, node, command, check=True):
    command = 'sudo ' + command
    command = "ssh %s %s@%s %s" % (get_ssh_options(keypath), user,
                                   node, command)
    popenargs = shlex.split(command)
    process = subprocess.Popen(popenargs, stdout=subprocess.PIPE)
    output, unused_err = process.communicate()
    retcode = process.poll()
    if retcode and check:
        raise Exception("%s: ssh failed with retcode: %s" % (node, retcode))
    return output


def execute_on_all(keypath, user, nodes, command):
    for node in nodes:
        ssh(keypath, user, node, command)


def enum(*sequential, **named):
    """Create auto-incremented enumerated types"""
    enums = dict(zip(sequential, range(len(sequential))), **named)
    return type('Enum', (), enums)
