PHP Telnet Class

From MikroTik Wiki
Revision as of 15:51, 16 September 2009 by Blaze (talk | contribs) (New page: =PHP telnet class= Class that allows you to send commands via php and telnet should possibly be able to modify for ssh but could not get ssh compiled into my PHP :) <pre> <?php header("C...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

PHP telnet class

Class that allows you to send commands via php and telnet should possibly be able to modify for ssh but could not get ssh compiled into my PHP :)

<?php
 header("Content-Type: text/plain");
/*
* RouterOS API
* Based on the code of SpectatorCN at http://forum.mikrotik.com/viewtopic.php?f=9&t=32957
* Modified by Ali Damji http://forum.mikrotik.com/viewtopic.php?f=9&t=33690
* Modified by Tim Haak
* Free to modify, distribute, do whatever.
*
*/
class phpMikrotikTelnet
{
	//You may be able to lower this for single commands but needs to be high when running lots of commands
	var $TimeOut=125000;
	var $fp;
	var $echo=true;
	
	function phpMikrotikTelnet($host, $username, $password,$echo=true)
	{
		$this->routeros_connect($host, $username, $password);
	}
	
	function routeros_connect($host, $username, $password) 
	{
		$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(0x41).chr(0x4E).chr(0x53).chr(0x49).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);
		$this->fp=fsockopen($host,23);
		fputs($this->fp,$header1);
		usleep(125000);
		fputs($this->fp,$header2);
		usleep(125000);
		$this->write_to_telnet($username."+ct");
		$this->write_to_telnet($password);
		$this->read_from_telnet();
	}
	
	function routeros_cmd($command) 
	{
		//$command = str_replace(";\n",';',$command);
		//echo $command."\n";
		$commands = explode("\n",$command);
		reset($commands);
		foreach ($commands as $cmd)
		{
			if ($this->echo)
				echo $cmd."\n";
			flush();
	    	$this->write_to_telnet(trim($cmd));
	    	$read = $this->read_from_telnet()."\n";
	    	if ($this->echo)
				echo $read;
	   		flush();
		}
	    return $rez;
	}
	
	# Telnet Related
	function write_to_telnet($text)
	{
	    fputs($this->fp,$text."\r\n");
	    usleep($this->TimeOut);
	   	return true;
	}
	
	function read_from_telnet()
	{
	    $output = "";
	    $count = 0;
	    $count2 = 0;
	    do{
	        $char =fread($this->fp, 1);
	        $output .= $char;
	        if($char==">") $count++;
	        if($count==1) break;
	        if($char==".") $count2++;
	        if($count2==3) break;
	    } while(1==1);
	    $output=preg_replace("/^.*?\n(.*)\n[^\n]*$/","$1",$output);
	    $o=explode("\n",$output);
	    for($i=1;$i<=count($o)-2;$i++) $op.=$o[$i]."\n";
	    return $op;
	}
	
	function close()
	{
		fclose($this->fp);
	}
	
}


$cmd = '
/queue type
remove pfifo
remove pfifo_long
remove red
remove sfq
remove pcq_game
remove pcq_rest
remove pcq_default
add kind=pfifo name=pfifo pfifo-limit=50
add kind=pfifo name=pfifo_long pfifo-limit=250
add kind=sfq name=sfq sfq-allot=1514 sfq-perturb=5
add kind=red name=red red-avg-packet=1000 red-burst=40 red-limit=180 red-max-threshold=100 red-min-threshold=30
#Short que better latency
add kind=pcq name=pcq_game pcq-rate=0 pcq-classifier=dst-address pcq-limit=20 pcq-total-limit=500
add kind=pcq name=pcq_rest pcq-rate=0 pcq-classifier=dst-address pcq-limit=200 pcq-total-limit=8000
add kind=pcq name=pcq_default pcq-rate=0 pcq-classifier=dst-address pcq-limit=50 pcq-total-limit=2000


:foreach intId in=[/interface wireless find] do={     \
:local intname [/interface wireless get $intId name];  \

:local qname ("Q_" . $intname);
:local subqname ("Q_SUB_" . $intname);
:local maxlimit 1000000000;

/queue tree


     
add burst-limit=0 burst-threshold=0 burst-time=0s  limit-at=$maxlimit \
    max-limit=$maxlimit name=$qname parent=$intname 
    
add burst-limit=0 burst-threshold=0 burst-time=0s  limit-at=512000 \
    max-limit=512000 name=("voip_46_"  . $intname)  packet-mark=dscp_46     parent=$qname priority=1 queue=pcq_game
add burst-limit=0 burst-threshold=0 burst-time=0s  limit-at=512000 \
    max-limit=512000 name=("critical_7_"  . $intname)  packet-mark=dscp_7     parent=$qname priority=1 queue=pcq_game
add burst-limit=0 burst-threshold=0 burst-time=0s  limit-at=3000000 \
    max-limit=3000000 name=("games_6_"  . $intname)  packet-mark=dscp_6     parent=$qname priority=2 queue=pcq_game
#pfifo
    
add burst-limit=0 burst-threshold=0 burst-time=0s  limit-at=5000000 \
    max-limit=$maxlimit name=("lv_hi_"  . $intname)  packet-mark=lvhi            parent=$qname priority=1 queue=pcq_rest  
      
add burst-limit=0 burst-threshold=0 burst-time=0s  limit-at=1000000 \
    max-limit=$maxlimit name=("lv_med_"  . $intname)  packet-mark=lvmed          parent=$qname priority=2 queue=pcq_rest
   
add burst-limit=0 burst-threshold=0 burst-time=0s  limit-at=512000 \
    max-limit=512000 name=("management_5_" . $intname)   packet-mark=dscp_5      parent=$qname priority=3 queue=pcq_default
#pfifo    
add burst-limit=0 burst-threshold=0 burst-time=0s  limit-at=1000000 \
    max-limit=$maxlimit name=$subqname parent=$qname    
  
add burst-limit=0 burst-threshold=0 burst-time=0s  limit-at=100000 \
    max-limit=$maxlimit name=("high_4_" . $intname)              packet-mark=dscp_4      parent=$subqname priority=5 queue=pcq_rest
#pfifo_long
add burst-limit=0 burst-threshold=0 burst-time=0s  limit-at=100000 \
    max-limit=$maxlimit name=("norm_3_" . $intname)              packet-mark=dscp_3      parent=$subqname priority=6 queue=pcq_rest
#pfifo_long
add burst-limit=0 burst-threshold=0 burst-time=0s  limit-at=100000 \
    max-limit=$maxlimit name=("filetrans_2_" . $intname)         packet-mark=dscp_2      parent=$subqname priority=7 queue=pcq_rest
#pfifo_long
add burst-limit=0 burst-threshold=0 burst-time=0s  limit-at=100000 \
    max-limit=$maxlimit name=("bulk_1_" . $intname)              packet-mark=dscp_1      parent=$subqname priority=8 queue=pcq_game
#sfq
add burst-limit=0 burst-threshold=0 burst-time=0s  limit-at=100000 \
    max-limit=$maxlimit name=("unmarked_" . $intname)            packet-mark="unmarked"  parent=$subqname priority=8 queue=pcq_game
#sfq
    
/system script
 set start_shaping source=([/system script get start_shaping source] . "       \
     /queue tree set games_6_$intname limit-at=5000000 max-limit=5000000;      \
     /queue tree set [find parent=$subqname] max-limit=5000000;                \
     /queue tree set $subqname max-limit=5000000\r\ \n")
 set stop_shaping source=([/system script get stop_shaping source] . "         \
     /queue tree set games_6_$intname limit-at=3000000 max-limit=3000000;      \
     /queue tree set [find parent=$subqname] max-limit=$maxlimit;              \
     /queue tree set $subqname max-limit=$maxlimit\r\ \n")
}


/system clock
set time-zone-name=Africa/Johannesburg

/system ntp client
set enabled=yes mode=unicast primary-ntp=172.20.2.1 secondary-ntp=\
    172.20.11.34

:put "done"
';

//$ServerList [] = "172.20.16.106";
//$ServerList [] = "172.20.245.55";
//$ServerList [] = "172.20.12.81";
$ServerList [] = "172.20.14.177";

$Username 	= 'timh';
$Pass 		= '3463236';

foreach ($ServerList as $Server)
{
	$mk = &new phpMikrotikTelnet($Server, $Username, $Pass);
	$mk->routeros_cmd($cmd);
	$mk->close();
	
}


?>