Pārlūkot izejas kodu

conditionally (with_extobjs yes) add whois_filt.pl, whois_filt.conf, and rc.ripe-dbase.extobjs to buildconf

Michael Schloh von Bennewitz 21 gadi atpakaļ
vecāks
revīzija
6916b3638c

+ 64 - 0
ripe-dbase/rc.ripe-dbase.extobjs

@@ -0,0 +1,64 @@
+#!@l_prefix@/lib/openpkg/bash @l_prefix@/etc/rc
+##
+##  rc.ripe-dbase -- Run-Commands
+##
+
+%config
+    ripe_dbase_enable="$openpkg_rc_def"
+    rip_filter_enable="$openpkg_rc_def"
+    ripe_dbase_log_prolog="true"
+    ripe_dbase_log_epilog="true"
+    ripe_dbase_log_numfiles="10"
+    ripe_dbase_log_minsize="1M"
+    ripe_dbase_log_complevel="9"
+
+%common
+    ripe_dbase_pidrip="@l_prefix@/var/ripe-dbase/whois_rip.pid"
+    ripe_dbase_pidfilt="@l_prefix@/var/ripe-dbase/whois_filt.pid"
+    ripe_dbase_cfgfile="@l_prefix@/etc/ripe-dbase/rip.config.sample"
+    ripe_dbase_signal () {
+        [ -f $ripe_dbase_pidfile ] && kill -$1 `cat $ripe_dbase_pidfile`
+    }
+
+%status -u @l_susr@ -o
+    ripe_dbase_usable="unknown"
+    ripe_dbase_active="no"
+    rcService ripe-dbase enable yes && \
+        ripe_dbase_signal 0 && ripe_dbase_active="yes"
+    echo "ripe_dbase_enable=\"$ripe_dbase_enable\""
+    echo "ripe_dbase_usable=\"$ripe_dbase_usable\""
+    echo "ripe_dbase_active=\"$ripe_dbase_active\""
+
+%start -u @l_susr@
+    #   main server
+    rcService ripe-dbase enable yes || exit 0
+    rcService ripe-dbase active yes && exit 0
+    nohup @l_prefix@/bin/whois_rip -p ${ripe_dbase_pidfile} \
+        -c ${ripe_dbase_cfgfile} &
+    #   perl filter
+    rcService rip_filter enable yes || exit 0
+    rcService rip_filter active yes && exit 0
+    @l_prefix@/bin/whois_filt
+
+%stop -u @l_susr@
+    rcService ripe-dbase enable yes || exit 0
+    rcService ripe-dbase active no  && exit 0
+    ripe_dbase_signal TERM
+    sleep 8
+
+%restart -u @l_susr@
+    rcService ripe-dbase enable yes || exit 0
+    rcService ripe-dbase active no  && exit 0
+    rc ripe-dbase stop start
+
+%daily -u @l_susr@
+    rcService ripe-dbase enable yes || exit 0
+
+    #   rotate logfile
+    shtool rotate -f \
+        -n ${ripe_dbase_log_numfiles} -s ${ripe_dbase_log_minsize} -d \
+        -z ${ripe_dbase_log_complevel} -m 644 -o @l_susr@ -g @l_sgrp@ \
+        -P "${ripe_dbase_log_prolog}" \
+        -E "${ripe_dbase_log_epilog} && rc ripe_dbase restart" \
+        @l_prefix@/var/ripe-dbase/log/whois_rip.err.log
+

+ 13 - 0
ripe-dbase/ripe-dbase.spec

@@ -44,6 +44,9 @@ Source0:      ftp://ftp.ripe.net/ripe/dbase/software/ripe-dbase-%{version}.tar.g
 Source1:      ripe-dbase-setup.sh
 Source2:      ripe-dbase-modify.sh
 Source3:      rc.ripe-dbase
+Source4:      rc.ripe-dbase.extobjs
+Source5:      whois_filt.pl
+Source6:      whois_filt.conf
 Patch0:       ripe-dbase.patch
 Patch1:       ripe-dbase.patch.extobjs
 
@@ -143,6 +146,16 @@ AutoReqProv:  no
     %{l_shtool} install -c -m 755 %{l_value -s -a} \
         %{SOURCE ripe-dbase-modify.sh} \
         $RPM_BUILD_ROOT%{l_prefix}/sbin/ripe-dbase-modify
+    l_hostname=`%{l_shtool} echo -e %h%d`
+    %{l_shtool} install -c -m 755 %{l_value -s -a} \
+        -e "s;@l_hostname@;$l_hostname;g" \
+        %{SOURCE whois_filt.pl} \
+        $RPM_BUILD_ROOT%{l_prefix}/bin/whois_filt
+    %{l_shtool} install -c -m 755 %{l_value -s -a} \
+        %{SOURCE whois_filt.conf} \
+        $RPM_BUILD_ROOT%{l_prefix}/etc/ripe-dbase/
+    %{l_shtool} install -c -m 755 %{l_value -s -a} \
+        %{SOURCE rc.ripe-dbase.extobjs} $RPM_BUILD_ROOT%{l_prefix}/etc/rc.d/
 %endif
     %{l_rpmtool} files -v -ofiles -r$RPM_BUILD_ROOT \
         %{l_files_std} \

+ 47 - 0
ripe-dbase/whois_filt.conf

@@ -0,0 +1,47 @@
+#
+# config.dat
+#
+# Defines various data needed for registry synchronisation
+
+#
+# List of our private objects and attributes which
+# will not get exported by the script
+#
+<private>
+reg-id
+window
+facility
+location
+remedyref
+ticket
+reg-id
+range
+preference
+purpose
+registry
+usedfor
+region
+comment
+assigned
+</private>
+
+#
+# List all maintainers with according passwords which we will need here
+#
+# This is not case-sensitive
+<maintainer>
+LOCAL-DB-MNT XXXXXXXXXXX
+CW-EUROPE-GSOC XXXXXXXXXXXX
+IPERGY-NOC XXXXXXXXx
+</maintainer>
+
+#
+# This is the the list of source and destination sources
+# of the registries we use. 
+#
+# Left side is the local source and right side is the destination
+# source. The first pair defines the default for the script.
+<source>
+EUCW RIPE
+ARINDB ARINDB
+</source>

+ 231 - 0
ripe-dbase/whois_filt.pl

@@ -0,0 +1,231 @@
+#!@l_prefix@/bin/perl
+
+#
+# whois wrapper to filter out private objects and attributes
+#
+# By Arnd Vehling, NetHead - 11/03/2004
+#
+# For Cable & Wireless Munic
+#
+
+  require 5.004;
+  use strict;
+  require Net::Daemon;
+  package cwho;
+
+  use RipeWhois;
+  
+  use vars qw($VERSION @ISA);
+  $VERSION = '0.01';
+  @ISA = qw(Net::Daemon); # to inherit from Net::Daemon
+
+  sub Version ($) { 'CW Local whoisd server by ::nethead::, 0.01'; }
+  
+  #
+  # Glob Vars
+  #
+
+  # Whois Server Definition
+  my %ldb = ('Host' => '@l_hostname@',  'Port' => '43001', 
+	     'Mode' => 0);
+
+  my @header = (
+  "% This is the Cable & Wireless Whois server.\n",
+  "% The objects are in RPSL format.\n",
+  "%\n",
+  "% Rights restricted by copyright.\n\n"
+  );
+  
+  # Configuration file with private definitions
+  my $config="@l_prefix@/etc/ripe-dbase/whois_filt.config";
+
+  # All whois objects go into this
+  my @src_objects = ();
+  my @privates    = ();
+
+  # Which source
+  my $local_source  = "ARINCW";
+
+  ##
+  ## Whois Query Code
+  ##
+
+  #
+  # Parse Config File
+  # 
+  sub read_config 
+  {
+    # Parse config file and read private attributes and local-src name
+    # for later use
+    my $Mode = $/; undef $/;
+    open( CONFIG, $config ) || die( "Cant open config-file $config\n" );
+    my $cnf  = <CONFIG>;
+
+    # Put all private attributes into a string
+    if ( $cnf =~ /<private>(.*?)<\/private>/ims ) {
+     my $priv = $1;
+     @privates = split( /\n/, $priv );
+    } else { 
+	die( "Problem with config file $config. No private attributes!\n" ); 
+	}
+
+    close( CONFIG );
+    $/ = $Mode;
+  }
+
+
+  #
+  # Make the Query
+  #
+  sub do_query
+  {
+    my $whois_query = $_[0];
+
+    my $source_whois = new RipeWhois(Host => $ldb{'Host'}, 
+				  Port => $ldb{'Port'},
+				  FormatMode => $ldb{'Mode'});
+
+    unless(ref($source_whois)) {
+	  print STDERR "ERROR Failed to open Whois Source ".$ldb{'Host'}."\n";
+	  exit 1;
+    }
+
+    if($source_whois->GetErrorCode()) {
+       print "Error. Problem with ". $ldb{'Host'}.":".$ldb{'Port'}." ".$source_whois->GetErrorString();
+       exit 2;
+    }
+
+    # Execute query 
+    #print "Query: $whois_query\n";
+
+    @src_objects = $source_whois->QueryObjects($whois_query);
+
+    unless(@src_objects) {
+      print "\nNo Objects found.\n";
+      my $myerr = $source_whois->GetErrorString();
+      print "Query error: $myerr\n";
+      exit 3;
+    }
+
+    $source_whois->destroy();
+  }
+
+  ##
+  ## Daemon Code
+  ##
+
+  # Treat command line option in the constructor
+  sub new ($$;$) {
+      my($class, $attr, $args) = @_;
+      my($self) = $class->SUPER::new($attr, $args);
+      if ($self->{'parent'}) {
+          # Called via Clone()
+          $self->{'base'} = $self->{'parent'}->{'base'};
+      } else {
+          # Initial call
+          if ($self->{'options'}  &&  $self->{'options'}->{'base'}) {
+              $self->{'base'} = $self->{'options'}->{'base'}
+          }
+      }
+      if (!$self->{'base'}) {
+          $self->{'base'} = 'dec';
+      }
+      $self;
+  }
+
+  sub Run ($) {
+
+      my($self) = @_;
+      my($line, $sock, $source, $query, $rc);
+      $sock = $self->{'socket'};
+     
+      if (!defined($line = $sock->getline())) {
+	  if ($sock->error()) {
+	      $self->Error("Client connection error %s",
+			   $sock->error());
+	  }
+	  $sock->close();
+	  return;
+      }
+
+      # Process whois query
+      $line =~ s/\s+$//; # Remove CRLF, if any
+      
+      # Construct Query
+      $query = "-s $local_source $line";
+     
+      # Execute Query, fills @src_objects
+      &do_query( $query );
+
+      # Print header
+      #map {($rc = printf $sock)} @header;
+      $rc = printf $sock @header;
+
+      if (!$rc) {
+	  $self->Error("Client connection error %s",
+		       $sock->error());
+	  $sock->close();
+	  return;
+      }
+
+      # Filter and Print Objects
+      foreach $source (@src_objects) {
+
+	#
+	# Skip private Objects 
+	#
+	# I need to change the config.dat format
+	# so that attributes and objects are in separate
+	# config sections so i dont need to code it
+	# statically here
+	#
+	if ( ($source =~ /remarks:\s+NO-EXPORT/is) ||
+	     ($source =~ /^range:\s+/is)           ||
+	     ($source =~ /^ticket:\s+/is)          ||
+	     ($source =~ /^reg-id:\s+/is)          ||
+	     ($source =~ /^purpose:\s+/is)         || 
+	     ($source =~ /^facility:\s+/is)       
+	   ) { next; }
+
+	# Remove private attributes, if any
+	foreach my $priv (@privates) {
+	  $source =~ s/^$priv:.*?$//mgi;
+	}
+	$source =~ s/\n\n/\n/g;
+
+	print("\n$source\n");
+	$rc = printf $sock ("\n$source\n");
+
+	if (!$rc) {
+	    $self->Error("Client connection error %s",
+			 $sock->error());
+	    $sock->close();
+	    return;
+	}
+      } # foreach
+
+      $rc = printf $sock ("\n");
+
+      if (!$rc) {
+	  $self->Error("Client connection error %s",
+		       $sock->error());
+	  $sock->close();
+	  return;
+      }
+  }
+
+##
+## Main
+##
+
+
+  # Read Config File
+  &read_config();
+
+  package Main;
+
+  # Create Server
+  my $server = cwho->new({'pidfile' => '@l_prefix@/var/ripe-dbase/whois_filt.pid', 'localport' => 43}, \@ARGV);
+  # Bind to address/port, run server
+  $server->Bind();
+