【问题标题】:Perl script to parse Jenkins job (config.xml) files which requires authentication用于解析需要身份验证的 Jenkins 作业 (config.xml) 文件的 Perl 脚本
【发布时间】:2014-07-25 15:39:28
【问题描述】:

我正在尝试解析 Jenkins 作业“config.xml”文件。

这是我尝试使用 HTTP::Tiny 的一种方法:

use HTTP::Tiny;

my $page = "http://localhost:8080/job/Job_One_Name/config.xml";
system("start $page");  # this loads the xml file in browser successfully

my $wsdlResponse = HTTP::Tiny->new->get($page);
$wsdlResponse->{success} or die print $logger->error_die($!); 
my $wsdlXML = XML::LibXML->new->parse_file($wsdlResponse->{content});

print $wsdlXML;

它因错误而死,“错误的文件描述符”

如果我注释掉该行,脚本会在 parse_file 行中断 错误信息:

Could not create file parser context for file "<html><head><meta http-equiv='refresh' content='1;url=/login?from=%2Fjo
b%2FJob_One_Name/config.xml'/><script>window.location.replace('/login?from=%2Fjob%2FJob_One_Name/config.xml');</script></head><body style='background-color:white; color:white;'>                                                                                                                                                    

Authentication required                                                                                               
<!--                                                                                                                  
You are authenticated as: anonymous                                                                                   
Groups that you are in:                                                                                               

Permission you need to have (but didn't): hudson.model.Hudson.Read                                                    
 ... which is implied by: hudson.security.Permission.GenericRead                                                      
 ... which is implied by: hudson.model.Hudson.Administer                                                              
-->                                                                                                                   

</body></html>                                                                                                      
                ": Result too large at Job.pm line 67.  

我也尝试了 XML::TwigLibXML->load_xmlload_html 来自网上不同的例子,但他们都死了类似于 “无法为文件创建文件解析器上下文”“错误的文件描述符”“指定位置、字符串或 IO”的错误 em>。

关于可能是什么问题的任何想法?提前致谢。

更新:

按照来自 Jenkins'Authenticating scripted clients'Perl LWP example for a scripted client',我已成功通过身份验证:

my $uagent = LWP::UserAgent->new(cookie_jar => HTTP::Cookies->new());
my %options = {'myUserName' => 'myPassword'};
$req = HTTP::Request->new( GET => $serverHost );
$req->authorization_basic( 'myUserName', 'myPassword' );
my $res = $uagent->request($req);

# Check the outcome of the response
print "Result: " . $res->status_line . "\n";
print $res->headers->as_string;
print "\n";
if ( !$res->is_success ) {
    print "Failed\n";
} else {
    print "Success!\n";

    # Parse XML
    my $wsdlResponse = HTTP::Tiny->new->get($page, \%options);
    #$dom = XML::LibXML->load_xml(location=>$page);     
    #print $dom . "\n";
    my $wsdlXML = XML::LibXML->new->parse_file($wsdlResponse->{content});
    print $wsdlXML;
    #print $res->content, "\n";
}

它仍然给我同样的 'Authentication required' 错误。我不知道如何使用成功授权的请求来解析文件。

【问题讨论】:

  • “它死于错误,“错误的文件描述符”。” -- WHERE
  • @JimGarrison 在“die”行,“$wsdlResponse->{success} or die print $logger->error_die($!);”
  • 你想抢什么? config.xml 是一个结构良好的 XML。 Jenkins 中的大部分信息都有一个 RESTful API,包括作业和单个构建。您可以通过这种方式以 JSON、Python 或 XML 格式提取信息。单击 Jenkins 页面底部的 REST API 链接。这会有帮助吗?
  • @DavidW。感谢您的回复。我只是在尝试编写自己的脚本,该脚本的功能与 Fetch 在 REST API 中的功能几乎相同。该脚本只是通过命令提示符或 shell(作业名称、节点等)提示所有内容,对其进行处理,并列出 HTML 表中的所有内容(它还包括每个作业的“可嵌入构建状态”图像)。我认为它可能会派上用场,或者允许我在这里和那里自定义一些小东西,但它最终可能没用......尽管如此,这只是我正在测试和工作的东西。

标签: xml perl parsing authentication jenkins


【解决方案1】:

您似乎需要在请求中提供身份验证。

它在浏览器中工作的原因很可能是您已经登录到 Jenkins 并且凭据缓存在浏览器中。当您从 Perl 代码中获取 URL 时,这些凭据将不存在。

您将需要检查 Jenkins 如何维护会话状态(令牌/cookie)并在您的 Perl 代码中执行相同的过程。

【讨论】:

    【解决方案2】:

    我通过在 'icognito 模式' 中试验 'firefox' 做了类似的事情 - 所以我可以很容易地看到相关的 cookie。 然后使用“EditThisCookie”或“cookie.txt export”插件将其导出。 然后我使用该导出的值在 perl 中创建了一个 cookie。

    最终我发现不使用该接口更容易,而是使用该服务器的 SSH 接口。

    【讨论】:

    • 我能够使用经过身份验证的请求解析 xml。我发布了解决方案。谢谢回复,我也试试看:)
    【解决方案3】:

    我想出了一种使用经过身份验证的请求来输出结果的方法。由于请求输出 xml 内容以及 headers 响应,即:

    HTTP/1.1 200 OK
    Connection: close
    Server: Jetty(8.y.z-SNAPSHOT)
    Content-Type: application/xml
    Client-Date: Wed, 30 Jul 2014 14:49:12 GMT
    Client-Peer: 127.0.0.1:8080
    Client-Response-Num: 1
    
    <?xml version... 
    <project>
      ....
      ....
    </project>
    

    我使用正则表达式提取输出的 xml 部分并将其保存到文件中。从那里我使用 LibXML 的 parse_file 方法来解析新写入的文件。 (我有一个单独的子例程,它使用 findnodes 方法来提取我想提取的特定节点。我没有发布它,因为这个解决方案处理了我遇到问题的身份验证)。

    解决方案:

    use strict;
    use warnings;
    use XML::LibXML;
    use Path::Class;
    use LWP;
    use HTTP::Cookies;
    
    my $serverXmlUrl = "http\://localhost:8080/job/jobName/config.xml";
    my $uagent = LWP::UserAgent->new(cookie_jar => HTTP::Cookies->new());
    my $request = HTTP::Request->new( GET => $serverXmlUrl );
    $request->authorization_basic( 'UserName', 'Password' );
    my $result = $uagent->request($request);
    
    if ( !$result->is_success ) {
        print "Failed\n";
    } else {
        print "Success!\n";
    
        # Create new file to write to
        my $dir         = dir(".");
        my $file        = $dir->file("job.xml");
        my $file_handle = $file->openw();
        my $xml_content = $result->as_string; # full result output
    
        # Regex to store only xml content
        $xml_content =~ s/.*(<\?xml.*)/$1/s; 
        # Save xml_content to file
        $file_handle->print($xml_content);
        $file_handle->close();
        # Parse newly written file
        print "Parsing file... \n";
        my $parser = XML::LibXML->new();
        my $doc    = $parser->parse_file($file);
        print $doc;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      • 1970-01-01
      相关资源
      最近更新 更多