2013-05-13 195 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可能假。)