vigr.sh 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. #
  28. error() {
  29. echo "$@" >&2
  30. exit 1
  31. }
  32. usage() {
  33. error "usage: vigr [-d dir]"
  34. }
  35. # Check arguments
  36. while getopts d: opt ; do
  37. case $opt in
  38. d)
  39. etcdir="${OPTARG}"
  40. ;;
  41. *)
  42. usage
  43. ;;
  44. esac
  45. done
  46. # Look for the current group file
  47. grpfile="${etcdir:-/etc}/group"
  48. if [ ! -f "${grpfile}" ] ; then
  49. error "Missing group file"
  50. fi
  51. # Create a secure temporary working directory
  52. tmpdir=$(mktemp -d -t vigr)
  53. if [ -z "${tmpdir}" -o ! -d "${tmpdir}" ] ; then
  54. error "Unable to create the temporary directory"
  55. fi
  56. tmpfile="${tmpdir}/group"
  57. # Clean up on exit
  58. trap "exit 1" INT
  59. trap "rm -rf '${tmpdir}'" EXIT
  60. set -e
  61. # Make a copy of the group file for the user to edit
  62. cp "${grpfile}" "${tmpfile}"
  63. while :; do
  64. # Let the user edit the file
  65. ${EDITOR:-/usr/bin/vi} "${tmpfile}"
  66. # If the result is valid, install it and exit
  67. if chkgrp -q "${tmpfile}" ; then
  68. install -b -m 0644 -C -S "${tmpfile}" "${grpfile}"
  69. exit 0
  70. fi
  71. # If it is not, offer to re-edit
  72. while :; do
  73. echo -n "Re-edit the group file? "
  74. read ans
  75. case $ans in
  76. [Yy]|[Yy][Ee][Ss])
  77. break
  78. ;;
  79. [Nn]|[Nn][Oo])
  80. exit 1
  81. ;;
  82. esac
  83. done
  84. done