Fihrist | Hakkımda | Özel projeler | Hobilerim | Klavyemden.. / BT
[Makaleler Fihristine git] | [BT Makaleleri Fihristine git]

PHP Script ile Cisco Router'a bağlanma..:

           "How to Connect Cisco Router with Perl Scripts " bağlantısında benzer olarak Perl ile bir Cisco yönlendiriciye nasıl bağlanıldığını anlatmıştım. Ve şimdi, PHP versiyonundan bahsedeceğim. Zira çoğu kimse tarafından PHP, Perl'e nisbetle daha çok bilinen ve daha basit bir dildir. Sizler de belki bu örnekerleri mevcut projelerinize eklemek istersiniz. Temel olarak script'imiz ile Cisco yönlendirici arasında bir telnet oturunu tesis ediyoruz. Bu sadece bir telbet bağlantısıdır. Internette aradığınız zaman bir çok telnet script'leri görebilirsiniz. Onları da kullanabilirsiniz ancak biz burada özel bir durumdan bahsediyoruz. Hadi sıfırdan başlayalım yazmaya...
           Mümkün olduğu kadar parametrik yazmaya çalışacağım. Yani mümkün olduğunca gömülü bilgi içermemeye çalışacağım. "$argv" değişkeni PHP'de ön tanımlı değişkenlerden birisidir ve konsoldan parametre almanıza yarar. Örneğin,

<?php
#!/usr/bin/php
$if(isset($argv[2])) {
print "The first parameter is:".$argv[1]."\n";
print "The second parameter is:".$argv[2]."\n";
} else {
print "usage: ./sample.php parameter1 parameter2 \n";
print "or \n";
print "usage: php sample.php parameter1 parameter2 \n";
}

?>

           Konsolunuzda bu script'i "./sample.php" ya da "php sample.php" komutu ile çalıştırabilirsiniz. Eğer "./sample.php" şeklinde çalıştıracaksanız script'in ilk satırına (#!/usr/bin/php) ifadesini eklemelisiniz ve sample.php dosyasına çalıştırma hakkı vermelisiniz. (chmod +x sample.php). Eğer "php sample.php" şeklinde çalıştıracaksanız ne ilk satıra ilgili ifadeyi eklemeniz gerekir ne de dosyaya çalıştırma hakkı vermeniz gerekir. Çünki "php" komutunun zaten çalıştırma hakkı vardır ve o bu işi halledecektir.

sample.php script $argv dizi değişkeni ile verilen parametreleri yakalayacaktır. Php script'inizin içerisinde bir yere "print_r($argv);" satırı ekleyecek olursanız, tüm parametreleri ekrana basmış olursunuz. Biz ise kendi örneğimizde $argv dizi değişkenini, ip_address, username ve password bilgilerini parametre olarak almak için kullanacağız.
           Eğer Cisco Router'un çıktısı bir ekrana sığmayacak kadar uzun ise ilk etapta gönderdiği çıktının son satırında " -- More -- " şeklinde bir ifade görürsünüz. Bu durumda klavyenizde boşluk tuşuna basarsanız, Cisco'nun çıktısının ikici sayfası ekrana gelecektir. Eğer bu durumda iken boşluk tuşuna basmak yerine enter tuşuna basarsak bu kez Cisco çıktısı sayfa sayfa değil, satır satır ilerleyecektir. Biz bir sonraı sayfayı alabilmek için boşluk karakteri göndermeliyiz. Php'de var olan ereg fonksiyonu ile de bu " -- More -- " ifadesini kontrol edeceğiz.

Cisco yönlendiriciye bağlanmak için php script'i (telnetCisco.php):
#!/usr/bin/php
<?php
if(!isset($argv[2])) {
die ("usage: ./scriptName router_ip username password\n");
}
$port = 23;
$timeout = 10;
$router_ip = $argv[1];
$username = $argv[2];
$password = $argv[3];

$connection = fsockopen($router_ip, $port, $errno, $errstr, $timeout);

if(!$connection){
echo "Connection failed\n";
exit();
} else {
echo "Connected\n";
fputs($connection, "$username\r\n");
fputs($connection, "$password\r\n");
fputs($connection, "show run\r\n");
fputs($connection, " ");

$j = 0;
while ($j < 16) {
fgets($connection, 128);
$j++;
}
stream_set_timeout($connection, 2);
$timeoutCount = 0;
while (!feof($connection)){
$content = fgets($connection, 128);
$content = str_replace("\r", '', $content);
$content = str_replace("\n", "", $content);
print $content."\n";

# If the router say "press space for more", send space char:
if (ereg('--More--', $content) ){ // IF current line contain --More-- expression,
fputs ($connection, " "); // sending space char for next part of output.
} # The "more" controlling part complated.

$info = stream_get_meta_data($connection);
if ($info['timed_out']) { // If timeout of connection info has got a value, the router not returning a output.
$timeoutCount++; // We want to count, how many times repeating.
}
if ($timeoutCount >2){ // If repeating more than 2 times,
break; // the connection terminating..
}
}
}
echo "End.\r\n";
?>

           "stream_get_meta_data" fonksiyonu bu makaledeki en kritik noktalardan birisidir. Çünki burada bağlantı durumunu bu fonksiyon ile kontrol ediyorum. Aşağıdaki çıktı bu fonksiyonun print_r çıktısıdır. Buradan Cisco'nun çıktılarının nerede bittiğini nasıl anlayacağımızı görmenizi istiyorum. (eof ifadesine dikkat ediniz.)

....
...
Array
(
[stream_type] => tcp_socket
[mode] => r+
[unread_bytes] => 0
[seekable] =>
[timed_out] => 1
[blocked] => 1
[eof] =>
)
Array
(
[stream_type] => tcp_socket
[mode] => r+
[unread_bytes] => 0
[seekable] =>
[timed_out] => 1
[blocked] => 1
[eof] =>
)
Array
(
[stream_type] => tcp_socket
[mode] => r+
[unread_bytes] => 0
[seekable] =>
[timed_out] => 1
[blocked] => 1
[eof] =>
)



Bu makalenin kopyalarından birisi şuradadır: Practical Code Solutions: How to Connect Cisco Router with PHP Scripts
My Personal Web Page - ReNewing period...