"Fossies" - the Fresh Open Source Software Archive

Member "ngrep-1_47/scripts/multi.pl" (7 Sep 2017, 2477 Bytes) of package /linux/misc/ngrep-1_47.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Perl source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "multi.pl" see the Fossies "Dox" file reference documentation.

    1 #!/usr/bin/perl
    2 #
    3 # Author: Jordan Ritter <jpr5@darkridge.com>
    4 # Date: Thu Jul  5 17:08:18 PDT 2001
    5 #
    6 # Input file format:
    7 #
    8 #      Rulename1 file1.gz rule1 bpf_filter1
    9 #      Rulename2 file2.gz rule2 bpf_filter2
   10 #      Rulename3 file3.gz rule3 bpf_filter3
   11 #
   12 # Output:
   13 # 
   14 #      ./ngrepped.Rulename1
   15 #      ./ngrepped.Rulename2
   16 #      ./ngrepped.Rulename3
   17 #
   18 # Considerations:
   19 #
   20 #      1. Not sure how previous script was able to get the pcap filters with spaces using split...
   21 #      2. Don't forget to tweak $max_procs in CONFIG section.
   22 #      3. Blank lines in rule file are bad bad bad.
   23 #      4. Assumes bash.
   24 #  
   25 
   26 ##########
   27 # CONFIG #
   28 ##########
   29 
   30 require 5.004;
   31 
   32 use POSIX qw(:signal_h);
   33 
   34 my($sig_set) = POSIX::SigSet->new(SIGINT);
   35 my($old_sig_set) = POSIX::SigSet->new();
   36 my($max_procs) = 10;
   37 
   38 my($rules_file,%rules, @rules);
   39 my($fork_level);
   40 my($loops);
   41 
   42 $|++;
   43 
   44 
   45 #############
   46 # FUNCTIONS #
   47 #############
   48 
   49 sub go {
   50     my($rule_name) = shift @_;
   51     return unless $rule_name;
   52 
   53     my(%rule) = %{$rules{$rule_name}};
   54 
   55     $fork_level++;
   56 
   57     sigprocmask(SIG_BLOCK, $sig_set, $old_sig_set);    
   58 
   59     my($pipe) = "pipe-$rule-$fork_level";
   60     my($daddy) = open($pipe, "-|");
   61 
   62     if (not defined $daddy) {
   63 
   64     warn "[$rule_name] fork() error: $!\n";
   65     sigprocmask(SIG_UNBLOCK, $old_sig_set);
   66     sleep(1);
   67 
   68     } elsif (not $daddy) {
   69 
   70     my(@args);
   71 
   72         $SIG{INT} = 'IGNORE';
   73         sigprocmask(SIG_UNBLOCK, $old_sig_set);
   74 
   75     system("zcat $rule{'file'} | " .
   76                "ngrep -qtI - $rule{'regex'} $rule{'filter'} 2&>1 > " .
   77                "ngrepped.$rule_name");
   78 
   79     exit;
   80     
   81     } else {
   82     
   83     sigprocmask(SIG_UNBLOCK, $old_sig_set);
   84 
   85     }
   86 
   87     &go(@_);
   88 
   89     close($pipe);
   90     print "[$rule_name] finished\n";
   91 }
   92 
   93 
   94 ########
   95 # MAIN #
   96 ########
   97 
   98 $rules_file = $ARGV[0];
   99 
  100 open(RULES, $rules_file) || die "Couldn't open rules file $rules_file: $!.\n";
  101 my(@lines) = <RULES>;
  102 close(RULES);
  103 
  104 if (($loops = scalar(@lines)) == 0) { 
  105     die "Rules file $rules_file empty, exiting.\n"; 
  106 }
  107 
  108 %rules = map { chomp(local(@fields) = split / /, $_); 
  109                $fields[0] => { "file" => $fields[1],
  110                                "regex" => $fields[2], 
  111                                "filter" => $fields[3] }; } @lines; 
  112 @rules = keys %rules;
  113 
  114 print "Hi, I'm ngrepper, and here we go.\n";
  115 
  116 for ( 0 .. int($loops / $max_procs) ) {
  117 
  118     $fork_level = 1;
  119     @rules_for_this_pass = splice(@rules, 0, $max_procs);
  120 
  121     &go(@rules_for_this_pass);
  122 
  123 }
  124 
  125 print "Welp, I'm done.\n";
  126 
  127 exit;
  128 
  129