/rc4.d/S20console-log

http://github.com/brinkman83/bashrc · #! · 316 lines · 292 code · 24 blank · 0 comment · 0 complexity · aff9f5838a2e05d0f973e0fa62231ae6 MD5 · raw file

  1. #! /bin/bash
  2. #
  3. # console-log init script for console-log
  4. ### BEGIN INIT INFO
  5. # Provides: console-log
  6. # Required-Start: $local_fs $remote_fs $syslog
  7. # Required-Stop: $local_fs $remote_fs $syslog
  8. # Should-Start:
  9. # Should-Stop:
  10. # Default-Start: 2 3 4 5
  11. # Default-Stop: 0 1 6
  12. # Short-Description: Puts a logfile pager on virtual consoles
  13. # Description: console-log keeps logfile pagers open on virtual consoles.
  14. ### END INIT INFO
  15. PATH=/sbin:/bin:/usr/sbin:/usr/bin
  16. DESC="console-log"
  17. DEFAULTPAGER="less"
  18. LOGPAGER="/usr/share/console-log/logpager"
  19. PIDFILEDEFDIR="/var/run/console-log"
  20. CONFIGFILE="/etc/console-log.conf"
  21. USERNAME="Debian-console-log"
  22. MAXFILESIZE="7000000"
  23. set -e
  24. if [ -r "/lib/lsb/init-functions" ]; then
  25. . /lib/lsb/init-functions
  26. else
  27. echo "E: /lib/lsb/init-functions not found, lsb-base (>= 3.0-6) needed"
  28. exit 1
  29. fi
  30. if [ -n "$CONLoGDEBUG" ]; then
  31. echo "now debugging $0 $@"
  32. set -x
  33. fi
  34. mkdir -p $PIDFILEDEFDIR
  35. # this is from madduck on IRC, 2006-07-06
  36. # There should be a better possibility to give daemon error messages
  37. # and/or to log things
  38. log()
  39. {
  40. case "$1" in
  41. [[:digit:]]*) success=$1; shift;;
  42. *) :;;
  43. esac
  44. log_action_begin_msg "$1"; shift
  45. log_action_end_msg ${success:-0} "$*"
  46. }
  47. # WARNING! The pager might be run as root. /usr/share/console-log/logpager
  48. # is a wrapper for the actual pager that is supposed to configure the pager
  49. # in a secure way to not allow shell escapes. If you have extended the
  50. # pager wrapper to support other pagers, please submit your patches via
  51. # the BTS.
  52. start_pager()
  53. {
  54. TTY="$1"
  55. CHVT="$2"
  56. FILE="$3"
  57. USER="$4"
  58. GROUP="$5"
  59. MAXFILESIZE="$6"
  60. PAGER="$7"
  61. LOCSCRIPT="$8"
  62. if echo $TTY | grep "[[:digit:]]\+" >/dev/null; then
  63. PIDFILEDIR="$PIDFILEDEFDIR"
  64. DAEMONUSER=""
  65. if [ -n "$USER" ]; then
  66. DAEMONUSER="--user $USER"
  67. mkdir -p $PIDFILEDEFDIR/$USER
  68. chown $USER $PIDFILEDEFDIR/$USER
  69. PIDFILEDIR="$PIDFILEDEFDIR/$USER"
  70. if [ -n "$GROUP" ]; then
  71. DAEMONUSER="$DAEMONUSER.$GROUP"
  72. fi
  73. fi
  74. unset found
  75. for file in $FILE; do
  76. if [ -f "$file" ] || [ -L "$file" ]; then
  77. # check if file is readable by the given user
  78. if su --shell=$SHELL --command="head -n 1 $file" $USER > /dev/null 2>&1; then
  79. FILENAME="$TTY-${file//\//_-_}"
  80. if [ -f "$PIDFILEDIR/$FILENAME" ]; then
  81. log_progress_msg "$file (already running)"
  82. else
  83. if [ -x "$LOCSCRIPT" ]; then
  84. . $LOCSCRIPT $file
  85. fi
  86. if [ -x "$LOGPAGER" ]; then
  87. RET=0
  88. (ulimit -S -v $(( $MAXFILESIZE / 1000 * 2 + 10000 ))
  89. openvt -f -c $TTY -- \
  90. daemon --foreground --respawn --attempts=20 --delay=10 \
  91. --name=$FILENAME --pidfile=$PIDFILEDIR/$FILENAME \
  92. $DAEMONUSER $LOGPAGER -- $PAGER $file $MAXFILESIZE) || RET=$?
  93. if [ "$RET" = 2 ]; then
  94. log 1 "E: openvt failed. headless system?"
  95. exit 1
  96. fi
  97. if [ -f /etc/console.noblank ]; then
  98. setterm -blank 0 > /dev/tty$TTY
  99. fi
  100. [ "$CHVT" == "yes" ] && chvt $TTY
  101. log_progress_msg "$file"
  102. else
  103. log 1 "W: $LOGPAGER is not executeable."
  104. fi
  105. fi
  106. else
  107. log 1 "W: $file not readable by $USER"
  108. fi
  109. found="1"
  110. break
  111. fi
  112. if [ -z "found" ]; then
  113. log 1 "W: no files in $FILE do exist"
  114. fi
  115. done
  116. else
  117. log 1 "E: illegal tty $TTY."
  118. exit 1
  119. fi
  120. }
  121. check_pager()
  122. {
  123. USER="$1"
  124. shift
  125. TTY="$1"
  126. shift
  127. FILELIST="$@"
  128. cd $PIDFILEDEFDIR
  129. PIDFILEDIR="$PIDFILEDEFDIR"
  130. if [ -n "$USER" ]; then
  131. PIDFILEDIR="$PIDFILEDEFDIR/$USER"
  132. fi
  133. unset found
  134. CHECKRET=0
  135. for FILE in $FILELIST; do
  136. if [ -f "$FILE" ] || [ -L "$FILE" ]; then
  137. log_progress_msg "$FILE"
  138. FILENAME="$TTY-${FILE//\//_-_}"
  139. if daemon --running $USER --name=$FILENAME --pidfile=$PIDFILEDIR/$FILENAME; then
  140. log_progress_msg "(running)"
  141. else
  142. log_progress_msg "(not running)"
  143. CHECKRET=3
  144. fi
  145. found="1"
  146. break
  147. fi
  148. done
  149. if [ -z "found" ]; then
  150. log 1 "W: no files in $FILE do exist"
  151. fi
  152. return $CHECKRET
  153. }
  154. do_from_config()
  155. {
  156. mkdir -p $PIDFILEDEFDIR
  157. cd $PIDFILEDEFDIR
  158. ACTION="$1"
  159. (
  160. while true; do
  161. unset tty
  162. chvt="no"
  163. unset file
  164. user="$USERNAME"
  165. unset group
  166. group="$USERNAME"
  167. unset locscript
  168. pager="$DEFAULTPAGER"
  169. unset maxfilesize
  170. maxfilesize="$MAXFILESIZE"
  171. COUNTER=""
  172. ELINE=0
  173. while read KEY VALUE; do
  174. case "$KEY" in
  175. "#" | \#* )
  176. continue
  177. ;; # comment
  178. "" )
  179. ELINE=1
  180. break
  181. ;;
  182. tty|chvt|file|user|group|pager|locscript|maxfilesize)
  183. eval $KEY=\"$VALUE\"
  184. COUNTER=".$COUNTER"
  185. ;;
  186. *)
  187. log 1 "ERR: illegal key $KEY"
  188. exit 1
  189. ;;
  190. esac
  191. done
  192. # do things only if configuration was read
  193. RET=0
  194. if [ -n "$COUNTER" ]; then
  195. case "$ACTION" in
  196. start) start_pager "$tty" "$chvt" "$file" "$user" "$group" "$maxfilesize" "$pager" "$locscript"
  197. ;;
  198. check) check_pager "$user" "$tty" "$file"
  199. RET=$?
  200. ;;
  201. *) log 1 "E: illegal action to do_from_config"
  202. ;;
  203. esac
  204. fi
  205. # break out of loop if eof
  206. # if we get here without eof, then ELINE==1
  207. [ "$ELINE" != "1" ] && break
  208. done
  209. ) < $CONFIGFILE
  210. return $RET
  211. }
  212. do_from_running()
  213. {
  214. ACTION="$1"
  215. cd $PIDFILEDEFDIR
  216. if [ "$ACTION" = "check" ]; then
  217. log_action_begin_msg "checking console-log"
  218. fi
  219. CHECKRET=0
  220. for PIDPATH in $(find . -maxdepth 2 -type f); do
  221. FILENAME=$(echo $PIDPATH | sed -n 's/.*\/\(.*\)/\1/p')
  222. PIDFILEDIR=$(echo $PIDPATH | sed -n 's/^.*\/\(.*\)\/.*/\1/p')
  223. if [ -z "$PIDFILEDIR" ]; then
  224. USER=""
  225. PIDFILEDIR="$PWD"
  226. else
  227. USER="--user $PIDFILEDIR"
  228. PIDFILEDIR="$PWD/$PIDFILEDIR"
  229. fi
  230. OUTPUT="${FILENAME#*-}"
  231. OUTPUT="${OUTPUT//_-_//}"
  232. TTY=${FILENAME%%-*}
  233. RUNNING="no"
  234. if daemon --running $USER --name=$FILENAME --pidfile=$PIDFILEDIR/$FILENAME; then
  235. if [ "$ACTION" = "stop" ]; then
  236. daemon --stop $USER --name=$FILENAME --pidfile=$PIDFILEDIR/$FILENAME
  237. TERM=vt100 tput clear > /dev/tty$TTY
  238. fi
  239. RUNNING="yes"
  240. else
  241. CHECKRET=3
  242. fi
  243. if [ -d $PIDFILEDIR ]; then
  244. rmdir --ignore-fail-on-non-empty $PIDFILEDIR
  245. fi
  246. # BUGS: This creates weird output if the log file name contains
  247. # the string "_-_". Go figure.
  248. log_progress_msg "$OUTPUT"
  249. if [ "$ACTION" = "check" ]; then
  250. if [ "$RUNNING" = "no" ]; then
  251. log_progress_msg "(not running)"
  252. else
  253. log_progress_msg "(running)"
  254. fi
  255. fi
  256. done
  257. if [ "$ACTION" = "check" ]; then
  258. log_end_msg 0
  259. return $CHECKRET
  260. fi
  261. }
  262. case "$1" in
  263. start)
  264. log_daemon_msg "Starting $DESC"
  265. do_from_config start
  266. log_end_msg 0
  267. ;;
  268. stop)
  269. log_daemon_msg "Stopping $DESC"
  270. do_from_running stop
  271. log_end_msg 0
  272. ;;
  273. reload|force-reload|restart)
  274. log_daemon_msg "Stopping $DESC for restart"
  275. do_from_running stop
  276. log_end_msg 0
  277. log_daemon_msg "Restarting $DESC"
  278. do_from_config start
  279. log_end_msg 0
  280. ;;
  281. status)
  282. log_daemon_msg "Checking $DESC processes"
  283. do_from_config check
  284. log_end_msg 0
  285. ;;
  286. *)
  287. N=/etc/init.d/$NAME
  288. echo >&2 "Usage: $N {start|stop|restart|reload|force-reload|status}"
  289. exit 1
  290. ;;
  291. esac
  292. exit 0