VirtualChannel start(TaskListener listener, String rootPassword) throws IOException, InterruptedException { final int uid = LIBC.geteuid(); if(uid==0) // already running as root return newLocalChannel(); String javaExe = System.getProperty("java.home") + "/bin/java"; File slaveJar = Which.jarFile(Launcher.class); ArgumentListBuilder args = new ArgumentListBuilder().add(javaExe); if(slaveJar.isFile()) args.add("-jar").add(slaveJar); else // in production code this never happens, but during debugging this is convenient args.add("-cp").add(slaveJar).add(hudson.remoting.Launcher.class.getName()); if(rootPassword==null) { // try sudo, in the hope that the user has the permission to do so without password return new LocalLauncher(listener).launchChannel( args.prepend(sudoExe()).toCommandArray(), listener.getLogger(), null, Collections.<String, String>emptyMap()); } else { // try sudo with the given password. Also run in pfexec so that we can elevate the privileges Process proc = sudoWithPass(args); return Channels.forProcess(args.toStringWithQuote(), Computer.threadPoolForRemoting, proc, listener.getLogger() ); } } }
protected Process sudoWithPass(ArgumentListBuilder args) throws IOException { args.prepend(sudoExe(),"-S"); listener.getLogger().println("$ "+Util.join(args.toList()," ")); ProcessBuilder pb = new ProcessBuilder(args.toCommandArray()); Process p = pb.start(); // TODO: use -p to detect prompt // TODO: detect if the password didn't work PrintStream ps = new PrintStream(p.getOutputStream()); ps.println(rootPassword); ps.println(rootPassword); ps.println(rootPassword); return p; } }.start(listener,rootPassword);
ArgumentListBuilder args = new ArgumentListBuilder(); MavenInstallation mi = getMaven(); if(mi==null) { String execName = build.getWorkspace().act(new DecideDefaultMavenCommand(normalizedTarget)); args.add(execName); } else { mi = mi.forNode(Computer.currentComputer().getNode(), listener); args.add(exec); args.add("-f",pom); String settingsPath = SettingsProvider.getSettingsRemotePath(getSettings(), build, listener); if(StringUtils.isNotBlank(settingsPath)){ args.add("-s", settingsPath); String settingsPath = GlobalSettingsProvider.getSettingsRemotePath(getGlobalSettings(), build, listener); if(StringUtils.isNotBlank(settingsPath)){ args.add("-gs", settingsPath); args.addKeyValuePairs("-D", build.getBuildVariables(), sensitiveVars); args.addKeyValuePairsFromPropertyString("-D", this.properties, resolver, sensitiveVars); args.add("-Dmaven.repo.local=" + build.getWorkspace().child(".repository")); args.addTokenized(normalizedTarget); wrapUpArguments(args,normalizedTarget,build,launcher,listener); if (!launcher.isUnix()) {
public ProcStarter cmds(ArgumentListBuilder args) { commands = args.toList(); masks = args.toMaskArray(); return this; }
public ArgumentListBuilder toFullArguments() { ArgumentListBuilder args = new ArgumentListBuilder(); args.add(new File(System.getProperty("java.home"),"bin/java")); // TODO: if we are to support a remote launch, JVM would be on a different path. args.addKeyValuePairs("-D",systemProperties); args.add("-cp").add(classpath.toString()); args.add(this.vmopts.toCommandArray()); args.add(mainClass); args.add(this.args.toCommandArray()); return args; }
@Override public boolean checkImageExists(TaskListener listener, String image) throws IOException, InterruptedException { ArgumentListBuilder args = new ArgumentListBuilder() .add("inspect") .add("-f", "'{{.Id}}'") .add(image); ByteArrayOutputStream out = new ByteArrayOutputStream(); Launcher launcher = new Launcher.LocalLauncher(listener); return launchDockerCLI(launcher, args) .stdout(out).stderr(launcher.getListener().getLogger()).join() == 0; }
/** * Runs the command and captures the output. */ public String popen(FilePath repository, TaskListener listener, boolean useTimeout, ArgumentListBuilder args) throws IOException, InterruptedException { args = seed(false).add(args.toCommandArray()); ByteArrayOutputStream rev = new ByteArrayOutputStream(); if (MercurialSCM.joinWithPossibleTimeout(l(args).pwd(repository).stdout(rev), useTimeout, listener) == 0) { return rev.toString(); } else { listener.error("Failed to run " + args.toStringWithQuote()); listener.getLogger().write(rev.toByteArray()); throw new AbortException(); } }
public Reader lsactivity(String activity, String commandFormat, String viewPath) throws IOException, InterruptedException { ArgumentListBuilder cmd = new ArgumentListBuilder(); cmd.add("lsactivity"); cmd.add("-fmt", commandFormat); cmd.add(activity); // changed the path from workspace to getRootViewPath to make Dynamic UCM work FilePath filePath = getRootViewPath(launcher).child(viewPath); ByteArrayOutputStream baos = new ByteArrayOutputStream(); launcher.run(cmd.toCommandArray(), null, baos, filePath); InputStreamReader reader = new InputStreamReader(new ByteArrayInputStream(baos.toByteArray())); baos.close(); return reader; }
private String getMavenVersionFromConsole() throws Exception { ArgumentListBuilder args = new ArgumentListBuilder(); args.add(getExecutable()); args.add("--version"); EnvVars env = new EnvVars(); maybyPut(JAVA_HOME, buildEnv, env); env.put(M2_HOME, getHome().getRemote()); env.put(MAVEN_SKIP_RC, TRUE); ByteArrayOutputStream buffer = new ByteArrayOutputStream(); Proc process = launcher.launch() .cmds(args) .envs(env) .pwd(build.getWorkspace()) .stdout(buffer) .start(); String output = new String(buffer.toByteArray()); if (muxlog.isTraceEnabled()) { muxlog.trace("Process output:\n{}", output);
public List<String> lsvob(boolean onlyMounted) throws IOException, InterruptedException { viewListPattern = getListPattern(); ArgumentListBuilder cmd = new ArgumentListBuilder(); cmd.add("lsvob"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); if (launcher.run(cmd.toCommandArray(), null, baos, null)) { return parseListOutput(new InputStreamReader(new ByteArrayInputStream(baos.toByteArray())), onlyMounted); } return new ArrayList<String>(); }
public boolean pullImage(String image) throws IOException, InterruptedException { ArgumentListBuilder args = dockerCommand() .add("pull", image); OutputStream out = verbose ? listener.getLogger() : new ByteArrayOutputStream(); OutputStream err = verbose ? listener.getLogger() : new ByteArrayOutputStream(); int status = launcher.launch() .envs(getEnvVars()) .cmds(args) .stdout(out).stderr(err).join(); return status == 0; }
public EnvVars getEnv(String container, Launcher launcher) throws IOException, InterruptedException { final ArgumentListBuilder args = dockerCommand() .add("exec") .add("--tty") .add(container) .add("env"); final ByteArrayOutputStream out = new ByteArrayOutputStream(); int status = launcher.launch() .envs(getEnvVars()) .cmds(args) .stdout(out).quiet(!verbose).stderr(listener.getLogger()).join(); if (status != 0) { throw new RuntimeException("Failed to retrieve container's environment"); } EnvVars env = new EnvVars(); LineIterator it = new LineIterator(new StringReader(out.toString())); while (it.hasNext()) { env.addLine(it.nextLine()); } return env; }
public void mkstream(String parentStream, String stream) throws IOException, InterruptedException { ArgumentListBuilder cmd = new ArgumentListBuilder(); cmd.add("mkstream"); cmd.add("-in"); cmd.add(parentStream); cmd.add(stream); ByteArrayOutputStream baos = new ByteArrayOutputStream(); launcher.run(cmd.toCommandArray(), null, baos, null); baos.close(); }
@Override public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { ArgumentListBuilder args = new ArgumentListBuilder(); String execName = "msbuild.exe"; MsBuildInstallation ai = getMsBuild(); args.add(execName); } else { EnvVars env = build.getEnvironment(listener); args.add(pathToMsBuild); args.add(tokenizeArgs(ai.getDefaultArgs())); args.add(tokenizeArgs(normalizedArgs)); args.add(parameters.toString()); normalizedFile = Util.replaceMacro(normalizedFile, build.getBuildVariables()); if (normalizedFile.length() > 0) { args.add(normalizedFile); if (!launcher.isUnix()) { args.prepend("cmd.exe", "/C", "\""); args.add("\"", "&&", "exit", "%%ERRORLEVEL%%"); listener.getLogger().println(String.format("Executing the command %s from %s", args.toStringWithQuote(), pwd)); int r = launcher.launch().cmds(args).envs(env).stdout(mbcp).pwd(pwd).join();
protected Process sudoWithPass(ArgumentListBuilder args) throws IOException { listener.getLogger().println("Running with embedded_su"); ProcessBuilder pb = new ProcessBuilder(args.prepend(sudoExe()).toCommandArray()); return EmbeddedSu.startWithSu(rootUsername, rootPassword, pb); } // in solaris, pfexec never asks for a password, so username==null means
public void rmview(String viewPath) throws IOException, InterruptedException { ArgumentListBuilder cmd = new ArgumentListBuilder(); cmd.add("rmview"); cmd.add("-force"); cmd.add(viewPath); FilePath workspace = launcher.getWorkspace(); String output = runAndProcessOutput(cmd, null, workspace, false, null); if (output.contains("cleartool: Error")) { throw new IOException("Failed to remove view: " + output); } FilePath viewFilePath = workspace.child(viewPath); if (viewFilePath.exists()) { launcher.getListener().getLogger().println("Removing view folder as it was not removed when the view was removed."); viewFilePath.deleteRecursive(); } }
private ArgumentListBuilder getGradleExecutor() { ArgumentListBuilder args = new ArgumentListBuilder(); if (gradleBuild.isUseWrapper()) { String execName = launcher.isUnix() ? GradleInstallation.UNIX_GRADLE_WRAPPER_COMMAND : GradleInstallation.WINDOWS_GRADLE_WRAPPER_COMMAND; FilePath gradleWrapperFile = new FilePath(new FilePath(ws, rootDir), execName); args.add(gradleWrapperFile.getRemote()); } else { try { args.add(getGradleExe()); } catch (Exception e) { listener.error("Couldn't find Gradle executable."); build.setResult(Result.FAILURE); throw new Run.RunnerAbortedException(); } } args.addTokenized(getSwitches()). addTokenized(tasks). add("-b", getBuildFileFullPath()); if (!launcher.isUnix()) { args = args.toWindowsCommand(); } return args; }
@Override public KeyMaterial materialize() throws IOException, InterruptedException { FilePath dockerConfig = createSecretsDirectory(); try { // TODO on Docker 17.07+ use --password-stdin EnvVars envWithConfig = new EnvVars(env); envWithConfig.put("DOCKER_CONFIG", dockerConfig.getRemote()); if (launcher.launch().cmds(new ArgumentListBuilder(dockerExecutable, "login", "-u", username, "-p").add(password, true).add(endpoint)).envs(envWithConfig).stdout(listener).join() != 0) { throw new AbortException("docker login failed"); } } catch (IOException | InterruptedException x) { try { dockerConfig.deleteRecursive(); } catch (Exception x2) { x.addSuppressed(x2); } throw x; } return new RegistryKeyMaterial(dockerConfig, new EnvVars("DOCKER_CONFIG", dockerConfig.getRemote())); }
@Override protected Boolean run() throws Exception { ArgumentListBuilder args = new ArgumentListBuilder(); org.jfrog.hudson.ArtifactoryServer artifactoryServer = Utils.prepareArtifactoryServer(null, step.getServer()); ArtifactoryConfigurator configurator = new ArtifactoryConfigurator(artifactoryServer); CredentialsConfig deployerConfig = CredentialManager.getPreferredDeployer(configurator, artifactoryServer); String username = deployerConfig.provideUsername(build.getParent()); String serverName = step.getServerName(); args.addTokenized("conan user"); args.add(username); args.add("-p"); args.addMasked(deployerConfig.providePassword(build.getParent())); args.add("-r"); args.add(serverName); EnvVars extendedEnv = new EnvVars(env); extendedEnv.put(Utils.CONAN_USER_HOME, step.getConanHome()); listener.getLogger().println("Adding conan user '" + username + "', server '" + serverName + "'"); Utils.exeConan(args, ws, launcher, listener, build, extendedEnv); return true; } }
public boolean perform(Run<?, ?> build, Launcher launcher, TaskListener listener, EnvVars env, FilePath workDir, FilePath tempDir) throws InterruptedException, IOException { listener.getLogger().println("Jenkins Artifactory Plugin version: " + ActionableHelper.getArtifactoryPluginVersion()); FilePath mavenHome = getMavenHome(listener, env, launcher); if (!mavenHome.exists()) { listener.getLogger().println("Couldn't find Maven home at " + mavenHome.getRemote() + " on agent " + Utils.getAgentName(workDir) + ". This could be because this build is running inside a Docker container."); } ArgumentListBuilder cmdLine = buildMavenCmdLine(build, listener, env, launcher, mavenHome, workDir, tempDir); String[] cmds = cmdLine.toCommandArray(); return RunMaven(build, launcher, listener, env, workDir, cmds); }