将munin广播监控插件代码从版本1更新到2


Updating munin shoutcast monitoring plugin code from version 1 to 2

所以我试图更新以下代码,该代码监视iccast和shoutcast侦听器,因为当我升级到shoutcast 2时,它停止工作,作者擅离正题或至少选择不回答。

现在我认为我已经解决了正则表达式代码的问题,但它仍然不工作。这使我认为代码检索状态页和新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;
    }

我在命令行运行插件得到的输出…

岩石。值B

流行。值B

说唱。值B

dnb。值B

psytrance。值B

优惠。值B

dubstep。值B

雷鬼。值B

电子。值B

环境。值B

完成。值0

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

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


UPDATE #1:我的第二个regex看起来更好:

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

UPDATE #2:在'$error = "错误登录" '之后添加'echo $xml;'将返回以下错误:

<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

根据你写的东西,问题是,你的信息被获取的位置已经改变了。您发布的错误信息已经告诉了新的位置(在它之前加上主机名)。

我不太熟悉fsock,但我认为它不能处理重定向。因此,我建议您使用cURL:只要遵循cURL手册上的第一个示例即可。然后cURL的输出只是替换$xml。记得将GET-Information ?sid=1也传递给cURL !

就测试一下,然后你会看到是否有更多关于字符串解析的错误。如果是,请张贴"新$xml"