#!/usr/local/bin/perl
# Shoutcast用ラジオサーバチェッカ
# laser@s7.xrea.com
# socket使えないサーバでは動きません
# どう使われようがかまいませんが責任はとりません
# 使用方法
# 直接呼び出すとSSIモード(接続者カウント付き)
# radio.cgi?mode=redirect&imagedir=http://表示する画像のディレクトリURL
# でCGIモード(リダイレクト)
#--------------------------------------------------------------------
# 接続するURL
$get_url = "http://nyama.sytes.net:8000/";
# ログファイル
$logfile = "./radio8000log.txt";
# 更新間隔時間 5分なら500 30秒なら30
# 注意:間隔がこれより長くてもアクセスが無いと更新されません
$updatetime_temp = 100;
# 表示する画像 ファイル名のみ
$radio_pic1 = "radio_onair3.gif"; # ON AIR
$radio_pic2 = "radio_off4.gif"; # OFF
# 引数無し時の画像ディレクトリ 最後に / 必要
$noquery_imgurl = "http://laser.s7.xrea.com/";
# SSIモード時の画像表示テンプレート
# $reprint がON AIR表示画像URL
sub outimage{
print "
";
}
# SSIモード時の接続者数表示テンプレート
# $onair_ip が接続者数
sub outconnect{
print " 現在の接続者 : $onair_ip名 (60秒以内)";
}
#--------------------------------------------------------------------
# 時間取得
$ENV{TZ} = 'JST-9';
$times = time;
($sec,$min,$hour,$mday,$month,$year,$wday,undef,undef) = localtime($times);
$month++;
$year = 1900 + $year;
$actime = sprintf("%d%02d%02d%02d%02d%02d", $year, $month, $mday, $hour, $min, $sec);
# 引数確認
@PAIRS = split(/&/,$ENV{'QUERY_STRING'});
foreach(@PAIRS){
($key, $value) = split(/=/, $_);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$QUERY{$key} = $value;
}
# ログ確認 $onairipは+1000されている
open(IN,"<$logfile");
($onaircheck,$lastupdatetime,$onairip) = split(/<>/, );
close(IN);
# 表示開始
if($actime > $lastupdatetime + $updatetime_temp){
$onairflag = &httpget; # OFFなら0 放送中なら接続数+1000を返す
&printout($onairflag,$onairflag);
}else{
&printout($onaircheck,$onairip);
}
exit;
#--------------------------------------------------------------------
# 反応を返す
sub printout{
local($onair_c,$onair_ip) = @_;
# 画像表示関係
$QUERY{'imagedir'} = $noquery_imgurl if(!($QUERY{'imagedir'} =~ /http\:\/\//));
if(!$onair_c){
$reprint = "$QUERY{'imagedir'}$radio_pic2";
}else{
$reprint = "$QUERY{'imagedir'}$radio_pic1";
}
# 出力
if($QUERY{'mode'} eq "redirect"){
print "Location: $reprint\n\n";
}else{
print "Content-type: text/html\n\n";
&outimage;
if($onair_ip){
$onair_ip = $onair_ip - 1000;
&outconnect;
}
}
}
# socketでgetする
sub httpget{
# あめぞう2000(www.amezo2000.com)のスクリプトから引っ張った
$get_url =~ /http:\/\/([^:\/]*)(:([0-9]+))?(\/.*)?/;
$host = $1;
$port = ($3 ne "") ? $3 : 80;
$path = ($4 ne "") ? $4 : "/";
$addr = (gethostbyname($host))[4];
$name = pack("S n a4 x8", 2, $port, $addr);
socket(S, 2, 1, 0);
connect(S, $name);
binmode(S);
select(S); $| = 1; select(stdout);
print S "GET $path HTTP/1.0\r\n"
. "User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98)\r\n"
. "Host: $host\r\n"
. "Referer: $get_url\r\n\r\n";
while(){
if ($_ eq "\n" || $_ eq "\r\n" || $_ eq "\r") { last; }
}
while(){
$data2 .= $_;
}
close(S);
# ON AIR判定 適当なので書き直し推奨
if($data2 =~ /Server is currently up and/){
$onair = 1;
if($data2 =~ /listeners \(([0-9]*) unique\)/){
$ipprint = $1;
$ipprint = $ipprint + 1000;
}else{
$ipprint = 1000;
}
}else{
$onair = 0;
$ipprint = 0;
}
# ログ書き込み
open(OUT,"+< $logfile");
flock(OUT,2);
truncate(OUT,0);
seek(OUT,0,0);
print OUT "$onair<>$actime<>$ipprint<>\n";
close(OUT);
return $ipprint;
}