summaryrefslogtreecommitdiff
path: root/savelocaltweaks
blob: 657f768b691277cd3ecb1f56de3773bb2c8facfa (plain)
  1. #!/bin/sh
  2. set -e
  3. PRG=$(basename "$0")
  4. TEMP="`getopt -s sh -o t:f -l target:,force -n "$PRG" -- "$@"`"
  5. if [ $? != 0 ] ; then echo >&2 "ERROR: Internal getopt error." ; exit 1 ; fi
  6. eval set -- "$TEMP"
  7. targetdir=''
  8. force='no'
  9. while true ; do
  10. case "$1" in
  11. -t|--target) targetdir="$2" ; shift 2 ;;
  12. -f|--force) force="yes" ; shift ;;
  13. --) shift ; break ;;
  14. *) echo >&2 "ERROR: Internal error resolving options." ; exit 1 ;;
  15. esac
  16. done
  17. basedir="/etc"
  18. includefile="/etc/local/localtweaks.include"
  19. excludefile="/etc/local/localtweaks.exclude"
  20. extensions=".orig .old"
  21. if [ -n "$targetdir" ]; then
  22. targetdirparent="$(dirname "$targetdir")"
  23. if ! [ -d "$targetdirparent" ]; then
  24. if [ "$force" = "yes" ]; then
  25. mkdir -p "$targetdirparent"
  26. else
  27. echo >&2 "Error: Parent directory for target directory does not exist."
  28. exit 1
  29. fi
  30. elif [ -e "$targetdir" ]; then
  31. if [ "$force" = "yes" ]; then
  32. rm -rf "$targetdir"
  33. else
  34. echo >&2 "Error: Target directory already exists."
  35. exit 1
  36. fi
  37. fi
  38. fi
  39. tempdir="$(mktemp -td localtweaks.XXXXXX)"
  40. for ext in $extensions; do
  41. extfiles="$(find $basedir -name "*$ext")"
  42. for extfile in $extfiles; do
  43. xextfile="${extfile%$ext}"
  44. files="$files ${xextfile#$basedir}"
  45. done
  46. done
  47. includes=""
  48. if [ -d "$(dirname "$includefile")" ] && [ -r "$includefile" ]; then
  49. includes="$(cat "$includefile")"
  50. for include in $includes; do
  51. files="$files ${include#$basedir}"
  52. done
  53. fi
  54. excludes=""
  55. if [ -d "$(dirname "$excludefile")" ] && [ -r "$excludefile" ]; then
  56. xexcludes="$(cat "$excludefile")"
  57. for exclude in $xexcludes; do
  58. excludes="$excludes ${exclude#$basedir}"
  59. done
  60. fi
  61. # process all files once each
  62. files="$(for x in $files; do echo "$x"; done | uniq | sort)"
  63. for file in $files; do
  64. # file were chosen based on backups - it may not exist itelf
  65. [ -s "$basedir/$file" ] || continue
  66. for exclude in $excludes; do
  67. [ "$file" = "$exclude" ] && continue 2
  68. done
  69. ext=""
  70. for xext in $extensions; do
  71. if [ -e $basedir/$file$xext ]; then
  72. ext="$xext"
  73. continue
  74. fi
  75. done
  76. newdir="$tempdir/$basedir/$(dirname "$file")"
  77. mkdir -p "$newdir"
  78. cp -af "$basedir/$file" "$newdir"
  79. # Only diff against existing and non-empty files.
  80. if [ -n "$ext" ] && [ -s "$basedir/$file$ext" ]; then
  81. diff -ruN "$basedir/$file$ext" "$basedir/$file" > "$tempdir/$basedir/$file.diff" || [ $? -lt 2 ]
  82. chown --reference="$basedir/$file" "$tempdir/$basedir/$file.diff"
  83. chmod --reference="$basedir/$file" "$tempdir/$basedir/$file.diff"
  84. chmod a-x "$tempdir/$basedir/$file.diff"
  85. fi
  86. done
  87. if [ -n "$targetdir" ]; then
  88. mv "$tempdir" "$targetdir"
  89. rm -rf "$tempdir"
  90. fi