30_failsafe_wait 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #!/bin/sh
  2. # Copyright (C) 2006-2010 OpenWrt.org
  3. # Copyright (C) 2010 Vertical Communications
  4. fs_wait_for_key () {
  5. local timeout=$3
  6. local timer
  7. local do_failsafe
  8. local keypress_true="$(mktemp)"
  9. local keypress_wait="$(mktemp)"
  10. local keypress_sec="$(mktemp)"
  11. if [ -z "$keypress_wait" ]; then
  12. keypress_wait=/tmp/.keypress_wait
  13. touch $keypress_wait
  14. fi
  15. if [ -z "$keypress_true" ]; then
  16. keypress_true=/tmp/.keypress_true
  17. touch $keypress_true
  18. fi
  19. if [ -z "$keypress_sec" ]; then
  20. keypress_sec=/tmp/.keypress_sec
  21. touch $keypress_sec
  22. fi
  23. trap "echo 'true' >$keypress_true; lock -u $keypress_wait ; rm -f $keypress_wait" INT
  24. trap "echo 'true' >$keypress_true; lock -u $keypress_wait ; rm -f $keypress_wait" USR1
  25. [ -n "$timeout" ] || timeout=1
  26. [ $timeout -ge 1 ] || timeout=1
  27. timer=$timeout
  28. lock $keypress_wait
  29. {
  30. while [ $timer -gt 0 ]; do
  31. echo "$timer" >$keypress_sec
  32. timer=$(($timer - 1))
  33. sleep 1
  34. done
  35. lock -u $keypress_wait
  36. rm -f $keypress_wait
  37. } &
  38. echo "Press the [$1] key and hit [enter] $2"
  39. # if we're on the console we wait for input
  40. {
  41. while [ -r $keypress_wait ]; do
  42. timer="$(cat $keypress_sec)"
  43. [ -n "$timer" ] || timer=1
  44. timer="${timer%%\ *}"
  45. [ $timer -ge 1 ] || timer=1
  46. do_failsafe=""
  47. {
  48. read -t "$timer" do_failsafe
  49. if [ "$do_failsafe" = "$1" ]; then
  50. echo "true" >$keypress_true
  51. lock -u $keypress_wait
  52. rm -f $keypress_wait
  53. fi
  54. }
  55. done
  56. }
  57. lock -w $keypress_wait
  58. keypressed=1
  59. [ "$(cat $keypress_true)" = "true" ] && keypressed=0
  60. [ -f "/tmp/failsafe_button" ] && keypressed=1
  61. rm -f $keypress_true
  62. rm -f $keypress_wait
  63. rm -f $keypress_sec
  64. return $keypressed
  65. }
  66. failsafe_wait() {
  67. FAILSAFE=
  68. pi_failsafe_net_message=true
  69. preinit_net_echo "Please press button now to enter failsafe"
  70. pi_failsafe_net_message=false
  71. fs_wait_for_key f 'to enter failsafe mode' $fs_failsafe_wait_timeout && FAILSAFE=true && export FAILSAFE
  72. }
  73. boot_hook_add preinit_main failsafe_wait