package org.jenkinsci.tools.configcloner;
import java.io.IOException;
import java.net.URL;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.List;
import org.jenkinsci.main.modules.cli.auth.ssh.PublicKeySignatureWriter;
import org.jenkinsci.main.modules.cli.auth.ssh.UserPropertyImpl;
import hudson.model.User;
public class CommandInvoker {
protected final String kind;
protected String[] options = new String[] {};
protected String[] arguments = new String[] {};
public CommandInvoker(String kind) {
this.kind = kind;
}
public CommandInvoker opts(String... opts) {
this.options = opts;
return this;
}
public CommandInvoker args(String... args) {
this.arguments = args;
return this;
}
public CommandResponse.Accumulator invoke(String... immediateArgs) {
if (immediateArgs.length != 0) {
args(immediateArgs);
}
return (CommandResponse.Accumulator) main().run(commandArgs());
}
public String[] commandArgs() {
final String[] args = new String[this.options.length + this.arguments.length + 1];
args[0] = kind;
System.arraycopy(this.options, 0, args, 1, this.options.length);
System.arraycopy(this.arguments, 0, args, this.options.length + 1, this.arguments.length);
return args;
}
public Main main() {
return new Main(CommandResponse.accumulate(), getCLIPoolForTest());
}
public static CLIPool getCLIPoolForTest() {
RandKeyCLIFactory factory = new RandKeyCLIFactory();
try {
User.current().addProperty(new UserPropertyImpl(
factory.publicKeyString()
));
} catch (NullPointerException ex) {
return new CLIPool(CLIFactory.system()); // Not running Jenkins
} catch (IOException ex) {
throw new RuntimeException(ex);
}
return new CLIPool(factory);
}
private static class RandKeyCLIFactory extends org.jenkinsci.tools.configcloner.CLIFactory {
private final KeyPair pair;
public RandKeyCLIFactory() {
this.pair = generateKeyPair();
}
@Override
protected List<KeyPair> userKeys() {
return Arrays.asList(pair);
}
private KeyPair generateKeyPair() {
try {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024);
return keyGen.generateKeyPair();
} catch (NoSuchAlgorithmException ex) {
throw new RuntimeException(ex);
}
}
public String publicKeyString() {
return new PublicKeySignatureWriter().asString(pair.getPublic());
}
}
public final Url url(URL url) {
return new Url(url, kind);
}
/**
* Invoker prepending url to args.
*/
public static class Url extends CommandInvoker {
private final URL url;
public Url(URL url, String kind) {
super(kind);
this.url = url;
}
@Override
public CommandInvoker args(String... args) {
String[] mainArgs = new String[args.length];
int i = 0;
for(String arg: args) {
mainArgs[i++] = url + arg;
}
this.arguments = mainArgs;
return this;
}
}
}