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