Guest User

Untitled

a guest
Feb 20th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.75 KB | None | 0 0
  1. #!/bin/sh
  2. set -e
  3.  
  4. backup() {
  5. if exists "$1"; then
  6. cp -dp "$1" "$2" || return $?
  7. fi
  8. return 0
  9. }
  10.  
  11. exists() {
  12. [ -e "$1" ] || return 1
  13. }
  14.  
  15. force_symlink() {
  16. if [ -e "$3" ] && ! unlink "$3"; then
  17. echo "cannot create symlink $2 -> $1 (unlink)" >&2
  18. exit 1
  19. fi
  20.  
  21. if ! symlink "$1" "$3"; then
  22. echo "cannot create symlink $2 -> $1 (symlink)" >&2
  23. exit 1
  24. fi
  25.  
  26. if ! rename "$3" "$2"; then
  27. echo "cannot create symlink $2 -> $1 (rename)" >&2
  28. exit 1
  29. fi
  30.  
  31. return 0
  32. }
  33.  
  34. symlink() {
  35. ln -s "$1" "$2" || return $?
  36. }
  37.  
  38. rename() {
  39. mv -fT "$1" "$2" || return $?
  40. }
  41.  
  42. reset_diversion() {
  43. dpkg-divert --package bash --remove "$2" || return $?
  44. dpkg-divert --package "$1" --divert "$3" --add "$2" || return $?
  45. }
  46.  
  47. has_binsh_line() {
  48. while read -r item; do
  49. if [ "$item" = '/bin/sh' ]; then
  50. return 0
  51. fi
  52. done
  53. return 1
  54. }
  55.  
  56. binsh_in_filelist() {
  57. dpkg-query -L "$1" 2> /dev/null | has_binsh_line || return $?
  58. }
  59.  
  60. undiverted() {
  61. in="`dpkg-divert --listpackage "$1"`" || return $?
  62. [ -z "$in" -o "$in" = 'bash' ] || return 1
  63. }
  64.  
  65. access() {
  66. # This isn't perfectly accurate, but it's sufficient for our purposes. The syscall is a little different.
  67. [ -e "$1" ] || return 1
  68. }
  69.  
  70. main() {
  71. if access /bin/sh; then
  72. backup /bin/sh /bin/sh.distrib || return $?
  73. backup /usr/share/man/man1/sh.1.gz /usr/share/man/man1/sh.distrib.1.gz || return $?
  74.  
  75. force_symlink bash /bin/sh /bin/sh.temp || return $?
  76. force_symlink bash.1.gz /usr/share/man/man1/sh.1.gz /usr/share/man/man1/sh.1.gz.temp || return $?
  77.  
  78. if ! binsh_in_filelist bash; then
  79. return 0
  80. fi
  81. fi
  82.  
  83. if undiverted /bin/sh; then
  84. reset_diversion dash /bin/sh /bin/sh.distrib || return $?
  85. fi
  86. if undiverted /usr/share/man/man1/sh.1.gz; then
  87. reset_diversion dash /usr/share/man/man1/sh.1.gz || return $?
  88. fi
  89.  
  90. return 0
  91. }
  92.  
  93. main || exit $?
Add Comment
Please, Sign In to add comment