openpkg/search.pl

Thu, 04 Oct 2012 20:30:05 +0200

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 04 Oct 2012 20:30:05 +0200
changeset 715
c10fb90893b9
permissions
-rw-r--r--

Correct out of date build configuration, porting to Solaris 11 network
link infrastructure and new libpcap logic. This additionally allows for
device drivers in subdirectories of /dev. Correct packaged nmap
personalities and signatures to work out of the box. Finally, hack
arpd logic to properly close sockets and quit on TERM by repeating
signaling in the run command script. Sadly, all this fails to correct
the run time behaviour of honeyd which fails to bind to the IP layer.

     1 ##
     2 ##  search.pl -- OpenPKG Package Searching
     3 ##  Copyright (c) 2011-2012 OpenPKG GmbH <http://openpkg.com/>
     4 ##
     5 ##  This software is property of the OpenPKG GmbH, DE MUC HRB 160208.
     6 ##  All rights reserved. Licenses which grant limited permission to use,
     7 ##  copy, modify and distribute this software are available from the
     8 ##  OpenPKG GmbH.
     9 ##
    10 ##  THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
    11 ##  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    12 ##  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
    13 ##  IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
    14 ##  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    15 ##  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    16 ##  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
    17 ##  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    18 ##  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    19 ##  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
    20 ##  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    21 ##  SUCH DAMAGE.
    22 ##
    24 require 5.003;
    26 #   OpenPKG instance prefix and RPM
    27 my $my_prefix = $ENV{'OPENPKG_PREFIX'};
    28 my $my_rpm = "$my_prefix/bin/openpkg rpm";
    29 delete $ENV{'OPENPKG_PREFIX'};
    31 #   program identification
    32 my $progname  = "search";
    33 my $progvers  = "0.1.0";
    35 #   home-brewn getopt(3) style option parser
    36 sub getopts ($$@) {
    37     my ($opt_spec, $opts, @argv_orig) = @_;
    38     my (%optf) = map { m/(\w)/; $1 => $_ } $opt_spec =~ m/(\w:|\w)/g;
    39     my (@argv, $optarg);
    41     foreach (@argv_orig) {
    42         if (@argv) {
    43             push @argv, $_;
    44         } elsif (defined $optarg) {
    45             if (exists $opts->{$optarg}) {
    46                 $opts->{$optarg} .= " $_";
    47             } else {
    48                 $opts->{$optarg} = $_;
    49             }
    50             $optarg = undef;
    51         } elsif (!/^[-]/) {
    52             push @argv, $_;
    53         } else {
    54             while (/^\-(\w)(.*)/) {
    55                 if (exists $optf{$1}) {
    56                     if (length($optf{$1}) > 1) {
    57                         if ($2 ne '') {
    58                             if (exists $opts->{$1}) {
    59                                 $opts->{$1} .= " $2";
    60                             } else {
    61                                 $opts->{$1} = $2;
    62                             }
    63                         } else {
    64                             $optarg = $1;
    65                         }
    66                         last;
    67                     } else {
    68                         $opts->{$1} = 1;
    69                     }
    70                 } else {
    71                     warn "openpkg:$prog_name:WARNING: unknown option $_\n";
    72                 }
    73                 $_ = "-$2";
    74             }
    75         }
    76     }
    77     if (defined $optarg) {
    78         warn "openpkg:$prog_name:WARNING: option $optarg requires an argument\n";
    79     }
    80     foreach my $opt (keys %optf) {
    81         if (not exists $opts->{$opt}) {
    82             $opts->{$opt} = (length($optf{$opt}) > 1 ? "" : 0);
    83         }
    84     }
    85     return @argv;
    86 }
    88 #   execute a command
    89 my $run_cache = {};
    90 sub run ($) {
    91     my ($cmd) = @_;
    92     my $out = $run_cache->{$cmd};
    93     if (not defined($out)) {
    94         my @out = `$cmd`;
    95         $out = [ @out ];
    96         $run_cache->{$cmd} = $out;
    97     }
    98     return (wantarray ? @{$out} : join(//, @{$out}));
    99 }
   101 #   determine reasonable temporary directory
   102 my $tmpdir = ($ENV{"TMPDIR"} || "/tmp");
   104 #   parse command line options
   105 my $opts = {};
   106 @ARGV = getopts("hvr:", $opts, @ARGV);
   108 #   usage sanity check and usage help
   109 sub usage {
   110     my ($rc) = @_;
   111     my $usage = "openpkg:$prog_name:USAGE: openpkg search <regex>\n";
   112     if ($rc == 0) {
   113         print STDOUT $usage;
   114     }
   115     else {
   116         print STDERR $usage;
   117     }
   118     exit($rc);
   119 }
   120 if ($opts->{"h"}) {
   121     usage(0);
   122 }
   123 if (@ARGV == 0) {
   124     usage(1);
   125 }
   127 #   take command line arguments
   128 my $keyword = $ARGV[0];
   130 #   determine start URL
   131 my $url = $opts->{"r"} || "";
   132 if ($url eq "") {
   133     $url = run("$my_prefix/bin/openpkg release --fmt='%u' 2>/dev/null");
   134     $url =~ s/^\s+//s;
   135     $url =~ s/\s+$//s;
   136 }
   137 if ($url eq "") {
   138     print STDERR "openpkg:$prog_name:ERROR: no repository URL known\n";
   139     exit(1);
   140 }
   142 #   recursively download XML/RDF index
   143 sub relurl ($$) {
   144     my ($url, $suburl) = @_;
   145     if ($suburl =~ m/^\w+:\/\//) {
   146         $url = $suburl;
   147     }
   148     elsif ($suburl =~ m/^\//) {
   149         $url = "file://$suburl";
   150     }
   151     else {
   152         $url =~ s/(\/)?\/*[^\/]*$/$1$suburl/;
   153     }
   154     1 while ($url =~ s/\/\.\//\//s);
   155     1 while ($url =~ s/\/[^\/]+\/\.\.\//\//s);
   156     return $url;
   157 }
   158 sub get_index ($) {
   159     my ($url) = @_;
   160     if ($url =~ m/^\//) {
   161         $url = "file://$url";
   162     }
   163     if ($url =~ m/\/$/) {
   164         $url .= "00INDEX.rdf";
   165     }
   166     my $cmd = "$my_prefix/bin/openpkg curl -s -o- \"$url\" 2>/dev/null";
   167     if ($url =~ m/\.bz2$/) {
   168         $cmd .= " | $my_prefix/lib/openpkg/bzip2 -d -c";
   169     }
   170     my $xml = run($cmd);
   171     my @includes = ();
   172     while ($xml =~ m/<Repository\s+[^>]*href="([^"]*)"/gs) {
   173         push(@includes, $1);
   174     }
   175     foreach my $include (@includes) {
   176         $xml .= get_index(relurl($url, $include));
   177     }
   178     return $xml;
   179 }
   180 my $xml = get_index($url);
   182 #   parse XML/RDF index
   183 my $x = $xml;
   184 $x =~ s/<rdf:Description\s+about="([^"]+)".*?>(.+?)<\/rdf:Description>/do1($1, $2), ''/sge;
   185 sub do1 {
   186     my ($nvr, $xml) = @_;
   187     my ($name) = ($xml =~ m|<Name>(.+?)</Name>|s);
   188     my ($vers) = ($xml =~ m|<Version>(.+?)</Version>|s);
   189     my ($rele) = ($xml =~ m|<Release>(.+?)</Release>|s);
   190     my ($summ) = ($xml =~ m|<Summary>(.+?)</Summary>|s);
   191     my ($desc) = ($xml =~ m|<Description>(.+?)</Description>|s);
   192     if (   $name =~ m|$keyword|si
   193         or $summ =~ m|$keyword|si
   194         or $desc =~ m|$keyword|si) {
   195         do2($nvr, $name, $vers, $rele, $summ, $desc, $xml);
   196     }
   197 }
   198 sub do2 {
   199     my ($nvr, $name, $vers, $rele, $summ, $desc, $xml) = @_;
   200     return if ($name eq "openpkg");
   201     if ($opts->{"v"}) {
   202         #   itemized verbose output
   203         my ($dist)     = ($xml =~ m|<Distribution>(.+?)</Distribution>|s);
   204         my ($class)    = ($xml =~ m|<Class>(.+?)</Class>|s);
   205         my ($group)    = ($xml =~ m|<Group>(.+?)</Group>|s);
   206         my ($license)  = ($xml =~ m|<License>(.+?)</License>|s);
   207         my ($packager) = ($xml =~ m|<Packager>(.+?)</Packager>|s);
   208         my ($url)      = ($xml =~ m|<URL>(.+?)</URL>|s);
   209         my ($vendor)   = ($xml =~ m|<Vendor>(.+?)</Vendor>|s);
   211         print "Name:     $name\n";
   212         print "Version:  $vers\n";
   213         print "Release:  $rele\n";
   214         print "Group:    $group\n";
   215         print "Class:    $class\n";
   216         print "Distrib:  $dist\n";
   217         print "License:  $license\n";
   218         print "Packager: $packager\n";
   219         print "Vendor:   $vendor\n";
   220         print "Summary:  $summ\n";
   221         print "URL:      $url\n";
   223         print "Description:\n";
   224         $desc =~ s/^\s+//mg;
   225         $desc =~ s/\s+$//mg;
   226         $desc =~ s/^/    /mg;
   227         print "$desc\n";
   229         my ($prov) = ($xml =~ m|<Provides>(.+?)</Provides>|s);
   230         if (($prov || "") ne "") {
   231             print "Provides:\n";
   232             $prov =~ s/<resource\s+equ="([^"]*)">(.+?)<\/resource>/do3($1, $2), ''/sge;
   233             sub do3 {
   234                 my ($val, $name) = @_;
   235                 print "    $name = $val\n";
   236             }
   237         }
   239         print "\n";
   240     }
   241     else {
   242         #   tabular brief output
   243         printf("%-20s %-10s %-9s %s\n", $name, $vers, $rele, $summ);
   244     }
   245 }

mercurial