从版本1到2更新munin shoutcast监控插件代码

时间:2015-09-16 10:36:57

标签: php regex shoutcast munin

所以我试图更新以下监控icecast和shoutcast听众的代码,因为当我升级到shoutcast 2时它停止了工作并且作者是AWOL或至少选择不回答。

现在我认为我已经解决了正则表达式代码的问题,但它仍然无法正常工作。这让我想到代码检索状态页面和新URL格式的方式也是一个问题。

无论如何,如果有任何帮助,我会感谢您在尝试解决此问题时给予我的任何帮助,谢谢!

源代码:https://github.com/munin-monitoring/contrib/blob/f444e600c9718ba249d46d3b44d6b6ebaccb0aa3/plugins/network/radio

第158行的旧正则表达式:

preg_match_all( "/.*?Stream Status: \<\/td\>\<td\>\<b\>\Stream is up at \d*? kbps with (\d*?) of \d*? listeners\<\/b\>\<\/td\>\<\/tr\>/s", $xml, $parser );

我的第一个正则表达式:

preg_match_all( "/.*?Stream Status: \<\/font\>\<\/td\>\<td>\<font class\=default\>\<b\>Stream is up at (\d*?) kbps with \<B\>(\d*?) of (\d*?) listeners/s", $xml, $parser );

问题代码:

    function getShout( $host, $port, $name ) {
            $error = false;
            $fp = fsockopen( $host, $port, $errno, $errstr, 10 );
            if ( !$fp ) {
                    $error = $errstr ."(". $errno .")";
            } else {
                    fputs( $fp, "GET / HTTP/1.0\r\n" );
                    fputs($fp, "User-Agent: Mozilla\r\n");
                    fputs( $fp, "Connection: close\r\n\r\n" );

                    $xml = "";

                    while ( !feof( $fp ) ) {
                            $xml .= fgets($fp, 512);
                    }
                    fclose( $fp );

                    if ( stristr( $xml, "HTTP/1.0 200 OK" ) == true ) {
                            $xml = trim( substr( $xml, 42 ) );
                    } else {
                            $error = "Bad login";
                    }
                    if ( !$error ) {
                            $res = array( "found" => true );

                            preg_match_all( "/.*?Stream Status: \<\/font\>\<\/td\>\<td>\<font class\=default\>\<b\>Stream is up at (\d*?) kbps with \<B\>(\d*?) of (\d*?) listeners/s", $xml, $parser );

                            $res["listeners"] = $parser[1][0];
                            $res["name"] = $name;

                    } else {
                            $res = $error;
                    }
            }
            return $res;
    }

我从命令行运行插件获得的输出......

  

rock.value B

     

pop.value B

     

rap.value B

     

dnb.value B

     

psytrance.value B

     

breaks.value B

     

dubstep.value B

     

reggae.value B

     

techno.value B

     

ambient.value B

     

complete.value 0

示例shoutcast v1状态页面:http://stream.radioamlo.info:8010/

示例shoutcast v2状态页面:http://91.221.151.237:8994/index.html?sid=1

更新#1:我的第二个正则表达式看起来更好:

preg_match_all( "/.*?Stream Status: \<\/font\>\<\/td\>\<td>\<font class\=default\>\<b\>Stream is up at \d*? kbps with \<B\>(\d*?) of \d*? 

更新#2 :添加&#39; echo $ xml;&#39;在&#39; $ error =&#34;错误登录&#34;;&#39;返回以下错误:

<html><head><title>Redirect</title></head><body>Click <a href="/index.html?sid=1">here</a> for redirect.</body></html>techno.value B
HTTP/1.1 302 Found
Content-Type:text/html;charset=utf-8
Location:index.html?sid=1
Content-Length:118

1 个答案:

答案 0 :(得分:0)

根据你写的问题,你提取信息的位置已经改变了。您发布的错误消息已告知新位置(在其前面添加主机名)。

我不熟悉fsock,bot我认为它不能处理重定向。所以我建议你改用cURL:坚持cURL manual上的第一个例子。然后,cURL的输出只会替换您的$xml。请记住将GET信息?sid=1传递给cURL!

只需测试一下,然后您将看到是否有更多关于字符串解析的错误。如果是,请求发布“新$xml”。