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