package beans.scripts;
import java.io.File;
import java.io.IOException;
import java.util.*;
import beans.config.Conf;
import cloudify.widget.common.asyncscriptexecutor.*;
import models.ServerNode;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.io.FileUtils;
import org.jclouds.compute.ComputeServiceContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import server.ApplicationContext;
import utils.StringUtils;
public class FileBasedScriptExecutor implements ScriptExecutor{
/* @Inject
private Conf conf;*/
private static Logger logger = LoggerFactory.getLogger( FileBasedScriptExecutor.class );
private Conf conf;
public FileBasedScriptExecutor(){
logger.info( "---Initializing FileBasedScriptExecutor---" );
}
/**
* Used for bootstrapping
* @param cmdLine
* @param serverNode
// * @param cloudBootstrapConfiguration
*/
@Override
public IAsyncExecution runBootstrapScript(CommandLine cmdLine, ServerNode serverNode) {
ExecuteData executeData = addCommonProps(cmdLine, serverNode);
executeData.action = "bootstrap";
IAsyncExecution impl = new AsyncExecutionImpl();
IAsyncExecutionDetails executionDetails = getExecutionDetails(serverNode, executeData.action);
impl.setDetails(executionDetails);
impl.writeTask( executeData );
logger.info("new bootstrap task written to [{}]", executionDetails.getTaskFile());
return impl;
}
@Override
public IAsyncExecution getBootstrapExecution( ServerNode serverNode){
ExecuteData executeData = addCommonProps(new ExecuteData(), serverNode);
executeData.action = "bootstrap";
IAsyncExecution impl = new AsyncExecutionImpl();
impl.setDetails(getExecutionDetails( serverNode, executeData.action ));
return impl;
}
/**
* used for running install and uninstall of applications
* @param cmdLine
// * @param server
*/
@Override
public void runInstallationManagementScript( CommandLine cmdLine, ServerNode serverNode ){
logger.debug("running install script for serverNode [{}]" , serverNode.toDebugString() );
ExecuteData executeData = addCommonProps(cmdLine, serverNode);
executeData.action = "install";
IAsyncExecution impl = new AsyncExecutionImpl();
impl.setDetails(getExecutionDetails( serverNode, executeData.action ));
impl.writeTask( executeData );
}
@Override
public void runTearDownCommand(CommandLine cmdLine) {
}
private static ExecuteData addCommonProps( CommandLine cmdLine, ServerNode serverNode ) {
ExecuteData result = new ExecuteData();
addCommonProps( result, cmdLine);
addCommonProps( result, serverNode );
return result;
}
private static ExecuteData addCommonProps( ExecuteData result, CommandLine cmdLine ) {
result.executable =cmdLine.getExecutable();
result.arguments = Arrays.asList(cmdLine.getArguments());
return result;
}
private static ExecuteData addCommonProps( ExecuteData result, ServerNode serverNode ){
result.serverNodeId = String.valueOf(serverNode.getId());
result.cloudifyHome = ApplicationContext.get().conf().server.environment.cloudifyHome;
result.managerIp = serverNode.getPublicIP();
// add application name and service for mail sending
if ( serverNode.getWidget() != null && serverNode.getWidget().sendEmail && !StringUtils.isEmptyOrSpaces(serverNode.getWidget().loginsString) ) {
logger.info("adding properties for sending email");
try {
result.serviceName = serverNode.getWidget().getConsoleUrlService();
result.applicationName = serverNode.getWidget().getRecipeName();
result.mandrill.apiKey = serverNode.getWidget().mandrillDetails.apiKey;
result.mandrill.templateName = serverNode.getWidget().mandrillDetails.templateName;
result.mandrill.data.name.setContent( serverNode.widgetInstanceUserDetails.name + " " + serverNode.widgetInstanceUserDetails.lastName );
result.mandrill.data.firstName.setContent( serverNode.widgetInstanceUserDetails.name );
result.mandrill.data.lastName.setContent(serverNode.widgetInstanceUserDetails.lastName);
result.mandrill.data.link.setContent( serverNode.getWidget().getConsoleURL() );
result.mandrill.data.linkTitle.setContent(serverNode.getWidget().getConsoleName());
result.mandrill.to.add(
new ExecuteData.MandrillEmailAddressItem(serverNode.widgetInstanceUserDetails.getEmail(), serverNode.widgetInstanceUserDetails.getName() , "to")
);
String csvBccEmails = serverNode.getWidget().mandrillDetails.csvBccEmails;
if (!StringUtils.isEmptyOrSpaces(csvBccEmails)) {
for (String item : csvBccEmails.split(",")) {
if (!StringUtils.isEmptyOrSpaces(item)) {
result.mandrill.to.add(new ExecuteData.MandrillEmailAddressItem(item, "bcc address", "bcc"));
}
}
}
result.sendEmail = serverNode.getWidget().sendEmail;
}catch(Exception e){
logger.info("error while trying to set properties for sending email");
}
}
return result;
}
public IAsyncExecutionDetails getExecutionDetails( ServerNode serverNode, String action ){
IAsyncExecutionDetails details = new AsyncExecutionDetails();
details.setNewScriptsDir( conf.asyncExecution.newScriptsDir);
String nodeId = String.valueOf(serverNode.getId());
details.setTaskFile( new File(conf.asyncExecution.newScriptsDir, String.format("%s_%s.json", nodeId, action)));
details.setOutputFile( new File(conf.asyncExecution.executingScriptsDir, String.format("%s/output.log", nodeId)));
details.setStatusFile( new File(conf.asyncExecution.executingScriptsDir, String.format("%s/%s.status", nodeId,action)));
return details;
}
// String outputFileName = EXECUTING_SCRIPTS_FOLDER_PATH +
// nodeId + File.separator + "output.log";
public Conf getConf() {
return conf;
}
public void setConf(Conf conf) {
this.conf = conf;
}
}