hey sarky,
i have written that script recently for mikrotik 2.7.dontremember;
it will kill duplicate pppoe logins
i have tested it in several providers and it works just fine
you have to replace user with account with 'read'+'write' rights.
it is a pity that mikrotik does not support automated key based ssh login and we have to do stuff like this; but it works.
be careful to restrict the user/pass account to login only from specific ip address. the telnet protocol is not secure and if your servers share the same lan with users it cant be made secure...
for 2.8.xxx you have to modify it a bit - column is no more supported for print and when removed you will have to modify the second regex...
here it comes:
#!/usr/bin/php4 -q
<? // $Id: mt_ck.php,v 1.2 2004/10/03 23:48:23 bbonev Exp $
$addr='192.168.x.x';
$port=23;
$user='user';
$pass='pass';
$cmd='/interface pppoe-server print column=remote-address,user,name without-paging';
$header1=chr(0xFF).chr(0xFB).chr(0x1F).chr(0xFF).chr(0xFB).
chr(0x20).chr(0xFF).chr(0xFB).chr(0x18).chr(0xFF).chr(0xFB).
chr(0x27).chr(0xFF).chr(0xFD).chr(0x01).chr(0xFF).chr(0xFB).
chr(0x03).chr(0xFF).chr(0xFD).chr(0x03).chr(0xFF).chr(0xFC).
chr(0x23).chr(0xFF).chr(0xFC).chr(0x24).chr(0xFF).chr(0xFA).
chr(0x1F).chr(0x00).chr(0x50).chr(0x00).chr(0x18).chr(0xFF).
chr(0xF0).chr(0xFF).chr(0xFA).chr(0x20).chr(0x00).chr(0x33).
chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0x2C).chr(0x33).
chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0xFF).chr(0xF0).
chr(0xFF).chr(0xFA).chr(0x27).chr(0x00).chr(0xFF).chr(0xF0).
chr(0xFF).chr(0xFA).chr(0x18).chr(0x00).chr(0x58).chr(0x54).
chr(0x45).chr(0x52).chr(0x4D).chr(0xFF).chr(0xF0);
$header2=chr(0xFF).chr(0xFC).chr(0x01).chr(0xFF).chr(0xFC).
chr(0x22).chr(0xFF).chr(0xFE).chr(0x05).chr(0xFF).chr(0xFC).chr(0x21);
$fp=fsockopen($addr,$port);
fputs($fp,$header1);
usleep(125000);
fputs($fp,$header2);
usleep(125000);
fputs($fp,"{$user}\n");
usleep(125000);
fputs($fp,"{$pass}\n");
usleep(125000);
fputs($fp,"$cmd\r\n");
usleep(125000);
fputs($fp,"quit\r\n");
usleep(2*125000);
do {
$nl=fread($fp,800);
$output.=$nl;
$stat=socket_get_status($fp);
} while ($stat["unread_bytes"]);
fclose($fp);
preg_match("|[#][ ]+REMOTE[-]ADDRESS[ ]+USER|",$output,$matches);
$begpos=strpos($output,$matches[0]);
$output=substr($output,$begpos);
$output=str_replace("\r",'',$output);
preg_match_all("|\n[ ]+([0-9]+)[ ]+R[ ]+([0-9A-F]+:[0-9A-F]+:[0-9A-F]+:[0-9A-F]+:[0-9A-F]+:[0-9A-F]+)[ ]+([0-9a-z.]+)[ ]+([<][^>]+[>])|",$output,$matches);
$users=array();
$logins=array();
for ($i=0;$i<count($matches[1]);$i++) {
$users[]=array('mac'=>$matches[2][$i],'user'=>$matches[3][$i]);
$logins[$matches[3][$i]]['cnt']++;
$logins[$matches[3][$i]]['ints'][]=$matches[4][$i];
}
$cmds='';
while (list($k,$v)=each($logins)) {
if ($v['cnt']>1) {
while (list($dummy,$vv)=each($v['ints']))
$cmds.='/interface pppoe-server remove "'.$vv.'"'."\r\n";
}
}
if ($cmds!='') {
$cmd=$cmds."quit\r\n";
echo $cmd;
$fp=fsockopen($addr,$port);
fputs($fp,$header1);
usleep(125000);
fputs($fp,$header2);
usleep(125000);
fputs($fp,"{$user}\n");
usleep(125000);
fputs($fp,"{$pass}\n");
usleep(125000);
fputs($fp,"$cmd\r\n");
usleep(125000);
# show the output
do {
$nl=fread($fp,800);
$output.=$nl;
$stat=socket_get_status($fp);
} while ($stat["unread_bytes"]);
echo $output;
fclose($fp);
}
?>