mirror of
https://git.FreeBSD.org/ports.git
synced 2024-11-27 00:57:50 +00:00
A special meta-port to do nothing but register dependencies on those
ports you specifically want to have installed. The normal dependency checking in programs like pkg_delete(1) will prevent easy deletion of ports that other ports depend on. Keeps egg off face. Protects feet from being shot. PR: ports/147808 Submitted by: Matthew Seaman <m.seaman at infracaninophile.co.uk> Approved by: tabthorpe (mentor)
This commit is contained in:
parent
7722c237dd
commit
e48a81f15b
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=256557
@ -72,6 +72,7 @@
|
||||
SUBDIR += tinderbox
|
||||
SUBDIR += tinderbox-devel
|
||||
SUBDIR += vulnerability-test-port
|
||||
SUBDIR += wanted-ports
|
||||
SUBDIR += xps
|
||||
|
||||
.include <bsd.port.subdir.mk>
|
||||
|
47
ports-mgmt/wanted-ports/Makefile
Normal file
47
ports-mgmt/wanted-ports/Makefile
Normal file
@ -0,0 +1,47 @@
|
||||
# New ports collection makefile for: wanted-ports
|
||||
# Date created: 7 June 2010
|
||||
# Whom: Matthew Seaman <m.seaman@infracaninophile.co.uk>
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
# port is self-contained in the files directory.
|
||||
|
||||
PORTNAME= wanted-ports
|
||||
PORTVERSION= 0.1
|
||||
#PORTREVISION is set from ${CFGFILE}
|
||||
CATEGORIES= ports-mgmt
|
||||
MASTER_SITES= # none
|
||||
DISTFILES= # none
|
||||
|
||||
MAINTAINER= m.seaman@infracaninphile.co.uk
|
||||
COMMENT= Just depend on a configurable, arbitrary set of other ports
|
||||
|
||||
LICENSE= BSD
|
||||
|
||||
NO_BUILD= yes
|
||||
SUB_FILES= ${PORTNAME} \
|
||||
${PORTNAME}.1
|
||||
SUB_LIST= PORTNAME=${PORTNAME} \
|
||||
PKGNAME=${PKGNAME}
|
||||
PLIST_SUB= PORTNAME=${PORTNAME}
|
||||
PLIST_FILES= bin/${PORTNAME}
|
||||
|
||||
MAN1= ${PORTNAME}.1
|
||||
|
||||
.if defined(WANTEDPORTSCFG)
|
||||
CFGFILE= ${WANTEDPORTSCFG}
|
||||
.else
|
||||
CFGFILE?= /var/db/${PORTNAME}.conf
|
||||
.endif
|
||||
|
||||
.if exists(${CFGFILE})
|
||||
.include "${CFGFILE}"
|
||||
.endif
|
||||
|
||||
do-install:
|
||||
${INSTALL_SCRIPT} ${WRKDIR}/${PORTNAME} ${PREFIX}/bin/${PORTNAME}
|
||||
.if !defined(NOPORTDOCS)
|
||||
${INSTALL_MAN} ${WRKDIR}/${PORTNAME}.1 ${MANPREFIX}/man/man1/
|
||||
.endif
|
||||
|
||||
.include <bsd.port.mk>
|
238
ports-mgmt/wanted-ports/files/wanted-ports.1.in
Normal file
238
ports-mgmt/wanted-ports/files/wanted-ports.1.in
Normal file
@ -0,0 +1,238 @@
|
||||
.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07)
|
||||
.\"
|
||||
.\" Standard preamble:
|
||||
.\" ========================================================================
|
||||
.de Sp \" Vertical space (when we can't use .PP)
|
||||
.if t .sp .5v
|
||||
.if n .sp
|
||||
..
|
||||
.de Vb \" Begin verbatim text
|
||||
.ft CW
|
||||
.nf
|
||||
.ne \\$1
|
||||
..
|
||||
.de Ve \" End verbatim text
|
||||
.ft R
|
||||
.fi
|
||||
..
|
||||
.\" Set up some character translations and predefined strings. \*(-- will
|
||||
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
|
||||
.\" double quote, and \*(R" will give a right double quote. \*(C+ will
|
||||
.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
|
||||
.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
|
||||
.\" nothing in troff, for use with C<>.
|
||||
.tr \(*W-
|
||||
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
|
||||
.ie n \{\
|
||||
. ds -- \(*W-
|
||||
. ds PI pi
|
||||
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
|
||||
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
|
||||
. ds L" ""
|
||||
. ds R" ""
|
||||
. ds C` ""
|
||||
. ds C' ""
|
||||
'br\}
|
||||
.el\{\
|
||||
. ds -- \|\(em\|
|
||||
. ds PI \(*p
|
||||
. ds L" ``
|
||||
. ds R" ''
|
||||
'br\}
|
||||
.\"
|
||||
.\" Escape single quotes in literal strings from groff's Unicode transform.
|
||||
.ie \n(.g .ds Aq \(aq
|
||||
.el .ds Aq '
|
||||
.\"
|
||||
.\" If the F register is turned on, we'll generate index entries on stderr for
|
||||
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
|
||||
.\" entries marked with X<> in POD. Of course, you'll have to process the
|
||||
.\" output yourself in some meaningful fashion.
|
||||
.ie \nF \{\
|
||||
. de IX
|
||||
. tm Index:\\$1\t\\n%\t"\\$2"
|
||||
..
|
||||
. nr % 0
|
||||
. rr F
|
||||
.\}
|
||||
.el \{\
|
||||
. de IX
|
||||
..
|
||||
.\}
|
||||
.\"
|
||||
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
|
||||
.\" Fear. Run. Save yourself. No user-serviceable parts.
|
||||
. \" fudge factors for nroff and troff
|
||||
.if n \{\
|
||||
. ds #H 0
|
||||
. ds #V .8m
|
||||
. ds #F .3m
|
||||
. ds #[ \f1
|
||||
. ds #] \fP
|
||||
.\}
|
||||
.if t \{\
|
||||
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
|
||||
. ds #V .6m
|
||||
. ds #F 0
|
||||
. ds #[ \&
|
||||
. ds #] \&
|
||||
.\}
|
||||
. \" simple accents for nroff and troff
|
||||
.if n \{\
|
||||
. ds ' \&
|
||||
. ds ` \&
|
||||
. ds ^ \&
|
||||
. ds , \&
|
||||
. ds ~ ~
|
||||
. ds /
|
||||
.\}
|
||||
.if t \{\
|
||||
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
|
||||
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
|
||||
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
|
||||
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
|
||||
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
|
||||
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
|
||||
.\}
|
||||
. \" troff and (daisy-wheel) nroff accents
|
||||
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
|
||||
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
|
||||
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
|
||||
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
|
||||
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
|
||||
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
|
||||
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
|
||||
.ds ae a\h'-(\w'a'u*4/10)'e
|
||||
.ds Ae A\h'-(\w'A'u*4/10)'E
|
||||
. \" corrections for vroff
|
||||
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
|
||||
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
|
||||
. \" for low resolution devices (crt and lpr)
|
||||
.if \n(.H>23 .if \n(.V>19 \
|
||||
\{\
|
||||
. ds : e
|
||||
. ds 8 ss
|
||||
. ds o a
|
||||
. ds d- d\h'-1'\(ga
|
||||
. ds D- D\h'-1'\(hy
|
||||
. ds th \o'bp'
|
||||
. ds Th \o'LP'
|
||||
. ds ae ae
|
||||
. ds Ae AE
|
||||
.\}
|
||||
.rm #[ #] #H #V #F C
|
||||
.\" ========================================================================
|
||||
.\"
|
||||
.IX Title "WANTED-PORTS 1"
|
||||
.TH WANTED-PORTS 1 "2010-06-12" "perl v5.10.1" "User Contributed Perl Documentation"
|
||||
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
|
||||
.\" way too many mistakes in technical documents.
|
||||
.if n .ad l
|
||||
.nh
|
||||
.SH "NAME"
|
||||
%%PORTNAME%% \-\- depend on the ports that you want installed
|
||||
.SH "SYNOPSIS"
|
||||
.IX Header "SYNOPSIS"
|
||||
\&\fB%%PORTNAME%%\fR [\fB\-n\fR] [\fB\-f\fR \fIconfig\fR] [\fB\-a|\-d\fR \fIportname\fR]]
|
||||
.SH "DESCRIPTION"
|
||||
.IX Header "DESCRIPTION"
|
||||
\&\fB%%PORTNAME%%\fR is a small port that simply has a user modifiable list
|
||||
of run-time dependencies. The idea is that by marking a port as
|
||||
wanted, it adds a double check helping to prevent accidental deletion
|
||||
of the ports you really want to have installed. \fIpkg_delete\fR\|(1) will
|
||||
refuse to delete a port when that port is a dependency required by
|
||||
some other installed port, unless you give the \fB\-f\fR option to force
|
||||
the action.
|
||||
.PP
|
||||
\&\fB%%PORTNAME%%\fR can also be used as a means to automate installing the
|
||||
required software load on a server.
|
||||
.SS "Using \fB%%PORTNAME%%\fP"
|
||||
.IX Subsection "Using %%PORTNAME%%"
|
||||
The first time you run the \fB%%PORTNAME%%\fR script, it will generate a
|
||||
skeleton configuration file. Run \fB%%PORTNAME%%\fR to modify the list
|
||||
of ports that you want to have marked. This will automatically
|
||||
increment the \f(CW\*(C`PORTREVISION\*(C'\fR of \fB%%PORTNAME%%\fR, marking the
|
||||
\&\fIports\-mgmt/%%PORTNAME%%\fR port to be updated, eg. the next time that
|
||||
\&\fIportmaster\fR\|(8) or \fIportupgrade\fR\|(1) is run.
|
||||
.PP
|
||||
Updating or reinstalling the port will cause the ports system to force
|
||||
all of the marked ports to be installed, using the standard dependency
|
||||
resolution mechanisms of the ports.
|
||||
.SH "OPTIONS"
|
||||
.IX Header "OPTIONS"
|
||||
.IP "\fB\-n\fR" 8
|
||||
.IX Item "-n"
|
||||
Dry-run. Causes \fB%%PORTNAME%%\fR not to update the configuration file,
|
||||
but instead to display what the final result would have been.
|
||||
.IP "\fB\-f\fR \fIconfig\fR" 8
|
||||
.IX Item "-f config"
|
||||
Read and modify an alternate configuration file. \fIconfig\fR should be
|
||||
the full path to the alternate file. \fINote:\fR when updating the
|
||||
\&\fIports\-management/%%PORTNAME%%\fR port, set \f(CW\*(C`CFGFILE\*(C'\fR or
|
||||
\&\f(CW\*(C`WANTEDPORTSCFG\*(C'\fR in the \fImake\fR\|(1) environment to achieve the same
|
||||
effect.
|
||||
.IP "\fB\-a\fR \fIportname\fR" 8
|
||||
.IX Item "-a portname"
|
||||
Add dependencies. Find all matching package names or port paths from
|
||||
the \fI\s-1INDEX\s0\fR file, and prompt the user whether to add any that are not
|
||||
already listed as dependencies in the configuration file.
|
||||
.IP "\fB\-d\fR \fIportname\fR" 8
|
||||
.IX Item "-d portname"
|
||||
Delete dependencies. Find all matching package names or port paths
|
||||
from the \fI\s-1INDEX\s0\fR file, and prompt the user whether to delete any that
|
||||
are currently listed as dependencies in the configuration file.
|
||||
.PP
|
||||
The add \fB\-a\fR and delete \fB\-d\fR options are processed in the order
|
||||
given on the command line, so a later option can override an earlier
|
||||
one. The \fIportname\fR argument will match any substring of the port or
|
||||
package name: care should be taken that you don't accidentally match
|
||||
unintended items. You can anchor searches to start or end of item
|
||||
using \f(CW\*(C`^\*(C'\fR or \f(CW\*(C`$\*(C'\fR.
|
||||
.SH "FILES"
|
||||
.IX Header "FILES"
|
||||
.IP "\fI/var/db/%%PORTNAME%%.conf\fR" 16
|
||||
.IX Item "/var/db/%%PORTNAME%%.conf"
|
||||
The default configuration file used by \fB%%PORTNAME%%\fR. This is a
|
||||
\&\fImakefile\fR snippet, that will be included by
|
||||
\&\fIports\-mgmt/%%PORTNAME%%/Makefile\fR. A skeleton version will be
|
||||
created by \fB%%PORTNAME%%\fR if it doesn't exist. The \fB%%PORTNAME%%\fR
|
||||
script exists to add or remove \f(CW\*(C`RUN_DEPENDS\*(C'\fR entries and update the
|
||||
\&\f(CW\*(C`PORTREVISION\*(C'\fR setting.
|
||||
.SH "ENVIRONMENT"
|
||||
.IX Header "ENVIRONMENT"
|
||||
The following environment variables affect the operation of
|
||||
\&\fB%%PORTNAME%%\fR. \f(CW\*(C`PORTSDIR\*(C'\fR, \f(CW\*(C`INDEXFILE\*(C'\fR and \f(CW\*(C`WANTEDPORTSCFG\*(C'\fR
|
||||
override the system default settings: normally they will not need to
|
||||
be set. \f(CW\*(C`USER\*(C'\fR and \f(CW\*(C`LOGNAME\*(C'\fR are standard settings, from
|
||||
\&\fIlogin\fR\|(1).
|
||||
.ie n .IP """PORTSDIR""" 16
|
||||
.el .IP "\f(CWPORTSDIR\fR" 16
|
||||
.IX Item "PORTSDIR"
|
||||
As in \fIports\fR\|(7), the location where the ports tree is installed.
|
||||
Default \fI/usr/ports\fR
|
||||
.ie n .IP """INDEXFILE""" 16
|
||||
.el .IP "\f(CWINDEXFILE\fR" 16
|
||||
.IX Item "INDEXFILE"
|
||||
As in \fIports\fR\|(7), overrides the automatic logic to determine the name
|
||||
of the index file. Default \fI\s-1INDEX\-\s0\fIN\fI\fR where \fIN\fR is the \s-1OS\s0 major
|
||||
version number.
|
||||
.ie n .IP """USER""" 16
|
||||
.el .IP "\f(CWUSER\fR" 16
|
||||
.IX Item "USER"
|
||||
.PD 0
|
||||
.ie n .IP """LOGNAME""" 16
|
||||
.el .IP "\f(CWLOGNAME\fR" 16
|
||||
.IX Item "LOGNAME"
|
||||
.PD
|
||||
The name of the user running the script. If neither are set, uses
|
||||
\&\f(CW\*(C`an unknown user\*(C'\fR.
|
||||
.ie n .IP """WANTEDPORTSCFG""" 16
|
||||
.el .IP "\f(CWWANTEDPORTSCFG\fR" 16
|
||||
.IX Item "WANTEDPORTSCFG"
|
||||
Override the default location of the configuration file. Using the
|
||||
\&\fB\-f config\fR command line option superceeds this setting. Default
|
||||
\&\fI/var/db/%%PORTNAME%%.conf\fR
|
||||
.SH "SEE ALSO"
|
||||
.IX Header "SEE ALSO"
|
||||
\&\fIports\fR\|(7), \fIpkg_delete\fR\|(1), \fIpkg_cutleaves\fR\|(1), \fIportmaster\fR\|(8),
|
||||
\&\fIportupgrade\fR\|(1)
|
370
ports-mgmt/wanted-ports/files/wanted-ports.in
Normal file
370
ports-mgmt/wanted-ports/files/wanted-ports.in
Normal file
@ -0,0 +1,370 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# $FreeBSD$
|
||||
|
||||
# Copyright 2010 Matthew Seaman. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
#
|
||||
# 2. Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following
|
||||
# disclaimer in the documentation and/or other materials provided
|
||||
# with the distribution.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
|
||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# Programatically edit the dependencies of %%PKGNAME%% to mark
|
||||
# depended on ports as wanted and help prevent accidental
|
||||
# removal. Wanted dependencies are read from a makefile snippet
|
||||
# containing PORTREVISION and RUN_DEPENDS variable settings:
|
||||
# PORTREVISION is incremented when any changes are made via this
|
||||
# script, which will cause this port to be reinstalled the next time
|
||||
# the ports are updated, hence forcing installation of the required
|
||||
# dependencies. Removing a depended-on port from the list does not
|
||||
# cause it to be removed automatically.
|
||||
|
||||
umask 022
|
||||
IFS='
|
||||
'
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:%%PREFIX%%/bin:%%PREFIX%%/sbin
|
||||
export IFS PATH
|
||||
|
||||
|
||||
# Dissect the PKGVERSION string, extracting the revision number.
|
||||
# Increment it or set it to 1 if unset and return the incremented
|
||||
# number.
|
||||
increment_revision () {
|
||||
local revision
|
||||
|
||||
revision=$( echo $1 | sed -ne 's:^[^_]*_\([^,]*\).*$:\1:p' )
|
||||
if [ ! -z $revision ]; then
|
||||
revision=$(( $revision + 1 ))
|
||||
else
|
||||
revision=1
|
||||
fi
|
||||
echo $revision
|
||||
}
|
||||
|
||||
# Update the $wanted_ports_conf file carefully.
|
||||
update_wanted_ports_conf() {
|
||||
local conf_file revision run_deps tmp_conf
|
||||
|
||||
conf_file=$1
|
||||
revision=$2
|
||||
run_deps=$3
|
||||
|
||||
|
||||
tmp_conf=$(mktemp "${conf_file%/*}/.${conf_file##*/}.XXXXXX")
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "${ME}: FATAL -- Can't create temporary file in ${conf_file%/*}."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
generate_conf $revision "$run_deps" > $tmp_conf
|
||||
|
||||
cp ${conf_file} ${conf_file}.old && \
|
||||
cp $tmp_conf ${conf_file} && \
|
||||
rm -f $tmp_conf
|
||||
}
|
||||
|
||||
# Generate a new config file
|
||||
generate_conf() {
|
||||
local revision run_deps firstline
|
||||
|
||||
revision=$1
|
||||
run_deps=$2
|
||||
|
||||
cat <<EOF
|
||||
# -*- makefile -*-
|
||||
#
|
||||
# Last updated by ${USER} using ${ME} on ${DATE}
|
||||
#
|
||||
# Config file for %%PKGNAME%%. Maintain it using %%PORTNAME%%
|
||||
|
||||
PORTREVISION= ${revision}
|
||||
|
||||
EOF
|
||||
|
||||
printf 'RUN_DEPENDS=\t'
|
||||
|
||||
firstline=
|
||||
for rd in $run_deps ; do
|
||||
[ -z $firstline ] || printf ' \\\n\t\t'
|
||||
echo -n $rd
|
||||
firstline=no
|
||||
done
|
||||
echo
|
||||
echo
|
||||
}
|
||||
|
||||
# Given a pkgname or port directory, construct a RUN_DEPENDS entry for
|
||||
# it. Since we have no way of knowing what files are significant from
|
||||
# among whatever the port installs (and the port may not even be
|
||||
# installed yet) use the form
|
||||
# "pkgname>=n.nn:${PORTSDIR}/category/portname" where n.nn is the
|
||||
# currently available version of the port. Requires the INDEX to have
|
||||
# been installed. This can return any number of dependency lines,
|
||||
# including none.
|
||||
#
|
||||
# Note: Don't allow %%PORTNAME%% to add a dependency on itself...
|
||||
run_dep_from_index() {
|
||||
local pkgpat
|
||||
|
||||
pkgpat=$1
|
||||
|
||||
# pkgpat should be a single word -- but it could be empty
|
||||
for pp in $pkgpat ; do
|
||||
# Has your head exploded yet?
|
||||
awk -F '|' -v x=$pp \
|
||||
'$1 ~ x || $2 ~ x { printf "%s:%s\n", $1, $2 }' \
|
||||
< ${PORTSDIR}/${INDEXFILE} | grep -v %%PORTNAME%% | \
|
||||
sed -e 's/-\([^-]*\):/>=\1:/' -e "s,${PORTSDIR},\${PORTSDIR},"
|
||||
done
|
||||
}
|
||||
|
||||
# Get the existing value of RUN_DEPENDS from the config file, and update it
|
||||
# against the current INDEX file.
|
||||
update_run_deps() {
|
||||
local conf_file run_deps
|
||||
|
||||
conf_file=$1
|
||||
run_deps=$( PORTSDIR=${PORTSDIR} make -f $conf_file -V RUN_DEPENDS )
|
||||
|
||||
for rd in $run_deps ; do
|
||||
rd=$( echo $rd | sed -e "s,^.*${PORTSDIR},," -e 's, *$,$,' )
|
||||
run_dep_from_index $rd
|
||||
done | sort -u
|
||||
}
|
||||
|
||||
# Return 0 or 1 according to user input "Y|y|yes" or "N|n|no"
|
||||
check_yesno() {
|
||||
local answer junk rc
|
||||
|
||||
rc=
|
||||
while [ -z $rc ]; do
|
||||
read answer junk
|
||||
case $answer in
|
||||
[Yy]|[Yy][Ee][Ss])
|
||||
rc=0
|
||||
;;
|
||||
[Nn]|[Nn][Oo])
|
||||
rc=1
|
||||
;;
|
||||
*)
|
||||
echo -n "${ME}: Errr... what?"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
return $rc
|
||||
}
|
||||
|
||||
|
||||
# Usage message
|
||||
usage() {
|
||||
echo >&2 <<EOF
|
||||
${ME}: Usage
|
||||
${ME} [-n] [-f cfgfile] [-a portname|-d portname]...
|
||||
|
||||
Options:
|
||||
|
||||
-n dry-run: don't commit changes to $CONF_FILE
|
||||
-f cfgfile alternative config file (default: $CONF_FILE)
|
||||
-a portname add portname to the list of wanted files
|
||||
-d portname remove portname from the list of wanted files
|
||||
|
||||
-a and -d options are processed in the order given on the command
|
||||
line: later items may undo the effect of earlier ones.
|
||||
|
||||
portnames are matched against both the pkgname and the path within
|
||||
the ports tree. One portname can result in adding or removing
|
||||
dependencies on a number of different ports.
|
||||
|
||||
Trying to add %%PORTNAME%% as a dependency of itself is an error.
|
||||
|
||||
Without arguments, ${ME} will update the config file to reference
|
||||
the current versions of any run-depends listed in the ports INDEX.
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
add_dependency() {
|
||||
local portname run_deps to_add
|
||||
|
||||
portname=$1
|
||||
run_deps=$2
|
||||
|
||||
to_add=$( run_dep_from_index "$portname" )
|
||||
|
||||
# Check on exiting dependencies
|
||||
{
|
||||
for ta in $to_add ; do
|
||||
if echo "$run_deps" | grep -q -F $ta ; then
|
||||
echo "${ME}: Dependency \"$ta\" already registered" >&2
|
||||
else
|
||||
echo -n "${ME}: Register new dependency \"$ta\"? " >&2
|
||||
if check_yesno >&2 ; then
|
||||
echo $ta
|
||||
fi
|
||||
fi
|
||||
done
|
||||
echo "$run_deps"
|
||||
} | sort -u
|
||||
}
|
||||
|
||||
delete_dependency() {
|
||||
local portname run_deps to_delete
|
||||
|
||||
portname=$1
|
||||
run_deps=$2
|
||||
|
||||
to_delete=$( run_dep_from_index "$portname" )
|
||||
|
||||
for rd in $run_deps ; do
|
||||
if echo "$to_delete" | grep -q -F $rd ; then
|
||||
echo -n "${ME}: Delete dependency \"$rd\"? " >&2
|
||||
if ! check_yesno >&2 ; then
|
||||
echo $rd
|
||||
fi
|
||||
else
|
||||
echo $rd
|
||||
fi
|
||||
done | sort -u
|
||||
}
|
||||
|
||||
# Program name
|
||||
ME=${0##*/}
|
||||
|
||||
# User running this scipt
|
||||
USER=${USER:-${LOGNAME:-"an unknown user"}}
|
||||
|
||||
# Date now
|
||||
DATE=$( date )
|
||||
|
||||
# Where the ports tree is installed
|
||||
PORTSDIR=${PORTSDIR:-/usr/ports}
|
||||
|
||||
# We need the ports tree to be installed
|
||||
if ! [ -d ${PORTSDIR} -a -f ${PORTSDIR}/Makefile ] ; then
|
||||
echo "${ME}: FATAL -- do you have the ports tree installed?" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# The ports INDEX file
|
||||
INDEXFILE=${INDEXFILE:-$( make -f ${PORTSDIR}/Makefile -V INDEXFILE )}
|
||||
|
||||
if ! [ -f ${PORTSDIR}/${INDEXFILE} ] ; then
|
||||
echo "${ME}: FATAL -- can\'t access ${PORTSDIR}/${INDEXFILE}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Makefile snippet containing PORTREVISION and RUN_DEPENDS data
|
||||
# Set WANTEDPORTSCFG in the environment to override, or use the -f
|
||||
# command line option
|
||||
CONF_FILE=${WANTEDPORTSCFG:-/var/db/%%PORTNAME%%.conf}
|
||||
|
||||
# The currently installed version of %%PKGNAME%% -- accounting for any
|
||||
# dynamic updates to PORTREVISION
|
||||
INSTALLED_PKG=$( pkg_info -Ex %%PKGNAME%% )
|
||||
|
||||
if [ -z $INSTALLED_PKG ] ; then
|
||||
echo "${ME}: FATAL -- the package providing this script seems " \
|
||||
"not to be installed" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#
|
||||
# Handle Options -- Main Code Loop
|
||||
#
|
||||
|
||||
dry_run=
|
||||
action=
|
||||
while getopts nf:a:d: opt ; do
|
||||
case $opt in
|
||||
n)
|
||||
dry_run=yes
|
||||
;;
|
||||
f)
|
||||
CONF_FILE="$OPTARG"
|
||||
;;
|
||||
a)
|
||||
action="${action} A:${OPTARG}"
|
||||
;;
|
||||
d)
|
||||
action="${action} D:${OPTARG}"
|
||||
;;
|
||||
*)
|
||||
usage
|
||||
exit 1
|
||||
esac
|
||||
done
|
||||
|
||||
#
|
||||
# Create the config file if it doesn't exist
|
||||
#
|
||||
|
||||
if ! [ -f ${CONF_FILE} ] ; then
|
||||
if [ -z $dry_run ] ; then
|
||||
echo "${ME}: WARNING -- no config file found, " \
|
||||
"creating initial ${CONF_FILE}" >&2
|
||||
generate_conf 1 '' > ${CONF_FILE}
|
||||
else
|
||||
echo "${ME}: WARNING -- no config file found, " \
|
||||
"dry run: this is what would have been generated" >&2
|
||||
generate_conf 1 '' >&2
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
#
|
||||
# Update and modify the list of run-depends
|
||||
#
|
||||
|
||||
RUN_DEPS=$( update_run_deps ${CONF_FILE} )
|
||||
|
||||
for a in $action ; do
|
||||
case ${a%%:*} in
|
||||
A)
|
||||
# Add a port or ports
|
||||
RUN_DEPS=$( add_dependency "${a#*:}" "$RUN_DEPS" ) >&1
|
||||
;;
|
||||
D)
|
||||
# Remove a port or ports
|
||||
RUN_DEPS=$( delete_dependency "${a#*:}" "$RUN_DEPS" ) >&1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
#
|
||||
# Maybe write out the result to the config file, bumping the
|
||||
# PORTREVISION from the installed version of %%PORTNAME%%
|
||||
#
|
||||
|
||||
revision=$( increment_revision $INSTALLED_PKG )
|
||||
|
||||
if [ -z $dry_run ] ; then
|
||||
# Do it
|
||||
update_wanted_ports_conf $CONF_FILE $revision "$RUN_DEPS"
|
||||
else
|
||||
echo "Dry run -- this is what would have been generated:"
|
||||
generate_conf $revision "$RUN_DEPS"
|
||||
fi
|
||||
|
||||
#
|
||||
# That's All Folks!
|
||||
#
|
129
ports-mgmt/wanted-ports/files/wanted-ports.pod
Normal file
129
ports-mgmt/wanted-ports/files/wanted-ports.pod
Normal file
@ -0,0 +1,129 @@
|
||||
=head1 NAME
|
||||
|
||||
%%PORTNAME%% -- depend on the ports that you want installed
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
B<%%PORTNAME%%> [B<-n>] [B<-f> F<config>] [B<-a|-d> F<portname>]]
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
B<%%PORTNAME%%> is a small port that simply has a user modifiable list
|
||||
of run-time dependencies. The idea is that by marking a port as
|
||||
wanted, it adds a double check helping to prevent accidental deletion
|
||||
of the ports you really want to have installed. L<pkg_delete(1)> will
|
||||
refuse to delete a port when that port is a dependency required by
|
||||
some other installed port, unless you give the B<-f> option to force
|
||||
the action.
|
||||
|
||||
B<%%PORTNAME%%> can also be used as a means to automate installing the
|
||||
required software load on a server.
|
||||
|
||||
=head2 Using B<%%PORTNAME%%>
|
||||
|
||||
The first time you run the B<%%PORTNAME%%> script, it will generate a
|
||||
skeleton configuration file. Run B<%%PORTNAME%%> to modify the list
|
||||
of ports that you want to have marked. This will automatically
|
||||
increment the C<PORTREVISION> of B<%%PORTNAME%%>, marking the
|
||||
F<ports-mgmt/%%PORTNAME%%> port to be updated, eg. the next time that
|
||||
L<portmaster(8)> or L<portupgrade(1)> is run.
|
||||
|
||||
Updating or reinstalling the port will cause the ports system to force
|
||||
all of the marked ports to be installed, using the standard dependency
|
||||
resolution mechanisms of the ports.
|
||||
|
||||
=head1 OPTIONS
|
||||
|
||||
=over 8
|
||||
|
||||
=item B<-n>
|
||||
|
||||
Dry-run. Causes B<%%PORTNAME%%> not to update the configuration file,
|
||||
but instead to display what the final result would have been.
|
||||
|
||||
=item B<-f> F<config>
|
||||
|
||||
Read and modify an alternate configuration file. F<config> should be
|
||||
the full path to the alternate file. I<Note:> when updating the
|
||||
F<ports-management/%%PORTNAME%%> port, set C<CFGFILE> or
|
||||
C<WANTEDPORTSCFG> in the L<make(1)> environment to achieve the same
|
||||
effect.
|
||||
|
||||
=item B<-a> F<portname>
|
||||
|
||||
Add dependencies. Find all matching package names or port paths from
|
||||
the F<INDEX> file, and prompt the user whether to add any that are not
|
||||
already listed as dependencies in the configuration file.
|
||||
|
||||
=item B<-d> F<portname>
|
||||
|
||||
Delete dependencies. Find all matching package names or port paths
|
||||
from the F<INDEX> file, and prompt the user whether to delete any that
|
||||
are currently listed as dependencies in the configuration file.
|
||||
|
||||
=back
|
||||
|
||||
The add B<-a> and delete B<-d> options are processed in the order
|
||||
given on the command line, so a later option can override an earlier
|
||||
one. The F<portname> argument will match any substring of the port or
|
||||
package name: care should be taken that you don't accidentally match
|
||||
unintended items. You can anchor searches to start or end of item
|
||||
using C<^> or C<$>.
|
||||
|
||||
=head1 FILES
|
||||
|
||||
=over 16
|
||||
|
||||
=item F</var/db/%%PORTNAME%%.conf>
|
||||
|
||||
The default configuration file used by B<%%PORTNAME%%>. This is a
|
||||
F<makefile> snippet, that will be included by
|
||||
F<ports-mgmt/%%PORTNAME%%/Makefile>. A skeleton version will be
|
||||
created by B<%%PORTNAME%%> if it doesn't exist. The B<%%PORTNAME%%>
|
||||
script exists to add or remove C<RUN_DEPENDS> entries and update the
|
||||
C<PORTREVISION> setting.
|
||||
|
||||
=back
|
||||
|
||||
=head1 ENVIRONMENT
|
||||
|
||||
The following environment variables affect the operation of
|
||||
B<%%PORTNAME%%>. C<PORTSDIR>, C<INDEXFILE> and C<WANTEDPORTSCFG>
|
||||
override the system default settings: normally they will not need to
|
||||
be set. C<USER> and C<LOGNAME> are standard settings, from
|
||||
L<login(1)>.
|
||||
|
||||
=over 16
|
||||
|
||||
=item C<PORTSDIR>
|
||||
|
||||
As in L<ports(7)>, the location where the ports tree is installed.
|
||||
Default F</usr/ports>
|
||||
|
||||
=item C<INDEXFILE>
|
||||
|
||||
As in L<ports(7)>, overrides the automatic logic to determine the name
|
||||
of the index file. Default F<INDEX-I<N>> where I<N> is the OS major
|
||||
version number.
|
||||
|
||||
=item C<USER>
|
||||
|
||||
=item C<LOGNAME>
|
||||
|
||||
The name of the user running the script. If neither are set, uses
|
||||
C<an unknown user>.
|
||||
|
||||
=item C<WANTEDPORTSCFG>
|
||||
|
||||
Override the default location of the configuration file. Using the
|
||||
B<-f config> command line option superceeds this setting. Default
|
||||
F</var/db/%%PORTNAME%%.conf>
|
||||
|
||||
=back
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<ports(7)>, L<pkg_delete(1)>, L<pkg_cutleaves(1)>, L<portmaster(8)>,
|
||||
L<portupgrade(1)>
|
||||
|
||||
=cut
|
5
ports-mgmt/wanted-ports/pkg-descr
Normal file
5
ports-mgmt/wanted-ports/pkg-descr
Normal file
@ -0,0 +1,5 @@
|
||||
A special meta-port to do nothing but register dependencies on those
|
||||
ports you specifically want to have installed. The normal dependency
|
||||
checking in programs like pkg_delete(1) will prevent easy deletion of
|
||||
ports that other ports depend on. Keeps egg off face. Protects feet
|
||||
from being shot.
|
Loading…
Reference in New Issue
Block a user