class UnixBuildServer(object):
    def __init__(self, server):
        self.sshOpts = SshConnectionOptions(server['host'], username=server['username'],password=server['password'])
        self.host = OverthereHost(self.sshOpts)
        self.session = OverthereHostSession(self.host)

        self.base_working_directory = server['BaseWorkingDirectory']
        self.working_directory = self.base_working_directory

        self.create_working_directory(self.base_working_directory)
        workDir = self.session.remote_file(self.base_working_directory)
        self.session.get_conn().setWorkingDirectory(workDir)

    @staticmethod
    def createServer(server):

        return UnixBuildServer(server)


    def set_working_directory(self, relative_directory_path):
        self.working_directory = "%s/%s" % (self.base_working_directory, relative_directory_path)
        self.create_working_directory(self.working_directory)
        workDir = self.session.remote_file(self.working_directory)
        self.session.get_conn().setWorkingDirectory(workDir)

    # main interface


    # session related methods

    def close_session(selfs):
        self.session.close()

    def create_working_directory(self, dir_full_path):
        response = self.session.execute("/bin/mkdir -p %s" % (dir_full_path))

    # File Handeling
    def read_file_in_workspace(self, file_name):
        print "not yet implemented"

    def write_file_in_workspace(self, file_name, content):
        print "not yet implemented"

    def create_directory(self, directory_name):
        self.execute_command(["/bin/mkdir -p %s" % (directory_name)])


    # command Execution
    def filename_generator(self, size=9, chars=string.ascii_uppercase + string.digits):
        return ''.join(random.choice(chars) for _ in range(size))

    def get_tmp_script_filename(self):
        return "%s.sh" % self.filename_generator()

    def execute_command(self, command, environment_variables=None):
        # get a BashScriptBuilder object
        command_object = BashScriptBuilder()

        # copy in the environment variables
        if environment_variables is not None:
            for key, value in environment_variables.items():
                command_object.set_env_var(key, value)

        # add the rest of the possible multiline command
        command_object.add_lines(command)

        executable_command = command_object.build()

        print "executing command: %s " % (executable_command)

        tmp_script_filename = self.get_tmp_script_filename()

        self.session.upload_text_content_to_work_dir(command_object.build(), tmp_script_filename, executable=True)
    #
        response = self.session.execute("%s/%s" % (self.working_directory, tmp_script_filename), check_success=False, suppress_streaming_output=False)

        if response.rc != 0:
            print response.stderr
            print response.stdout
            print "unable to execute command %s" % (command)
            raise Exception('unable to execute command')
        else:
            print "Response:", str(response.stdout)
            return response