s6-db-reload 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #!/bin/sh --
  2. set -ue
  3. # based on artix script
  4. # https://gitea.artixlinux.org/artix/s6-contrib
  5. usage() {
  6. printf '%s\n' \
  7. "Usage: ${0##*/} [options]" \
  8. ' -r delete all old databases' \
  9. ' -u use user database' \
  10. ' -x use user X11 database' \
  11. ' -h show this help message'
  12. exit "${1:-0}"
  13. }
  14. RMDB=0
  15. USERDB=0
  16. X=0
  17. while getopts uxrh arg; do
  18. case "${arg}" in
  19. r) RMDB=1 ;;
  20. u) USERDB=1 ;;
  21. x)
  22. USERDB=1
  23. X=1
  24. ;;
  25. h) usage 0 ;;
  26. ?) usage 1 ;;
  27. esac
  28. done
  29. if [ "${USERDB}" -eq 0 ]; then
  30. [ "$(id -u)" -eq 0 ] || {
  31. if command -v doas >/dev/null; then
  32. exec doas -- "${0}" "${@}"
  33. elif comman -v sudo >/dev/null; then
  34. exec sudo -- "${0}" "${@}"
  35. else
  36. echo "please run as root" 1>&2
  37. exit 1
  38. fi
  39. }
  40. SYSPATH='/etc/s6'
  41. RUNPATH='/run/s6-rc'
  42. else
  43. SYSPATH="${XDG_DATA_HOME:-${HOME:?}/.local/share}/s6"
  44. RUNPATH="${XDG_RUNTIME_DIR:-${TMPDIR:-/tmp}/runtime-${USER:-$(id -un)}}/s6"
  45. if [ "${X}" -eq 1 ]; then
  46. SYSPATH="${SYSPATH}/x11"
  47. RUNPATH="${RUNPATH}/x11/s6-rc"
  48. else
  49. SYSPATH="${SYSPATH}/user"
  50. RUNPATH="${RUNPATH}/user/s6-rc"
  51. fi
  52. fi
  53. shift $(( OPTIND - 1 ))
  54. RCPATH="${SYSPATH}/rc"
  55. SVPATH="${SYSPATH}/sv"
  56. DBPATH="${RCPATH}/compiled"
  57. SVDIRS="${RUNPATH}/servicedirs"
  58. TIMESTAMP="$(date '+%s_%N')"
  59. NEW_DB="${DBPATH}-${TIMESTAMP}"
  60. umask 022
  61. set --
  62. if [ -d "${SVPATH}-priv" ]; then
  63. set -- "${SVPATH}-priv"
  64. fi
  65. s6-rc-compile "${NEW_DB}" "${SVPATH}" "${@}"
  66. # reload s6 if currently running
  67. if [ -e "${RUNPATH}" ]; then
  68. for dir in "${SVDIRS}"/*; do
  69. if [ -e "${dir}/down" ]; then
  70. s6-svc -x "${dir}"
  71. fi
  72. done
  73. s6-rc-update -v1 -l "${RUNPATH}" "${NEW_DB}"
  74. fi
  75. # update symlink
  76. if [ -h "${DBPATH}" ]; then
  77. unlink "${DBPATH}"
  78. elif [ -d "${DBPATH}" ]; then
  79. rm -r "${DBPATH}"
  80. elif [ -e "${DBPATH}" ]; then
  81. echo "DB path is not symlink or directory: '${DBPATH}'" 1>&2
  82. exit 1
  83. fi
  84. (
  85. cd "${DBPATH%/*}"
  86. ln -vs "${NEW_DB##*/}" "${DBPATH##*/}"
  87. )
  88. # remove old
  89. if [ "${RMDB}" -eq 1 ]; then
  90. echo "removing old compiled DBs in '${RCPATH}'"
  91. for dir in "${RCPATH}"/*; do
  92. if [ "$dir" != "${DBPATH}"-"${TIMESTAMP}" ] && [ "$dir" != "${DBPATH}" ]; then
  93. rm -r "$dir"
  94. fi
  95. done
  96. fi
  97. echo "done"