/** * ***************************************************************************** * * Copyright (c) 2013, Oracle Corporation * * All rights reserved. This program and the accompanying materials are made * available under the terms of the Eclipse Public License v1.0 which * accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * * Winston Prakash, Kohsuke Kawaguchi * ****************************************************************************** */ package hudson.init; import static hudson.init.InitMilestone.JOB_LOADED; import hudson.model.Hudson; import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.io.StringWriter; import java.net.URL; import java.util.Arrays; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.eclipse.hudson.script.ScriptSupport; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class InitScriptsExecutor { private static Logger logger = LoggerFactory.getLogger(InitScriptsExecutor.class); @Initializer(after=JOB_LOADED) public static void init(Hudson hudson) throws IOException { URL bundledInitScript = hudson.servletContext.getResource("/WEB-INF/init.groovy"); if (bundledInitScript != null) { logger.info("Executing bundled init script: " + bundledInitScript); InputStream in = bundledInitScript.openStream(); try { String script = IOUtils.toString(in); logger.info(new Script(script).execute()); } finally { IOUtils.closeQuietly(in); } } File initScript = new File(hudson.getRootDir(), "init.groovy"); if (initScript.exists()) { execute(initScript); } File initScriptD = new File(hudson.getRootDir(), "init.groovy.d"); if (initScriptD.isDirectory()) { File[] scripts = initScriptD.listFiles(new FileFilter() { @Override public boolean accept(File f) { return f.getName().endsWith(".groovy"); } }); if (scripts != null) { // sort to run them in a deterministic order Arrays.sort(scripts); for (File f : scripts) { execute(f); } } } } private static void execute(File initScript) throws IOException { logger.info("Executing " + initScript); String script = FileUtils.readFileToString(initScript); logger.info(new Script(script).execute()); } private static final class Script { private final String script; private transient ClassLoader parentClassLoader; private ScriptSupport scriptSupport; private Script(String script) { this(script, ScriptSupport.SCRIPT_GROOVY); } private Script(String script, String scriptType) { this.script = script; parentClassLoader = getClassLoader(); if (scriptType != null) { for (ScriptSupport scriptSupport : ScriptSupport.getAvailableScriptSupports()) { if (scriptSupport.hasSupport(scriptType)) { this.scriptSupport = scriptSupport; } } } } private Script(String script, ScriptSupport scriptSupport) { this(script); this.scriptSupport = scriptSupport; } public ClassLoader getClassLoader() { return Hudson.getInstance().getPluginManager().uberClassLoader; } public String execute() throws RuntimeException { if (scriptSupport != null) { StringWriter out = new StringWriter(); PrintWriter printWriter = new PrintWriter(out); scriptSupport.evaluate(parentClassLoader, script, null, printWriter); return out.toString(); } else { return "No script support to execute the script. Install script support plugin"; } } } }