You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
2.8 KiB

  1. #!/bin/sh /etc/rc.common
  2. START=52
  3. STOP=52
  4. USE_PROCD=1
  5. TORRC_FILE=/etc/tor/torrc_generated # file with torrc config
  6. HS_DIR_PATH=/etc/tor/hidden_service #hidden service directory path
  7. TOR_USER=tor
  8. clean_hs() {
  9. local name=""
  10. }
  11. config_tor() {
  12. local restart_tor update_config
  13. config_get_bool restart_tor "common" RestartTor
  14. config_get_bool update_config "common" UpdateTorConf
  15. tail_conf=$(uci show tor.conf.tail_include 2>/dev/null)
  16. head_conf=$(uci show tor.conf.head_include 2>/dev/null)
  17. echo "tail_conf $tail_conf"
  18. if [ "$update_config" = "1" ]; then
  19. if [ -n "$(echo $tail_conf | grep $TORRC_FILE)" ] || [ -n "$(echo $head_conf | grep $TORRC_FILE)" ]; then
  20. echo "Info. Not updating tor configuration"
  21. else
  22. #uci add_list
  23. echo "Info. Updating tor configuration"
  24. uci add_list tor.conf.tail_include="$TORRC_FILE"
  25. uci commit tor
  26. fi
  27. fi
  28. if [ "$restart_tor" = "1" ]; then
  29. /etc/init.d/tor restart
  30. fi
  31. }
  32. handle_hs_ports_conf() {
  33. local public_port local_port
  34. local value="$1"
  35. local ipv4="$2"
  36. local name="$3"
  37. public_port=$(echo "$value"|awk -F';' '{print $1}')
  38. local_port=$(echo "$value"|awk -F';' '{print $2}')
  39. echo "HiddenServicePort $public_port $ipv4:$local_port">>$TORRC_FILE
  40. }
  41. parse_hs_conf() {
  42. local name public_port local_port enable_hs ipv4
  43. local config="$1"
  44. config_get name "$config" Name
  45. config_get description "$config" Description
  46. config_get_bool enable_hs "$config" Enabled 0
  47. config_get ipv4 "$config" IPv4
  48. if [ "$enable_hs" = "1" ]; then
  49. mkdir -p "$HS_DIR_PATH/$name"
  50. chown "$TOR_USER":"$TOR_USER" "$HS_DIR_PATH/"
  51. chown "$TOR_USER:$TOR_USER" "$HS_DIR_PATH/$name"
  52. chmod 700 "$HS_DIR_PATH/"
  53. chmod 700 "$HS_DIR_PATH/$name/"
  54. echo "HiddenServiceDir $HS_DIR_PATH/$name" >>$TORRC_FILE
  55. config_list_foreach "$config" PublicLocalPort handle_hs_ports_conf "$ipv4" "$name"
  56. fi
  57. }
  58. parse_hs_conf_hooks() {
  59. local name hook_script enable_hs hostname_file
  60. local config="$1"
  61. config_get enable_hs "$config" Enabled 0
  62. config_get hook_script "$config" HookScript
  63. config_get name "$config" Name
  64. hostname="$HS_DIR_PATH/$name/hostname"
  65. # check if we should run hook_script
  66. if [ "$enable_hs" = "true" ] && [ -x "$hook_script" ] && [ -f "$hostname" ] ; then
  67. hostname_uri=$(cat "$hostname")
  68. # call hook script
  69. $hook_script "--update-onion" "$hostname_uri"
  70. fi
  71. }
  72. parse_common_conf() {
  73. local hs_dir generated_config
  74. config_get generated_config "common" GenConf
  75. config_get hs_dir "common" HSDir
  76. [ -n "$hs_dir" ] && HS_DIR_PATH="$hs_dir"
  77. [ -n "$generated_config" ] && TORRC_FILE="$generated_config"
  78. }
  79. start_service() {
  80. config_load tor-hs
  81. # clean config
  82. echo "" > $TORRC_FILE # clean config
  83. # load common config
  84. parse_common_conf
  85. # load hs service
  86. config_foreach parse_hs_conf hidden-service
  87. # update tor config
  88. config_tor
  89. # load and run tor-hs hooks
  90. config_foreach parse_hs_conf_hooks hidden-service
  91. }