# Path: clearstack/controller.py
# class Controller:
#     CONF = {}
#     _plugins = []
#     _groups = []
#     _sequences = []
# 
#     def add_sequence(self, desc, function, args=None):
#         self._sequences.append(Sequence(desc, function, args))
# 
#     def run_all_sequences(self):
#         for seq in self._sequences:
#             try:
#                 seq.run()
#             except Exception as e:
#                 raise e
# 
#     def add_plugin(self, plugin):
#         self._plugins.append(plugin)
# 
#     def get_all_plugins(self):
#         return self._plugins
# 
#     def add_group(self, name, args):
#         self._groups.append(Group(name, args))
# 
#     def get_all_groups(self):
#         return self._groups
# 
#     def get_all_arguments(self):
#         """Get a list of the configuration argument loaded"""
#         arguments = []
#         for group in self._groups:
#             arguments.extend([argument.conf_name
#                               for argument in group.get_all_arguments()])
#         return arguments
# 
#     def validate_groups(self, conf_values):
#         """ Load validation functions, in order to check
#         the values in the answer file """
#         arguments = {}
#         for group in self._groups:
#             for arg in group.get_all_arguments():
#                 try:
#                     arg.validate(conf_values[arg.conf_name])
#                 except Exception as e:
#                     raise Exception("{0}: {1}".format(arg.conf_name, str(e)))
#         return arguments
# 
# Path: clearstack/common/util.py
# HOST_LOG_DIR = '/var/log/clearstack'
# HOST_LOG_FILE = "{0}/clearstack.log".format(HOST_LOG_DIR)
# LOG_DIR = '/var/log/clearstack'
#     LOG_DIR = '/tmp/log/clearstack'
# LOG_FILE = "{0}/clearstack.log".format(LOG_DIR)
# LOG = logging.getLogger("Clearstack")
# def _print_error_message(self, e, file_name):
# def port_open(port):
# def service_status(service):
# def service_enabled(service):
# def setup_debugging(debug, is_remote_host=True):
# def run_command(command, stdin=None, environ=None, debug=True):
# def str2bool(value):
# def write_config(file, data):
# def write_properties(file, data):
# def get_option(file, section, option):
# def delete_option(file, section, option=None):
# def write_in_file_ine(file, data):
# def get_dns():
# def get_netmask():
# def get_gateway():
# def get_net_interface():
# def get_ips():
# def get_nic(ip):
# def get_ip():
# def find_my_ip_from_config(config_ips):
# def is_localhost(host):
# def has_localhost(hosts):
# def remove_localhost(hosts):
# def ensure_directory(dir):
# def link_file(source, target):
# 
# Path: clearstack/common/util.py
# LOG = logging.getLogger("Clearstack")
# 
# Path: clearstack/common/singleton.py
# class Singleton:
#     def __init__(self, decorated):
#         self._decorated = decorated
# 
#     def get(self):
#         try:
#             return self._instance
#         except AttributeError:
#             self._instance = self._decorated()
#             return self._instance
# 
#     def __call__(self):
#         raise TypeError('Singletons must be accessed through `Get()`.')
# 
#     def __instancecheck__(self, inst):
#         return isinstance(inst, self._decorated)


import os
import paramiko
from clearstack.controller import Controller
from clearstack.common import util
from clearstack.common.util import LOG
from clearstack.common.singleton import Singleton
        util.remove_localhost(hosts)

        if not conf['CONFIG_PRIVATE_SSH_KEY'] and hosts:
            raise Exception("CONFIG_PRIVATE_SSH_KEY: missing private key")

        for host in hosts:
            try:
                connection = self.connect(self.ssh_user, self.ssh_private_key,
                                          host)
                self.test_python_in_host(host, connection)
            except Exception as e:
                raise Exception("host {0}: {1}".format(host, str(e)))
            finally:
                if connection:
                    connection.close()

    def run_recipe(self, recipe_file, host):
        connection = None
        interpreter = "python3"
        if recipe_file.endswith('.sh'):
            interpreter = "bash -f"

        try:
            connection = self.connect(self.ssh_user, self.ssh_private_key,
                                      host)
            cmd = "source /root/.bashrc 2> /dev/null;" \
                  "source /usr/share/defaults/etc/profile 2> /dev/null;" \
                  "{0} {1}".format(interpreter, recipe_file)
            stdin, stdout, stderr = self.run_command(connection, cmd)
        except Exception as e:

# Path: clearstack/controller.py
# class Controller:
#     CONF = {}
#     _plugins = []
#     _groups = []
#     _sequences = []
# 
#     def add_sequence(self, desc, function, args=None):
#         self._sequences.append(Sequence(desc, function, args))
# 
#     def run_all_sequences(self):
#         for seq in self._sequences:
#             try:
#                 seq.run()
#             except Exception as e:
#                 raise e
# 
#     def add_plugin(self, plugin):
#         self._plugins.append(plugin)
# 
#     def get_all_plugins(self):
#         return self._plugins
# 
#     def add_group(self, name, args):
#         self._groups.append(Group(name, args))
# 
#     def get_all_groups(self):
#         return self._groups
# 
#     def get_all_arguments(self):
#         """Get a list of the configuration argument loaded"""
#         arguments = []
#         for group in self._groups:
#             arguments.extend([argument.conf_name
#                               for argument in group.get_all_arguments()])
#         return arguments
# 
#     def validate_groups(self, conf_values):
#         """ Load validation functions, in order to check
#         the values in the answer file """
#         arguments = {}
#         for group in self._groups:
#             for arg in group.get_all_arguments():
#                 try:
#                     arg.validate(conf_values[arg.conf_name])
#                 except Exception as e:
#                     raise Exception("{0}: {1}".format(arg.conf_name, str(e)))
#         return arguments
# 
# Path: clearstack/common/util.py
# HOST_LOG_DIR = '/var/log/clearstack'
# HOST_LOG_FILE = "{0}/clearstack.log".format(HOST_LOG_DIR)
# LOG_DIR = '/var/log/clearstack'
#     LOG_DIR = '/tmp/log/clearstack'
# LOG_FILE = "{0}/clearstack.log".format(LOG_DIR)
# LOG = logging.getLogger("Clearstack")
# def _print_error_message(self, e, file_name):
# def port_open(port):
# def service_status(service):
# def service_enabled(service):
# def setup_debugging(debug, is_remote_host=True):
# def run_command(command, stdin=None, environ=None, debug=True):
# def str2bool(value):
# def write_config(file, data):
# def write_properties(file, data):
# def get_option(file, section, option):
# def delete_option(file, section, option=None):
# def write_in_file_ine(file, data):
# def get_dns():
# def get_netmask():
# def get_gateway():
# def get_net_interface():
# def get_ips():
# def get_nic(ip):
# def get_ip():
# def find_my_ip_from_config(config_ips):
# def is_localhost(host):
# def has_localhost(hosts):
# def remove_localhost(hosts):
# def ensure_directory(dir):
# def link_file(source, target):
# 
# Path: clearstack/common/util.py
# LOG = logging.getLogger("Clearstack")
# 
# Path: clearstack/common/singleton.py
# class Singleton:
#     def __init__(self, decorated):
#         self._decorated = decorated
# 
#     def get(self):
#         try:
#             return self._instance
#         except AttributeError:
#             self._instance = self._decorated()
#             return self._instance
# 
#     def __call__(self):
#         raise TypeError('Singletons must be accessed through `Get()`.')
# 
#     def __instancecheck__(self, inst):
#         return isinstance(inst, self._decorated)


# Path: clearstack/ssh.py
import os
import paramiko
from clearstack.controller import Controller
from clearstack.common import util
from clearstack.common.util import LOG
from clearstack.common.singleton import Singleton

        util.remove_localhost(hosts)

        if not conf['CONFIG_PRIVATE_SSH_KEY'] and hosts:
            raise Exception("CONFIG_PRIVATE_SSH_KEY: missing private key")

        for host in hosts:
            try:
                connection = self.connect(self.ssh_user, self.ssh_private_key,
                                          host)
                self.test_python_in_host(host, connection)
            except Exception as e:
                raise Exception("host {0}: {1}".format(host, str(e)))
            finally:
                if connection:
                    connection.close()

    def run_recipe(self, recipe_file, host):
        connection = None
        interpreter = "python3"
        if recipe_file.endswith('.sh'):
            interpreter = "bash -f"

        try:
            connection = self.connect(self.ssh_user, self.ssh_private_key,
                                      host)
            cmd = "source /root/.bashrc 2> /dev/null;" \
                  "source /usr/share/defaults/etc/profile 2> /dev/null;" \
                  "{0} {1}".format(interpreter, recipe_file)
            stdin, stdout, stderr = self.run_command(connection, cmd)
        except Exception as e:

            LOG.error("clearstack: an error has occurred in {0},"