update Mon Mar 15 12:37:00 PDT 2010
[pkgsrc.git] / mk / pkginstall / usergroup-check
1 #!/bin/sh
2 #
3 # $NetBSD: usergroup-check,v 1.2 2006/12/15 12:46:24 martti Exp $
4 #
5 # Copyright (c) 2006 The NetBSD Foundation, Inc.
6 # All rights reserved.
7 #
8 # This code is derived from software contributed to The NetBSD Foundation
9 # by Johnny C. Lam.
10 #
11 # Redistribution and use in source and binary forms, with or without
12 # modification, are permitted provided that the following conditions
13 # are met:
14 # 1. Redistributions of source code must retain the above copyright
15 #    notice, this list of conditions and the following disclaimer.
16 # 2. Redistributions in binary form must reproduce the above copyright
17 #    notice, this list of conditions and the following disclaimer in the
18 #    documentation and/or other materials provided with the distribution.
19 # 3. All advertising materials mentioning features or use of this software
20 #    must display the following acknowledgement:
21 #        This product includes software developed by the NetBSD
22 #        Foundation, Inc. and its contributors.
23 # 4. Neither the name of The NetBSD Foundation nor the names of its
24 #    contributors may be used to endorse or promote products derived
25 #    from this software without specific prior written permission.
26 #
27 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
28 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
29 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
31 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37 # POSSIBILITY OF SUCH DAMAGE.
38 #
39
40 ######################################################################
41 #
42 # NAME
43 #       usergroup-check -- verify that users/groups match numeric IDs
44 #
45 # SYNOPSIS
46 #       usergroup-check -g [group_entry ...]
47 #       usergroup-check -u [user_entry ...]
48 #
49 # DESCRIPTION
50 #       usergroup-check checks for the existence of users and groups
51 #       and verifies that they match the requested numeric IDs if
52 #       given.  The group_entry format matches that of /etc/group and
53 #       the user_entry format matches that of /etc/passwd, though the
54 #       field contents may be empty.
55 #
56 #       usergroup-check exits 0 if the users and groups exist and match
57 #       the numeric IDs, and >0 otherwise.
58 #
59 # OPTIONS
60 #       The following command line arguments are supported.
61 #
62 #       -g      Indicates that the subsequent arguments are group entries.
63 #
64 #       -u      Indicates that the subsequent arguments are user entries.
65 #
66 ######################################################################
67
68 : ${PERL5=perl}
69
70 self="${0##*/}"
71
72 usage() {
73         echo 1>&2 "usage: $self -g [group_entry ...]"
74         echo 1>&2 "       $self -u [user_entry ...]"
75 }
76
77 if test $# -lt 1; then
78         usage; exit 1
79 fi
80
81 check=
82 case "$1" in
83 -g)     check=groups ;;
84 -u)     check=users ;;
85 *)      usage; exit 1 ;;
86 esac
87 shift
88
89 missing_groups=
90 missing_users=
91
92 case $check in
93 groups)
94         while test $# -gt 0; do
95                 entry="$1"; shift
96                 ( SAVEIFS="$IFS"; IFS=":"
97                   set -- $entry; group="$1"; groupid="$2"
98                   IFS="$SAVEIFS"
99                   gid=`${PERL5} -le 'print scalar getgrnam shift' $group`
100                   test -n "$gid" || exit 1
101                   case "$groupid" in
102                   ""|$gid)     exit 0 ;;
103                   *)            exit 1 ;;
104                   esac ) || missing_groups="$missing_groups $i"
105         done
106         ;;
107
108 users)
109         missing_users=
110         while test $# -gt 0; do
111                 entry="$1"; shift
112                 ( SAVEIFS="$IFS"; IFS=":"
113                   set -- $entry; user="$1"; userid="$3"
114                   IFS="$SAVEIFS"
115                   gid=`${PERL5} -le 'print scalar getpwnam shift' $user`
116                   test -n "$gid" || exit 1
117                   case "$userid" in
118                   ""|$gid)     exit 0 ;;
119                   *)            exit 1 ;;
120                   esac ) || missing_users="$missing_users $i"
121         done
122         ;;
123 esac
124
125 test -z "$missing_groups" -a -z "$missing_users" || exit 1
126 exit 0