rc-runit 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #!/bin/sh
  2. SVDIR=/etc/sv
  3. RUNSVDIR=/etc/runit/runsvdir
  4. for SERVICEDIR in /var/service /service NONE; do
  5. if [ -d "${SERVICEDIR}" ]; then
  6. break
  7. fi
  8. done
  9. if [ "${SERVICEDIR}" = "NONE" ]; then
  10. echo "No service directory found"
  11. exit 99
  12. fi
  13. ########################################
  14. if [ "$(basename $0)" = "rc-service" ]; then
  15. SVC="$1"
  16. ACTION="$2"
  17. if [ "$UID" != "0" ]; then
  18. echo "Need root privileges"
  19. exit 13
  20. fi
  21. elif [ "$(basename $0)" = "rc-update" ]; then
  22. ACTION="$1"
  23. SVC="$2"
  24. RUNLEVEL="$3"
  25. else
  26. echo "Unknown basename \"$0\""
  27. exit 11
  28. fi
  29. if [ -z "${RUNLEVEL}" ]; then
  30. RUNLEVEL=$(readlink ${RUNSVDIR}/current)
  31. RUNLEVEL=$(basename ${RUNLEVEL})
  32. fi
  33. ########################################
  34. ### DEBUG
  35. if [ -r /tmp/service.debug.on ]; then
  36. printf 2>/dev/null >>/tmp/service.log "%-8s %s\n" "${ACTION}" "${SVC}"
  37. fi
  38. ########################################
  39. if [ "${ACTION}" != "show" ]; then
  40. if [ ! -d "${SVDIR}/${SVC}" ]; then
  41. echo "Could not find service \"${SVC}\""
  42. exit 1
  43. fi
  44. fi
  45. echo "${ACTION}" | grep -q "start\|stop\|status\|show\|add\|delete"
  46. if [ $? -ne 0 ]; then
  47. echo "Unknown action \"${ACTION}\""
  48. exit 10
  49. fi
  50. if echo "${ACTION}" | grep -qE "start|stop|status"; then
  51. if [ ! -L "${SERVICEDIR}/${SVC}" ]; then
  52. echo "Service \"${SVC}\" not enabled"
  53. exit 9
  54. fi
  55. fi
  56. case "${ACTION}" in
  57. "start")
  58. OUT=$(sv u "${SVC}" 2>&1)
  59. echo "Service \"${SVC}\" started"
  60. exit 0
  61. ;;
  62. "restart")
  63. OUT=$(sv restart "${SVC}" 2>&1)
  64. echo "Service \"${SVC}\" restarted"
  65. exit 0
  66. ;;
  67. "stop")
  68. OUT=$(sv d "${SVC}" 2>&1)
  69. echo "Service \"${SVC}\" stopped"
  70. exit 0
  71. ;;
  72. "status")
  73. OUT=$(sv s "${SVC}" 2>&1)
  74. if echo "${OUT}" | grep -q "^run"; then
  75. echo "Service \"${SVC}\" started"
  76. exit 0
  77. elif echo "${OUT}" | grep -q "^down.*normally up"; then
  78. echo "Service \"${SVC}\" crashed"
  79. exit 1
  80. fi
  81. ;;
  82. "add")
  83. if [ ! -d "${RUNSVDIR}/${RUNLEVEL}" ]; then
  84. echo "Unknown runlevel \"${RUNLEVEL}\""
  85. exit 12
  86. fi
  87. if [ ! -L "${RUNSVDIR}/${RUNLEVEL}/${SVC}" ]; then
  88. ln -s "${SVDIR}/${SVC}" "${RUNSVDIR}/${RUNLEVEL}/${SVC}"
  89. echo " * service ${SVC} added to runlevel default"
  90. exit 0
  91. else
  92. echo " * rc-update: ${SVC} already installed in runlevel 'default'; skipping"
  93. exit 0
  94. fi
  95. ;;
  96. "delete")
  97. if [ ! -d "${RUNSVDIR}/${RUNLEVEL}" ]; then
  98. echo "Unknown runlevel \"${RUNLEVEL}\""
  99. exit 12
  100. fi
  101. if [ -L "${RUNSVDIR}/${RUNLEVEL}/${SVC}" ]; then
  102. rm "${RUNSVDIR}/${RUNLEVEL}/${SVC}"
  103. echo " * service ${SVC} removed from runlevel default"
  104. exit 0
  105. else
  106. echo " * rc-update: service '${SVC}' is not in the runlevel '${RUNLEVEL}'"
  107. exit 0
  108. fi
  109. ;;
  110. "show")
  111. for S in $(cd ${SVDIR}; ls -1); do
  112. printf " %-20s |" "${S}"
  113. for RL in $(cd ${RUNSVDIR}; find -name "${S}"); do
  114. printf " %s" "$(echo ${RL} | cut -d/ -f2)"
  115. done
  116. printf "\n"
  117. done
  118. exit 0
  119. ;;
  120. *)
  121. ### DEBUG
  122. if [ -r /tmp/service.debug.on ]; then
  123. printf >>/tmp/service.log "UNKNOWN ACTION ${ACTION}\n" "${ACTION}" "${SVC}"
  124. fi
  125. ;;
  126. esac