From 7723cd7e9c085abcbec9029e8866b8863085ae92 Mon Sep 17 00:00:00 2001 From: kohsuke Date: Sun, 18 May 2008 22:10:37 +0000 Subject: [PATCH] extension points shouldn't depend on implementation detail class, so promoted ComputerImpl to SlaveComputer. git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@9402 71c3de6d-444a-0410-be80-ed276b4c234a --- .../java/hudson/TcpSlaveAgentListener.java | 4 +- core/src/main/java/hudson/model/Slave.java | 252 +--------------- .../hudson/slaves/CommandStartMethod.java | 3 +- .../java/hudson/slaves/JNLPStartMethod.java | 3 +- .../slaves/SlaveAvailabilityStrategy.java | 38 +-- .../java/hudson/slaves/SlaveComputer.java | 281 ++++++++++++++++++ .../hudson/slaves/SlaveReconnectionWork.java | 16 +- .../java/hudson/slaves/SlaveStartMethod.java | 6 +- .../slaves/SlaveComputer/disconnect.jelly | 12 + .../hudson/slaves/SlaveComputer/log.jelly | 14 + .../slaves/SlaveComputer/sidepanel.jelly | 20 ++ .../SlaveComputer/sidepanel_fr.properties | 6 + .../SlaveComputer/sidepanel_ja.properties | 6 + .../SlaveComputer/sidepanel_nl.properties | 6 + .../SlaveComputer/sidepanel_pt_BR.properties | 6 + .../SlaveComputer/sidepanel_ru.properties | 6 + .../SlaveComputer/sidepanel_tr.properties | 6 + .../SlaveComputer/slave-agent.jnlp.jelly | 47 +++ .../slaves/SlaveComputer/systemInfo.jelly | 24 ++ 19 files changed, 473 insertions(+), 283 deletions(-) create mode 100644 core/src/main/java/hudson/slaves/SlaveComputer.java create mode 100644 core/src/main/resources/hudson/slaves/SlaveComputer/disconnect.jelly create mode 100644 core/src/main/resources/hudson/slaves/SlaveComputer/log.jelly create mode 100644 core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel.jelly create mode 100644 core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_fr.properties create mode 100644 core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_ja.properties create mode 100644 core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_nl.properties create mode 100644 core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_pt_BR.properties create mode 100644 core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_ru.properties create mode 100644 core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_tr.properties create mode 100644 core/src/main/resources/hudson/slaves/SlaveComputer/slave-agent.jnlp.jelly create mode 100644 core/src/main/resources/hudson/slaves/SlaveComputer/systemInfo.jelly diff --git a/core/src/main/java/hudson/TcpSlaveAgentListener.java b/core/src/main/java/hudson/TcpSlaveAgentListener.java index 8fe3a1ec0f..b0aa3527b0 100644 --- a/core/src/main/java/hudson/TcpSlaveAgentListener.java +++ b/core/src/main/java/hudson/TcpSlaveAgentListener.java @@ -1,7 +1,7 @@ package hudson; import hudson.model.Hudson; -import hudson.model.Slave.ComputerImpl; +import hudson.slaves.SlaveComputer; import hudson.remoting.Channel; import hudson.remoting.Channel.Listener; @@ -159,7 +159,7 @@ public class TcpSlaveAgentListener extends Thread { } String nodeName = in.readUTF(); - ComputerImpl computer = (ComputerImpl) Hudson.getInstance().getComputer(nodeName); + SlaveComputer computer = (SlaveComputer) Hudson.getInstance().getComputer(nodeName); if(computer==null) { error(out, "No such slave: "+nodeName); return; diff --git a/core/src/main/java/hudson/model/Slave.java b/core/src/main/java/hudson/model/Slave.java index dc1c5be29e..58c0175cde 100644 --- a/core/src/main/java/hudson/model/Slave.java +++ b/core/src/main/java/hudson/model/Slave.java @@ -8,38 +8,25 @@ import hudson.slaves.SlaveStartMethod; import hudson.slaves.SlaveAvailabilityStrategy; import hudson.slaves.CommandStartMethod; import hudson.slaves.JNLPStartMethod; -import hudson.maven.agent.Main; -import hudson.maven.agent.PluginManagerInterceptor; +import hudson.slaves.SlaveComputer; import hudson.model.Descriptor.FormException; import hudson.remoting.Callable; -import hudson.remoting.Channel; -import hudson.remoting.Channel.Listener; import hudson.remoting.VirtualChannel; -import hudson.remoting.Which; import hudson.tasks.DynamicLabeler; import hudson.tasks.LabelFinder; import hudson.util.ClockDifference; -import hudson.util.NullStream; import hudson.util.RingBufferLogHandler; -import hudson.util.StreamTaskListener; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import javax.servlet.ServletException; -import javax.servlet.http.HttpServletResponse; import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; -import java.io.PrintWriter; import java.io.Serializable; import java.net.URL; import java.net.URLConnection; import java.util.*; -import java.util.logging.Level; -import java.util.logging.LogRecord; import java.util.logging.Logger; /** @@ -262,7 +249,7 @@ public final class Slave implements Node, Serializable { } public Computer createComputer() { - return new ComputerImpl(this); + return new SlaveComputer(this); } public FilePath getWorkspaceFor(TopLevelItem item) { @@ -292,219 +279,6 @@ public final class Slave implements Node, Serializable { return r.child("workspace"); } - public static final class ComputerImpl extends Computer { - private volatile Channel channel; - private Boolean isUnix; - /** - * Number of failed attempts to reconnect to this node - * (so that if we keep failing to reconnect, we can stop - * trying.) - */ - private transient int numRetryAttempt; - - /** - * This is where the log from the remote agent goes. - */ - private File getLogFile() { - return new File(Hudson.getInstance().getRootDir(),"slave-"+nodeName+".log"); - } - - private ComputerImpl(Slave slave) { - super(slave); - } - - public Slave getNode() { - return (Slave)super.getNode(); - } - - @Override - @Deprecated - public boolean isJnlpAgent() { - return getNode().getStartMethod() instanceof JNLPStartMethod; - } - - @Override - public boolean isLaunchSupported() { - return getNode().getStartMethod().isLaunchSupported(); - } - - /** - * Launches a remote agent asynchronously. - */ - private void launch(final Slave slave) { - closeChannel(); - Computer.threadPoolForRemoting.execute(new Runnable() { - public void run() { - // do this on another thread so that the lengthy launch operation - // (which is typical) won't block UI thread. - slave.startMethod.launch(ComputerImpl.this, new StreamTaskListener(openLogFile())); - } - }); - } - - public OutputStream openLogFile() { - OutputStream os; - try { - os = new FileOutputStream(getLogFile()); - } catch (FileNotFoundException e) { - logger.log(Level.SEVERE, "Failed to create log file "+getLogFile(),e); - os = new NullStream(); - } - return os; - } - - private final Object channelLock = new Object(); - - /** - * Creates a {@link Channel} from the given stream and sets that to this slave. - */ - public void setChannel(InputStream in, OutputStream out, OutputStream launchLog, Listener listener) throws IOException, InterruptedException { - synchronized(channelLock) { - if(this.channel!=null) - throw new IllegalStateException("Already connected"); - - Channel channel = new Channel(nodeName,threadPoolForRemoting, Channel.Mode.NEGOTIATE, - in,out, launchLog); - channel.addListener(new Listener() { - public void onClosed(Channel c,IOException cause) { - ComputerImpl.this.channel = null; - } - }); - channel.addListener(listener); - - PrintWriter log = new PrintWriter(launchLog,true); - - {// send jars that we need for our operations - // TODO: maybe I should generalize this kind of "post initialization" processing - FilePath dst = new FilePath(channel,getNode().getRemoteFS()); - new FilePath(Which.jarFile(Main.class)).copyTo(dst.child("maven-agent.jar")); - log.println("Copied maven-agent.jar"); - new FilePath(Which.jarFile(PluginManagerInterceptor.class)).copyTo(dst.child("maven-interceptor.jar")); - log.println("Copied maven-interceptor.jar"); - } - - isUnix = channel.call(new DetectOS()); - log.println(isUnix?Messages.Slave_UnixSlave():Messages.Slave_WindowsSlave()); - - // install log handler - channel.call(new LogInstaller()); - - numRetryAttempt = 0; - - // prevent others from seeing a channel that's not properly initialized yet - this.channel = channel; - } - Hudson.getInstance().getQueue().scheduleMaintenance(); - } - - @Override - public VirtualChannel getChannel() { - return channel; - } - - public List getLogRecords() throws IOException, InterruptedException { - if(channel==null) - return Collections.emptyList(); - else - return channel.call(new Callable,RuntimeException>() { - public List call() { - return new ArrayList(SLAVE_LOG_HANDLER.getView()); - } - }); - } - - public void doDoDisconnect(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { - Hudson.getInstance().checkPermission(Hudson.ADMINISTER); - closeChannel(); - rsp.sendRedirect("."); - } - - public void doLaunchSlaveAgent(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { - if(channel!=null) { - rsp.sendError(HttpServletResponse.SC_NOT_FOUND); - return; - } - - launch(); - - // TODO: would be nice to redirect the user to "launching..." wait page, - // then spend a few seconds there and poll for the completion periodically. - rsp.sendRedirect("log"); - } - - public void tryReconnect() { - numRetryAttempt++; - if(numRetryAttempt<6 || (numRetryAttempt%12)==0) { - // initially retry several times quickly, and after that, do it infrequently. - logger.info("Attempting to reconnect "+nodeName); - launch(); - } - } - - public void launch() { - if(channel==null) - launch(getNode()); - } - - /** - * Gets the string representation of the slave log. - */ - public String getLog() throws IOException { - return Util.loadFile(getLogFile()); - } - - /** - * Handles incremental log. - */ - public void doProgressiveLog( StaplerRequest req, StaplerResponse rsp) throws IOException { - new LargeText(getLogFile(),false).doProgressText(req,rsp); - } - - /** - * Serves jar files for JNLP slave agents. - */ - public JnlpJar getJnlpJars(String fileName) { - return new JnlpJar(fileName); - } - - @Override - protected void kill() { - super.kill(); - closeChannel(); - } - - /** - * If still connected, disconnect. - */ - private void closeChannel() { - Channel c = channel; - channel = null; - isUnix=null; - if(c!=null) - try { - c.close(); - } catch (IOException e) { - logger.log(Level.SEVERE, "Failed to terminate channel to "+getDisplayName(),e); - } - } - - @Override - protected void setNode(Node node) { - super.setNode(node); - if(channel==null) - // maybe the configuration was changed to relaunch the slave, so try it now. - launch((Slave)node); - } - - private static final Logger logger = Logger.getLogger(ComputerImpl.class.getName()); - - private static final class DetectOS implements Callable { - public Boolean call() throws IOException { - return File.pathSeparatorChar==':'; - } - } - } - /** * Web-bound object used to serve jar files for JNLP. */ @@ -531,15 +305,15 @@ public final class Slave implements Node, Serializable { } public Launcher createLauncher(TaskListener listener) { - ComputerImpl c = getComputer(); + SlaveComputer c = getComputer(); return new RemoteLauncher(listener, c.getChannel(), c.isUnix); } /** * Gets the corresponding computer object. */ - public ComputerImpl getComputer() { - return (ComputerImpl)Hudson.getInstance().getComputer(this); + public SlaveComputer getComputer() { + return (SlaveComputer)Hudson.getInstance().getComputer(this); } public Computer toComputer() { @@ -576,22 +350,6 @@ public final class Slave implements Node, Serializable { return this; } - /** - * This field is used on each slave node to record log records on the slave. - */ - private static final RingBufferLogHandler SLAVE_LOG_HANDLER = new RingBufferLogHandler(); - - private static class LogInstaller implements Callable { - public Void call() { - // avoid double installation of the handler - Logger logger = Logger.getLogger("hudson"); - logger.removeHandler(SLAVE_LOG_HANDLER); - logger.addHandler(SLAVE_LOG_HANDLER); - return null; - } - private static final long serialVersionUID = 1L; - } - // // backwrad compatibility // diff --git a/core/src/main/java/hudson/slaves/CommandStartMethod.java b/core/src/main/java/hudson/slaves/CommandStartMethod.java index 7d7d5d6e25..137c087045 100644 --- a/core/src/main/java/hudson/slaves/CommandStartMethod.java +++ b/core/src/main/java/hudson/slaves/CommandStartMethod.java @@ -2,7 +2,6 @@ package hudson.slaves; import org.kohsuke.stapler.DataBoundConstructor; import hudson.model.Descriptor; -import hudson.model.Slave; import hudson.model.Messages; import hudson.util.StreamTaskListener; import hudson.util.ProcessTreeKiller; @@ -56,7 +55,7 @@ public class CommandStartMethod extends SlaveStartMethod { return String.format("[%1$tD %1$tT]", new Date()); } - public void launch(Slave.ComputerImpl computer, final StreamTaskListener listener) { + public void launch(SlaveComputer computer, final StreamTaskListener listener) { try { listener.getLogger().println(Messages.Slave_Launching(getTimestamp())); listener.getLogger().println("$ " + getCommand()); diff --git a/core/src/main/java/hudson/slaves/JNLPStartMethod.java b/core/src/main/java/hudson/slaves/JNLPStartMethod.java index 744d2baec6..7cddb0137f 100644 --- a/core/src/main/java/hudson/slaves/JNLPStartMethod.java +++ b/core/src/main/java/hudson/slaves/JNLPStartMethod.java @@ -1,7 +1,6 @@ package hudson.slaves; import hudson.model.Descriptor; -import hudson.model.Slave; import hudson.util.StreamTaskListener; import org.kohsuke.stapler.DataBoundConstructor; @@ -21,7 +20,7 @@ public class JNLPStartMethod extends SlaveStartMethod { return false; } - public void launch(Slave.ComputerImpl computer, StreamTaskListener listener) { + public void launch(SlaveComputer computer, StreamTaskListener listener) { // do nothing as we cannot self start } diff --git a/core/src/main/java/hudson/slaves/SlaveAvailabilityStrategy.java b/core/src/main/java/hudson/slaves/SlaveAvailabilityStrategy.java index 304266a280..73339ea245 100644 --- a/core/src/main/java/hudson/slaves/SlaveAvailabilityStrategy.java +++ b/core/src/main/java/hudson/slaves/SlaveAvailabilityStrategy.java @@ -1,12 +1,11 @@ package hudson.slaves; -import hudson.util.DescriptorList; import hudson.ExtensionPoint; import hudson.model.Describable; -import hudson.model.Slave; import hudson.model.Descriptor; -import org.kohsuke.stapler.StaplerRequest; -import net.sf.json.JSONObject; +import hudson.model.Slave; +import hudson.util.DescriptorList; +import org.kohsuke.stapler.DataBoundConstructor; /** * Slave availability strategy @@ -22,12 +21,7 @@ public abstract class SlaveAvailabilityStrategy implements Describable getDescriptor() { return DESCRIPTOR; } - public static final Descriptor DESCRIPTOR = - new DescriptorImpl(); + public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl(); private static class DescriptorImpl extends Descriptor { public DescriptorImpl() { @@ -71,12 +77,6 @@ public abstract class SlaveAvailabilityStrategy implements Describable getLogRecords() throws IOException, InterruptedException { + if(channel==null) + return Collections.emptyList(); + else + return channel.call(new Callable,RuntimeException>() { + public List call() { + return new ArrayList(SLAVE_LOG_HANDLER.getView()); + } + }); + } + + public void doDoDisconnect(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { + Hudson.getInstance().checkPermission(Hudson.ADMINISTER); + closeChannel(); + rsp.sendRedirect("."); + } + + public void doLaunchSlaveAgent(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { + if(channel!=null) { + rsp.sendError(HttpServletResponse.SC_NOT_FOUND); + return; + } + + launch(); + + // TODO: would be nice to redirect the user to "launching..." wait page, + // then spend a few seconds there and poll for the completion periodically. + rsp.sendRedirect("log"); + } + + public void tryReconnect() { + numRetryAttempt++; + if(numRetryAttempt<6 || (numRetryAttempt%12)==0) { + // initially retry several times quickly, and after that, do it infrequently. + logger.info("Attempting to reconnect "+nodeName); + launch(); + } + } + + public void launch() { + if(channel==null) + launch(getNode()); + } + + /** + * Gets the string representation of the slave log. + */ + public String getLog() throws IOException { + return Util.loadFile(getLogFile()); + } + + /** + * Handles incremental log. + */ + public void doProgressiveLog( StaplerRequest req, StaplerResponse rsp) throws IOException { + new LargeText(getLogFile(),false).doProgressText(req,rsp); + } + + /** + * Serves jar files for JNLP slave agents. + */ + public Slave.JnlpJar getJnlpJars(String fileName) { + return new Slave.JnlpJar(fileName); + } + + @Override + protected void kill() { + super.kill(); + closeChannel(); + } + + /** + * If still connected, disconnect. + */ + private void closeChannel() { + Channel c = channel; + channel = null; + isUnix=null; + if(c!=null) + try { + c.close(); + } catch (IOException e) { + logger.log(Level.SEVERE, "Failed to terminate channel to "+getDisplayName(),e); + } + } + + @Override + protected void setNode(Node node) { + super.setNode(node); + if(channel==null) + // maybe the configuration was changed to relaunch the slave, so try it now. + launch((Slave)node); + } + + private static final Logger logger = Logger.getLogger(SlaveComputer.class.getName()); + + private static final class DetectOS implements Callable { + public Boolean call() throws IOException { + return File.pathSeparatorChar==':'; + } + } + + /** + * This field is used on each slave node to record log records on the slave. + */ + private static final RingBufferLogHandler SLAVE_LOG_HANDLER = new RingBufferLogHandler(); + + private static class LogInstaller implements Callable { + public Void call() { + // avoid double installation of the handler + Logger logger = Logger.getLogger("hudson"); + logger.removeHandler(SLAVE_LOG_HANDLER); + logger.addHandler(SLAVE_LOG_HANDLER); + return null; + } + private static final long serialVersionUID = 1L; + } +} diff --git a/core/src/main/java/hudson/slaves/SlaveReconnectionWork.java b/core/src/main/java/hudson/slaves/SlaveReconnectionWork.java index 9aca9d4c52..dfdb68cc03 100644 --- a/core/src/main/java/hudson/slaves/SlaveReconnectionWork.java +++ b/core/src/main/java/hudson/slaves/SlaveReconnectionWork.java @@ -1,8 +1,8 @@ package hudson.slaves; +import hudson.model.Computer; import hudson.model.Hudson; import hudson.model.Queue; -import hudson.model.Slave; import hudson.triggers.SafeTimerTask; import java.util.Map; @@ -15,23 +15,23 @@ import java.util.WeakHashMap; */ public class SlaveReconnectionWork extends SafeTimerTask { /** - * Use weak hash map to avoid leaking {@link Slave}. + * Use weak hash map to avoid leaking {@link Computer}. */ - private final Map nextCheck = new WeakHashMap(); + private final Map nextCheck = new WeakHashMap(); protected void doRun() { final Queue queue = Hudson.getInstance().getQueue(); - for (Slave s : Hudson.getInstance().getSlaves()) { - if (!nextCheck.containsKey(s) || System.currentTimeMillis() > nextCheck.get(s)) { - boolean hasJob = !s.getComputer().isIdle(); + for (Computer c : Hudson.getInstance().getComputers()) { + if (!nextCheck.containsKey(c) || System.currentTimeMillis() > nextCheck.get(c)) { + boolean hasJob = !c.isIdle(); // TODO get only the items from the queue that can apply to this slave SlaveAvailabilityStrategy.State state = new SlaveAvailabilityStrategy.State(queue.getItems().length > 0, hasJob); // at the moment I don't trust strategies to wait more than 60 minutes // strategies need to wait at least one minute - final long waitInMins = Math.min(1, Math.max(60, s.getAvailabilityStrategy().check(s, state))); - nextCheck.put(s, System.currentTimeMillis() + 60 * 1000 * waitInMins); + final long waitInMins = Math.min(1, Math.max(60, c.getAvailabilityStrategy().check(c, state))); + nextCheck.put(c, System.currentTimeMillis() + 60 * 1000 * waitInMins); } } } diff --git a/core/src/main/java/hudson/slaves/SlaveStartMethod.java b/core/src/main/java/hudson/slaves/SlaveStartMethod.java index 5051174ab1..aa85a2834b 100644 --- a/core/src/main/java/hudson/slaves/SlaveStartMethod.java +++ b/core/src/main/java/hudson/slaves/SlaveStartMethod.java @@ -1,7 +1,7 @@ package hudson.slaves; import hudson.ExtensionPoint; -import hudson.model.Slave.ComputerImpl; +import hudson.slaves.SlaveComputer; import hudson.model.Describable; import hudson.model.Computer; import hudson.remoting.Channel.Listener; @@ -30,7 +30,7 @@ public abstract class SlaveStartMethod implements Describable, * Launches the slave agent for the given {@link Computer}. * *

- * If the slave agent is launched successfully, {@link ComputerImpl#setChannel(InputStream, OutputStream, OutputStream, Listener)} + * If the slave agent is launched successfully, {@link SlaveComputer#setChannel(InputStream, OutputStream, OutputStream, Listener)} * should be invoked in the end to notify Hudson of the established connection. * The operation could also fail, in which case there's no need to make any callback notification, * (except to notify the user of the failure through {@link StreamTaskListener}.) @@ -38,7 +38,7 @@ public abstract class SlaveStartMethod implements Describable, * @param listener * The progress of the launch, as well as any error, should be sent to this listener. */ - public abstract void launch(ComputerImpl computer, StreamTaskListener listener); + public abstract void launch(SlaveComputer computer, StreamTaskListener listener); /** * All registered {@link SlaveStartMethod} implementations. diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/disconnect.jelly b/core/src/main/resources/hudson/slaves/SlaveComputer/disconnect.jelly new file mode 100644 index 0000000000..96f8105766 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/disconnect.jelly @@ -0,0 +1,12 @@ + + + + + +

+ Are you sure about disconnecting? + + + + + diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/log.jelly b/core/src/main/resources/hudson/slaves/SlaveComputer/log.jelly new file mode 100644 index 0000000000..cdaa290940 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/log.jelly @@ -0,0 +1,14 @@ + + + + + +

+        
+ +
+ +
+
+
+
diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel.jelly b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel.jelly new file mode 100644 index 0000000000..970ec5d257 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel.jelly @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_fr.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_fr.properties new file mode 100644 index 0000000000..50e7d1b7e3 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_fr.properties @@ -0,0 +1,6 @@ +Back\ to\ List=Retour à la liste +Status=Statut +Build\ History=Historique des builds +Log= +System\ Information=Information système +Disconnect=Déconnection diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_ja.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_ja.properties new file mode 100644 index 0000000000..a7bd95975c --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_ja.properties @@ -0,0 +1,6 @@ +Back\ to\ List=\u30ea\u30b9\u30c8\u3078\u623b\u308b +Status=\u72b6\u614b +Build\ History=\u30d3\u30eb\u30c9\u5c65\u6b74 +Log=\u30ed\u30b0 +System\ Information=\u30b7\u30b9\u30c6\u30e0\u60c5\u5831 +Disconnect=\u5207\u65ad diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_nl.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_nl.properties new file mode 100644 index 0000000000..ccd689b7b1 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_nl.properties @@ -0,0 +1,6 @@ +Back\ to\ List=Terug naar de lijst +Status=Status +Build\ History=Overzicht bouwpogingen +Log=Log +System\ Information=Systeeminformatie +Disconnect=Loskoppelen diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_pt_BR.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_pt_BR.properties new file mode 100644 index 0000000000..2122c67a33 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_pt_BR.properties @@ -0,0 +1,6 @@ +Back\ to\ List=Voltar para a Lista +Status=Estado +Build\ History=Hist\u00F3rico de Constru\u00E7\u00F5es +Log= +System\ Information=Informa\u00E7\u00F5es do Sistema +Disconnect=Desconectar diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_ru.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_ru.properties new file mode 100644 index 0000000000..4f9ebfac11 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_ru.properties @@ -0,0 +1,6 @@ +Back\ to\ List=\u0412\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u0441\u043f\u0438\u0441\u043a\u0443 +Status=\u0421\u0442\u0430\u0442\u0443\u0441 +Build\ History=\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0441\u0431\u043e\u0440\u043e\u043a +Log=\u0416\u0443\u0440\u043d\u0430\u043b +System\ Information=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0435 +Disconnect=\u041e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_tr.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_tr.properties new file mode 100644 index 0000000000..60fbfeae5b --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_tr.properties @@ -0,0 +1,6 @@ +Back\ to\ List=Listeye D\u00f6n +Status=Durum +Build\ History=Yap\u0131land\u0131rma Ge\u00e7mi\u015fi +Log=Log +System\ Information=Sistem Bilgisi +Disconnect=Ba\u011flant\u0131y\u0131 Kes diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/slave-agent.jnlp.jelly b/core/src/main/resources/hudson/slaves/SlaveComputer/slave-agent.jnlp.jelly new file mode 100644 index 0000000000..c68ed0c3f4 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/slave-agent.jnlp.jelly @@ -0,0 +1,47 @@ + + + + + + + + + + + + Slave Agent for ${it.displayName} + Hudson project + + + + + + + + + + + + + + + + + + + + + + + ${request.serverName} + ${rootURL}/tcpSlaveAgentListener/ + ${app.secretKey} + ${it.node.nodeName} + + + + diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/systemInfo.jelly b/core/src/main/resources/hudson/slaves/SlaveComputer/systemInfo.jelly new file mode 100644 index 0000000000..945f16dd46 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/systemInfo.jelly @@ -0,0 +1,24 @@ + + + + + + + +

System Properties

+ +

Environment Variables

+ +

Thread Dump

+ +

${t.key}

+
${t.value}
+
+
+
+
+
-- GitLab