2

我编写了一个 Perl 脚本,该脚本将启动一个 SNMP 会话并提取数据/计数器及其对 csv 文件的值。有 7 个 perl 脚本;顶部有不同的属性/定义/变量..但引擎是相同的。

此时,除了定义的变量之外,这 7 个 perl 脚本都是多余的。有没有办法将执行 perl 脚本保存为属性/执行文件并将引擎保存在另一个文件中?这个属性/执行 perl 脚本将调用引擎(使用在它自己的脚本中定义的属性)。

所以简而言之,我想在他们自己的脚本中使用变量(也作为一个执行),但是从一个统一的“引擎”调用一个特定的函数。

IE

取回_mibs1.pl 取回_mibs2.pl 取回_mibs3.pl 取回_mibs4.pl 取回_mibs5.pl 取回_mibs6.pl 取回_mibs7.pl

检索_mibs1.pl

#!/usr/local/bin/perl

use Net::SNMP;

##DEFINITION START

my @Servers = (
  'server1',
  'server2',
);

my $PORT = 161;

my $COMMUNITY = 'secret';

my $BASEOID = '1.2.3.4.5.6.7.8';

my $COUNTERS = [
  [11,'TotalIncomingFromPPH'],
  [12,'TotalFailedIncomingFromPPH'],
];

##ENGINE START
sub main {
  my $stamp = gmtime();
  my @oids = ();
  foreach my $counter (@$COUNTERS) {
    push @oids,("$BASEOID.$$counter[0].0");
  }
  foreach my $server (@Servers) {
    print "$stamp$SEPARATOR$server";
    my ($session,$error) = Net::SNMP->session(-version => 1,-hostname => $server,-port => $PORT,-community => $COMMUNITY);
    if ($session) {
      my $result = $session->get_request(-varbindlist => \@oids);
      if (defined $result) {
        foreach my $oid (@oids) {
          print $SEPARATOR,$result->{$oid};
        }
      } else {
        print STDERR "$stamp Request error: ",$session->error,"\n";
        print "$SEPARATOR-1" x scalar(@oids);
      }
    } else {
      print STDERR "$stamp Session error: $error\n";
      print "$SEPARATOR-1" x scalar(@oids);
    }
    print "\n";
  }
}
main();
4

3 回答 3

1

脑海里立刻浮现出两个想法:

为您的通用代码构建一个 Perl 模块,然后根据您requireuse需要构建一个模块。(区别主要在于您是要运行LynxLee::run_servers()还是run_servers()- 您是否希望模块影响您当前的范围。)

使用符号链接:创建这些符号链接:retrieve_mibs1.pl -> retrieve_mibs.pl retrieve_mibs2.pl -> retrieve_mibs.pl,依此类推,然后根据程序名称设置变量:

#!/usr/bin/perl -w

use File::Basename;

my $name = basename($0);

my @Servers, $PORT, $COMMUNITY, $BASEOID, $COUNTERS;

if($name ~= /retrieve_mibs1\.pl/) {
    @Servers = (
        'server1',
        'server2',
    );

    # ...
} elsif ($name ~= /retrieve_mibs2\.pl/) {
    @Servers = (
        'server3',
        'server4',
    );

    # ...
}

使用程序名称对哈希进行索引以检索参数会更简洁,但我不太擅长 Perl 引用。:)

于 2011-01-21T08:11:03.647 回答
1

您可以使用 eval 来做到这一点:在一个文件中设置变量,然后打开引擎并评估它的内容。

variables.pl(设置变量并调用引擎):

use warnings;
use strict;
use Carp;
use English '-no_match_vars';

require "engine.pl"; # so that we can call it's subs

# DEFINITION START
our $VAR1    = "Hello";
our $VAR2    = "World";

# CALL THE ENGINE
print "START ENGINE:\n";
engine(); # call engine
print "DONE\n";

engine.pl(实际工作的东西):

sub engine{
    print "INSIDE ENGINE\n";
    print "Var1: $VAR1\n";
    print "Var2: $VAR2\n";
}
1;  # return a true value

其他选择是:

  • 将定义作为命令行参数直接传递给engine.pl评估@ARGV
  • 编写一个包含引擎和这个模块的perl模块use
  • 将参数存储在配置文件中并从引擎中读取(例如使用Config::IniFiles
于 2011-01-21T08:12:24.753 回答
0

我不确定是什么问题,所以我猜测了一下。您在不同的地方都有代码,每次保存一些变量时都是相同的。这就是子程序的定义。


也许问题在于您不知道如何在这些不同的脚本中包含通用代码。这相当容易:您在 perl 模块中编写该代码。这基本上是一个以pm而不是pl. 当然,您必须处理很多事情,例如导出函数。Perldoc应该会有很大帮助。

于 2011-01-21T08:09:40.497 回答