freedombone-app-datserver 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. #!/bin/bash
  2. #
  3. # _____ _ _
  4. # | __|___ ___ ___ _| |___ _____| |_ ___ ___ ___
  5. # | __| _| -_| -_| . | . | | . | . | | -_|
  6. # |__| |_| |___|___|___|___|_|_|_|___|___|_|_|___|
  7. #
  8. # Freedom in the Cloud
  9. #
  10. # The main issue here is bootstrapping. What is running
  11. # on the bootstrap server publicbits.org port 6881 ?
  12. #
  13. # Also it appears that users trying to clone have to
  14. # register an account on datbase.org or another datbase
  15. # server
  16. #
  17. # License
  18. # =======
  19. #
  20. # Copyright (C) 2018 Bob Mottram <bob@freedombone.net>
  21. #
  22. # This program is free software: you can redistribute it and/or modify
  23. # it under the terms of the GNU Affero General Public License as published by
  24. # the Free Software Foundation, either version 3 of the License, or
  25. # (at your option) any later version.
  26. #
  27. # This program is distributed in the hope that it will be useful,
  28. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  29. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  30. # GNU Affero General Public License for more details.
  31. #
  32. # You should have received a copy of the GNU Affero General Public License
  33. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  34. VARIANTS='full full-vim'
  35. IN_DEFAULT_INSTALL=0
  36. SHOW_ON_ABOUT=0
  37. DATSERVER_DOMAIN_NAME=
  38. DATSERVER_CODE=
  39. DATSERVER_HYPERCORED_VERSION='1.4.1'
  40. DATSERVER_DIRECTORY=/etc/datserver
  41. DATSERVER_PORT=3282
  42. # bootstrap servers are specified here
  43. DATSERVER_BOOTSTRAP_FILE=$DATSERVER_DIRECTORY/node_modules/datland-swarm-defaults/index.js
  44. DATSERVER_DISCOVERY1='discovery1.publicbits.org'
  45. DATSERVER_DISCOVERY2='discovery2.publicbits.org'
  46. DATSERVER_BOOTSTRAP1='bootstrap1.publicbits.org:6881'
  47. DATSERVER_BOOTSTRAP2='bootstrap2.publicbits.org:6881'
  48. DATSERVER_BOOTSTRAP3='bootstrap3.publicbits.org:6881'
  49. DATSERVER_BOOTSTRAP4='bootstrap4.publicbits.org:6881'
  50. datserver_variables=(MY_USERNAME
  51. DATSERVER_DISCOVERY1
  52. DATSERVER_DISCOVERY2
  53. DATSERVER_BOOTSTRAP1
  54. DATSERVER_BOOTSTRAP2
  55. DATSERVER_BOOTSTRAP3
  56. DATSERVER_BOOTSTRAP4)
  57. function datserver_generate_bootstraps {
  58. { echo "var extend = require('xtend')";
  59. echo '';
  60. echo "var DAT_DOMAIN = 'dat.local'";
  61. echo 'var DEFAULT_DISCOVERY = [';
  62. echo " '$DATSERVER_DISCOVERY1',";
  63. echo " '$DATSERVER_DISCOVERY2'";
  64. echo ']';
  65. echo 'var DEFAULT_BOOTSTRAP = [';
  66. echo " '$DATSERVER_BOOTSTRAP1',";
  67. echo " '$DATSERVER_BOOTSTRAP2',";
  68. echo " '$DATSERVER_BOOTSTRAP3',";
  69. echo " '$DATSERVER_BOOTSTRAP4'";
  70. echo ']';
  71. echo '';
  72. echo 'var DEFAULT_OPTS = {';
  73. echo ' dns: {server: DEFAULT_DISCOVERY, domain: DAT_DOMAIN},';
  74. echo ' dht: {bootstrap: DEFAULT_BOOTSTRAP}';
  75. echo '}';
  76. echo '';
  77. echo 'module.exports = function (opts) {';
  78. echo ' return extend(DEFAULT_OPTS, opts) // opts takes priority';
  79. echo '}'; } > $DATSERVER_BOOTSTRAP_FILE
  80. chown datserver:datserver $DATSERVER_BOOTSTRAP_FILE
  81. }
  82. function datserver_configure_bootstraps {
  83. read_config_param DATSERVER_DISCOVERY1
  84. read_config_param DATSERVER_DISCOVERY2
  85. read_config_param DATSERVER_BOOTSTRAP1
  86. read_config_param DATSERVER_BOOTSTRAP2
  87. read_config_param DATSERVER_BOOTSTRAP3
  88. read_config_param DATSERVER_BOOTSTRAP4
  89. data=$(mktemp 2>/dev/null)
  90. dialog --backtitle $"Freedombone Control Panel" \
  91. --title $"dat bootstrap servers" \
  92. --form $"Specify discovery and bootstrap servers:\\n" 14 68 6 \
  93. $"Discovery 1:" 1 1 "$DATSERVER_DISCOVERY1" 1 15 50 99 \
  94. $"Discovery 2:" 2 1 "$DATSERVER_DISCOVERY2" 2 15 50 99 \
  95. $"Bootstrap 1:" 3 1 "$DATSERVER_BOOTSTRAP1" 3 15 50 99 \
  96. $"Bootstrap 2:" 4 1 $"$DATSERVER_BOOTSTRAP2" 4 15 50 99 \
  97. $"Bootstrap 3:" 5 1 $"$DATSERVER_BOOTSTRAP3" 5 15 50 99 \
  98. $"Bootstrap 4:" 6 1 $"$DATSERVER_BOOTSTRAP4" 6 15 50 99 \
  99. 2> "$data"
  100. sel=$?
  101. case $sel in
  102. 1) rm -f "$data"
  103. return;;
  104. 255) rm -f "$data"
  105. return;;
  106. esac
  107. DATSERVER_DISCOVERY1=$(sed -n 1p < "$data")
  108. DATSERVER_DISCOVERY2=$(sed -n 2p < "$data")
  109. DATSERVER_BOOTSTRAP1=$(sed -n 3p < "$data")
  110. DATSERVER_BOOTSTRAP2=$(sed -n 4p < "$data")
  111. DATSERVER_BOOTSTRAP3=$(sed -n 4p < "$data")
  112. DATSERVER_BOOTSTRAP4=$(sed -n 4p < "$data")
  113. rm "$data"
  114. write_config_param DATSERVER_DISCOVERY1
  115. write_config_param DATSERVER_DISCOVERY2
  116. write_config_param DATSERVER_BOOTSTRAP1
  117. write_config_param DATSERVER_BOOTSTRAP2
  118. write_config_param DATSERVER_BOOTSTRAP3
  119. write_config_param DATSERVER_BOOTSTRAP4
  120. datserver_generate_bootstraps
  121. systemctl restart datserver
  122. }
  123. function logging_on_datserver {
  124. echo -n ''
  125. }
  126. function logging_off_datserver {
  127. echo -n ''
  128. }
  129. function remove_user_datserver {
  130. echo -n ''
  131. }
  132. function add_user_datserver {
  133. echo -n ''
  134. echo '0'
  135. }
  136. function change_password_datserver {
  137. echo -n ''
  138. }
  139. function install_interactive_datserver {
  140. echo -n ''
  141. APP_INSTALLED=1
  142. }
  143. function reconfigure_datserver {
  144. # This is used if you need to switch identity. Dump old keys and generate new ones
  145. echo -n ''
  146. }
  147. function datserver_add_dat {
  148. data=$(mktemp 2>/dev/null)
  149. dialog --title $"Add a dat" \
  150. --backtitle $"Freedombone Control Panel" \
  151. --inputbox $"dat link:" 8 70 2>"$data"
  152. sel=$?
  153. case $sel in
  154. 0)
  155. dat_link=$(<"$data")
  156. if [ "$dat_link" ]; then
  157. if [ ${#dat_link} -gt 5 ]; then
  158. if ! grep -q "$dat_link" $DATSERVER_DIRECTORY/feeds; then
  159. echo "$dat_link" >> $DATSERVER_DIRECTORY/feeds
  160. chown -R datserver:datserver $DATSERVER_DIRECTORY/feeds
  161. systemctl restart datserver
  162. fi
  163. fi
  164. fi
  165. ;;
  166. esac
  167. rm -f "$data"
  168. }
  169. function configure_interactive_datserver {
  170. W=(1 $"Add a dat"
  171. 2 $"Browse or edit feeds"
  172. 3 $"Bootstrap servers")
  173. while true
  174. do
  175. # shellcheck disable=SC2068
  176. selection=$(dialog --backtitle $"Freedombone Administrator Control Panel" --title $"dat server" --menu $"Choose an operation, or ESC for main menu:" 11 70 4 "${W[@]}" 3>&2 2>&1 1>&3)
  177. if [ ! "$selection" ]; then
  178. break
  179. fi
  180. case $selection in
  181. 1) datserver_add_dat
  182. ;;
  183. 2) cd $DATSERVER_DIRECTORY || break
  184. editor feeds
  185. chown -R datserver:datserver $DATSERVER_DIRECTORY/feeds
  186. systemctl restart datserver
  187. ;;
  188. 3) datserver_configure_bootstraps
  189. ;;
  190. esac
  191. done
  192. }
  193. function upgrade_datserver {
  194. CURR_DATSERVER_HYPERCORED_VERSION=$(get_completion_param "datserver hypercored version")
  195. if [[ "$CURR_DATSERVER_HYPERCORED_VERSION" != "$DATSERVER_HYPERCORED_VERSION" ]]; then
  196. cd $DATSERVER_DIRECTORY || exit 254274
  197. systemctl stop datserver
  198. if npm update hypercored@$DATSERVER_HYPERCORED_VERSION; then
  199. set_completion_param "datserver hypercored version" "$DATSERVER_HYPERCORED_VERSION"
  200. fi
  201. datserver_generate_bootstraps
  202. chown -R datserver:datserver "$DATSERVER_DIRECTORY"
  203. systemctl restart datserver
  204. fi
  205. }
  206. function backup_local_datserver {
  207. source_directory=$DATSERVER_DIRECTORY
  208. systemctl stop datserver
  209. dest_directory=datserver
  210. backup_directory_to_usb "$source_directory" $dest_directory
  211. systemctl start datserver
  212. }
  213. function restore_local_datserver {
  214. systemctl stop datserver
  215. temp_restore_dir=/root/tempdatserver
  216. datserver_dir=$DATSERVER_DIRECTORY
  217. restore_directory_from_usb $temp_restore_dir datserver
  218. if [ -d $temp_restore_dir ]; then
  219. if [ -d "$temp_restore_dir$datserver_dir" ]; then
  220. cp -rp "$temp_restore_dir$datserver_dir"/* "$datserver_dir"/
  221. else
  222. if [ ! -d "$datserver_dir" ]; then
  223. mkdir "$datserver_dir"
  224. fi
  225. cp -rp "$temp_restore_dir"/* "$datserver_dir"/
  226. fi
  227. chown -R datserver:datserver "$datserver_dir"
  228. rm -rf $temp_restore_dir
  229. fi
  230. systemctl start datserver
  231. }
  232. function backup_remote_datserver {
  233. source_directory=$DATSERVER_DIRECTORY
  234. systemctl stop datserver
  235. dest_directory=datserver
  236. backup_directory_to_friend "$source_directory" $dest_directory
  237. systemctl start datserver
  238. }
  239. function restore_remote_datserver {
  240. systemctl stop datserver
  241. temp_restore_dir=/root/tempdatserver
  242. datserver_dir=$DATSERVER_DIRECTORY
  243. restore_directory_from_friend $temp_restore_dir datserver
  244. if [ -d $temp_restore_dir ]; then
  245. if [ -d "$temp_restore_dir$datserver_dir" ]; then
  246. cp -rp "$temp_restore_dir$datserver_dir"/* "$datserver_dir"/
  247. else
  248. if [ ! -d "$datserver_dir" ]; then
  249. mkdir "$datserver_dir"
  250. fi
  251. cp -rp $temp_restore_dir/* "$datserver_dir"/
  252. fi
  253. chown -R datserver:datserver "$datserver_dir"
  254. rm -rf $temp_restore_dir
  255. fi
  256. systemctl start datserver
  257. }
  258. function remove_datserver {
  259. if [ -f /etc/systemd/system/datserver.service ]; then
  260. systemctl stop datserver
  261. systemctl disable datserver
  262. rm /etc/systemd/system/datserver.service
  263. fi
  264. userdel -r datserver
  265. remove_nodejs datserver
  266. if [ -d $DATSERVER_DIRECTORY ]; then
  267. rm -rf $DATSERVER_DIRECTORY
  268. fi
  269. remove_app datserver
  270. remove_completion_param install_datserver
  271. sed -i '/datserver/d' "$COMPLETION_FILE"
  272. firewall_remove $DATSERVER_PORT
  273. }
  274. function install_datserver {
  275. apt-get -yq install wget
  276. install_nodejs datserver
  277. if [ -d $DATSERVER_DIRECTORY ]; then
  278. rm -rf $DATSERVER_DIRECTORY
  279. fi
  280. mkdir $DATSERVER_DIRECTORY
  281. cd $DATSERVER_DIRECTORY || exit 3658356
  282. if ! npm install hypercored@$DATSERVER_HYPERCORED_VERSION; then
  283. echo $'hypercored was not installed'
  284. exit 4635439
  285. fi
  286. if ! npm install lil-pids@2.6.1; then
  287. echo $'lil-pids was not installed'
  288. exit 36483463
  289. fi
  290. echo "$DATSERVER_DIRECTORY/node_modules/.bin/hypercored --cwd $DATSERVER_DIRECTORY" > $DATSERVER_DIRECTORY/services
  291. set_completion_param "datserver hypercored version" "$DATSERVER_HYPERCORED_VERSION"
  292. adduser --system --home="$DATSERVER_DIRECTORY" --group datserver
  293. if [ ! -d $DATSERVER_DIRECTORY ]; then
  294. echo $'dat directory was not created'
  295. exit 9568356
  296. fi
  297. datserver_generate_bootstraps
  298. chown -R datserver:datserver "$DATSERVER_DIRECTORY"
  299. firewall_add datserver $DATSERVER_PORT
  300. { echo '[Unit]';
  301. echo 'After=syslog.target network.target remote-fs.target nss-lookup.target';
  302. echo '';
  303. echo '[Service]';
  304. echo 'User=datserver';
  305. echo 'Group=datserver';
  306. echo "ExecStart=$DATSERVER_DIRECTORY/node_modules/.bin/lil-pids $DATSERVER_DIRECTORY/services $DATSERVER_DIRECTORY/pids";
  307. echo 'Restart=always';
  308. echo "WorkingDirectory=$DATSERVER_DIRECTORY";
  309. echo 'StandardError=syslog';
  310. echo '';
  311. echo '[Install]';
  312. echo 'WantedBy=multi-user.target'; } > /etc/systemd/system/datserver.service
  313. systemctl enable datserver
  314. systemctl start datserver
  315. APP_INSTALLED=1
  316. }
  317. # NOTE: deliberately there is no "exit 0"