<?php
function
StrKey(
$src
,
$key
, &
$res
)
{
$key
.=
" "
;
if
(
strncasecmp
(
$src
,
$key
,
strlen
(
$key
) ) )
return
false;
$res
=
substr
(
$src
,
strlen
(
$key
) );
return
true;
}
function
StrSplit(
$src
,
$sep
, &
$d1
, &
$d2
)
{
$pos
=
strpos
(
$src
,
$sep
);
if
(
$pos
=== false )
{
$d1
=
$src
;
return
;
}
$d1
=
substr
(
$src
, 0,
$pos
);
$d2
=
substr
(
$src
,
$pos
+ 1 );
}
function
StrDecode( &
$src
)
{
$res
=
""
;
for
(
$i
= 0;
$i
<
strlen
(
$src
); )
{
if
(
$src
[
$i
] ==
'%'
)
{
$res
.= sprintf(
"%c"
,
intval
(
substr
(
$src
,
$i
+ 1, 2 ), 16 ) );
$i
+= 3;
continue
;
}
$res
.=
$src
[
$i
];
$i
+= 1;
}
return
(
$res
);
}
class
CVentriloClient
{
var
$m_uid
;
var
$m_admin
;
var
$m_phan
;
var
$m_cid
;
var
$m_ping
;
var
$m_sec
;
var
$m_name
;
var
$m_comm
;
function
Parse(
$str
)
{
$ary
=
explode
(
","
,
$str
);
for
(
$i
= 0;
$i
<
count
(
$ary
);
$i
++ )
{
StrSplit(
$ary
[
$i
],
"="
,
$field
,
$val
);
if
(
strcasecmp
(
$field
,
"UID"
) == 0 )
{
$this
->m_uid =
$val
;
continue
;
}
if
(
strcasecmp
(
$field
,
"ADMIN"
) == 0 )
{
$this
->m_admin =
$val
;
continue
;
}
if
(
strcasecmp
(
$field
,
"CID"
) == 0 )
{
$this
->m_cid =
$val
;
continue
;
}
if
(
strcasecmp
(
$field
,
"PHAN"
) == 0 )
{
$this
->m_phan =
$val
;
continue
;
}
if
(
strcasecmp
(
$field
,
"PING"
) == 0 )
{
$this
->m_ping =
$val
;
continue
;
}
if
(
strcasecmp
(
$field
,
"SEC"
) == 0 )
{
$this
->m_sec =
$val
;
continue
;
}
if
(
strcasecmp
(
$field
,
"NAME"
) == 0 )
{
$this
->m_name = StrDecode(
$val
);
continue
;
}
if
(
strcasecmp
(
$field
,
"COMM"
) == 0 )
{
$this
->m_comm = StrDecode(
$val
);
continue
;
}
}
}
}
class
CVentriloChannel
{
var
$m_cid
;
var
$m_pid
;
var
$m_prot
;
var
$m_name
;
var
$m_comm
;
function
Parse(
$str
)
{
$ary
=
explode
(
","
,
$str
);
for
(
$i
= 0;
$i
<
count
(
$ary
);
$i
++ )
{
StrSplit(
$ary
[
$i
],
"="
,
$field
,
$val
);
if
(
strcasecmp
(
$field
,
"CID"
) == 0 )
{
$this
->m_cid =
$val
;
continue
;
}
if
(
strcasecmp
(
$field
,
"PID"
) == 0 )
{
$this
->m_pid =
$val
;
continue
;
}
if
(
strcasecmp
(
$field
,
"PROT"
) == 0 )
{
$this
->m_prot =
$val
;
continue
;
}
if
(
strcasecmp
(
$field
,
"NAME"
) == 0 )
{
$this
->m_name = StrDecode(
$val
);
continue
;
}
if
(
strcasecmp
(
$field
,
"COMM"
) == 0 )
{
$this
->m_comm = StrDecode(
$val
);
continue
;
}
}
}
}
class
CVentriloStatus
{
var
$m_cmdprog
;
var
$m_cmdcode
;
var
$m_cmdhost
;
var
$m_cmdport
;
var
$m_error
;
var
$m_name
;
var
$m_phonetic
;
var
$m_comment
;
var
$m_maxclients
;
var
$m_voicecodec_code
;
var
$m_voicecodec_desc
;
var
$m_voiceformat_code
;
var
$m_voiceformat_desc
;
var
$m_uptime
;
var
$m_platform
;
var
$m_version
;
var
$m_channelcount
;
var
$m_channelfields
;
var
$m_channellist
;
var
$m_clientcount
;
var
$m_clientfields
;
var
$m_clientlist
;
function
Parse(
$str
)
{
$pos
=
strpos
(
$str
,
"\n"
);
if
(
$pos
=== false )
{
}
else
{
$str
=
substr
(
$str
, 0,
$pos
);
}
if
( StrKey(
$str
,
"ERROR:"
,
$val
) )
{
$this
->m_error =
$val
;
return
-1;
}
if
( StrKey(
$str
,
"NAME:"
,
$val
) )
{
$this
->m_name = StrDecode(
$val
);
return
0;
}
if
( StrKey(
$str
,
"PHONETIC:"
,
$val
) )
{
$this
->m_phonetic = StrDecode(
$val
);
return
0;
}
if
( StrKey(
$str
,
"COMMENT:"
,
$val
) )
{
$this
->m_comment = StrDecode(
$val
);
return
0;
}
if
( StrKey(
$str
,
"AUTH:"
,
$this
->m_auth ) )
return
0;
if
( StrKey(
$str
,
"MAXCLIENTS:"
,
$this
->m_maxclients ) )
return
0;
if
( StrKey(
$str
,
"VOICECODEC:"
,
$val
) )
{
StrSplit(
$val
,
","
,
$this
->m_voicecodec_code,
$desc
);
$this
->m_voicecodec_desc = StrDecode(
$desc
);
return
0;
}
if
( StrKey(
$str
,
"VOICEFORMAT:"
,
$val
) )
{
StrSplit(
$val
,
","
,
$this
->m_voiceformat_code,
$desc
);
$this
->m_voiceformat_desc = StrDecode(
$desc
);
return
0;
}
if
( StrKey(
$str
,
"UPTIME:"
,
$val
) )
{
$this
->m_uptime =
$val
;
return
0;
}
if
( StrKey(
$str
,
"PLATFORM:"
,
$val
) )
{
$this
->m_platform = StrDecode(
$val
);
return
0;
}
if
( StrKey(
$str
,
"VERSION:"
,
$val
) )
{
$this
->m_version = StrDecode(
$val
);
return
0;
}
if
( StrKey(
$str
,
"CHANNELCOUNT:"
,
$this
->m_channelcount ) )
return
0;
if
( StrKey(
$str
,
"CHANNELFIELDS:"
,
$this
->m_channelfields ) )
return
0;
if
( StrKey(
$str
,
"CHANNEL:"
,
$val
) )
{
$chan
=
new
CVentriloChannel;
$chan
->Parse(
$val
);
$this
->m_channellist[
count
(
$this
->m_channellist ) ] =
$chan
;
return
0;
}
if
( StrKey(
$str
,
"CLIENTCOUNT:"
,
$this
->m_clientcount ) )
return
0;
if
( StrKey(
$str
,
"CLIENTFIELDS:"
,
$this
->m_clientfields ) )
return
0;
if
( StrKey(
$str
,
"CLIENT:"
,
$val
) )
{
$client
=
new
CVentriloClient;
$client
->Parse(
$val
);
$this
->m_clientlist[
count
(
$this
->m_clientlist ) ] =
$client
;
return
0;
}
return
1;
}
function
ChannelFind(
$cid
)
{
for
(
$i
= 0;
$i
<
count
(
$this
->m_channellist );
$i
++ )
if
(
$this
->m_channellist[
$i
]->m_cid ==
$cid
)
return
(
$this
->m_channellist[
$i
] );
return
NULL;
}
function
ChannelPathName(
$idx
)
{
$chan
=
$this
->m_channellist[
$idx
];
$pathname
=
$chan
->m_name;
for
(;;)
{
$chan
=
$this
->ChannelFind(
$chan
->m_pid );
if
(
$chan
== NULL )
break
;
$pathname
=
$chan
->m_name .
"/"
.
$pathname
;
}
return
(
$pathname
);
}
function
Request()
{
$cmdline
=
$this
->m_cmdprog;
$cmdline
.=
" -c"
.
$this
->m_cmdcode;
$cmdline
.=
" -t"
.
$this
->m_cmdhost;
if
(
strlen
(
$this
->m_cmdport ) )
{
$cmdline
.=
":"
.
$this
->m_cmdport;
if
(
strlen
(
$this
->m_cmdpass ) )
$cmdline
.=
":"
.
$this
->m_cmdpass;
}
$cmdline
=
escapeshellcmd
(
$cmdline
);
$pipe
= popen(
$cmdline
,
"r"
);
if
(
$pipe
=== false )
{
$this
->m_error =
"PHP Unable to spawn shell."
;
return
-10;
}
$cnt
= 0;
while
( !
feof
(
$pipe
) )
{
$s
=
fgets
(
$pipe
, 1024 );
if
(
strlen
(
$s
) == 0 )
continue
;
$rc
=
$this
->Parse(
$s
);
if
(
$rc
< 0 )
{
pclose(
$pipe
);
return
(
$rc
);
}
$cnt
+= 1;
}
pclose(
$pipe
);
if
(
$cnt
== 0 )
{
$this
->m_error =
"PHP Unable to start external status process."
;
return
-11;
}
return
0;
}
};
?>