From: Alex Software <http://diskless.kbpriroda.ru>
Date: Mon, 1 Oct 2007 14:31:37 +0000 (UTC)
Subject: Скрипт для формирования на основе опроса принтеров в сети по SNMP.
Для удобства настройки печати пользователю имеется способ
автоматической настройки его принтера согласно правилам, которые вы
можете сами установить.
Есть множество способов такой автоматической настройки, но для
удобства лучше всего использовать управляемые коммутаторы, где можно
подписать порт. В этом случае можно сделать универсальную утилиту,
которая будет настраивать cups исходя из модели принтера путем
получения информации посредством SNMP и сохранить "физическое"
местоположение принтера, а так же при логине пользователя выяснить на
каком порту он находится и согласно правилам выяснить ближайший к нему
принтер и установить его "по умолчанию".
Для удобства последующей работы я использую postgresql для хранения
информации о принтерах, чтобы каждый раз не сканировать сеть.
Пример скрипта для получения информации из принтеров (HP, других нет).
Скрипт работает на основе информации из портов коммутаторов (SMC и
3Com, возможно и из других будет брать, но надо подрисовать адреса и
функции опроса). Комментарии я специально оставил, чтобы донести
мысль.
my $q_switch_ip=shift(@_);
my $q_mac=shift(@_);
my $t;
my $sss;
my $r_port=0;
$t=new Net::Telnet(prompt=>'/Manager|--More--/');
$t->open($q_switch_ip);
$t->login('manager','friend');
$t->errmode('return');
@lines=$t->cmd(String=>'show switch fdb address='.$q_mac);
foreach $sss (@lines) {
if ($sss=~'ynamic') {
#print " MAC=".$q_mac.' found on=>'.substr($sss,19,3)."n";
$r_port=substr($sss,19,3);
}
}
@lines=$t->cmd(String=>'quit');
$t->close;
return $r_port;
}
sub find_3com {
my $q_switch_ip=shift(@_);
my $q_mac=shift(@_);
my $t;
my $sss;
my $r_port=0;
$t=new Net::Telnet(prompt=>'/ption:/');
$t->open($q_switch_ip);
$t->login('admin','');
$t->errmode('return');
sub find_smc {
my $q_switch_ip=shift(@_);
my $q_mac=shift(@_);
my $t;
my $sss;
my $r_port=0;
$t=new Net::Telnet(prompt=>'/Vty-[0123456789]|---More---/');
$t->open($q_switch_ip);
$t->login('admin','admin');
$t->errmode('return');
sub ip1_to_mac {
my $ip_dst=shift(@_);
my $tmp_str;
my @arr1;
my $r_mac='00:00:00:00:00:00';
open(IN_CMD,'arping -c 1 '.$ip_dst.' |');
while ($tmp_str=) {
if ($tmp_str=~/reply/) {
@arr1=split(' ',$tmp_str);
$r_mac=@arr1[4];
$r_mac=~s/[//g;
$r_mac=~s/]//g;
}
}
close IN_CMD;
return $r_mac;
}
sub ip_to_mac {
my $ip_dst=shift(@_);
my $tmp_str;
my $ip_adr;
my @arr1;
my $r_mac='00:00:00:00:00:00';
#print 'ping -c3 '.$ip_dst.' ';
system('ping -c1 '.$ip_dst.' > /dev/null ');
open(IN_CMD,'arp -n |');
while ($tmp_str=) {
$ip_adr=substr($tmp_str,0,15);
$ip_adr=~s/ //g;
#192.168.100.15 ether 00:0D:61:20:2A:5A C eth0
if (index($ip_dst,$ip_adr) == 0) {
if (length($ip_dst) == length($ip_adr)) {
#@arr1=split(' ',$tmp_str);
#$r_mac=@arr1[4];
#$r_mac=~s/[//g;
#$r_mac=~s/]//g;
if ($tmp_str=~/incomplete/) {
$r_mac='00:00:00:00:00:00';
} else {
$r_mac=substr($tmp_str,33,17);
#print $tmp_str;
}
}
}
}
close IN_CMD;
return $r_mac;
}
sub sw3com_port_descr {
my ($session, $error) = Net::SNMP->session(
-hostname => shift(@_),
-community => 'public',
-port => 161
);
my $r_descr= "";
my $port_num=shift(@_);
if (!defined($session)) {
#printf("ERROR: %s.n", $error);
return " Error";
}
#my $ifDescr = '1.3.6.1.2.1.2.2.1.2.101';
my $real_q=$port_num + 100;
my $ifDescr = '1.3.6.1.2.1.31.1.1.1.18.'.$real_q;
sub sw_smc_port_descr {
my $q_switch_ip=shift(@_);
my $q_port=shift(@_);
my $t;
my $sss;
my $r_port="";
$t=new Net::Telnet(prompt=>'/Vty-[0123456789]|---More---/');
$t->open($q_switch_ip);
$t->login('admin','admin');
$t->errmode('return');
$q_mac=~s/:/-/g;
@lines=$t->cmd(String=>'show interface status ethernet 1/'.$q_mac);
foreach $sss (@lines) {
if ($sss=~'Name:') {
#print " MAC=".$q_mac.' found on=>'.substr($sss,index($sss,'/')+1,2)."n";
$r_port=substr($sss,index($sss,'Name:')+5,10);
}
}
$t->close;
return $r_port;
}
sub swsmc_port_descr {
my ($session, $error) = Net::SNMP->session(
-hostname => shift(@_),
-community => 'public',
-port => 161
);
my $r_descr= "";
my $port_num=shift(@_);
if (!defined($session)) {
#printf("ERROR: %s.n", $error);
return " Error";
}
#my $ifDescr = '1.3.6.1.2.1.2.2.1.2.101';
my $real_q=$port_num + 100;
my $ifDescr = '1.3.6.1.2.1.31.1.1.1.18.'.$port_num;
Скрипт формирует файл для postgres c информацией о принтерах. Скрипт
должен выполняться на маршрутизаторе или сервере, который имеет доступ
ко всем принтерам сети.
808 Прочтений • [Скрипт для формирования на основе опроса принтеров в сети по SNMP. (perl print snmp)] [08.05.2012] [Комментариев: 0]