xref: /freebsd/usr.sbin/vigr/vigr.sh (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
1*17a2c536SDag-Erling Smørgrav#!/bin/sh
2*17a2c536SDag-Erling Smørgrav#-
3*17a2c536SDag-Erling Smørgrav# Copyright (c) 2014 Dag-Erling Smørgrav
4*17a2c536SDag-Erling Smørgrav# All rights reserved.
5*17a2c536SDag-Erling Smørgrav#
6*17a2c536SDag-Erling Smørgrav# Redistribution and use in source and binary forms, with or without
7*17a2c536SDag-Erling Smørgrav# modification, are permitted provided that the following conditions
8*17a2c536SDag-Erling Smørgrav# are met:
9*17a2c536SDag-Erling Smørgrav# 1. Redistributions of source code must retain the above copyright
10*17a2c536SDag-Erling Smørgrav#    notice, this list of conditions and the following disclaimer.
11*17a2c536SDag-Erling Smørgrav# 2. Redistributions in binary form must reproduce the above copyright
12*17a2c536SDag-Erling Smørgrav#    notice, this list of conditions and the following disclaimer in the
13*17a2c536SDag-Erling Smørgrav#    documentation and/or other materials provided with the distribution.
14*17a2c536SDag-Erling Smørgrav#
15*17a2c536SDag-Erling Smørgrav# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16*17a2c536SDag-Erling Smørgrav# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*17a2c536SDag-Erling Smørgrav# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*17a2c536SDag-Erling Smørgrav# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19*17a2c536SDag-Erling Smørgrav# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20*17a2c536SDag-Erling Smørgrav# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21*17a2c536SDag-Erling Smørgrav# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22*17a2c536SDag-Erling Smørgrav# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23*17a2c536SDag-Erling Smørgrav# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24*17a2c536SDag-Erling Smørgrav# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25*17a2c536SDag-Erling Smørgrav# SUCH DAMAGE.
26*17a2c536SDag-Erling Smørgrav#
27*17a2c536SDag-Erling Smørgrav#
28*17a2c536SDag-Erling Smørgrav
29*17a2c536SDag-Erling Smørgraverror() {
30*17a2c536SDag-Erling Smørgrav	echo "$@" >&2
31*17a2c536SDag-Erling Smørgrav	exit 1
32*17a2c536SDag-Erling Smørgrav}
33*17a2c536SDag-Erling Smørgrav
34*17a2c536SDag-Erling Smørgravusage() {
35*17a2c536SDag-Erling Smørgrav	error "usage: vigr [-d dir]"
36*17a2c536SDag-Erling Smørgrav}
37*17a2c536SDag-Erling Smørgrav
38*17a2c536SDag-Erling Smørgrav# Check arguments
39*17a2c536SDag-Erling Smørgravwhile getopts d: opt ; do
40*17a2c536SDag-Erling Smørgrav	case $opt in
41*17a2c536SDag-Erling Smørgrav	d)
42*17a2c536SDag-Erling Smørgrav		etcdir="${OPTARG}"
43*17a2c536SDag-Erling Smørgrav		;;
44*17a2c536SDag-Erling Smørgrav	*)
45*17a2c536SDag-Erling Smørgrav		usage
46*17a2c536SDag-Erling Smørgrav		;;
47*17a2c536SDag-Erling Smørgrav	esac
48*17a2c536SDag-Erling Smørgravdone
49*17a2c536SDag-Erling Smørgrav
50*17a2c536SDag-Erling Smørgrav# Look for the current group file
51*17a2c536SDag-Erling Smørgravgrpfile="${etcdir:-/etc}/group"
52*17a2c536SDag-Erling Smørgravif [ ! -f "${grpfile}" ] ; then
53*17a2c536SDag-Erling Smørgrav	error "Missing group file"
54*17a2c536SDag-Erling Smørgravfi
55*17a2c536SDag-Erling Smørgrav
56*17a2c536SDag-Erling Smørgrav# Create a secure temporary working directory
57*17a2c536SDag-Erling Smørgravtmpdir=$(mktemp -d -t vigr)
58*17a2c536SDag-Erling Smørgravif [ -z "${tmpdir}" -o ! -d "${tmpdir}" ] ; then
59*17a2c536SDag-Erling Smørgrav	error "Unable to create the temporary directory"
60*17a2c536SDag-Erling Smørgravfi
61*17a2c536SDag-Erling Smørgravtmpfile="${tmpdir}/group"
62*17a2c536SDag-Erling Smørgrav
63*17a2c536SDag-Erling Smørgrav# Clean up on exit
64*17a2c536SDag-Erling Smørgravtrap "exit 1" INT
65*17a2c536SDag-Erling Smørgravtrap "rm -rf '${tmpdir}'" EXIT
66*17a2c536SDag-Erling Smørgravset -e
67*17a2c536SDag-Erling Smørgrav
68*17a2c536SDag-Erling Smørgrav# Make a copy of the group file for the user to edit
69*17a2c536SDag-Erling Smørgravcp "${grpfile}" "${tmpfile}"
70*17a2c536SDag-Erling Smørgrav
71*17a2c536SDag-Erling Smørgravwhile :; do
72*17a2c536SDag-Erling Smørgrav	# Let the user edit the file
73*17a2c536SDag-Erling Smørgrav	${EDITOR:-/usr/bin/vi} "${tmpfile}"
74*17a2c536SDag-Erling Smørgrav
75*17a2c536SDag-Erling Smørgrav	# If the result is valid, install it and exit
76*17a2c536SDag-Erling Smørgrav	if chkgrp -q "${tmpfile}" ; then
77*17a2c536SDag-Erling Smørgrav		install -b -m 0644 -C -S "${tmpfile}" "${grpfile}"
78*17a2c536SDag-Erling Smørgrav		exit 0
79*17a2c536SDag-Erling Smørgrav	fi
80*17a2c536SDag-Erling Smørgrav
81*17a2c536SDag-Erling Smørgrav	# If it is not, offer to re-edit
82*17a2c536SDag-Erling Smørgrav	while :; do
83*17a2c536SDag-Erling Smørgrav		echo -n "Re-edit the group file? "
84*17a2c536SDag-Erling Smørgrav		read ans
85*17a2c536SDag-Erling Smørgrav		case $ans in
86*17a2c536SDag-Erling Smørgrav		[Yy]|[Yy][Ee][Ss])
87*17a2c536SDag-Erling Smørgrav			break
88*17a2c536SDag-Erling Smørgrav			;;
89*17a2c536SDag-Erling Smørgrav		[Nn]|[Nn][Oo])
90*17a2c536SDag-Erling Smørgrav			exit 1
91*17a2c536SDag-Erling Smørgrav			;;
92*17a2c536SDag-Erling Smørgrav		esac
93*17a2c536SDag-Erling Smørgrav	done
94*17a2c536SDag-Erling Smørgravdone
95