ОсновноеRadiotalkПользовательское
Технологии вещания, софт, скрипты
3   •   Посмотреть все темы

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

 

44
firefedot @firefedot
Доброе...
Стоит 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-адреса получить с логинами.

Спасибо.

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

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

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

382
Grigorij @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> </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> </xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

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

Отредактировано gyurgin_1 - 05.01.2015
44
firefedot @firefedot
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> </xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
выдаст список ip адресов слушателей.

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

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

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

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

Отредактировано firefedot - 05.01.2015
382
Grigorij @gyurgin_1
Называйте как угодно, положили куда надо, вызвали правильно.
Давайте убедимся что он отрабатывается, после строки <xsl:template match = "/icestats" > добавьте например <xsl:text> ACTIVE USERS: </xsl:text>. По крайней мере хоть заголовок то покажет...

44
firefedot @firefedot
gyurgin_1 пишет:

добавьте например <xsl:text> ACTIVE USERS: </xsl:text>. По крайней мере хоть заголовок то покажет...


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

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

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

382
Grigorij @gyurgin_1
Попробуйте перед обходом <xsl:for-each select="listener"> добавить <xsl:variable name = "themount"><xsl:value-of select="@mount" /></xsl:variable> больше ничего не нашел что может повлиять, да и это врядли.

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

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

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

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

Отредактировано firefedot - 05.01.2015
382
Grigorij @gyurgin_1
Ну вот - взял стандартную страницу с 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>
Проверил - работает.

44
firefedot @firefedot
а запускали из 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 - 05.01.2015
382
Grigorij @gyurgin_1
В логах ничего криминального, такое ощущение, что icecast не желает отдавать данные, может это связано с аутенфикацией? Надо пробовать самый простой конфиг без аутенфикации. Если будет работать - поищем решение. У Вас я так понимаю через htpasswd, можно переделать на внешнюю.

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

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

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


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

Отредактировано firefedot - 05.01.2015
382
Grigorij @gyurgin_1
Читайте <authentication type="url">

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

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

Отредактировано firefedot - 06.01.2015