[csw-devel] SF.net SVN: gar:[21821] csw/mgar/pkg/alternatives
pfelecan at users.sourceforge.net
pfelecan at users.sourceforge.net
Thu Aug 22 11:12:21 CEST 2013
Revision: 21821
http://gar.svn.sourceforge.net/gar/?rev=21821&view=rev
Author: pfelecan
Date: 2013-08-22 09:12:15 +0000 (Thu, 22 Aug 2013)
Log Message:
-----------
alternatives/trunk:
- removed the branch but copied the relevant adaptation
- completely garified
- manual page generated on the fly
- removed the components related to the old recipe
Modified Paths:
--------------
csw/mgar/pkg/alternatives/trunk/Makefile
Added Paths:
-----------
csw/mgar/pkg/alternatives/trunk/checksums
csw/mgar/pkg/alternatives/trunk/files/
csw/mgar/pkg/alternatives/trunk/files/CSWalternatives.i.cswalternatives
csw/mgar/pkg/alternatives/trunk/files/CSWalternatives.r.cswalternatives
csw/mgar/pkg/alternatives/trunk/files/LICENSE-2.0.txt
csw/mgar/pkg/alternatives/trunk/files/README
csw/mgar/pkg/alternatives/trunk/files/README.user
csw/mgar/pkg/alternatives/trunk/files/alternatives
csw/mgar/pkg/alternatives/trunk/files/alternatives.8
Removed Paths:
-------------
csw/mgar/pkg/alternatives/branches/alternatives-gar/
csw/mgar/pkg/alternatives/trunk/README
csw/mgar/pkg/alternatives/trunk/README.user
csw/mgar/pkg/alternatives/trunk/alternatives
csw/mgar/pkg/alternatives/trunk/copyright
csw/mgar/pkg/alternatives/trunk/i.cswalternatives
csw/mgar/pkg/alternatives/trunk/pkginfo
csw/mgar/pkg/alternatives/trunk/prototype
csw/mgar/pkg/alternatives/trunk/r.cswalternatives
Modified: csw/mgar/pkg/alternatives/trunk/Makefile
===================================================================
--- csw/mgar/pkg/alternatives/trunk/Makefile 2013-08-22 08:03:48 UTC (rev 21820)
+++ csw/mgar/pkg/alternatives/trunk/Makefile 2013-08-22 09:12:15 UTC (rev 21821)
@@ -1,8 +1,54 @@
-package: alternatives
- @echo Note: subversion status is:
- svn status
- createpkg -b `pwd`
- touch package
+# $Id$
+NAME = alternatives
+VERSION = 1.0
-clean:
- rm -f *.pkg.gz package
+DESCRIPTION = Alternatives implementation specific to OpenCSW
+define BLURB
+endef
+
+MASTER_SITES =
+DISTFILES = alternatives
+DISTFILES += CSWalternatives.i.cswalternatives
+DISTFILES += CSWalternatives.r.cswalternatives
+DISTFILES += LICENSE-2.0.txt
+DISTFILES += README
+DISTFILES += README.user
+
+# File name regex to get notifications about upstream software releases
+UFILES_REGEX = $(NAME)-(\d+(?:\.\d+)*).tar.gz
+
+LICENSE = LICENSE-2.0.txt
+
+VENDOR_URL = http://wiki.opencsw.org/project-alternatives
+
+CONFIGURE_SCRIPTS =
+
+BUILD_DEP_PKGS = CSWhelp2man
+
+BUILD_SCRIPTS = man
+INSTALL_SCRIPTS = custom
+TEST_SCRIPTS =
+
+ARCHALL = 1
+
+include gar/category.mk
+
+build-man:
+ cd $(WORKDIR) && help2man --section=8 --source='Open CSW' --no-info --output=alternatives.8 ./alternatives
+ @$(MAKECOOKIE)
+
+install-custom:
+ ginstall -d $(DESTDIR)$(bindir)
+ ginstall $(WORKDIR)/alternatives $(DESTDIR)$(bindir)
+ ginstall -d $(DESTDIR)$(mandir)/man8
+ ginstall $(WORKDIR)/alternatives.8 $(DESTDIR)$(mandir)/man8
+ ginstall -d $(DESTDIR)/etc/opt/csw/alternatives
+ ginstall -d $(DESTDIR)/etc/opt/csw/preserve/CSWalternatives/alternatives
+ ginstall -d $(DESTDIR)/var/opt/csw/alternatives
+ ginstall -d $(DESTDIR)/usr/sadm/install/scripts
+ ginstall $(WORKDIR)/CSWalternatives.i.cswalternatives $(DESTDIR)/usr/sadm/install/scripts/i.cswalternatives
+ ginstall $(WORKDIR)/CSWalternatives.r.cswalternatives $(DESTDIR)/usr/sadm/install/scripts/r.cswalternatives
+ ginstall -d $(DESTDIR)$(docdir)/$(NAME)
+ ginstall $(WORKDIR)/README $(DESTDIR)$(docdir)/$(NAME)
+ ginstall $(WORKDIR)/README.user $(DESTDIR)$(docdir)/$(NAME)
+ @$(MAKECOOKIE)
Deleted: csw/mgar/pkg/alternatives/trunk/README
===================================================================
--- csw/mgar/pkg/alternatives/trunk/README 2013-08-22 08:03:48 UTC (rev 21820)
+++ csw/mgar/pkg/alternatives/trunk/README 2013-08-22 09:12:15 UTC (rev 21821)
@@ -1,66 +0,0 @@
-This file is more of an "internals" thoughts and notes file.
-For user facing documentation, see README.user
-
-Phil decided that a from-scratch, CSW-custom implementation was needed,
-because the debian one was hugely bloated, and the redhat smaller one,
-did not play nicely with NFS-shared /opt/csw
-So please dont go getting ideas that we can migrated back to redhat,etc
-in the future! :) we tried, and it failed.
-
-Sections below:
- * CODE NOTES
- * FILE FORMATS
-
-
-CODE NOTES
-
- My initial version seems to expect each "alternative" to have its own
-file as /opt/csw/share/alternatives/xyz
-One line per file only would be nice, please. But this suports
-multiple lines per file now.
-
-When a choice is manually set (overriding auto settings), it records that
-fact by making a symlink from the relevant shipped file, to
-/etc/opt/csw/alternatives/(progname)
-and then it will make the user-facing symlink(s) indicated by that file
-
-This way, you can have the binary, and alternatives files per software,
-in NFS-shared /opt/csw, but then have machine-local overrides.
-
-Reminder: Do NOT have to get fancy with the class action script not
- getting called with pathnames on sparse zones with pkg-inherit-dir,
- because since /opt/csw is shared, the symlink will already be in place.
-
- Ambuguity for --remove:
- what if --remove is used, on something that has a manually set pref?
- (rather than calling --auto)
- I choose that it will LEAVE the manual choice.
- That is to say, it will leave the saved preference as valid.
- BUT, if the manual choice matches the --remove", then
- it should skip it as a "what to match" option..? !!
-
- This is to potentially make our pkgrm/pkgadd upgrade cycle
- function as a user expects: to preserve their manual choice.
-
-FILE FORMATS
-
- Packages that provide implementation of an "alternative" for a
- particular path, need to provide a file in
- /opt/csw/share/alternatives/[softwarename]
-
- *** Note that it MUST be in that directory and nowhere else !!! ***
-
- The format of this file, is one or more lines, of the following format:
-
- /full/path shortname /provided/path priority [/slave/path shortname /provide!
-
- Note that tabs are not allowed.
-
- The purpose of the "slave path", is that sometimes, when the "main" path
- changes its implementation, one or more other ones must be changed
- to match.
-
- This line format, is normally passed onto our
- "alternatives" binary by the class action script, directly as
- an arg list to the --install option.
-
Deleted: csw/mgar/pkg/alternatives/trunk/README.user
===================================================================
--- csw/mgar/pkg/alternatives/trunk/README.user 2013-08-22 08:03:48 UTC (rev 21820)
+++ csw/mgar/pkg/alternatives/trunk/README.user 2013-08-22 09:12:15 UTC (rev 21821)
@@ -1,44 +0,0 @@
-This is a short documentation file for the OpenCSW targetted implementation of
-linux style "alternatives", aka "update-alternatives" in debian.
-
-USER LEVEL DOCS
-
- alternatives --display shortname
- # will display any currently installed symlink for "shortname"
- # will display any installed packages that provide "shortname".
- # will display current decision mode for --install, for "shortname"
- # (either "auto", or [?? something else]
-
-
- alternatives --config shortname
- # will display any installed packages that provide "shortname".
- # will prompt user for their preferred choice of package to use,
- or to stick/revert to auto mode.
-
- alternatives --auto shortname
- # sets shortname to be auto-chosen. Will adjust symlinks now, if appropriate
-
- alternatives --set shortname /provided/path
- # sets shortname to be the implementation provided by /provided/path,
- # IF PRESENT.
- # Basically, sets that one to be artificially "highest priority", then
- # configure the link now.
- # If the manual setting is invalid, it will be ignored
-
- alternatives --install /full/path/name shortname /path/xx priority [...]
- # notifies the alternatives handler, and says,
- # "hey, here's an implementation. If its highest priority right now,
- # use it!"
- # Unlike redhat, we dont actually "register" anything.
-
- alternatives --remove shortname /full/path/name
- # basically, a hint to reconfigure shortname "as appropriate",
- # while ignoring anything matching /full/path/name as a valid alternative
-
- alternatives --list
- # Gives a short list of programs "known" to alternatives, on this machine.
-
- alternatives --relink-missing
- # if you are in a situation where symlinks have not been created,
- # call this, and it will create any missing ones as appropriate
-
Deleted: csw/mgar/pkg/alternatives/trunk/alternatives
===================================================================
--- csw/mgar/pkg/alternatives/trunk/alternatives 2013-08-22 08:03:48 UTC (rev 21820)
+++ csw/mgar/pkg/alternatives/trunk/alternatives 2013-08-22 09:12:15 UTC (rev 21821)
@@ -1,472 +0,0 @@
-#!/bin/ksh -p
-
-# ksh high-level implentation of linux style "alternatives".
-# Adjusted for OpenCSW needs
-# Author: Philip Brown, phil at bolthole.com, 2010-2011
-#
-
-PRIORITIESDIR=/opt/csw/share/alternatives
-MANUALDIR=/etc/opt/csw/alternatives #manual override location
-AWK=nawk
-DEBUG=${DEBUG:-/bin/true}
-
-#echo DEBUG VERSION of $0: dont ship this
-#DEBUG=echo
-
-function usage {
- prog=`basename $0`
- print "Usage for $prog :"
- print " $prog --display {name}"
- print " $prog --auto {name}"
- print " $prog --set {name} {/full/path}"
- print " $prog --config {name}"
- print " "
- print " The following are provided for compatibility, but do not work"
- print " in exactly the same way as linux variants"
- print " See comments in usage function code for more information."
- print " $prog --install {/full/path/name} {name} {#priority}"
- print " $prog --remove {name} {/full/path}"
- print ""
- print " The following are opencsw-only:"
- print " $prog --relink-missing : create missing symlinks"
- print " $prog --list"
- print ""
- print "See /opt/csw/share/doc/alternatives/ for more docs"
-
-
-# I dont want to bloat up the usage message, so here's some more docs
-#
-# This program is a lightweight 'workalike' to the linux alternatives prog.
-# It is written with OpenCSW in mind, and is specificaly tailored for
-# our needs. You may find it useful in other fields, but be aware that
-# its primary purpose is to be simple, and flexible. NOT an exact clone.
-# Part of its flexibility comes from the fact that it is configuration-file
-# driven, NOT internal-database-driven
-# The --install and --remove flags, while (hopefully) provided as
-# a convenience, do NOT install, or remove, any configuration. They just
-# update symlinks, "as appropriate"
-#
-# Priorities are driven by configuration files delivered by our packages.
-# They get delivered to /opt/csw/share/alternatives, which keeps things
-# NFS friendly.
-# Thes files should only get "installed" or "removed" on a per-SVR4 package
-# basis normally. (although technically, it would be possible to drop in your
-# own config file in either $PRIORITIESDIR or $MANUALDIR, and then
-# have things integrate with your own custom non-packaged software).
-#
-# There is almost NO ERROR CHECKING. There is no saving state of prior actions,
-# other than the --set comand.
-# It is up to individual packages to make sure that everyone providing
-# an alternative for {name}, all have the same "slave entries",
-# if you choose to use slave entries
-}
-
-
-# Usage: find_highest_prio {name}
-# search through all conf files for {name}
-# print out the highest priority match. or, potentially nothing.
-function find_highest_prio {
- if [[ "$1" == "" ]] ; then
- print INTERNAL ERROR: find_highest_prio called with no args
- return
- fi
- # I hate using cat, but its the only way to avoid nawk throwing a fit.
- cat $PRIORITIESDIR/* $MANUALDIR/$1 2>/dev/null |
- $AWK ' BEGIN {save=""}
- $2 == "'$1'" {if($4 > highest){
- save=$0;
- highest=$4
- }
- }
-
- END {print save}
- '
-}
-
-if [[ $# -lt 1 ]] ; then
- print error: need an argument
- usage
- exit 1
-fi
-
-
-############################################################
-# Start of subroutine area
-
-# Usage: print_alternatives shortname
-# This prints only the INSTALLED alternatives lines for named software.
-# Does not display whether or not any have been manually chosen.
-# Prints in priority-sorted order
-# This is used both as a user-facing display, and also internally
-#
-function print_alternatives {
- if [[ $# != 1 ]] ; then print ERROR print_alternatives needs an arg; fi
- cat $PRIORITIESDIR/* 2>/dev/null|
- nawk '$2 == "'$1'" {print}' | sort -nr +3
-}
-
-# User facing function, as well as internal
-# enables "alternatives --list"
-function list_alternatives {
- cat $PRIORITIESDIR/* 2>/dev/null| nawk '{print $2}' | sort -u
-}
-
-# prints ONLY the manually set alternatives line, if present
-function print_manual_set {
- if [[ $# != 1 ]] ; then print ERROR print_manual_set needs an arg; fi
-
- if [[ -f $MANUALDIR/$1 ]] ; then
- nawk '$2 == "'$1'" {print}' $MANUALDIR/$1
- else
- return 1
- fi
-}
-
-function fileerr_exit {
- print Debug: potentially should check to see if /opt/csw is
- print specifically read-only, or we are in jumpstart, or something
- print before returning a bad status exit, perhaps
-
- case `/bin/id` in
- 'uid=0('*)
- :
- ;;
- *)
- echo "Hey! Try running this as root whydoncha?"
- exit 1
- ;;
- esac
-
- print If someone other than Phil is seeing this, please let him know
-
- exit 1
-}
-
-# Called only internally, by set_alternative.
-# args: {target} {shortname} {implementation-path}
-# Split out, because one "alternatives" line may have multiple "slave" links
-function set_link {
- $DEBUG set_link called with: $1 $2 $3
- if [[ $# -lt 3 ]] ; then
- print ERROR: set_link needs 3 arguments
- return 1
- fi
-
- if [[ -h $1 ]] ; then
- linktarget=`ls -l $1 | nawk '{print $NF}'`
- if [[ "$linktarget" == "$3" ]] ; then
- $DEBUG $1 already linked to $3
- return 0
- fi
-
- $DEBUG removing symlink $1
- /bin/rm -f $1
- if [[ $? -ne 0 ]] ; then
- $DEBUG permission to remove $1 failed
- fileerr_exit
- fi
- fi
- if [[ ! -f $1 ]] ; then
- $DEBUG linking $1 to $3
- ln -s $3 $1
- if [[ $? -ne 0 ]] ; then
- $DEBUG permission to create symlink for $1 failed
- fileerr_exit
- fi
- return 0
- else
- print ERROR: $1 exists, and is not symlink.
- print Not installing $3 as $1
- return 1
- fi
-
- ## Note to self: check existing, and dont attempt to
- ## update if already set how we want it?
- ## Also, dont crash if /opt/csw is read-only.
- ## Just politely print warning, and exit cleanly.
- ## At least if running from jumpstart environment?
- ## ALSO, be paranoid and dont remove a "real" file, if
- ## one already exists in the target space.
- ## only a symlink
-}
-
-
-#Used for --remove.
-# removes the old symlinks.
-# pass in the "normal" cache file format.
-# Should be called ONLY IF THERE ARE NO MORE "alternatives" installed
-# or if, perhaps, the "current" alternative is the one being removed.
-function rm_alternative_links {
- $DEBUG rm_alternative_links called with $@
- # first one is special
- if [[ -h $1 ]] ; then
- rm -f $1
- fi
- shift 4
- while [[ $# -ge 3 ]] ; do
- rm -f $1
- shift 3
- done
-
-}
-
-# set_alternatives: mostly internal function.
-# It "sets" only in the sense of making the symlink for the binary(s)
-#
-# Usage: set_alternative {shortname} [ignore-path]
-#
-# Goes and checks both standard configs, and manual config, for best fit.
-# Mandatory first argument, is the "shortname" of the alternative.
-# Optional second argument implies "remove" mode, and needs to be
-# a full path to one of the main implementations of an alternative.
-# The line containing that, will then be ignored.
-#
-#
-function set_alternative {
- typeset shortname remove_match line
- $DEBUG set_alternative called with $*
-
- if [[ $# -lt 1 ]] ; then
- print ERROR set_alternative needs an arg; exit 1;
- fi
-
- shortname="$1"
- remove_match="$2"
-
-
-
- line=`print_manual_set $shortname`
- if [[ "$line" != "" ]] ; then
- set $line
- if [[ "$3" = "$remove_match" ]] ; then
- $DEBUG Note: manual choice is currently $line
- rm_alternative_links $line
- line=""
- fi
- if [[ ! -f "$3" ]] ; then
- print $0 Note: manual choice set, but is invalid.
- print Ignoring $3
- line=""
- fi
- fi
-
- if [[ "$line" = "" ]] ; then
- if [[ "$remove_match" != "" ]] ; then
- line=`print_alternatives $shortname|
- nawk ' $3 != "'$remove_match'" {print}' |
- head -1`
- if [[ "$line" = "" ]] ; then
- line=`print_alternatives $shortname`
- set $line
- if [[ $3 = "$remove_match" ]] ; then
- print Removing last alternative for $shortname
- rm_alternative_links $line
- return 0
- fi
- fi
- else
- line=`print_alternatives $shortname|head -1`
- fi
- fi
-
-
- if [[ "$line" != "" ]] ; then
- set $line
- set_link $1 $2 $3
- shift 4
- while [[ "$1" != "" ]] ; do
- set_link $1 $2 $3
- shift 3
- done
- return 0
- fi
-
- # If we are here, then our "database" is internally
- # inconsistent...?
- print $0: Error 52: should not be in this code section.
- print "Inconsistency with files in $PRIORITIESDIR ?"
-
-
-}
-
-function revert_to_auto {
- case $1 in
- */*)
- print Error: need short name for --auto
- exit 1
- ;;
- esac
- if [[ -f "$MANUALDIR/$1" ]] ; then
- $DEBUG removing manual setting for $1
- rm "$MANUALDIR/$1"
- else
- $DEBUG no manual setting for $1 found
- fi
- set_alternative $1
-}
-
-# Usage: set_manual_prio shortname /full/path
-# Sets a manual override for priorities, for "shortname", by finding
-# the alternatives file supporting the desired combo, and making
-# a symlink under $MANUALDIR, pointing to it.
-# Attempting to set non-alternatives-supported paths is a user error
-# Will then call our internal "make a symlink" routine to create the
-# user-facing symlink for 'shortname'.
-function set_manual_prio {
- case $1 in
- */*)
- print Error: need short name as first arg for --set
- exit 1
- ;;
- esac
-
- if [[ ! -d $MANUALDIR ]] ; then
- mkdir $MANUALDIR 2>/dev/null
- fi
- if [[ ! -d $MANUALDIR ]] ; then
- print Error: $MANUALDIR does not exist. Cannot continue
- exit 1
- fi
- check=`egrep -l "^[^ ]* [ ]*$1 [ ]*$2 " $PRIORITIESDIR/*`
- if [[ "$check" == "" ]] ; then
- print Error: no installed match found for $1 $2
- exit 1
- fi
- # Note: target file may have more than one line in it!!
-
- $DEBUG found match for $1: $check
- rm -f $MANUALDIR/$1
- ln -s $check $MANUALDIR/$1
- # I use a symlink, so that way, the manual set does not take
- # effect if the package has been removed.. but it is remembered
- # if the package is coming right back, hopefully.
-
- set_alternative $1
-
-}
-
-
-
-function display_choices {
- case $1 in
- */*)
- print Error: need short name as arg for --display
- exit 1
- ;;
- esac
-
- if [[ -f $MANUALDIR/$1 ]] ; then
- print Manual mode for $1 set. Paths are:
- print_manual_set $1
- fi
- print Installed alternatives for $1 are:
- print_alternatives $1
-}
-
-function config_alternative {
- case $1 in
- */*)
- print Error: need short name as arg for --config
- exit 1
- ;;
- "")
- print Error: Need a name for --config
- exit 1
- ;;
- esac
- print "Chooser for software '$1'"
- print_alternatives $1 |nawk '{print $4,$1,$3}'
- print "Input the priority number for your desired choice, or 0 to quit"
-
- read prio
- case $prio in
- 0|Q|q)
- print Quitting without change
- exit 0
- ;;
- esac
- fullpath=`cat $PRIORITIESDIR/* |
- nawk '$2 == "'$1'" && $4 == "'$prio'" {print $3}'`
-
- if [[ "$fullpath" = "" ]] ; then
- print Error: no match for priority $prio
- exit 1
- fi
-
- set_manual_prio $1 $fullpath
-}
-
-# User facing function: --relink-missing
-# Used as a damage control function for zones that are non-sparse.
-# Even though we dont officially support non-sparse zones :-)
-# Go through and create links for all alternatives known.
-function relink_missing {
- for alt in `list_alternatives` ; do
- set_alternative $alt
- done
-}
-############################################################
-# Return to "main" area below
-
-## Comment on --remove arg:
-## It does not actually **remove* registration of alternative.
-## That is left for pkgrm.
-## What it does do, is reset link, while ignoring the specified alternative.
-## So for strict purposes, it would better be called "--ignore-and-set"
-## Left in original flag, but dual-implemented as --ignore
-##
-
-if [[ "$1" == "--remove" ]] ; then
- $DEBUG $0 $*
- $DEBUG Note: --remove is really only temporary
- $DEBUG It works like --ignore
- $DEBUG You must pkgrm or rm the appropriate file in $PRIORITIESDIR
- $DEBUG to remove a "registration" for an alternative
-fi
-
-
-
-case $1 in
- --install)
- shift
- $DEBUG "($0 Using files in $PRIORITIESDIR)"
- set_alternative $2
- ;;
- --remove|--ignore) #args = shortname /local/path
- shift
- print "(Note: ignoring arguments for --remove except for '$1')"
- $DEBUG "(Using files in $PRIORITIESDIR)"
- set_alternative $1 $2
- ;;
- --auto)
- shift
- revert_to_auto $1
- ;;
- --list)
- echo "List of installed software that uses the alternatives system:"
- list_alternatives
- ;;
- --display)
- shift
- display_choices $1
- ;;
- --config)
- shift
- config_alternative $1
- ;;
- --set)
- shift
- set_manual_prio $1 $2
- ;;
- --relink-missing)
- relink_missing
- ;;
- *)
- print -- $1 is not a recognized command.
- usage
-
- exit 1
- ;;
-esac
-
-
Added: csw/mgar/pkg/alternatives/trunk/checksums
===================================================================
Deleted: csw/mgar/pkg/alternatives/trunk/copyright
===================================================================
--- csw/mgar/pkg/alternatives/trunk/copyright 2013-08-22 08:03:48 UTC (rev 21820)
+++ csw/mgar/pkg/alternatives/trunk/copyright 2013-08-22 09:12:15 UTC (rev 21821)
@@ -1,2 +0,0 @@
-Scripts in this package are copyright Dagobert Michelsen and Philip Brown
-They may be freely used and copied as part of this package.
Added: csw/mgar/pkg/alternatives/trunk/files/CSWalternatives.i.cswalternatives
===================================================================
--- csw/mgar/pkg/alternatives/trunk/files/CSWalternatives.i.cswalternatives (rev 0)
+++ csw/mgar/pkg/alternatives/trunk/files/CSWalternatives.i.cswalternatives 2013-08-22 09:12:15 UTC (rev 21821)
@@ -0,0 +1,52 @@
+#!/bin/sh
+#
+# i.cswalternatives - Class action script for
+# registering applications in alternatives
+#
+# Written and maintained by Dagobert Michelsen
+#
+# 2010-02-11 Initial release
+
+: ${PKG_INSTALL_ROOT:=/}
+
+while read src dest; do
+ /usr/bin/cp $src $dest || exit 2
+
+ cat $dest | while read C; do
+ set -- $C
+
+ ALTLINK="$1"
+ ALTNAME="$2"
+ ALTPATH="$3"
+ ALTPRIO="$4"
+
+ echo "Registering '$ALTNAME' alternative $ALTPATH ..."
+
+ ARGS="--install $ALTLINK $ALTNAME $ALTPATH $ALTPRIO"
+ shift; shift; shift; shift
+
+ while [ $# -gt 0 ]; do
+ ARGS="$ARGS --slave $1 $2 $3"
+ shift; shift; shift
+ done
+
+ if [ ! -x ${PKG_INSTALL_ROOT}/opt/csw/sbin/alternatives ]; then
+ echo "ERROR: /opt/csw/sbin/alternatives could not be found" >&2
+ exit 2
+ fi
+
+ chroot ${PKG_INSTALL_ROOT} /opt/csw/sbin/alternatives $ARGS
+
+ # Redo previous manual selection if this is an upgrade
+ if /usr/bin/test -L "${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives/$ALTNAME"; then
+ CHOICE=`/usr/bin/perl -e 'print readlink $ARGV[0]' "${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives/$ALTNAME"`
+ if [ "${CHOICE}" = "$ALTPATH" ]; then
+ echo "Applying previous manual selection ${CHOICE} ..."
+ chroot ${PKG_INSTALL_ROOT} /opt/csw/sbin/alternatives --set $ALTNAME ${CHOICE}
+ rm -f ${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives/$ALTNAME
+ fi
+ fi
+ done
+done
+
+exit 0
Added: csw/mgar/pkg/alternatives/trunk/files/CSWalternatives.r.cswalternatives
===================================================================
--- csw/mgar/pkg/alternatives/trunk/files/CSWalternatives.r.cswalternatives (rev 0)
+++ csw/mgar/pkg/alternatives/trunk/files/CSWalternatives.r.cswalternatives 2013-08-22 09:12:15 UTC (rev 21821)
@@ -0,0 +1,42 @@
+#!/bin/sh
+#
+# r.cswalternatives - Class action script for
+# registering applications in alternatives
+#
+# Written and maintained by Dagobert Michelsen
+#
+# 2010-02-11 Initial release
+
+: ${PKG_INSTALL_ROOT:=/}
+
+while read dest; do
+ cat $dest | while read C; do
+ set -- $C
+
+ # If we are in manual mode and the selected item is about to be removed
+ # make sure to remember the selection for next install to be reset.
+
+ if egrep '^manual$' ${PKG_INSTALL_ROOT}/var/opt/csw/alternatives/$2 >/dev/null 2>&1; then
+ CHOICE="`perl -e 'print readlink $ARGV[0]' ${PKG_INSTALL_ROOT}/etc/opt/csw/alternatives/$2`"
+ if [ "$3" = "${CHOICE}" ]; then
+ echo "Preserving '$2' manual choice ${CHOICE} ..."
+ mkdir -p ${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives
+ rm -f ${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives/$2
+ ln -s "${CHOICE}" ${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives/$2
+ fi
+ fi
+
+ echo "Unregistering '$2' alternative $3 ..."
+
+ if [ -x ${PKG_INSTALL_ROOT}/opt/csw/sbin/alternatives ]; then
+ chroot ${PKG_INSTALL_ROOT} /opt/csw/sbin/alternatives --remove $2 $3
+ else
+ echo "ERROR: /opt/csw/sbin/alternatives could not be found" >&2
+ exit 2
+ fi
+ done
+
+ rm -f $dest
+done
+
+exit 0
Added: csw/mgar/pkg/alternatives/trunk/files/LICENSE-2.0.txt
===================================================================
--- csw/mgar/pkg/alternatives/trunk/files/LICENSE-2.0.txt (rev 0)
+++ csw/mgar/pkg/alternatives/trunk/files/LICENSE-2.0.txt 2013-08-22 09:12:15 UTC (rev 21821)
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
Copied: csw/mgar/pkg/alternatives/trunk/files/README (from rev 21819, csw/mgar/pkg/alternatives/trunk/README)
===================================================================
--- csw/mgar/pkg/alternatives/trunk/files/README (rev 0)
+++ csw/mgar/pkg/alternatives/trunk/files/README 2013-08-22 09:12:15 UTC (rev 21821)
@@ -0,0 +1,66 @@
+This file is more of an "internals" thoughts and notes file.
+For user facing documentation, see README.user
+
+Phil decided that a from-scratch, CSW-custom implementation was needed,
+because the debian one was hugely bloated, and the redhat smaller one,
+did not play nicely with NFS-shared /opt/csw
+So please dont go getting ideas that we can migrated back to redhat,etc
+in the future! :) we tried, and it failed.
+
+Sections below:
+ * CODE NOTES
+ * FILE FORMATS
+
+
+CODE NOTES
+
+ My initial version seems to expect each "alternative" to have its own
+file as /opt/csw/share/alternatives/xyz
+One line per file only would be nice, please. But this suports
+multiple lines per file now.
+
+When a choice is manually set (overriding auto settings), it records that
+fact by making a symlink from the relevant shipped file, to
+/etc/opt/csw/alternatives/(progname)
+and then it will make the user-facing symlink(s) indicated by that file
+
+This way, you can have the binary, and alternatives files per software,
+in NFS-shared /opt/csw, but then have machine-local overrides.
+
+Reminder: Do NOT have to get fancy with the class action script not
+ getting called with pathnames on sparse zones with pkg-inherit-dir,
+ because since /opt/csw is shared, the symlink will already be in place.
+
+ Ambuguity for --remove:
+ what if --remove is used, on something that has a manually set pref?
+ (rather than calling --auto)
+ I choose that it will LEAVE the manual choice.
+ That is to say, it will leave the saved preference as valid.
+ BUT, if the manual choice matches the --remove", then
+ it should skip it as a "what to match" option..? !!
+
+ This is to potentially make our pkgrm/pkgadd upgrade cycle
+ function as a user expects: to preserve their manual choice.
+
+FILE FORMATS
+
+ Packages that provide implementation of an "alternative" for a
+ particular path, need to provide a file in
+ /opt/csw/share/alternatives/[softwarename]
+
+ *** Note that it MUST be in that directory and nowhere else !!! ***
+
+ The format of this file, is one or more lines, of the following format:
+
+ /full/path shortname /provided/path priority [/slave/path shortname /provide!
+
+ Note that tabs are not allowed.
+
+ The purpose of the "slave path", is that sometimes, when the "main" path
+ changes its implementation, one or more other ones must be changed
+ to match.
+
+ This line format, is normally passed onto our
+ "alternatives" binary by the class action script, directly as
+ an arg list to the --install option.
+
Copied: csw/mgar/pkg/alternatives/trunk/files/README.user (from rev 21819, csw/mgar/pkg/alternatives/trunk/README.user)
===================================================================
--- csw/mgar/pkg/alternatives/trunk/files/README.user (rev 0)
+++ csw/mgar/pkg/alternatives/trunk/files/README.user 2013-08-22 09:12:15 UTC (rev 21821)
@@ -0,0 +1,44 @@
+This is a short documentation file for the OpenCSW targetted implementation of
+linux style "alternatives", aka "update-alternatives" in debian.
+
+USER LEVEL DOCS
+
+ alternatives --display shortname
+ # will display any currently installed symlink for "shortname"
+ # will display any installed packages that provide "shortname".
+ # will display current decision mode for --install, for "shortname"
+ # (either "auto", or [?? something else]
+
+
+ alternatives --config shortname
+ # will display any installed packages that provide "shortname".
+ # will prompt user for their preferred choice of package to use,
+ or to stick/revert to auto mode.
+
+ alternatives --auto shortname
+ # sets shortname to be auto-chosen. Will adjust symlinks now, if appropriate
+
+ alternatives --set shortname /provided/path
+ # sets shortname to be the implementation provided by /provided/path,
+ # IF PRESENT.
+ # Basically, sets that one to be artificially "highest priority", then
+ # configure the link now.
+ # If the manual setting is invalid, it will be ignored
+
+ alternatives --install /full/path/name shortname /path/xx priority [...]
+ # notifies the alternatives handler, and says,
+ # "hey, here's an implementation. If its highest priority right now,
+ # use it!"
+ # Unlike redhat, we dont actually "register" anything.
+
+ alternatives --remove shortname /full/path/name
+ # basically, a hint to reconfigure shortname "as appropriate",
+ # while ignoring anything matching /full/path/name as a valid alternative
+
+ alternatives --list
+ # Gives a short list of programs "known" to alternatives, on this machine.
+
+ alternatives --relink-missing
+ # if you are in a situation where symlinks have not been created,
+ # call this, and it will create any missing ones as appropriate
+
Copied: csw/mgar/pkg/alternatives/trunk/files/alternatives (from rev 21819, csw/mgar/pkg/alternatives/trunk/alternatives)
===================================================================
--- csw/mgar/pkg/alternatives/trunk/files/alternatives (rev 0)
+++ csw/mgar/pkg/alternatives/trunk/files/alternatives 2013-08-22 09:12:15 UTC (rev 21821)
@@ -0,0 +1,479 @@
+#!/bin/ksh -p
+
+# ksh high-level implentation of linux style "alternatives".
+# Adjusted for OpenCSW needs
+# Author: Philip Brown, phil at bolthole.com, 2010-2011
+# $Id$
+Revision="$(echo '$Revision$' | sed -e 's/^[$]Revision: //' -e 's/ [$]$//')"
+
+PRIORITIESDIR=/opt/csw/share/alternatives
+MANUALDIR=/etc/opt/csw/alternatives #manual override location
+AWK=nawk
+DEBUG=${DEBUG:-/bin/true}
+
+#echo DEBUG VERSION of $0: dont ship this
+#DEBUG=echo
+
+function usage {
+ prog=`basename $0`
+ print "Usage for $prog :"
+ print " $prog --display {name}"
+ print " $prog --auto {name}"
+ print " $prog --set {name} {/full/path}"
+ print " $prog --config {name}"
+ print " "
+ print " The following are provided for compatibility, but do not work"
+ print " in exactly the same way as linux variants"
+ print " See comments in usage function code for more information."
+ print " $prog --install {/full/path/name} {name} {#priority}"
+ print " $prog --remove {name} {/full/path}"
+ print ""
+ print " The following are opencsw-only:"
+ print " $prog --relink-missing : create missing symlinks"
+ print " $prog --list"
+ print ""
+ print "See /opt/csw/share/doc/alternatives/ for more docs"
+
+
+# I dont want to bloat up the usage message, so here's some more docs
+#
+# This program is a lightweight 'workalike' to the linux alternatives prog.
+# It is written with OpenCSW in mind, and is specificaly tailored for
+# our needs. You may find it useful in other fields, but be aware that
+# its primary purpose is to be simple, and flexible. NOT an exact clone.
+# Part of its flexibility comes from the fact that it is configuration-file
+# driven, NOT internal-database-driven
+# The --install and --remove flags, while (hopefully) provided as
+# a convenience, do NOT install, or remove, any configuration. They just
+# update symlinks, "as appropriate"
+#
+# Priorities are driven by configuration files delivered by our packages.
+# They get delivered to /opt/csw/share/alternatives, which keeps things
+# NFS friendly.
+# Thes files should only get "installed" or "removed" on a per-SVR4 package
+# basis normally. (although technically, it would be possible to drop in your
+# own config file in either $PRIORITIESDIR or $MANUALDIR, and then
+# have things integrate with your own custom non-packaged software).
+#
+# There is almost NO ERROR CHECKING. There is no saving state of prior actions,
+# other than the --set comand.
+# It is up to individual packages to make sure that everyone providing
+# an alternative for {name}, all have the same "slave entries",
+# if you choose to use slave entries
+}
+
+
+# Usage: find_highest_prio {name}
+# search through all conf files for {name}
+# print out the highest priority match. or, potentially nothing.
+function find_highest_prio {
+ if [[ "$1" == "" ]] ; then
+ print INTERNAL ERROR: find_highest_prio called with no args
+ return
+ fi
+ # I hate using cat, but its the only way to avoid nawk throwing a fit.
+ cat $PRIORITIESDIR/* $MANUALDIR/$1 2>/dev/null |
+ $AWK ' BEGIN {save=""}
+ $2 == "'$1'" {if($4 > highest){
+ save=$0;
+ highest=$4
+ }
+ }
+
+ END {print save}
+ '
+}
+
+if [[ $# -lt 1 ]] ; then
+ print error: need an argument
+ usage
+ exit 1
+fi
+
+
+############################################################
+# Start of subroutine area
+
+# Usage: print_alternatives shortname
+# This prints only the INSTALLED alternatives lines for named software.
+# Does not display whether or not any have been manually chosen.
+# Prints in priority-sorted order
+# This is used both as a user-facing display, and also internally
+#
+function print_alternatives {
+ if [[ $# != 1 ]] ; then print ERROR print_alternatives needs an arg; fi
+ cat $PRIORITIESDIR/* 2>/dev/null|
+ nawk '$2 == "'$1'" {print}' | sort -nr +3
+}
+
+# User facing function, as well as internal
+# enables "alternatives --list"
+function list_alternatives {
+ cat $PRIORITIESDIR/* 2>/dev/null| nawk '{print $2}' | sort -u
+}
+
+# prints ONLY the manually set alternatives line, if present
+function print_manual_set {
+ if [[ $# != 1 ]] ; then print ERROR print_manual_set needs an arg; fi
+
+ if [[ -f $MANUALDIR/$1 ]] ; then
+ nawk '$2 == "'$1'" {print}' $MANUALDIR/$1
+ else
+ return 1
+ fi
+}
+
+function fileerr_exit {
+ print Debug: potentially should check to see if /opt/csw is
+ print specifically read-only, or we are in jumpstart, or something
+ print before returning a bad status exit, perhaps
+
+ case `/bin/id` in
+ 'uid=0('*)
+ :
+ ;;
+ *)
+ echo "Hey! Try running this as root whydoncha?"
+ exit 1
+ ;;
+ esac
+
+ print If someone other than Phil is seeing this, please let him know
+
+ exit 1
+}
+
+# Called only internally, by set_alternative.
+# args: {target} {shortname} {implementation-path}
+# Split out, because one "alternatives" line may have multiple "slave" links
+function set_link {
+ $DEBUG set_link called with: $1 $2 $3
+ if [[ $# -lt 3 ]] ; then
+ print ERROR: set_link needs 3 arguments
+ return 1
+ fi
+
+ if [[ -h $1 ]] ; then
+ linktarget=`ls -l $1 | nawk '{print $NF}'`
+ if [[ "$linktarget" == "$3" ]] ; then
+ $DEBUG $1 already linked to $3
+ return 0
+ fi
+
+ $DEBUG removing symlink $1
+ /bin/rm -f $1
+ if [[ $? -ne 0 ]] ; then
+ $DEBUG permission to remove $1 failed
+ fileerr_exit
+ fi
+ fi
+ if [[ ! -f $1 ]] ; then
+ $DEBUG linking $1 to $3
+ ln -s $3 $1
+ if [[ $? -ne 0 ]] ; then
+ $DEBUG permission to create symlink for $1 failed
+ fileerr_exit
+ fi
+ return 0
+ else
+ print ERROR: $1 exists, and is not symlink.
+ print Not installing $3 as $1
+ return 1
+ fi
+
+ ## Note to self: check existing, and dont attempt to
+ ## update if already set how we want it?
+ ## Also, dont crash if /opt/csw is read-only.
+ ## Just politely print warning, and exit cleanly.
+ ## At least if running from jumpstart environment?
+ ## ALSO, be paranoid and dont remove a "real" file, if
+ ## one already exists in the target space.
+ ## only a symlink
+}
+
+
+#Used for --remove.
+# removes the old symlinks.
+# pass in the "normal" cache file format.
+# Should be called ONLY IF THERE ARE NO MORE "alternatives" installed
+# or if, perhaps, the "current" alternative is the one being removed.
+function rm_alternative_links {
+ $DEBUG rm_alternative_links called with $@
+ # first one is special
+ if [[ -h $1 ]] ; then
+ rm -f $1
+ fi
+ shift 4
+ while [[ $# -ge 3 ]] ; do
+ rm -f $1
+ shift 3
+ done
+
+}
+
+# set_alternatives: mostly internal function.
+# It "sets" only in the sense of making the symlink for the binary(s)
+#
+# Usage: set_alternative {shortname} [ignore-path]
+#
+# Goes and checks both standard configs, and manual config, for best fit.
+# Mandatory first argument, is the "shortname" of the alternative.
+# Optional second argument implies "remove" mode, and needs to be
+# a full path to one of the main implementations of an alternative.
+# The line containing that, will then be ignored.
+#
+#
+function set_alternative {
+ typeset shortname remove_match line
+ $DEBUG set_alternative called with $*
+
+ if [[ $# -lt 1 ]] ; then
+ print ERROR set_alternative needs an arg; exit 1;
+ fi
+
+ shortname="$1"
+ remove_match="$2"
+
+
+
+ line=`print_manual_set $shortname`
+ if [[ "$line" != "" ]] ; then
+ set $line
+ if [[ "$3" = "$remove_match" ]] ; then
+ $DEBUG Note: manual choice is currently $line
+ rm_alternative_links $line
+ line=""
+ fi
+ if [[ ! -f "$3" ]] ; then
+ print $0 Note: manual choice set, but is invalid.
+ print Ignoring $3
+ line=""
+ fi
+ fi
+
+ if [[ "$line" = "" ]] ; then
+ if [[ "$remove_match" != "" ]] ; then
+ line=`print_alternatives $shortname|
+ nawk ' $3 != "'$remove_match'" {print}' |
+ head -1`
+ if [[ "$line" = "" ]] ; then
+ line=`print_alternatives $shortname`
+ set $line
+ if [[ $3 = "$remove_match" ]] ; then
+ print Removing last alternative for $shortname
+ rm_alternative_links $line
+ return 0
+ fi
+ fi
+ else
+ line=`print_alternatives $shortname|head -1`
+ fi
+ fi
+
+
+ if [[ "$line" != "" ]] ; then
+ set $line
+ set_link $1 $2 $3
+ shift 4
+ while [[ "$1" != "" ]] ; do
+ set_link $1 $2 $3
+ shift 3
+ done
+ return 0
+ fi
+
+ # If we are here, then our "database" is internally
+ # inconsistent...?
+ print $0: Error 52: should not be in this code section.
+ print "Inconsistency with files in $PRIORITIESDIR ?"
+
+
+}
+
+function revert_to_auto {
+ case $1 in
+ */*)
+ print Error: need short name for --auto
+ exit 1
+ ;;
+ esac
+ if [[ -f "$MANUALDIR/$1" ]] ; then
+ $DEBUG removing manual setting for $1
+ rm "$MANUALDIR/$1"
+ else
+ $DEBUG no manual setting for $1 found
+ fi
+ set_alternative $1
+}
+
+# Usage: set_manual_prio shortname /full/path
+# Sets a manual override for priorities, for "shortname", by finding
+# the alternatives file supporting the desired combo, and making
+# a symlink under $MANUALDIR, pointing to it.
+# Attempting to set non-alternatives-supported paths is a user error
+# Will then call our internal "make a symlink" routine to create the
+# user-facing symlink for 'shortname'.
+function set_manual_prio {
+ case $1 in
+ */*)
+ print Error: need short name as first arg for --set
+ exit 1
+ ;;
+ esac
+
+ if [[ ! -d $MANUALDIR ]] ; then
+ mkdir $MANUALDIR 2>/dev/null
+ fi
+ if [[ ! -d $MANUALDIR ]] ; then
+ print Error: $MANUALDIR does not exist. Cannot continue
+ exit 1
+ fi
+ check=`egrep -l "^[^ ]* [ ]*$1 [ ]*$2 " $PRIORITIESDIR/*`
+ if [[ "$check" == "" ]] ; then
+ print Error: no installed match found for $1 $2
+ exit 1
+ fi
+ # Note: target file may have more than one line in it!!
+
+ $DEBUG found match for $1: $check
+ rm -f $MANUALDIR/$1
+ ln -s $check $MANUALDIR/$1
+ # I use a symlink, so that way, the manual set does not take
+ # effect if the package has been removed.. but it is remembered
+ # if the package is coming right back, hopefully.
+
+ set_alternative $1
+
+}
+
+
+
+function display_choices {
+ case $1 in
+ */*)
+ print Error: need short name as arg for --display
+ exit 1
+ ;;
+ esac
+
+ if [[ -f $MANUALDIR/$1 ]] ; then
+ print Manual mode for $1 set. Paths are:
+ print_manual_set $1
+ fi
+ print Installed alternatives for $1 are:
+ print_alternatives $1
+}
+
+function config_alternative {
+ case $1 in
+ */*)
+ print Error: need short name as arg for --config
+ exit 1
+ ;;
+ "")
+ print Error: Need a name for --config
+ exit 1
+ ;;
+ esac
+ print "Chooser for software '$1'"
+ print_alternatives $1 |nawk '{print $4,$1,$3}'
+ print "Input the priority number for your desired choice, or 0 to quit"
+
+ read prio
+ case $prio in
+ 0|Q|q)
+ print Quitting without change
+ exit 0
+ ;;
+ esac
+ fullpath=`cat $PRIORITIESDIR/* |
+ nawk '$2 == "'$1'" && $4 == "'$prio'" {print $3}'`
+
+ if [[ "$fullpath" = "" ]] ; then
+ print Error: no match for priority $prio
+ exit 1
+ fi
+
+ set_manual_prio $1 $fullpath
+}
+
+# User facing function: --relink-missing
+# Used as a damage control function for zones that are non-sparse.
+# Even though we dont officially support non-sparse zones :-)
+# Go through and create links for all alternatives known.
+function relink_missing {
+ for alt in `list_alternatives` ; do
+ set_alternative $alt
+ done
+}
+############################################################
+# Return to "main" area below
+
+## Comment on --remove arg:
+## It does not actually **remove* registration of alternative.
+## That is left for pkgrm.
+## What it does do, is reset link, while ignoring the specified alternative.
+## So for strict purposes, it would better be called "--ignore-and-set"
+## Left in original flag, but dual-implemented as --ignore
+##
+
+if [[ "$1" == "--remove" ]] ; then
+ $DEBUG $0 $*
+ $DEBUG Note: --remove is really only temporary
+ $DEBUG It works like --ignore
+ $DEBUG You must pkgrm or rm the appropriate file in $PRIORITIESDIR
+ $DEBUG to remove a "registration" for an alternative
+fi
+
+
+
+case $1 in
+ --install)
+ shift
+ $DEBUG "($0 Using files in $PRIORITIESDIR)"
+ set_alternative $2
+ ;;
+ --remove|--ignore) #args = shortname /local/path
+ shift
+ print "(Note: ignoring arguments for --remove except for '$1')"
+ $DEBUG "(Using files in $PRIORITIESDIR)"
+ set_alternative $1 $2
+ ;;
+ --auto)
+ shift
+ revert_to_auto $1
+ ;;
+ --list)
+ echo "List of installed software that uses the alternatives system:"
+ list_alternatives
+ ;;
+ --display)
+ shift
+ display_choices $1
+ ;;
+ --config)
+ shift
+ config_alternative $1
+ ;;
+ --set)
+ shift
+ set_manual_prio $1 $2
+ ;;
+ --relink-missing)
+ relink_missing
+ ;;
+ --help)
+ usage
+ ;;
+ --version)
+ print ${Revision}
+ ;;
+ *)
+ print -- $1 is not a recognized command.
+ usage
+
+ exit 1
+ ;;
+esac
+
+
Property changes on: csw/mgar/pkg/alternatives/trunk/files/alternatives
___________________________________________________________________
Added: svn:executable
+ *
Added: svn:keywords
+ Author Date Id Revision
Added: csw/mgar/pkg/alternatives/trunk/files/alternatives.8
===================================================================
Deleted: csw/mgar/pkg/alternatives/trunk/i.cswalternatives
===================================================================
--- csw/mgar/pkg/alternatives/trunk/i.cswalternatives 2013-08-22 08:03:48 UTC (rev 21820)
+++ csw/mgar/pkg/alternatives/trunk/i.cswalternatives 2013-08-22 09:12:15 UTC (rev 21821)
@@ -1,52 +0,0 @@
-#!/bin/sh
-#
-# i.cswalternatives - Class action script for
-# registering applications in alternatives
-#
-# Written and maintained by Dagobert Michelsen
-#
-# 2010-02-11 Initial release
-
-: ${PKG_INSTALL_ROOT:=/}
-
-while read src dest; do
- /usr/bin/cp $src $dest || exit 2
-
- cat $dest | while read C; do
- set -- $C
-
- ALTLINK="$1"
- ALTNAME="$2"
- ALTPATH="$3"
- ALTPRIO="$4"
-
- echo "Registering '$ALTNAME' alternative $ALTPATH ..."
-
- ARGS="--install $ALTLINK $ALTNAME $ALTPATH $ALTPRIO"
- shift; shift; shift; shift
-
- while [ $# -gt 0 ]; do
- ARGS="$ARGS --slave $1 $2 $3"
- shift; shift; shift
- done
-
- if [ ! -x ${PKG_INSTALL_ROOT}/opt/csw/sbin/alternatives ]; then
- echo "ERROR: /opt/csw/sbin/alternatives could not be found" >&2
- exit 2
- fi
-
- chroot ${PKG_INSTALL_ROOT} /opt/csw/sbin/alternatives $ARGS
-
- # Redo previous manual selection if this is an upgrade
- if /usr/bin/test -L "${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives/$ALTNAME"; then
- CHOICE=`/usr/bin/perl -e 'print readlink $ARGV[0]' "${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives/$ALTNAME"`
- if [ "${CHOICE}" = "$ALTPATH" ]; then
- echo "Applying previous manual selection ${CHOICE} ..."
- chroot ${PKG_INSTALL_ROOT} /opt/csw/sbin/alternatives --set $ALTNAME ${CHOICE}
- rm -f ${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives/$ALTNAME
- fi
- fi
- done
-done
-
-exit 0
Deleted: csw/mgar/pkg/alternatives/trunk/pkginfo
===================================================================
--- csw/mgar/pkg/alternatives/trunk/pkginfo 2013-08-22 08:03:48 UTC (rev 21820)
+++ csw/mgar/pkg/alternatives/trunk/pkginfo 2013-08-22 09:12:15 UTC (rev 21821)
@@ -1,9 +0,0 @@
-PKG=CSWalternatives
-ARCH=all
-NAME=alternatives - an implementation of linux-style alternatives choice mgr
-VERSION=1.1.1,REV=YYYY.MM.DD
-CATEGORY=system
-VENDOR=http://www.opencsw.org written and packaged for CSW by Philip Brown
-EMAIL=phil at opencsw.org
-HOTLINE=http://www.opencsw.org/bugtrack/
-PSTAMP=cswalternatives v1.1
Deleted: csw/mgar/pkg/alternatives/trunk/prototype
===================================================================
--- csw/mgar/pkg/alternatives/trunk/prototype 2013-08-22 08:03:48 UTC (rev 21820)
+++ csw/mgar/pkg/alternatives/trunk/prototype 2013-08-22 09:12:15 UTC (rev 21821)
@@ -1,8 +0,0 @@
-i pkginfo
-i copyright
-f none /usr/sadm/install/scripts/i.cswalternatives=i.cswalternatives 0755 root bin
-f none /usr/sadm/install/scripts/r.cswalternatives=r.cswalternatives 0755 root bin
-f none /opt/csw/sbin/alternatives=alternatives 0755 root bin
-d none /opt/csw/share/doc/alternatives 0755 root bin
-f none /opt/csw/share/doc/alternatives/README.user=README.user 0644 root bin
-f none /opt/csw/share/doc/alternatives/README.code=README 0644 root bin
Deleted: csw/mgar/pkg/alternatives/trunk/r.cswalternatives
===================================================================
--- csw/mgar/pkg/alternatives/trunk/r.cswalternatives 2013-08-22 08:03:48 UTC (rev 21820)
+++ csw/mgar/pkg/alternatives/trunk/r.cswalternatives 2013-08-22 09:12:15 UTC (rev 21821)
@@ -1,42 +0,0 @@
-#!/bin/sh
-#
-# r.cswalternatives - Class action script for
-# registering applications in alternatives
-#
-# Written and maintained by Dagobert Michelsen
-#
-# 2010-02-11 Initial release
-
-: ${PKG_INSTALL_ROOT:=/}
-
-while read dest; do
- cat $dest | while read C; do
- set -- $C
-
- # If we are in manual mode and the selected item is about to be removed
- # make sure to remember the selection for next install to be reset.
-
- if egrep '^manual$' ${PKG_INSTALL_ROOT}/var/opt/csw/alternatives/$2 >/dev/null 2>&1; then
- CHOICE="`perl -e 'print readlink $ARGV[0]' ${PKG_INSTALL_ROOT}/etc/opt/csw/alternatives/$2`"
- if [ "$3" = "${CHOICE}" ]; then
- echo "Preserving '$2' manual choice ${CHOICE} ..."
- mkdir -p ${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives
- rm -f ${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives/$2
- ln -s "${CHOICE}" ${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives/$2
- fi
- fi
-
- echo "Unregistering '$2' alternative $3 ..."
-
- if [ -x ${PKG_INSTALL_ROOT}/opt/csw/sbin/alternatives ]; then
- chroot ${PKG_INSTALL_ROOT} /opt/csw/sbin/alternatives --remove $2 $3
- else
- echo "ERROR: /opt/csw/sbin/alternatives could not be found" >&2
- exit 2
- fi
- done
-
- rm -f $dest
-done
-
-exit 0
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