Не знаю, что я сделал, но теперь это работает. Вот готовый код, если кому-то ещё понадобится. Он запускается сам по себе, но мы используем обёртку из-за особенностей передачи информации Platypus в демон, если кому нужна обёртка – дайте знать. Это базовый скрипт, нет проверки ошибок и он не был протестирован на 100%. Вероятно, в будущем его расширят и будут использовать для сбора другой информации, но пока что – это всё. Используйте его на свой страх и риск.
killradius - Disconnect Radius Script
#!/usr/local/bin/php -q
<?php
if ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
?>
Этот скрипт будет искать MAC-адрес в таблице radacct и отключать пользователя от соответствующего NAS.
Пример использования: <? print $_SERVER['PHP_SELF']; ?> 00:00:00:00:00:00
<?php
} else {
$macaddr = $argv[1];
// Попытаемся подключиться к базе данных....
$link = mysql_connect("localhost", "dbusername", "dbpassword");
if (!$link) {
die('Не удалось подключиться: ' . mysql_error());
echo 'Ошибка подключения к mysql';
}
mysql_select_db("database") or die(mysql_error());
$query = "SELECT * FROM `radacct` WHERE `UserName` LIKE '$macaddr' ORDER BY `RadAcctId` DESC LIMIT 0,1";
$result=mysql_query($query);
$num=mysql_numrows($result);
//Закрываем соединение с mysql!
mysql_close($link);
$i=0;
while ($i < $num) {
// Все наши переменные из запроса.
$RadAcctId=mysql_result($result,$i,"RadAcctId");
$AcctSessionId=mysql_result($result,$i,"AcctSessionId");
$AcctUniqueId=mysql_result($result,$i,"AcctUniqueId");
$UserName=mysql_result($result,$i,"UserName");
$Realm=mysql_result($result,$i,"Realm");
$NASIPAddress=mysql_result($result,$i,"NASIPAddress");
$NASPortId=mysql_result($result,$i,"NASPortId");
$AcctStartTime=mysql_result($result,$i,"AcctStartTime");
$AcctStopTime=mysql_result($result,$i,"AcctStopTime");
$AcctSessionTime=mysql_result($result,$i,"AcctSessionTime");
$AcctAuthentic=mysql_result($result,$i,"AcctAuthentic");
$ConnectInfo_start=mysql_result($result,$i,"ConnectInfo_start");
$ConnectInfo_stop=mysql_result($result,$i,"ConnectInfo_stop");
$AcctInputOctets=mysql_result($result,$i,"AcctInputOctets");
$AcctOutputOctets=mysql_result($result,$i,"AcctOutputOctets");
$CalledStationId=mysql_result($result,$i,"CalledStationId");
$CallingStationId=mysql_result($result,$i,"CallingStationId");
$AcctTerminateCause=mysql_result($result,$i,"AcctTerminateCause");
$ServiceType=mysql_result($result,$i,"ServiceType");
$FramedProtocol=mysql_result($result,$i,"FramedProtocol");
$FramedIPAddress=mysql_result($result,$i,"FramedIPAddress");
$AcctStartDelay=mysql_result($result,$i,"AcctStartDelay");
$AcctStopDelay=mysql_result($result,$i,"AcctStopDelay");
// Следующие 4 строки закомментированы, так как они использовались для отладки.
// echo "Username: $UserName\n";
// echo "Client IP: $FramedIPAddress\n";
// echo "NAS IP Address: $NASIPAddress\n";
// echo "AcctSessionId: $AcctSessionId\n";
// Это команда, которую мы передадим php для выполнения
$cmd = "echo NAS-IP-Address=$NASIPAddress,User-Name=$UserName,Framed-IP-Address=$FramedIPAddress,Acct-Session-Id=$AcctSessionId | /usr/local/bin/radclient $NASIPAddress:1700 disconnect SomeSecret";
// Давайте фактически выполним команду сейчас
exec($cmd);
$i++;
}
}
?>