[csw-devel] SF.net SVN: gar:[6697] csw/mgar/pkg/cvsproxy/trunk

bonivart at users.sourceforge.net bonivart at users.sourceforge.net
Sun Oct 4 15:50:05 CEST 2009


Revision: 6697
          http://gar.svn.sourceforge.net/gar/?rev=6697&view=rev
Author:   bonivart
Date:     2009-10-04 13:50:05 +0000 (Sun, 04 Oct 2009)

Log Message:
-----------
cvsproxy: added pre/post scripts, some re-layout

Modified Paths:
--------------
    csw/mgar/pkg/cvsproxy/trunk/Makefile
    csw/mgar/pkg/cvsproxy/trunk/checksums

Added Paths:
-----------
    csw/mgar/pkg/cvsproxy/trunk/files/CSWcvsproxy.postinstall
    csw/mgar/pkg/cvsproxy/trunk/files/CSWcvsproxy.preremove
    csw/mgar/pkg/cvsproxy/trunk/files/editconf.pl

Modified: csw/mgar/pkg/cvsproxy/trunk/Makefile
===================================================================
--- csw/mgar/pkg/cvsproxy/trunk/Makefile	2009-10-04 11:34:11 UTC (rev 6696)
+++ csw/mgar/pkg/cvsproxy/trunk/Makefile	2009-10-04 13:50:05 UTC (rev 6697)
@@ -9,7 +9,12 @@
 
 MASTER_SITES = http://www.sra.co.jp/people/m-kasahr/cvsproxy/src/
 DISTFILES  = $(GARNAME)-$(GARVERSION).tar.gz
+DISTFILES += CSWcvsproxy.postinstall
+DISTFILES += CSWcvsproxy.preremove
 
+REQUIRED_PKGS = CSWtcpwrap
+SPKG_SOURCEURL = http://www.sra.co.jp/people/m-kasahr/cvsproxy
+
 # We define upstream file regex so we can be notifed of new upstream software release
 UFILES_REGEX = $(GARNAME)-(\d+(?:\.\d+)*).tar.gz
 
@@ -25,4 +30,8 @@
 	@cp $(WORKSRC)/README $(DESTDIR)$(docdir)/$(GARNAME)
 	@cp $(WORKSRC)/NEWS $(DESTDIR)$(docdir)/$(GARNAME)
 	@cp $(WORKSRC)/ChangeLog $(DESTDIR)$(docdir)/$(GARNAME)
+	@mv $(DESTDIR)/opt/csw/libexec/cvsproxy $(DESTDIR)/opt/csw/libexec/cvsproxy.tmp
+	@ginstall -d $(DESTDIR)/opt/csw/libexec/$(GARNAME)
+	@cp $(FILEDIR)/editconf.pl $(DESTDIR)/opt/csw/libexec/$(GARNAME)
+	@mv $(DESTDIR)/opt/csw/libexec/cvsproxy.tmp $(DESTDIR)/opt/csw/libexec/$(GARNAME)/cvsproxy
 	@$(MAKECOOKIE)

Modified: csw/mgar/pkg/cvsproxy/trunk/checksums
===================================================================
--- csw/mgar/pkg/cvsproxy/trunk/checksums	2009-10-04 11:34:11 UTC (rev 6696)
+++ csw/mgar/pkg/cvsproxy/trunk/checksums	2009-10-04 13:50:05 UTC (rev 6697)
@@ -1 +1,3 @@
+5095049b846e80cbe0745d85929af2d9  download/CSWcvsproxy.postinstall
+3ce92c760a74f36d40acc02eb5e8e275  download/CSWcvsproxy.preremove
 ceff47a655085497f5712e2da160c607  download/cvsproxy-1.0.1.tar.gz

Added: csw/mgar/pkg/cvsproxy/trunk/files/CSWcvsproxy.postinstall
===================================================================
--- csw/mgar/pkg/cvsproxy/trunk/files/CSWcvsproxy.postinstall	                        (rev 0)
+++ csw/mgar/pkg/cvsproxy/trunk/files/CSWcvsproxy.postinstall	2009-10-04 13:50:05 UTC (rev 6697)
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+# Mostly copied from CSWfam
+
+set -e
+
+if [ "$PKG_ROOT_DIR" = "" ]; then
+	PKG_ROOT_DIR=/;
+fi
+
+CSWROOT=$PKG_ROOT_DIR/opt/csw
+EDITCONF=$CSWROOT/libexec/cvsproxy/editconf.pl
+
+
+echo "Adding cvsproxy to /etc/services"
+"$EDITCONF" "$PKG_ROOT_DIR/etc/services" add '^cvsproxy\b' \
+	"cvsproxy		2401/tcp	# Transparent CVS proxy" \
+	"cvsproxy		2401/udp	# Transparent CVS proxy"
+
+echo "Adding cvsproxy to inetd.conf"
+"$EDITCONF" "$PKG_ROOT_DIR/etc/inetd.conf" add 'Transparent CVS proxy' \
+	"# Transparent CVS proxy"
+"$EDITCONF" "$PKG_ROOT_DIR/etc/inetd.conf" add '^cvsproxy\b' \
+	"cvsproxy stream tcp nowait nobody /opt/csw/libexec/tcpd /opt/csw/libexec/cvsproxy/cvsproxy"
+
+
+echo "Restarting inetd..."
+pkill -HUP inetd
+
+exit 0

Added: csw/mgar/pkg/cvsproxy/trunk/files/CSWcvsproxy.preremove
===================================================================
--- csw/mgar/pkg/cvsproxy/trunk/files/CSWcvsproxy.preremove	                        (rev 0)
+++ csw/mgar/pkg/cvsproxy/trunk/files/CSWcvsproxy.preremove	2009-10-04 13:50:05 UTC (rev 6697)
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+set -e
+
+if [ "$PKG_ROOT_DIR" = "" ]; then
+	PKG_ROOT_DIR=/;
+fi
+
+EDITCONF="$PKG_ROOT_DIR/opt/csw/libexec/cvsproxy/editconf.pl"
+
+echo "Removing cvsproxy from /etc/services"
+"$EDITCONF" "$PKG_ROOT_DIR/etc/services" remove '^cvsproxy'
+
+echo "Removing cvsproxy from inetd.conf"
+"$EDITCONF" "$PKG_ROOT_DIR/etc/inetd.conf" remove '^cvsproxy'
+"$EDITCONF" "$PKG_ROOT_DIR/etc/inetd.conf" remove 'Transparent CVS proxy'
+
+echo "Restarting inetd..."
+pkill -HUP inetd
+
+exit 0

Added: csw/mgar/pkg/cvsproxy/trunk/files/editconf.pl
===================================================================
--- csw/mgar/pkg/cvsproxy/trunk/files/editconf.pl	                        (rev 0)
+++ csw/mgar/pkg/cvsproxy/trunk/files/editconf.pl	2009-10-04 13:50:05 UTC (rev 6697)
@@ -0,0 +1,440 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+#  $Id: editconf.perl,v 1.1 2000/05/19 22:44:34 rusty Exp $
+#
+#  This edits configuration files during software install/uninstall.
+#  Run with --help or see the text of the usage subroutine below for
+#  more information.
+#
+#  Examples:
+#
+#      Add fam to /etc/inetd.conf during install:
+#      editconf inetd.conf add '\bfam\b' \
+#          "#  fam, the File Alteration Monitor" \
+#          "sgi_fam/1-2 stream rpc/tcp wait root /usr/local/bin/fam fam"
+#
+#      Remove fam from /etc/inetd.conf during uninstall:
+#      editconf inetd.conf remove '\bfam\b'
+#
+#      Add /usr/sysadm/lib to /etc/ld.so.conf#
+#      editconf ld.so.conf add '\bsysadm\b' /usr/sysadm/lib
+#
+#      Add sysadmd to /usr/local/etc/tcpmux.conf:
+#      editconf tcpmux.conf add '\bsysadm\b' \
+#          "#  sysadmd, for system administration applications" \
+#          "sgi_sysadm root /usr/sysadm/bin/sysadmd sysadmd"
+#
+#  The main goal of this script is to "do no harm."  We don't
+#  modify any files if it looks like we're going to mess with
+#  lines which have been edited by the user.  The only time we
+#  change a file is when we're confident that we're adding new
+#  lines, or messing with lines which we ourselves added or
+#  removed during a previous invocation of the script.
+#
+#  Well... that's not entirely true; the "remove" operation comments
+#  out any line that matches the given regexp.  But it makes a backup!
+#
+#  USING EDITCONF WITH AUTOMAKE AND RPM
+#
+#  This prepends DESTDIR to the files it operates on (unless you pass
+#  it a file starting with \.{0,2}/, so it can be used during an
+#  automake "make install" into a non-root directory (as you would do
+#  while building an RPM package).  Note that the file it attempts to
+#  operate on probably won't be present, though, so you'll probably
+#  need to ignore errors during the make install:
+#
+#      make-install-hook:
+#              -$(EDITCONF) ld.so.conf add '\bsysadm\b' /usr/sysadm/lib
+#
+#  This will probably fail when DESTDIR is set, as ld.so.conf probably
+#  doesn't exist under DESTDIR; the only reason to have this line in the
+#  Makefile.am is so that a normal "make install" will update the
+#  configuration files.
+#
+#  In order to have your configuration files updated during the install/
+#  uninstall of an rpm package, you'll need to add something like this
+#  to your spec file:
+#
+#      #  this is %preun rather than %postun because we want to use our
+#      #  script before it gets uninstalled.
+#      %preun
+#      perl /usr/local/lib/fam/editconf.perl ld.so.conf remove '\bsysadm\b'
+#
+#
+sub usage {
+    my($msg) = @_;
+    $msg && ($msg ne "help") && print STDERR "$msg\n\n";
+    print STDERR <<"EOF";
+Usage:
+  $0 [options] file \"add\" regexp lines...
+  $0 [options] file \"remove\" regexp [comment]
+  $0 --help
+
+Options:
+  -n  No-exec (don't change any files)
+  -v  Verbose
+  -s  Silent
+  --  End argument processing (in case your new config file lines
+      start with -)
+EOF
+
+    if($msg eq "help") {
+        print STDERR <<"EOF";
+
+This edits configuration files.  Given a file name, it looks
+in a list of directories (see below) for the file.  (If the file
+name starts with "/" or ".", the path list is not searched.)
+Once the file is found, the given regular expression is searched
+for in the file to determine whether the option or service we're
+adding/removing already exists.
+
+If we're adding new lines to the file, there are four possible
+outcomes:
+
+  - If the regexp isn't found in the file, we figure our lines
+    haven't been added before, and we add them.
+
+  - If the regexp is found in the file, and indeed the exact lines
+    we were going to add are already there, we're happy, and we
+    don't change the file.
+
+  - If the regexp is found in the file, and the lines we were going
+    to add are present but commented out, we uncomment them.
+
+  - If the regexp is found in the file, but in lines which are
+    different than the lines we were going to add, we figure the
+    option or service we were going to add has already been configured
+    differently; in this case, we make our changes in a new copy
+    of the file and print a warning message saying that someone
+    should compare the two files.  (We don't change the
+    configuration of the system in this case.) 
+
+If we're removing lines from the file, there are two possible
+outcomes:
+
+  - If the regexp isn't found in the file, we're happy, and we
+    don't change the file.
+
+  - If the regexp is found in the file, we make a backup of the
+    file, and comment out the lines containing the regexp in the
+    original file.
+
+EOF
+        print STDERR "Configuration file paths:\n";
+        foreach (@::paths) { print STDERR "  $_\n"; }
+    }
+
+    exit 1;
+}
+
+
+#  See if DESTDIR is set, to have us operate on files not in /
+my $DESTDIR = $ENV{'DESTDIR'} ? $ENV{'DESTDIR'} : "";
+
+#  This is the list of places we'll look for the configuration file
+#  if we weren't given an absolute path.
+@::paths = ("$DESTDIR/etc", "$DESTDIR/usr/etc", "$DESTDIR/usr/local/etc");
+
+my $comment = '#';
+my $verbose = &splicegrep('^-v$', \@ARGV, '^--$');
+my $noexec = &splicegrep('^-n$', \@ARGV, '^--$');
+my $silent = &splicegrep('^-s$', \@ARGV, '^--$');
+&splicegrep('^--?h', \@ARGV, '^--$') && &usage("help");
+&splicegrep('^-', \@ARGV, '^--$') && &usage();
+&splicegrep('^--$', \@ARGV);
+
+my $file; # the name of the file passed on the command line
+my $regexp; # the pattern passed on the command line
+my $op; # the operation being performed (add|remove)
+
+($file = shift) || &usage("The config file name is required!");
+(($op = shift) && ($op =~ /^(add|remove)$/)) || &usage("\"add\" or \"remove\" is required!");
+($regexp = shift) || &usage("The regexp to search for is required!");
+my @lines = @ARGV;
+
+
+#
+#  Does the file name start with /, ./, or ../?
+#
+if ($file =~ m#^\.{0,2}/#) {
+    #  Danger!  Not applying $DESTDIR to $path here!
+    &shaketh_thy_booty($op, $file, $regexp, @lines);
+    exit 0;
+}
+#
+#  No, so we'll search for the file name in the list of paths.
+#
+$verbose && $DESTDIR && print "Using DESTDIR \"$DESTDIR\"\n";
+my($p, $path);
+foreach $p (@::paths) {
+    $path = "$p/$file";
+    $verbose && print STDERR "Looking for $path...\n";
+    if (-f $path) {
+        &shaketh_thy_booty($op, $path, $regexp, @lines);
+        exit 0;
+    }
+}
+die("Couldn't find $file in " . join(" ", @::paths) . "\n");
+
+
+#
+#  Once we know what file we're attacking, this does the actual work.
+#
+sub shaketh_thy_booty {  #  or is it "thine"?
+    my($op, $path, $regexp, @lines) = @_;
+    $noexec || -w $path || die("I don't have write permission on $path!\n");
+    #  Might as well snort it into memory.  Hopefully it's a small file, ha ha.
+    open(CFG, "<$path") || die("Couldn't open $path for input!\n");
+    my @wholefile = <CFG>;
+    close(CFG);
+
+    my $matched = 0;
+    if (!grep /$regexp/, @wholefile) {
+        if ($op eq 'add') {
+            #  It doesn't contain our regexp, so append our lines and
+            #  exit happily.
+            if ($noexec) {
+                print "I would have added the following lines to $path:\n";
+                foreach (@lines) { print "$_\n"; }
+            } else {
+                open(CFG, ">>$path") || die("Couldn't open $path for append!\n");
+                $silent || print "Added the following lines to $path:\n";
+                foreach (@lines) {
+                    $silent || print "$_\n";
+                    print CFG "$_\n";
+                }
+                $silent || print "(end of lines added to $path)\n";
+            }
+            exit 0;
+        } elsif ($op eq 'remove') {
+            #  It doesn't contain our regexp, so we don't need to remove it,
+            #  so we're happy.
+            exit 0;
+        } else { die("bad op \"$op\""); }
+    }
+
+    if ($op eq "remove") {
+        #  Since we're still here, and we're removing this entry, comment out
+        #  all lines matching our regexp.
+        if ($noexec) {
+            print "I would have commented out the following lines in $path:\n";
+            grep {
+                /$regexp/ && print;
+            } @wholefile;
+        } else {
+            my $tmpnm = &tmpnam("$path.$$");
+            my $comment_re = quotemeta $comment;
+            my @commented_out;
+            open(CFG, ">$tmpnm") || die("Couldn't open $tmpnm for output!\n");
+            foreach (@wholefile) {
+                #  We care if it matches, and isn't already commented out.
+                if ((/$regexp/) && (!/^$comment_re/)) {
+                    push @commented_out, $_;
+                    print CFG $comment;
+                }
+                print CFG;
+            }
+            if ($#commented_out == -1) {
+                #  We didn't actually need to comment anything out!
+                #  Apparently all the lines that matched our regexp were
+                #  already commented out.
+                $verbose && print "All the lines matching our regexp were ",
+                                  "already commented out, so we're not doing ",
+                                  "anything!\n";
+                unlink $tmpnm;
+                exit 0;
+            }
+#            $silent || print "Commented out the following lines in $path:\n";
+#            $silent || grep { print; } @commented_out;
+#            $silent || print "(end of lines commented out in $path)\n";
+            my $bak = &tmpnam("$path.O");
+            rename($path, $bak) || die("Couldn't rename $path to $bak!\n");
+            rename($tmpnm, $path) || die("Couldn't rename $tmpnm to $path!\n");
+            $silent || print "Original file saved as $bak\n";
+        }
+        exit 0;
+    }
+
+    #  just a sanity check...
+    ($op eq "add") || die("bad op \"\$op\"");
+
+    #  We're still here, so we found our regexp, which suggests that the
+    #  entry we're adding might already be in the file.  Do our new lines
+    #  match existing lines exactly?
+    $verbose && print "The file contains our regular expression, so let's see ",
+                      "if it has our lines...\n";
+    $matched = 1;
+    my $re;
+    foreach (@lines) {
+        $re = quotemeta $_;
+        $verbose && print "  Looking for \"$re\"\n";
+        if (! grep /^$re$/, @wholefile) {
+            $verbose && print "  Didn't find it!\n";
+            $matched = 0;
+            last;
+        }
+    }
+    if ($matched) {
+        #  The lines we would have added are already in the file, so
+        #  we can all go home early.
+        $verbose && print "$path already contains the lines we would have ",
+                          "added.\n";
+        exit 0;
+    }
+
+    #  All right, we're still here, so let's see if the lines we would have
+    #  added are in the file, but commented out.  This is slightly complicated
+    #  by the possibility that lines we're adding start with comments; if so,
+    #  we don't want to require that they be preceded by another comment
+    #  character.
+    $verbose && print "Let's see if it has our lines, but commented out...\n";
+    $re = quotemeta $comment;
+    my @linesre = @lines;
+    grep {
+        #  If it starts with a comment, require make an additional starting
+        #  comment optional.  (the ($re.*)? as opposed to $re.*)
+        $_ = (/^$re/) ? "^($re.*)?" . quotemeta $_ : "^$re.*" . quotemeta $_;
+    } @linesre;
+    $matched = 1;
+    foreach $re (@linesre) {
+        #  This loop through @linesre isn't done in the grep above because
+        #  we want that to iterate through every element, while this loop
+        #  can bail as soon as it fails to find a line it's looking for.
+        $verbose && print "  Looking for \"$re\"\n";
+        #  If you change this next line, make sure you make the same changes
+        #  in the substitution below.
+        if (! grep /$re$/, @wholefile) {
+            $verbose && print "  Didn't find it!\n";
+            $matched = 0;
+            last;
+        }
+    }
+    if ($matched) {
+        #  The lines we would have added are already in the file, but
+        #  commented out.  Let's uncomment them into a temp file, and then
+        #  replace the existing file with the temp file.
+        if ($noexec) {
+            print "I would have uncommented the following lines in $path:\n";
+            foreach (@lines) { print "$_\n"; }
+            exit 0;
+        }
+        #  This is crude.  For every line in the file, if it matches the
+        #  commented-out version of any of the lines we're adding, replace
+        #  it with the corresponding non-commented-out line.
+        my $idx;
+        foreach (@wholefile) {
+            foreach $idx (0..$#lines) {
+                s/$linesre[$idx]$/$lines[$idx]/ && last;
+            }
+        }
+        #  isn't there a perl tmpnam?  this open/die is stupid.
+        my $tmpnm = &tmpnam("$path.$$");
+        open(CFG, ">$tmpnm") || die("Couldn't open $tmpnm for output!\n");
+        print CFG @wholefile;
+        close(CFG) || die("Couldn't close $tmpnm after writing!\n");
+        rename($tmpnm, $path) || die("Couldn't replace $path with $tmpnm " .
+                                     "after writing!\n");
+        exit 0;
+    }
+
+    #  We're still here, so it looks like our configuration lines are in the
+    #  file, but they're different than what we would have added.  Nuts!
+    #  Comment out everything matching our regexp and append our new lines,
+    #  but do it into a new file so that we don't stomp any existing
+    #  configuration.
+    my $tmpnm = &tmpnam("$path.N");
+    if ($noexec) {
+        print "I would have copied $path to $tmpnm and commented out the following lines in $tmpnm:\n";
+        grep {
+            /$regexp/ && print;
+        } @wholefile;
+        print "...and added the following lines to $tmpnm:\n";
+        foreach (@lines) { print "$_\n"; }
+        exit 0;
+    }
+    grep {
+        /$regexp/ && ($_ = ($comment . $_));
+    } @wholefile;
+    #  Now append our new stuff
+    foreach (@lines) {
+        push @wholefile, "$_\n";
+    }
+    open(CFG, ">$tmpnm") || die("Couldn't open $tmpnm for output!\n");
+    print CFG @wholefile;
+    close(CFG) || die("Couldn't close $tmpnm after writing!\n");
+    #  Just for fun, if $path.N already existed, let's see if it's the
+    #  same as what we just wrote.
+    &diff($tmpnm, "$path.N", \@wholefile) || ($tmpnm = "$path.N");  
+
+    print STDERR <<"EOF";
+
+**********************************************************************
+Configuration changes to $file have not been made
+automatically because there appears to be a conflict between the
+file's current contents and the lines which would have been added.
+
+Original file: $path
+New file:      $tmpnm
+
+Please compare these two files and update the original file as needed.
+**********************************************************************
+
+EOF
+    exit 0;
+}
+
+
+#  Returns the array of elements matching the given re in the given array,
+#  and removes those elements from the array.  If $bre is set, we only
+#  search through the array until an element matching $bre is encountered.
+sub splicegrep {
+    my($re, $a, $bre) = @_;
+    my @ta = ();
+    my @ra = ();
+    my $skip = 0;
+    $a || ($a = \@ARGV);
+    #  sub-optimal but our argv should be short
+    grep {
+        $bre && /$bre/ && ($skip = 1);
+        ((!$skip) && /$re/) ? push @ra, $_ : push @ta, $_;
+    } @{$a};
+    @{$a} = @ta;
+    return @ra;
+}
+
+
+#  This is kind of stupid.
+sub tmpnam {
+    my($base) = @_;
+    my $hope = $base;
+    my $count = 0;
+    while(-e $hope) {
+        $hope = "$base$count";
+        ++$count;
+    }
+    return $hope;
+}
+
+
+#  Returns 0 if we know the two files are the same, 1 if we're not sure.
+sub diff {
+    my($fn1, $fn2, $fc1) = @_;
+    ($fn1 eq $fn2) && return 0;  # same file name!
+    my $sz1 = (stat $fn1)[7];  # size $sstuff[7];  #  size
+    my $sz2 = (stat $fn2)[7];  # size  $sstuff[7];  #  size
+    $sz1 && ($sz1 != $sz2) && return 1;  # different sizes; they're different
+    #  Nuts, they're the same size, so we have to compare them.
+    open(FH2, "<$fn2") || return 1;
+    my @snort2 = <FH2>;
+    close(FH2);
+    #  Same number of lines?
+    ($#snort2 == $#{$fc1}) || return 1;
+    my $i = $#snort2;
+    while ($i >= 0) {
+        ($snort2[$i] eq $fc1->[$i]) || return 1;
+        --$i;
+    }
+    return 0;
+}


Property changes on: csw/mgar/pkg/cvsproxy/trunk/files/editconf.pl
___________________________________________________________________
Added: svn:executable
   + *


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the devel mailing list