freedombone-app-datserver 9.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. #!/bin/bash
  2. #
  3. # _____ _ _
  4. # | __|___ ___ ___ _| |___ _____| |_ ___ ___ ___
  5. # | __| _| -_| -_| . | . | | . | . | | -_|
  6. # |__| |_| |___|___|___|___|_|_|_|___|___|_|_|___|
  7. #
  8. # Freedom in the Cloud
  9. #
  10. # License
  11. # =======
  12. #
  13. # Copyright (C) 2018 Bob Mottram <bob@freedombone.net>
  14. #
  15. # This program is free software: you can redistribute it and/or modify
  16. # it under the terms of the GNU Affero General Public License as published by
  17. # the Free Software Foundation, either version 3 of the License, or
  18. # (at your option) any later version.
  19. #
  20. # This program is distributed in the hope that it will be useful,
  21. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  22. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  23. # GNU Affero General Public License for more details.
  24. #
  25. # You should have received a copy of the GNU Affero General Public License
  26. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  27. VARIANTS='full full-vim'
  28. IN_DEFAULT_INSTALL=0
  29. SHOW_ON_ABOUT=0
  30. DATSERVER_DOMAIN_NAME=
  31. DATSERVER_CODE=
  32. DATSERVER_DAT_VERSION='13.10.0'
  33. DATSERVER_HYPERCORED_VERSION='1.4.1'
  34. DATSERVER_DIRECTORY=/etc/datserver
  35. datserver_variables=(MY_USERNAME)
  36. function logging_on_datserver {
  37. echo -n ''
  38. }
  39. function logging_off_datserver {
  40. echo -n ''
  41. }
  42. function remove_user_datserver {
  43. remove_username="$1"
  44. "${PROJECT_NAME}-pass" -u "$remove_username" --rmapp datserver
  45. }
  46. function add_user_datserver {
  47. new_username="$1"
  48. new_user_password="$2"
  49. "${PROJECT_NAME}-pass" -u "$new_username" -a datserver -p "$new_user_password"
  50. echo '0'
  51. }
  52. function install_interactive_datserver {
  53. echo -n ''
  54. APP_INSTALLED=1
  55. }
  56. function change_password_datserver {
  57. curr_username="$1"
  58. new_user_password="$2"
  59. "${PROJECT_NAME}-pass" -u "$curr_username" -a datserver -p "$new_user_password"
  60. }
  61. function reconfigure_datserver {
  62. # This is used if you need to switch identity. Dump old keys and generate new ones
  63. echo -n ''
  64. }
  65. function datserver_add_url {
  66. data=$(mktemp 2>/dev/null)
  67. dialog --title $"Add a file to dat using its URL" \
  68. --backtitle $"Freedombone Control Panel" \
  69. --inputbox $"File URL" 8 70 2>"$data"
  70. sel=$?
  71. case $sel in
  72. 0)
  73. file_url=$(<"$data")
  74. if [ "$file_url" ]; then
  75. if [ ${#file_url} -gt 5 ]; then
  76. clear
  77. cd $DATSERVER_DIRECTORY || return
  78. wget "$file_url"
  79. chown -R datserver:datserver $DATSERVER_DIRECTORY/*
  80. fi
  81. fi
  82. ;;
  83. esac
  84. rm -f "$data"
  85. }
  86. function datserver_add_file {
  87. read_config_param MY_USERNAME
  88. selected_file=$(dialog --title "Choose a file to store within dat" --fselect "/home/$MY_USERNAME/" 30 60)
  89. if [ ! "$selected_file" ]; then
  90. return
  91. fi
  92. if [ ! -f "$selected_file" ]; then
  93. return
  94. fi
  95. if [[ "$selected_file" == "$DATSERVER_DIRECTORY"* ]]; then
  96. return
  97. fi
  98. clear
  99. echo ''
  100. echo $"Copying $selected_file"
  101. cp "$selected_file" $DATSERVER_DIRECTORY
  102. chown -R datserver:datserver $DATSERVER_DIRECTORY/*
  103. }
  104. function datserver_show_address {
  105. cd $DATSERVER_DIRECTORY || return
  106. dat_address=$(dat status | grep "dat:")
  107. clear
  108. echo ''
  109. echo "$dat_address"
  110. echo ''
  111. echo -n "$dat_address" | qrencode -t UTF8
  112. echo ''
  113. echo ' '
  114. # shellcheck disable=SC2034
  115. read -n1 -r -p $"Press any key to continue..." key
  116. }
  117. function configure_interactive_datserver {
  118. W=(1 $"Add a local file"
  119. 2 $"Add a file from its URL")
  120. while true
  121. do
  122. # shellcheck disable=SC2068
  123. selection=$(dialog --backtitle $"Freedombone Administrator Control Panel" --title $"dat server" --menu $"Choose an operation, or ESC for main menu:" 14 70 3 "${W[@]}" 3>&2 2>&1 1>&3)
  124. if [ ! "$selection" ]; then
  125. break
  126. fi
  127. case $selection in
  128. 1) datserver_show_address
  129. ;;
  130. 2) datserver_add_file
  131. ;;
  132. 3) datserver_add_url
  133. ;;
  134. esac
  135. done
  136. }
  137. function upgrade_datserver {
  138. CURR_DATSERVER_DAT_VERSION=$(get_completion_param "datserver version")
  139. if [[ "$CURR_DATSERVER_DAT_VERSION" != "$DATSERVER_DAT_VERSION" ]]; then
  140. if npm update -g dat@$DATSERVER_DAT_VERSION; then
  141. set_completion_param "datserver version" "$DATSERVER_DAT_VERSION"
  142. fi
  143. chown -R datserver:datserver "$DATSERVER_DIRECTORY"
  144. fi
  145. CURR_DATSERVER_HYPERCORED_VERSION=$(get_completion_param "datserver hypercored version")
  146. if [[ "$CURR_DATSERVER_HYPERCORED_VERSION" != "$DATSERVER_HYPERCORED_VERSION" ]]; then
  147. if npm update -g hypercored@$DATSERVER_HYPERCORED_VERSION; then
  148. set_completion_param "datserver hypercored version" "$DATSERVER_HYPERCORED_VERSION"
  149. fi
  150. chown -R datserver:datserver "$DATSERVER_DIRECTORY"
  151. fi
  152. }
  153. function backup_local_datserver {
  154. source_directory=$DATSERVER_DIRECTORY
  155. systemctl stop datserver
  156. dest_directory=datserver
  157. backup_directory_to_usb "$source_directory" $dest_directory
  158. systemctl start datserver
  159. }
  160. function restore_local_datserver {
  161. systemctl stop datserver
  162. temp_restore_dir=/root/tempdatserver
  163. datserver_dir=$DATSERVER_DIRECTORY
  164. restore_directory_from_usb $temp_restore_dir datserver
  165. if [ -d $temp_restore_dir ]; then
  166. if [ -d "$temp_restore_dir$datserver_dir" ]; then
  167. cp -rp "$temp_restore_dir$datserver_dir"/* "$datserver_dir"/
  168. else
  169. if [ ! -d "$datserver_dir" ]; then
  170. mkdir "$datserver_dir"
  171. fi
  172. cp -rp "$temp_restore_dir"/* "$datserver_dir"/
  173. fi
  174. chown -R datserver:datserver "$datserver_dir"
  175. rm -rf $temp_restore_dir
  176. fi
  177. systemctl start datserver
  178. }
  179. function backup_remote_datserver {
  180. source_directory=$DATSERVER_DIRECTORY
  181. systemctl stop datserver
  182. dest_directory=datserver
  183. backup_directory_to_friend "$source_directory" $dest_directory
  184. systemctl start datserver
  185. }
  186. function restore_remote_datserver {
  187. systemctl stop datserver
  188. temp_restore_dir=/root/tempdatserver
  189. datserver_dir=$DATSERVER_DIRECTORY
  190. restore_directory_from_friend $temp_restore_dir datserver
  191. if [ -d $temp_restore_dir ]; then
  192. if [ -d "$temp_restore_dir$datserver_dir" ]; then
  193. cp -rp "$temp_restore_dir$datserver_dir"/* "$datserver_dir"/
  194. else
  195. if [ ! -d "$datserver_dir" ]; then
  196. mkdir "$datserver_dir"
  197. fi
  198. cp -rp $temp_restore_dir/* "$datserver_dir"/
  199. fi
  200. chown -R datserver:datserver "$datserver_dir"
  201. rm -rf $temp_restore_dir
  202. fi
  203. systemctl start datserver
  204. }
  205. function remove_datserver {
  206. if [ -f /etc/systemd/system/datserver.service ]; then
  207. systemctl stop datserver
  208. systemctl disable datserver
  209. rm /etc/systemd/system/datserver.service
  210. fi
  211. userdel -r datserver
  212. npm uninstall -g dat
  213. npm uninstall -g hypercored
  214. remove_nodejs datserver
  215. remove_onion_service datserver "${DATSERVER_ONION_PORT}"
  216. if grep -q "datserver" /etc/crontab; then
  217. sed -i "/datserver/d" /etc/crontab
  218. fi
  219. if [ -d $DATSERVER_DIRECTORY ]; then
  220. rm -rf $DATSERVER_DIRECTORY
  221. fi
  222. remove_app datserver
  223. remove_completion_param install_datserver
  224. sed -i '/datserver/d' "$COMPLETION_FILE"
  225. }
  226. function install_datserver {
  227. apt-get -yq install wget
  228. install_nodejs datserver
  229. if ! npm install -g dat@$DATSERVER_DAT_VERSION; then
  230. exit 2468736
  231. fi
  232. if [ ! -f /root/.npm-global/bin/dat ]; then
  233. echo $'dat was not installed'
  234. exit 156835
  235. fi
  236. if ! npm install -g hypercored@$DATSERVER_HYPERCORED_VERSION; then
  237. echo $'hypercored was not installed'
  238. exit 4635439
  239. fi
  240. set_completion_param "datserver version" "$DATSERVER_DAT_VERSION"
  241. set_completion_param "datserver hypercored version" "$DATSERVER_HYPERCORED_VERSION"
  242. if [ -d $DATSERVER_DIRECTORY ]; then
  243. rm -rf $DATSERVER_DIRECTORY
  244. fi
  245. mkdir $DATSERVER_DIRECTORY
  246. useradd -d "$DATSERVER_DIRECTORY" -s /bin/false datserver
  247. if [ ! -d $DATSERVER_DIRECTORY ]; then
  248. echo $'dat directory was not created'
  249. exit 9568356
  250. fi
  251. cd $DATSERVER_DIRECTORY || exit 3578635
  252. echo -e "\\n\\n" | dat create
  253. if [ ! -d $DATSERVER_DIRECTORY/.dat ]; then
  254. echo $'dat was not created'
  255. exit 753563
  256. fi
  257. dat_address=$(dat status | grep "dat:")
  258. if [ ! "$dat_address" ]; then
  259. echo $'dat address could not be found'
  260. exit 235479763
  261. fi
  262. if [ ${#dat_address} -lt 10 ]; then
  263. echo $'dat address is too short'
  264. exit 4789264359
  265. fi
  266. echo "$dat_address created"
  267. { echo '[Unit]';
  268. echo 'Description=datserver';
  269. echo 'After=syslog.target';
  270. echo 'After=network.target';
  271. echo '';
  272. echo '[Service]';
  273. echo 'Type=simple';
  274. echo 'User=datserver';
  275. echo 'Group=datserver';
  276. echo "WorkingDirectory=$DATSERVER_DIRECTORY";
  277. echo "ExecStart=/root/.npm-global/bin/dat share $DATSERVER_DIRECTORY";
  278. echo 'Environment=NODE_ENV=production';
  279. echo 'Environment=USER=datserver';
  280. echo 'Restart=always';
  281. echo 'StandardError=syslog';
  282. echo '';
  283. echo '[Install]';
  284. echo 'WantedBy=multi-user.target'; } >> "/etc/systemd/system/datserver.service"
  285. systemctl enable datserver
  286. chown -R datserver:datserver "$DATSERVER_DIRECTORY"
  287. systemctl start datserver
  288. APP_INSTALLED=1
  289. }
  290. # NOTE: deliberately there is no "exit 0"