30_failsafe_wait 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. [ "$pi_preinit_no_failsafe" != "y" ] && echo "Press the [$1] key and hit [enter] $2"
  40. echo "Press the [1], [2], [3] or [4] key and hit [enter] to select the debug level"
  41. # if we're on the console we wait for input
  42. {
  43. while [ -r $keypress_wait ]; do
  44. timer="$(cat $keypress_sec)"
  45. [ -n "$timer" ] || timer=1
  46. timer="${timer%%\ *}"
  47. [ $timer -ge 1 ] || timer=1
  48. do_keypress=""
  49. {
  50. read -t "$timer" do_keypress
  51. case "$do_keypress" in
  52. $1)
  53. echo "true" >$keypress_true
  54. ;;
  55. 1 | 2 | 3 | 4)
  56. echo "$do_keypress" >/tmp/debug_level
  57. ;;
  58. *)
  59. continue;
  60. ;;
  61. esac
  62. lock -u $keypress_wait
  63. rm -f $keypress_wait
  64. }
  65. done
  66. }
  67. lock -w $keypress_wait
  68. keypressed=1
  69. [ "$(cat $keypress_true)" = "true" ] && keypressed=0
  70. rm -f $keypress_true
  71. rm -f $keypress_wait
  72. rm -f $keypress_sec
  73. return $keypressed
  74. }
  75. failsafe_wait() {
  76. FAILSAFE=
  77. [ "$pi_preinit_no_failsafe" = "y" ] && {
  78. fs_wait_for_key "" "" $fs_failsafe_wait_timeout
  79. return
  80. }
  81. grep -q 'failsafe=' /proc/cmdline && FAILSAFE=true && export FAILSAFE
  82. if [ "$FAILSAFE" != "true" ]; then
  83. fs_wait_for_key f 'to enter failsafe mode' $fs_failsafe_wait_timeout && FAILSAFE=true
  84. [ -f "/tmp/failsafe_button" ] && FAILSAFE=true && echo "- failsafe button "$(cat /tmp/failsafe_button)" was pressed -"
  85. [ "$FAILSAFE" = "true" ] && export FAILSAFE && touch /tmp/failsafe
  86. fi
  87. }
  88. boot_hook_add preinit_main failsafe_wait