30_failsafe_wait 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. # Copyright (C) 2006-2010 OpenWrt.org
  2. # Copyright (C) 2010 Vertical Communications
  3. fs_wait_for_key () {
  4. local timeout=$3
  5. local timer
  6. local do_keypress
  7. local keypress_true="$(mktemp)"
  8. local keypress_wait="$(mktemp)"
  9. local keypress_sec="$(mktemp)"
  10. if [ -z "$keypress_wait" ]; then
  11. keypress_wait=/tmp/.keypress_wait
  12. touch $keypress_wait
  13. fi
  14. if [ -z "$keypress_true" ]; then
  15. keypress_true=/tmp/.keypress_true
  16. touch $keypress_true
  17. fi
  18. if [ -z "$keypress_sec" ]; then
  19. keypress_sec=/tmp/.keypress_sec
  20. touch $keypress_sec
  21. fi
  22. trap "echo 'true' >$keypress_true; lock -u $keypress_wait ; rm -f $keypress_wait" INT
  23. trap "echo 'true' >$keypress_true; lock -u $keypress_wait ; rm -f $keypress_wait" USR1
  24. [ -n "$timeout" ] || timeout=1
  25. [ $timeout -ge 1 ] || timeout=1
  26. timer=$timeout
  27. lock $keypress_wait
  28. {
  29. while [ $timer -gt 0 ]; do
  30. pi_failsafe_net_message=true \
  31. preinit_net_echo "Please press button now to enter failsafe"
  32. echo "$timer" >$keypress_sec
  33. timer=$(($timer - 1))
  34. sleep 1
  35. done
  36. lock -u $keypress_wait
  37. rm -f $keypress_wait
  38. } &
  39. local consoles="$(cat /sys/class/tty/console/active)"
  40. [ -n "$consoles" ] || consoles=console
  41. for console in $consoles; do
  42. [ -c "/dev/$console" ] || continue
  43. [ "$pi_preinit_no_failsafe" != "y" ] && echo "Press the [$1] key and hit [enter] $2" > "/dev/$console"
  44. echo "Press the [1], [2], [3] or [4] key and hit [enter] to select the debug level" > "/dev/$console"
  45. {
  46. while [ -r $keypress_wait ]; do
  47. timer="$(cat $keypress_sec)"
  48. [ -n "$timer" ] || timer=1
  49. timer="${timer%%\ *}"
  50. [ $timer -ge 1 ] || timer=1
  51. do_keypress=""
  52. {
  53. read -t "$timer" do_keypress < "/dev/$console"
  54. case "$do_keypress" in
  55. $1)
  56. echo "true" >$keypress_true
  57. ;;
  58. 1 | 2 | 3 | 4)
  59. echo "$do_keypress" >/tmp/debug_level
  60. ;;
  61. *)
  62. continue;
  63. ;;
  64. esac
  65. lock -u $keypress_wait
  66. rm -f $keypress_wait
  67. }
  68. done
  69. } &
  70. done
  71. lock -w $keypress_wait
  72. keypressed=1
  73. [ "$(cat $keypress_true)" = "true" ] && keypressed=0
  74. trap - INT
  75. trap - USR1
  76. rm -f $keypress_true
  77. rm -f $keypress_wait
  78. rm -f $keypress_sec
  79. return $keypressed
  80. }
  81. failsafe_wait() {
  82. FAILSAFE=
  83. [ "$pi_preinit_no_failsafe" = "y" ] && {
  84. fs_wait_for_key "" "" $fs_failsafe_wait_timeout
  85. return
  86. }
  87. grep -q 'failsafe=' /proc/cmdline && FAILSAFE=true && export FAILSAFE
  88. if [ "$FAILSAFE" != "true" ]; then
  89. fs_wait_for_key f 'to enter failsafe mode' $fs_failsafe_wait_timeout && FAILSAFE=true
  90. [ -f "/tmp/failsafe_button" ] && FAILSAFE=true && echo "- failsafe button "$(cat /tmp/failsafe_button)" was pressed -"
  91. [ "$FAILSAFE" = "true" ] && export FAILSAFE && touch /tmp/failsafe
  92. fi
  93. }
  94. boot_hook_add preinit_main failsafe_wait