Показаны сообщения с ярлыком perl. Показать все сообщения
Показаны сообщения с ярлыком perl. Показать все сообщения

четверг, 30 июля 2015 г.

Save WSA config via ftp using perl script

Простой способ автоматизировать резервирование файлов конфигурации - написать скрипт. В случае с Cisco IronPort S170 это хороший вариант т.к. встроенных возможностей по автоматической записи конфигов на сторонний хост я не нашел. Нужна линуксовая машина, где есть perl. На нее будем писать конфиги с WSA. На WSA поднят FTP сервер.

#! /usr/bin/perl -w

use Net::FTP;

chdir ("/home/cisco/wsa/configuration" or die "cannot change: $!\n");

$ftp = Net::FTP->new("10.5.32.2", Debug => 1, Passive => 1)
or die "Cannot connect to wsa: $@";

$ftp->login("admin", "password")
or die "Cannot login", $ftp->message;

$ftp->cwd("/configuration")
or die "Cannot change working directory ", $ftp->message;

$ftp->binary or die "Cannot set binary mode: $!";

@ls = $ftp->ls() or die "ls failed", $ftp->message;

foreach $i (@ls) {
        ($i1 = $i) =~ s/(\.\/)//;
        print "",$i1,"\n";
        $ftp->get($i1) or die "get failed ", $ftp->message;
}

$ftp->quit;

Не забываем добавить в cron

11 * * * * /home/cisco/wsa/ftp.pl


четверг, 31 мая 2012 г.

Многопоточность в Perl. Threads, Queue.

У меня уже был пост об этом. Со временем исправил много багов. Теперь нити работают через очередь, не зависают. Данный скрипт пингает хосты из сети, которую мы ему задаем в переменной $network, выдаёт статистику "сколько хостов ответило из общего количества в сети". Сеть задаём в формате N.N.N.N/N, модуль Net::Netmask определяет кол-во хостов в сети. В данном случае стартует 25 нитей, каждая из которых выполняет функцию ping. Когда очередь исчерпана, скрипт переходит к подсчёту статистики из файла.


#!/usr/bin/perl -w
#Ping network with threads and queue

use threads;
use Net::Ping;
use Net::Netmask;
use Thread::Queue;

# Programm variables

$debug=1;
$data_queue0 = Thread::Queue->new;
my $sleeptime = 0;                              

$network='178.76.215.0/25';

sub cidr {
  my $net = shift @_;
  my $block = Net::Netmask->new($net);
  my @pool;
  $size=$block->size();

  for (my $i=0; $i<=$size; $i++) {
   #print $block->nth($i),"\n";
 push (@pool, $block->nth($i));
 
  }
  return @pool;

}
                                                        
sub ping {
  while ($data_queue0->pending()) {
  my $host = $data_queue0->dequeue;
  my $pingprotocol = "icmp";
  my $pingtimeout = 1;
  my $pinglength = 1;
                                                                                                 
  my $p = Net::Ping->new($pingprotocol,$pingtimeout,$pinglength);
    if ( $p->ping($host) ) {
      print OFILE "$host OK\n";
      #print "$host OK\n";
        }  
  $p->close();
  }
}


sub que {
    print "Starting que sub\n";
    my @ar=@_;
    #print @ar,"\n"; 
    my $a;

    foreach my $ip (@ar) {
     $data_queue0->enqueue($ip);
  $a++;
    }

    if ($debug==1) { print "$a elements queued\n"; }
}

sub startthreads {
    for ($m=0; $m<=24; $m++) {
 sleep($sleeptime);
 $thrd[$m] = threads->new(\&ping, $data_queue0);
     print "Thread $m started.\n";  

    }
    print "All threads are started\n";                                            
    foreach (@thrd) { $_->join(); }
    print "All threads are joined!\n";
}

#Programm body

#1 - Recive data from cidr to array
@ipaddr = cidr($network);

#2 - Insert array into queue
que(@ipaddr);

#3 - Open file for inserting stdout from threads
open OFILE, ">ping_network_stats.txt";

#4 - Create threads
startthreads;

#5 - Close file with WRITE ONLY
close(OFILE);

#6 - Open file with READ ONLY
open OFILE1, ";

#8 Delete empty strings
chomp @count;

#9 - Print results of programm 
print "Network usage\: ",$#count," of ",$size,", ", $use=($#count/$size)*100, " %";

#10 - Close file descriptor with WRITE ONLY
close (OFILE1);

четверг, 24 мая 2012 г.

Работа с PostgreSQL через DBI в Perl

Очень доходчиво.

Оригинал тут http://www.lghost.ru/docs/postgres/DBI_pg.html

В этом небольшом руководстве я рассмотрю работу с SQL сервером PostgreSQL в языке Perl. Поскольку для Perl существует стандартный интерфейс для работы с разными СУБД, который называется DBI (Database Independent Interface), то я буду рассматривать именно его. Хотя DBI и является стандартной вещью, но всё-равно от специфики конкретных СУБД никуда не уйти, так как некоторые СУБД могут не поддерживать весь спектр возможностей заложенных в DBI. Поэтому, в данном случае, я буду говорить только о реализации DBI интерфейса, которую поддерживает DBI драйвер для PostgreSQL. Этот драйвер поставляется в виде отдельного модуля, который интегрируется с DBI и называется DBD::Pg (DataBase Driver для PostgreSQL).

Информация, которую вы найдёте в данном руководстве не является (за малыми исключениями) моим личным опытом. Я просто сделал небольшую компиляцю странички man наDBD::Pg и снабдил ряд моментов пояснениями и примерами. В принципе, если у вас нет трудностей с английским языком, а также есть желание почитать оригинал - вы всегда можете это сделать.


понедельник, 9 августа 2010 г.

Perl view my IP

Есть сервер, подключенный к модему с динамическим public ip. Решил обойтись без dynamic dns. На сервере пишу скрипт на Perl, который выходит на сайт whatismyipaddress.com, узнает там свой айпишник, записывает его в файл ip.htm и выкладывает на ftp.


#!/usr/bin/perl
# Script by k4

open DB, "ip.htm";
$pth="/home/user";
chdir $pth;

$lastip=;
chomp $lastip;
#print $lastip;

my $url = 'http://whatismyipaddress.com/';

use LWP::Simple;
my $content = get $url;
die "Couldn't get $url" unless defined $content;

if($content =~ m/(IP\sInformation:\s\)(\d+\.\d+\.\d+\.\d+)(\<\!\-\-\s)/) {

if ($lastip eq $2) { } else { $a=1; print `echo $2 > ip.htm`; }
} else {
print "IP is unknown\n";
}

if ($a) {

use Net::FTP;

$ftp = Net::FTP->new('ftp.host.net', Debug => 0)
or die "Cannot connect to sgsn1: $@";


$ftp->login('login', 'password')
or die "Cannot login", $ftp->message;

#$ftp->cwd("/")
#or die "Cannot change working directory ", $ftp->message;

$ftp->put("ip.htm")
or die "send failed ", $ftp->message;

$ftp->quit;
}

среда, 2 декабря 2009 г.

Perl Threads многопоточность

UPD: Продолжение тут - http://www.k4route.ru/2012/05/perl-threads-queue.html
Имеется много хостов. Периодически нужно цеплятся к каждому и вытягивать какой-нить принтаут или просто давать какаю-нить команду, да так, чтоб одновременно. Множить скрипты? Нужно использовать многопоточность! Начал гуглить. Perl, нити :) Нити-нити! :) Много инфы, мануалы на английском... не очень понятно... разбираюсь... Очередная ссылка, попадая на блог, где чел прям совсем доступно рассказывает про эти самые нити. С базовым пониманием уже можно приступать к изучению крутых мануалов. Собственно ссылко http://nopox.wordpress.com/2007/11/06/multithreading-in-perl-part-2/

И первая моя прога с нитями. Цепляется к массиву хостов по телнет, вытягивает принтаут комманды date.


use threads; #Подключаем модуль нитей
use Net::Telnet; #Модуль Telnet

@sgsns=('172.26.18.163', '172.26.18.164', '172.26.18.165', '172.26.18.166');

$login="log";
$password="pass";


#Создаём столько нитей, сколько у нас элементов в массиве @sgsns

for ($i=0; $i<=$#sgsns; $i++) {
push @threads, threads->create(\&sub1, $sgsns[$i], $login, $password)
}

foreach $thread (@threads) {
$thread->join(); #Сообщаем главной программе,
} #чтоб дожидалась выполнения нити

sub sub1 {
my @InboundParameters = @_;

my $host = $InboundParameters[0];
my $login = $InboundParameters[1];
my $password = $InboundParameters[2];

my $fd=new Net::Telnet (Timeout => 30 , Prompt => '/[\$%#>] $/');

$fd->open($host);
$fd->login($login,$password);

my @lines1=$fd->cmd("date");
print "$host\: @lines1";
print "\n";

}

вторник, 10 ноября 2009 г.

Perl и время

($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
$year=$year+1900;
$mon=$mon+1;
print "$year-$mon-$mday $hour:$min:$sec";
print "\n";