1

Тема: Получить список ip адресов слушателей

Доброе...
Стоит icecast 2.4.1 на Centos 6.6.
Слушатели подключаются через логин:пароль, соответсвенно, в админке видно видно и адрес и логин.
Не могу ни как спарсить эти значения, делаю вот так, создаю файл:

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" >
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Transitiona
l//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" indent="yes" encodin
g="UTF-8" />
<xsl:template match = "/icestats" >
<icecast>
<xsl:for-each select="source">
                <source mount="{@mount}">
                    <xsl:choose>
                        <xsl:when test="listener">
                        <xsl:for-each select="listener">
                        <xsl:variable name = "themount"><xsl:value-of select="@mount" /></xsl:variable>
                                <ip><xsl:value-of select="IP" /></ip>
                        </xsl:for-each>
                    </xsl:when>
                </xsl:choose>
                </source>
</xsl:for-each>
</icecast>
</xsl:template>
</xsl:stylesheet>

Взял пример из файла listclients.xsl
Пробовал разные варианты с  <source mount="{@mount}"> и заменял это на <xsl:value-of select="@mount" />.
В итоге получаю только списки точек вещания.

при этом пробую сделать так:

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" >
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" indent="yes" encoding="UTF-8" />
<xsl:template match = "/icestats" >
<icecast>
<xsl:for-each select="source">
    <source mount="{@mount}">
        <listeners><xsl:value-of select="listeners" /></listeners>
        <listener_peak><xsl:value-of select="listener_peak" /></listener_peak>
        <maxlisteners><xsl:value-of select="max_listeners" /></maxlisteners>
        <bitrate><xsl:value-of select="bitrate" /></bitrate>
        <title><xsl:value-of select="title" /></title>
    
    </source>
</xsl:for-each>
</icecast>
</xsl:template>
</xsl:stylesheet>

И на выходе получаю что нужно.
Файлы эти делаю с расширением xsl и сохраняю в webroot.

Как правильно написать, чтобы ip-адреса получить с логинами.

Спасибо.

2

Re: Получить список ip адресов слушателей

Или даже так....
Откуда берутся берутся изначальные данные, кто их генерит. тот же, например, <xsl:template match = "/icestats" >.
Кто создает этот icestats?
Перелазил все установленные файлы от icecast и пока пришел к выводу. что это все скомпилировано уже в самом icecast...

3

Re: Получить список ip адресов слушателей

Правильный вывод. IP-адреса можно парсить через админку например.

4

Re: Получить список ip адресов слушателей

Но как?
если я не могу знать, что даже если там вывод типа xml ... к чему мне там обращаться?
Не html же парсить...
Или я не так понял?

5

Re: Получить список ip адресов слушателей

Вот такой xml

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" >
<xsl:output omit-xml-declaration="yes" method="text" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="no" encoding="UTF-8" />
<xsl:template match = "/icestats" >
<xsl:for-each select="source">
<xsl:for-each select="listener">
<xsl:value-of select="IP" />
<xsl:text>&#13;&#10;</xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

выдаст список ip адресов слушателей.
Если надо с именами пользователей попробуйте так (не проверял)

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" >
<xsl:output omit-xml-declaration="yes" method="text" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="no" encoding="UTF-8" />
<xsl:template match = "/icestats" >
<xsl:for-each select="source">
<xsl:for-each select="listener">
<xsl:if test="username"> (<xsl:value-of select="username" /><xsl:text> - </xsl:text>)</xsl:if><xsl:value-of select="IP" />
<xsl:text>&#13;&#10;</xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Опрашивать как всегда, через ?mount=/

Отредактировано gyurgin_1 (05-01-2015 22:26:42)

6

Re: Получить список ip адресов слушателей

пишет gyurgin_1:

Вот такой xml

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" >
<xsl:output omit-xml-declaration="yes" method="text" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="no" encoding="UTF-8" />
<xsl:template match = "/icestats" >
<xsl:for-each select="source">
<xsl:for-each select="listener">
<xsl:value-of select="IP" />
<xsl:text>&#13;&#10;</xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

выдаст список ip адресов слушателей.

Опрашивать как всегда, через ?mount=/

И так)
1 - Создал файл text.xsl с предложенным вами содержимым - верно назвал его ?
2 - Положил в webroot -  так? (/usr/share/icecast/web)
3 - В строке адреса вбиваю http://10.0.0.1:8888/test.xsl?mount=/home - так? (/home - точка вещания на ней есть слушатель сейчас)

В ответ получаю чистый страниц...

Где я не так делаю что?)))

Отредактировано firefedot (05-01-2015 22:38:42)

7

Re: Получить список ip адресов слушателей

Называйте как угодно, положили куда надо, вызвали правильно.
Давайте убедимся что он отрабатывается, после строки

<xsl:template match = "/icestats" >

добавьте например

<xsl:text> ACTIVE USERS: &#13;&#10;</xsl:text>

. По крайней мере хоть заголовок то покажет...

8

Re: Получить список ip адресов слушателей

пишет gyurgin_1:

добавьте например

<xsl:text> ACTIVE USERS: &#13;&#10;</xsl:text>

. По крайней мере хоть заголовок то покажет...

Добавил, заголовок получил ACTIVE USERS:

9

Re: Получить список ip адресов слушателей

Ну значит работает. Я проверял на icecast KH, сейчас посмотрю обычный дистрибутив, может чем отличается, хотя врядли.

10

Re: Получить список ip адресов слушателей

Такое ощущение, что просто не видит эти значения. как будто их просто нет или они ему не доступны .. но странно то.что если я ввожу вместо ip количество или битрейт, то получаю результат.
Например вписав <listeners><xsl:value-of select="listeners" /></listeners> после <xsl:for-each select="source">
а вот именно в цикле слушателей про айпи  - глухо)
Стоит сейчас icecast 2.4.1, тот же эффект был и на 2.3 версиях

11

Re: Получить список ip адресов слушателей

Попробуйте перед обходом

<xsl:for-each select="listener">

добавить

<xsl:variable name = "themount"><xsl:value-of select="@mount" /></xsl:variable>

больше ничего не нашел что может повлиять, да и это врядли.

12

Re: Получить список ip адресов слушателей

Попробуйте вызвать скрипт из админки, наконец проверьте стандартный (/admin/listclients.xsl?mount=/ ).

13

Re: Получить список ip адресов слушателей

Дописал строку про mount - ситуация не изменилась, единственное, появилось число 10, которому взятся не откуда)

Положил файл в admin и получил 400 - Unrecognised command

Стандартная страница со списком работает как и работала

Отредактировано firefedot (05-01-2015 23:51:31)

14

Re: Получить список ip адресов слушателей

Ну вот - взял стандартную страницу с icecast-2.4.1 и порезал там весь html, вываливает все в одну строчку

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8" />
<xsl:template match = "/icestats" >
<xsl:for-each select="source">
<xsl:choose>
<xsl:when test="listener">
<xsl:variable name = "themount"><xsl:value-of select="@mount" /></xsl:variable>
<xsl:for-each select="listener">                                            
<xsl:value-of select="IP" />
<xsl:if test="username">
(<xsl:value-of select="username" />)
</xsl:if>                                        
<xsl:value-of select="Connected" />
<xsl:value-of select="UserAgent" />
</xsl:for-each>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Проверил - работает.

15

Re: Получить список ip адресов слушателей

а запускали из webroot?
я так же делал и ваш код вставлял в файл list.xsl  - результат белый лист....
не пойму, что  не то...

в логах  такая строчка

[2015-01-05  23:59:17] DBUG auth/add_authenticated_listener Stats request, sending XSL transformed s
tats
[2015-01-05  23:59:17] DBUG xslt/xslt_get_stylesheet Using cached sheet 0

и да, если менять сам файл listclients.xsl, то он просто выведет текст... но вот как сделать так.что бы и файл был и данные получить?)

Отредактировано firefedot (06-01-2015 00:17:49)

16

Re: Получить список ip адресов слушателей

В логах ничего криминального, такое ощущение, что icecast не желает отдавать данные, может это связано с аутенфикацией? Надо пробовать самый простой конфиг без аутенфикации. Если будет работать - поищем решение. У Вас я так понимаю через htpasswd, можно переделать на внешнюю.

17

Re: Получить список ip адресов слушателей

Попробовал точку без пароля - тот же результат

У меня аутентификация происходит через файл

<authentication type="htpasswd">
         <option name="filename" value="/path/home_auth"/>
         <option name="allow_duplicate_users" value="0"/>
     </authentication>

На внешнюю. это как? не понял...

Отредактировано firefedot (06-01-2015 00:29:45)

18

Re: Получить список ip адресов слушателей

Читайте <authentication type="url">

19

Re: Получить список ip адресов слушателей

да. посмотрел.. но что-то мне подсказывает , что это не решит проблему ...
такое ощущение, что эти данные находятся под паролем от админки самой...
То есть как бы у него запрашивается пароль., а он его не вбивает...
Может такое быть?

Отредактировано firefedot (06-01-2015 00:39:56)

20

Re: Получить список ip адресов слушателей

В общем решил много времени пока не тратить на это.
Страницу listclients.xsl привел к виду xml
А везде, где есть ссылка на эту страницу, поменял ссылку на страницу, где используются данные... внешне сделаю их одинаковыми и думаю нормально все будет ...
А если, вдруг, кто читая потом найдет/подскажет решение, как правильно надо было сделать, буду искренне признателен )
Спасибо gyurgin_1 за помощь.

Отредактировано firefedot (06-01-2015 01:43:43)

21

Re: Получить список ip адресов слушателей

А вообще. может кому тоже пригодиться искать не ведомое))),, то много можно найти в исходниках.
Например, не мог найти, как получить id для Кика пользователя с точки. А на самом деле просто, может конечно кто знал, я не знал), но в исходниках. в папке src есть файл admin.c  и там как раз есть все то что отображено в админке и там на строчке (примерно) 731

xmlNewChild(listenernode, NULL, XMLSTR("ID"), XMLSTR(buf));

От сюда получаем как правильно обратится к этой будущей переменной.
Так что, в исходниках можно найти все что нужно, главное  искать не там. где светло, а там где надо)

А сам файл listclients.xsl пока оставил вида xml. как и писал выше

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" />
<xsl:template match = "/icestats" >
<icecast>
<xsl:for-each select="source">
<mount><xsl:value-of select="@mount" /></mount>
<xsl:choose>
<xsl:when test="listener">
<xsl:variable name = "themount"><xsl:value-of select="@mount" /></xsl:variable>
<xsl:for-each select="listener">
<users>
<id><xsl:value-of select="ID" /></id>
<ip><xsl:value-of select="IP" /></ip>
<username><xsl:if test="username">
(<xsl:value-of select="username" />)
</xsl:if></username>...............
<time><xsl:value-of select="Connected" /></time>
<client><xsl:value-of select="UserAgent" /></client>
</users>
</xsl:for-each>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</icecast>
</xsl:template>
</xsl:stylesheet>

А что бы кикать в файле обработчике, назову его так) сделал так (приведу весь файл. может кто поправит. как правильней и лучше сделать))

<?php
$url = 'http://admin:pass@10.0.0.1:8888/admin/listclients.xsl?mount=/home';

echo '<p>Список тех кто слушает</p>';
echo '<table id="select" border="1">';
echo '<thead>';
echo '<tr>';
echo '<th>ip</th>';
echo '<th>Имя</th>';
echo '<th>Времени слушает</th>';
echo '<th>Действия</th>';
echo '</tr>';
echo '</thead>';
echo '<tbody>';

$smpl_xml=simplexml_load_file($url);
$mount = $smpl_xml->mount;
echo "Точка вещания <b>".$mount."</b>";
foreach ($smpl_xml->users as $us){
    $ip2=$us->ip;
    $time2=(int)$us->time;
    $id2=$us->id;   
    $time_hour=  floor($time2/3600);   
    $time_all= date('i:s',$time2);
echo '<tr><td>'.$ip2.'</td><td>'.$us->username.'</td><td align="center">'.$time_hour.':'.$time_all.'</td><td><a href="http://10.0.0.1:8888/admin/killclient.xsl?mount=/home&amp;id='.$id2.'" >Отключить</a></td></tr>';
}
echo '</tbody>';   
echo '</table>';

Конечно, надо все до конца облагородить переменными и получением точки вещания из админки ... но может и это пригодится кому. хотя не знаю, видимо таких извращенцев не много )))