Search in sources :

Example 1 with DualOutputStream

use of hudson.util.DualOutputStream in project hudson-2.x by hudson.

the class Main method remotePost.

/**
     * Run command and place the result to a remote Hudson installation
     */
public static int remotePost(String[] args) throws Exception {
    String projectName = args[0];
    String home = getHudsonHome();
    // make sure it ends with '/'
    if (!home.endsWith("/"))
        home = home + '/';
    // check for authentication info
    String auth = new URL(home).getUserInfo();
    if (auth != null)
        auth = "Basic " + new Base64Encoder().encode(auth.getBytes("UTF-8"));
    {
        // check if the home is set correctly
        HttpURLConnection con = open(new URL(home));
        if (auth != null)
            con.setRequestProperty("Authorization", auth);
        con.connect();
        if (con.getResponseCode() != 200 || con.getHeaderField("X-Hudson") == null) {
            System.err.println(home + " is not Hudson (" + con.getResponseMessage() + ")");
            return -1;
        }
    }
    String projectNameEnc = URLEncoder.encode(projectName, "UTF-8").replaceAll("\\+", "%20");
    {
        // check if the job name is correct
        HttpURLConnection con = open(new URL(home + "job/" + projectNameEnc + "/acceptBuildResult"));
        if (auth != null)
            con.setRequestProperty("Authorization", auth);
        con.connect();
        if (con.getResponseCode() != 200) {
            System.err.println(projectName + " is not a valid job name on " + home + " (" + con.getResponseMessage() + ")");
            return -1;
        }
    }
    // get a crumb to pass the csrf check
    String crumbField = null, crumbValue = null;
    try {
        HttpURLConnection con = open(new URL(home + "crumbIssuer/api/xml?xpath=concat(//crumbRequestField,\":\",//crumb)'"));
        if (auth != null)
            con.setRequestProperty("Authorization", auth);
        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String line = in.readLine();
        in.close();
        String[] components = line.split(":");
        if (components.length == 2) {
            crumbField = components[0];
            crumbValue = components[1];
        }
    } catch (IOException e) {
    // presumably this Hudson doesn't use CSRF protection
    }
    // write the output to a temporary file first.
    File tmpFile = File.createTempFile("hudson", "log");
    try {
        FileOutputStream os = new FileOutputStream(tmpFile);
        Writer w = new OutputStreamWriter(os, "UTF-8");
        w.write("<?xml version='1.0' encoding='UTF-8'?>");
        w.write("<run><log encoding='hexBinary' content-encoding='" + Charset.defaultCharset().name() + "'>");
        w.flush();
        // run the command
        long start = System.currentTimeMillis();
        List<String> cmd = new ArrayList<String>();
        for (int i = 1; i < args.length; i++) cmd.add(args[i]);
        Proc proc = new Proc.LocalProc(cmd.toArray(new String[0]), (String[]) null, System.in, new DualOutputStream(System.out, new EncodingStream(os)));
        int ret = proc.join();
        w.write("</log><result>" + ret + "</result><duration>" + (System.currentTimeMillis() - start) + "</duration></run>");
        w.close();
        String location = home + "job/" + projectNameEnc + "/postBuildResult";
        while (true) {
            try {
                // start a remote connection
                HttpURLConnection con = open(new URL(location));
                if (auth != null)
                    con.setRequestProperty("Authorization", auth);
                if (crumbField != null && crumbValue != null) {
                    con.setRequestProperty(crumbField, crumbValue);
                }
                con.setDoOutput(true);
                // this tells HttpURLConnection not to buffer the whole thing
                con.setFixedLengthStreamingMode((int) tmpFile.length());
                con.connect();
                // send the data
                FileInputStream in = new FileInputStream(tmpFile);
                Util.copyStream(in, con.getOutputStream());
                in.close();
                if (con.getResponseCode() != 200) {
                    Util.copyStream(con.getErrorStream(), System.err);
                }
                return ret;
            } catch (HttpRetryException e) {
                if (e.getLocation() != null) {
                    // retry with the new location
                    location = e.getLocation();
                    continue;
                }
                // otherwise failed for reasons beyond us.
                throw e;
            }
        }
    } finally {
        tmpFile.delete();
    }
}
Also used : DualOutputStream(hudson.util.DualOutputStream) InputStreamReader(java.io.InputStreamReader) ArrayList(java.util.ArrayList) IOException(java.io.IOException) HttpRetryException(java.net.HttpRetryException) URL(java.net.URL) Base64Encoder(com.thoughtworks.xstream.core.util.Base64Encoder) FileInputStream(java.io.FileInputStream) HttpURLConnection(java.net.HttpURLConnection) FileOutputStream(java.io.FileOutputStream) BufferedReader(java.io.BufferedReader) OutputStreamWriter(java.io.OutputStreamWriter) EncodingStream(hudson.util.EncodingStream) File(java.io.File) Writer(java.io.Writer) OutputStreamWriter(java.io.OutputStreamWriter)

Aggregations

Base64Encoder (com.thoughtworks.xstream.core.util.Base64Encoder)1 DualOutputStream (hudson.util.DualOutputStream)1 EncodingStream (hudson.util.EncodingStream)1 BufferedReader (java.io.BufferedReader)1 File (java.io.File)1 FileInputStream (java.io.FileInputStream)1 FileOutputStream (java.io.FileOutputStream)1 IOException (java.io.IOException)1 InputStreamReader (java.io.InputStreamReader)1 OutputStreamWriter (java.io.OutputStreamWriter)1 Writer (java.io.Writer)1 HttpRetryException (java.net.HttpRetryException)1 HttpURLConnection (java.net.HttpURLConnection)1 URL (java.net.URL)1 ArrayList (java.util.ArrayList)1