2013-05-13 57 views
1

我可以使用以下程序更改構建的說明。這會將構建的描述更改爲「FOO FOO FOO」。不幸的是,我的登錄不起作用。現在,這個測試Jenkins構建服務器對它沒有任何安全性。然而,我們經常詹金斯的服務器上,您需要登錄才能更改生成的描述:通過Perl腳本登錄到Jenkins

#! /usr/bin/env perl 

use 5.12.0; 
use warnings; 

use LWP::UserAgent; 
use HTTP::Request::Common qw(POST); 
use Data::Dumper; 

use constant { 
    JENKINS_BASE   => "http://build.vegibank.com/", 
    USER_ID     => "buildguy", 
    PASSWORD    => "swordfish", 
}; 

use constant { 
    LOGIN_URL    => JENKINS_BASE . '/j_acegi_security_check', 
    JOB_URL     => JENKINS_BASE . '/job', 
    SUBMIT_DESCRIPTION  => 'submitDescription', 
}; 

my $job_number = 4; 
my $job_name = "proginator-2.0"; 
my $description = "FOO FOO FOO"; 

my $user_agent = LWP::UserAgent->new or die qq(Can't get User Agent); 

# 
# My Login Stuff (but it doesn't do anything w/ security off 
# 

my $response = $user_agent->request (
    POST LOGIN_URL, 
    [ 
     j_username => USER_ID, 
     j_password => PASSWORD, 
    ], 
); 

$response = $user_agent->request (
    POST "@{[JOB_URL]}/$job_name/$job_number/@{[SUBMIT_DESCRIPTION]}", 
    [ 
     description => "$description", 
    ], 
); 

我試圖連接到詹金斯登錄會話,但我不相信我做這很對。當我嘗試登錄,我得到一個302響應我的回答對象的下列轉儲:

$VAR1 = bless({ 
    '_protocol' => 'HTTP/1.1', 
    '_content' => '', 
    '_rc' => '302', 
    '_headers' => bless({ 
      'connection' => 'close', 
      'client-response-num' => 1, 
      'set-cookie' => 'JSESSIONID=1D5DF6FAF8714B2ACA4D496FBFE6E983; Path=/jenkins/; HttpOnly', 
      'location' => 'http://build.vegicorp.com/;jsessionid=1D5DF6FAF8714B2ACA4D496FBFE6E983', 
      'date' => 'Mon, 13 May 2013 20:02:35 GMT', 
      'client-peer' => '10.10.21.96:80', 
      'content-length' => '0', 
      'client-date' => 'Mon, 13 May 2013 20:02:35 GMT', 
      'content-type' => 'text/plain; charset=UTF-8', 
      'server' => 'Apache-Coyote/1.1' 
    }, 'HTTP::Headers'), 
    '_msg' => 'Moved Temporarily', 
    '_request' => bless({ 
      '_content' => 'j_username=buildguy&j_password=swordfish', 
      '_uri' => bless(do{\(my $o = 'http://build.vegicorp.com/j_acegi_security_check')}, 'URI::http'), 
      '_headers' => bless({ 
        'user-agent' => 'libwww-perl/6.03', 
        'content-type' => 'application/x-www-form-urlencoded', 
        'content-length' => 42 
    }, 'HTTP::Headers'), 
      '_method' => 'POST', 
      '_uri_canonical' => $VAR1->{'_request'}{'_uri'} 
    }, 'HTTP::Request') 
}, 'HTTP::Response'); 

我想我必須打一個有效的頁面,因爲我得到一個302碼,但我的領域可能不是正確的(或者我要去錯誤的頁面)。

任何人都可以幫忙嗎?

回答

2

我的授權由於...技術術語是什麼?哦,是啊......「做得不對。」

谷歌搜索並獲得大量無用的垃圾後,我決定查看詹金斯網站是否可能有這方面的內容。而且,它正好在一個名爲Authenticating scripted clients的頁面下面。事實上,他們甚至給出Perl LWP example for a scripted client

哈哈,我太努力了。 Jenkins似乎會使用基本的HTTP身份驗證機制,並且我不必通過試圖弄清楚他們的登錄表單是如何工作的內容。顯然,Jenkins正在簡化基本認證機制,即使你的認證機制遠非基本 ​​- 就像一個好的程序應該做的那樣。

所以,我所要做的就是使用基本的認證機制。

my $browser = LWP::UserAgent->new or die qq(Cannot get User Agent); 
my $request = HTTP::Request->new; 
$request->authorization_basic(USER_ID, PASSWORD); 
$request->method("GET"); 
$request->url("$jenkins_url"); 
my $response = $browser->request($request); 
if (not $response->is_success) { 
    die qq(Something went horribly wrong...); 
} 
1

我在登錄成功時看到重定向 - 它設置會話cookie並將您重定向到主頁面。

由於UA對象沒有保留會話cookie,因此您的帖子可能會失敗。根據文檔,'默認是沒有cookie_jar,即從不自動添加「Cookie」標頭到請求。'請嘗試:

my $ua = LWP::UserAgent->new(cookie_jar => HTTP::Cookies->new()); 

存儲和重新使用您的會話的描述更改帖子。

(另外,憑據是在頭轉儲可見,可能要編輯...編輯:我是個白癡,他們在你的常量太and're可能假。)