freedombone-template 35KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037
  1. #!/bin/bash
  2. # _____ _ _
  3. # | __|___ ___ ___ _| |___ _____| |_ ___ ___ ___
  4. # | __| _| -_| -_| . | . | | . | . | | -_|
  5. # |__| |_| |___|___|___|___|_|_|_|___|___|_|_|___|
  6. #
  7. # Freedom in the Cloud
  8. #
  9. # Command to create app templates
  10. #
  11. # License
  12. # =======
  13. #
  14. # Copyright (C) 2018 Bob Mottram <bob@freedombone.net>
  15. #
  16. # This program is free software: you can redistribute it and/or modify
  17. # it under the terms of the GNU Affero General Public License as published by
  18. # the Free Software Foundation, either version 3 of the License, or
  19. # (at your option) any later version.
  20. #
  21. # This program is distributed in the hope that it will be useful,
  22. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  23. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  24. # GNU Affero General Public License for more details.
  25. #
  26. # You should have received a copy of the GNU Affero General Public License
  27. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  28. PROJECT_NAME='freedombone'
  29. app_name='noapp'
  30. app_name_lower=$(echo "${app_name}" | tr '[:upper:]' '[:lower:]')
  31. app_name=$app_name_lower
  32. app_name_upper=$(echo "${app_name}" | tr '[:lower:]' '[:upper:]')
  33. app_repo=
  34. app_repo_commit='TODO'
  35. app_php=
  36. app_node=
  37. app_nodeapp=
  38. app_onion_only=
  39. app_port=
  40. app_port_internal=
  41. app_daemon=
  42. app_dir=
  43. app_webui=1
  44. your_name=''
  45. your_email=''
  46. SHOW_ON_ABOUT=1
  47. database_type=''
  48. debian_packages=
  49. snap_packages=
  50. function show_help {
  51. echo ''
  52. echo $"${PROJECT_NAME}-template --app [myappname] --php yes -n \"My Name\" -e \"myname@mydomain\" > src/${PROJECT_NAME}-app-myappname"
  53. echo ''
  54. echo $'Creates a new app script which can then be filled in'
  55. echo ''
  56. echo ''
  57. echo $' -h --help Show help'
  58. echo $' -a --app [name] Name of the application'
  59. echo $' -n --name [name] Your name'
  60. echo $' -e --email [address] Your email address'
  61. echo $' -r --repo [url] Git repo url for the app'
  62. echo $' -c --commit [hash] Git commit'
  63. echo $' --port [number] Port number for the app'
  64. echo $' --portinternal [number] Internal port between a daemon and the web server'
  65. echo $' --node [yes|no] Is this a nodejs app?'
  66. echo $' --nodeapp [package] Specify a nodejs package to install'
  67. echo $' -o --onion [yes|no] Is this app only available on an onion address?'
  68. echo $' -p --php [yes|no] Is this a PHP app?'
  69. echo $' --packages [list of deb package names] Debian packages to be installed'
  70. echo $' --snaps [list of snap package names] Snap packages to be installed'
  71. echo $' -s --daemon [yes|no] Add a daemon'
  72. echo $' -d --database [mariadb|postgresql|mongodb] Type of database'
  73. echo $' -w --web [yes|no] Whether there is a web user interface (default is yes)'
  74. echo $' --dir [directory] Where to install to'
  75. echo $' -i --internalport [number] Internal port number for the daemon'
  76. echo ''
  77. exit 0
  78. }
  79. while [ $# -gt 1 ]
  80. do
  81. key="$1"
  82. case $key in
  83. -h|--help)
  84. show_help
  85. ;;
  86. -a|--app|--appname)
  87. shift
  88. app_name="$1"
  89. app_name_lower=$(echo "${app_name}" | tr '[:upper:]' '[:lower:]')
  90. app_name=$app_name_lower
  91. app_name_upper=$(echo "${app_name}" | tr '[:lower:]' '[:upper:]')
  92. ;;
  93. -r|--repo)
  94. shift
  95. app_repo="$1"
  96. ;;
  97. -c|--commit)
  98. shift
  99. app_repo_commit="$1"
  100. ;;
  101. -n|--name)
  102. shift
  103. your_name="$1"
  104. ;;
  105. -e|--email)
  106. shift
  107. your_email="$1"
  108. ;;
  109. -d|--database)
  110. shift
  111. database_type="$1"
  112. ;;
  113. -i|--internal|--internalport)
  114. shift
  115. app_port_internal="$1"
  116. ;;
  117. -p|--php)
  118. shift
  119. app_php="$1"
  120. ;;
  121. --node|--nodejs)
  122. shift
  123. app_node="$1"
  124. ;;
  125. --nodeapp)
  126. shift
  127. app_nodeapp="$1"
  128. ;;
  129. -s|--daemon|--systemd)
  130. shift
  131. if [[ "$1" == 'yes' ]]; then
  132. app_daemon=1
  133. fi
  134. ;;
  135. -o|--onion)
  136. shift
  137. if [[ "$1" == 'yes' ]]; then
  138. app_onion_only=1
  139. fi
  140. ;;
  141. -w|--web)
  142. shift
  143. if [[ "$1" == $'n'* || "$1" == $'N'* ]]; then
  144. app_webui=
  145. fi
  146. ;;
  147. --port)
  148. shift
  149. app_port="$1"
  150. ;;
  151. --portinternal|--portint)
  152. shift
  153. app_port_internal="$1"
  154. ;;
  155. --dir)
  156. shift
  157. app_dir="$1"
  158. ;;
  159. --packages|--package)
  160. shift
  161. debian_packages="$1"
  162. ;;
  163. --snaps|--snap)
  164. shift
  165. snap_packages="$1"
  166. ;;
  167. *)
  168. # unknown option
  169. ;;
  170. esac
  171. shift
  172. done
  173. if [[ "$app_name" == 'noapp' ]]; then
  174. show_help
  175. exit 1
  176. fi
  177. if [[ "$app_name" == *' '* ]]; then
  178. echo $'app name should not contain any spaces'
  179. exit 2
  180. fi
  181. if [[ "$app_name" == *'_'* ]]; then
  182. echo $'app name should not contain any underscore characters'
  183. exit 3
  184. fi
  185. if [[ "$app_name" == *'-'* ]]; then
  186. echo $'app name should not contain any hyphen characters'
  187. exit 4
  188. fi
  189. if [ ${#app_name} -lt 3 ]; then
  190. echo $'app name should be at least three characters'
  191. exit 5
  192. fi
  193. if [ ${#your_name} -lt 2 ]; then
  194. echo $'Specify your name with --name'
  195. exit 6
  196. fi
  197. if [ ${#your_email} -lt 3 ]; then
  198. echo $'Specify your email address with --email'
  199. exit 7
  200. fi
  201. if [[ "$your_email" != *'@'* ]]; then
  202. echo $"That doesn't look like an email address"
  203. exit 8
  204. fi
  205. if [ "$app_nodeapp" ]; then
  206. app_node='yes'
  207. fi
  208. if [ ! $app_webui ]; then
  209. if [ ! "$app_dir" ]; then
  210. app_dir=/etc/${app_name}
  211. fi
  212. app_php=
  213. fi
  214. echo '#!/bin/bash'
  215. echo '#'
  216. echo '# _____ _ _'
  217. echo '# | __|___ ___ ___ _| |___ _____| |_ ___ ___ ___'
  218. echo '# | __| _| -_| -_| . | . | | . | . | | -_|'
  219. echo '# |__| |_| |___|___|___|___|_|_|_|___|___|_|_|___|'
  220. echo '#'
  221. echo '# Freedom in the Cloud'
  222. echo '#'
  223. echo '# License'
  224. echo '# ======='
  225. echo '#'
  226. echo "# Copyright (C) $(date +%Y) ${your_name} <${your_email}>"
  227. echo '#'
  228. echo '# This program is free software: you can redistribute it and/or modify'
  229. echo '# it under the terms of the GNU Affero General Public License as published by'
  230. echo '# the Free Software Foundation, either version 3 of the License, or'
  231. echo '# (at your option) any later version.'
  232. echo '#'
  233. echo '# This program is distributed in the hope that it will be useful,'
  234. echo '# but WITHOUT ANY WARRANTY; without even the implied warranty of'
  235. echo '# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the'
  236. echo '# GNU Affero General Public License for more details.'
  237. echo '#'
  238. echo '# You should have received a copy of the GNU Affero General Public License'
  239. echo '# along with this program. If not, see <http://www.gnu.org/licenses/>.'
  240. echo ''
  241. echo "VARIANTS='full full-vim'"
  242. echo ''
  243. echo 'IN_DEFAULT_INSTALL=0'
  244. echo "SHOW_ON_ABOUT=${SHOW_ON_ABOUT}"
  245. if [ $app_onion_only ]; then
  246. echo 'SHOW_ICANN_ADDRESS_ON_ABOUT=0'
  247. fi
  248. echo ''
  249. echo "${app_name_upper}_DOMAIN_NAME="
  250. echo "${app_name_upper}_CODE="
  251. if [ "$app_port" ]; then
  252. echo "${app_name_upper}_PORT=$app_port"
  253. fi
  254. echo "${app_name_upper}_ONION_PORT=$(( ( RANDOM % 1000 ) + 9010 ))"
  255. if [ "$app_repo" ]; then
  256. echo "${app_name_upper}_REPO=\"${app_repo}\""
  257. echo "${app_name_upper}_COMMIT='${app_repo_commit}'"
  258. fi
  259. if [ $app_daemon ]; then
  260. if [ ! "$app_port_internal" ]; then
  261. echo "${app_name_upper}_PORT_INTERNAL=TODO"
  262. else
  263. echo "${app_name_upper}_PORT_INTERNAL=$app_port_internal"
  264. fi
  265. fi
  266. echo ''
  267. echo "${app_name}_variables=(ONION_ONLY"
  268. echo " ${app_name_upper}_DOMAIN_NAME"
  269. echo " ${app_name_upper}_CODE"
  270. echo ' DDNS_PROVIDER'
  271. echo " MY_USERNAME)"
  272. echo ''
  273. echo "function logging_on_${app_name} {"
  274. echo " echo -n ''"
  275. echo "}"
  276. echo ''
  277. echo "function logging_off_${app_name} {"
  278. echo " echo -n ''"
  279. echo '}'
  280. echo ''
  281. echo "function remove_user_${app_name} {"
  282. echo " remove_username=\"\$1\""
  283. echo ''
  284. echo " \"\${PROJECT_NAME}-pass\" -u \"\$remove_username\" --rmapp ${app_name}"
  285. echo '}'
  286. echo ''
  287. echo "function add_user_${app_name} {"
  288. echo " new_username=\"\$1\""
  289. echo " new_user_password=\"\$2\""
  290. echo ''
  291. echo " \"\${PROJECT_NAME}-pass\" -u \"\$new_username\" -a ${app_name} -p \"\$new_user_password\""
  292. echo " echo '0'"
  293. echo '}'
  294. echo ''
  295. echo "function install_interactive_${app_name} {"
  296. if [ ! $app_onion_only ]; then
  297. if [ $app_webui ]; then
  298. echo " if [ ! \"\$ONION_ONLY\" ]; then"
  299. echo " ONION_ONLY='no'"
  300. echo ' fi'
  301. echo ''
  302. echo " if [[ \"\$ONION_ONLY\" != \"no\" ]]; then"
  303. echo " ${app_name_upper}_DOMAIN_NAME='${app_name}.local'"
  304. echo " write_config_param \"${app_name_upper}_DOMAIN_NAME\" \"\$${app_name_upper}_DOMAIN_NAME\""
  305. echo ' else'
  306. echo " interactive_site_details \"${app_name}\" \"${app_name_upper}_DOMAIN_NAME\" \"${app_name_upper}_CODE\""
  307. echo ' fi'
  308. else
  309. echo " echo -n ''"
  310. fi
  311. else
  312. echo " echo -n ''"
  313. fi
  314. echo ' APP_INSTALLED=1'
  315. echo '}'
  316. echo ''
  317. echo "function change_password_${app_name} {"
  318. echo " curr_username=\"\$1\""
  319. echo " new_user_password=\"\$2\""
  320. if [ $app_webui ]; then
  321. echo ''
  322. echo " read_config_param '${app_name_upper}_DOMAIN_NAME'"
  323. fi
  324. echo ''
  325. echo " \"\${PROJECT_NAME}-pass\" -u \"\$curr_username\" -a ${app_name} -p \"\$new_user_password\""
  326. echo '}'
  327. if [[ "$database_type" == "mariadb" || "$database_type" == "mysql" || "$database_type" == "postgres"* || "$database_type" == "mongo"* ]]; then
  328. echo ''
  329. echo "function ${app_name}_create_database {"
  330. echo " if [ -f \"\$IMAGE_PASSWORD_FILE\" ]; then"
  331. echo " ${app_name_upper}_ADMIN_PASSWORD=\"\$(printf \"%d\" \"\$(cat \"$IMAGE_PASSWORD_FILE\")\")\""
  332. echo ' else'
  333. echo " if [ ! \"\$${app_name_upper}_ADMIN_PASSWORD\" ]; then"
  334. echo " ${app_name_upper}_ADMIN_PASSWORD=\$(create_password \"\${MINIMUM_PASSWORD_LENGTH}\")"
  335. echo ' fi'
  336. echo ' fi'
  337. echo " if [ ! \"\$${app_name_upper}_ADMIN_PASSWORD\" ]; then"
  338. echo ' return'
  339. echo ' fi'
  340. echo ''
  341. if [[ "$database_type" = "mysql" || "$database_type" = "mariadb" ]]; then
  342. echo " create_database ${app_name} \"\$${app_name_upper}_ADMIN_PASSWORD\" \"\$MY_USERNAME\""
  343. fi
  344. if [[ "$database_type" = "mongo"* ]]; then
  345. echo " create_database_mongodb ${app_name} \"\$${app_name_upper}_ADMIN_PASSWORD\" \"\$MY_USERNAME\""
  346. fi
  347. if [[ "$database_type" == "postgres"* ]]; then
  348. echo ' systemctl restart postgresql'
  349. echo " run_system_query_postgresql \"CREATE USER peertube WITH PASSWORD '\$${app_name_upper}_ADMIN_PASSWORD';\""
  350. echo " run_system_query_postgresql \"CREATE DATABASE ${app_name} OWNER ${app_name};\""
  351. echo " run_system_query_postgresql \"GRANT ALL PRIVILEGES ON DATABASE ${app_name} to ${app_name};\""
  352. echo " run_system_query_postgresql \"set statement_timeout to 40000;\""
  353. fi
  354. echo '}'
  355. fi
  356. echo ''
  357. echo "function reconfigure_${app_name} {"
  358. echo ' # This is used if you need to switch identity. Dump old keys and generate new ones'
  359. echo " echo -n ''"
  360. echo '}'
  361. echo ''
  362. echo "function configure_interactive_${app_name} {"
  363. echo ' W=(1 $"Option 1"'
  364. echo ' 2 $"Option 2")'
  365. echo ''
  366. echo ' while true'
  367. echo ' do'
  368. echo ' # shellcheck disable=SC2068'
  369. echo " selection=\$(dialog --backtitle \$\"Freedombone Administrator Control Panel\" --title \$\"${app_name}\" --menu \$\"Choose an operation, or ESC for main menu:\" 14 70 3 \"\${W[@]}\" 3>&2 2>&1 1>&3)"
  370. echo ''
  371. echo " if [ ! \"\$selection\" ]; then"
  372. echo ' break'
  373. echo ' fi'
  374. echo " case \$selection in"
  375. echo ' 1) # call some function for option 1'
  376. echo ' ;;'
  377. echo ' 2) # call some function for option 2'
  378. echo ' ;;'
  379. echo ' esac'
  380. echo ' done'
  381. echo '}'
  382. echo ''
  383. echo "function upgrade_${app_name} {"
  384. if [ ! "$app_repo" ]; then
  385. echo "echo -n ''"
  386. else
  387. echo " CURR_${app_name_upper}_COMMIT=\$(get_completion_param \"${app_name} commit\")"
  388. echo " if [[ \"\$CURR_${app_name_upper}_COMMIT\" == \"\$${app_name_upper}_COMMIT\" ]]; then"
  389. echo ' return'
  390. echo ' fi'
  391. if [ $app_webui ]; then
  392. echo ''
  393. echo " if grep -q \"${app_name} domain\" \"\$COMPLETION_FILE\"; then"
  394. echo " ${app_name_upper}_DOMAIN_NAME=\$(get_completion_param \"${app_name} domain\")"
  395. echo ' fi'
  396. fi
  397. echo ''
  398. echo ' # update to the next commit'
  399. if [ ! "$app_dir" ]; then
  400. echo " set_repo_commit \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\" \"${app_name} commit\" \"\$${app_name_upper}_COMMIT\" \"\$${app_name_upper}_REPO\""
  401. echo " chown -R www-data:www-data \"/var/www/\${${app_name_upper}_DOMAIN_NAME}/htdocs\""
  402. else
  403. echo " set_repo_commit \"${app_dir}\" \"${app_name} commit\" \"\$${app_name_upper}_COMMIT\" \"\$${app_name_upper}_REPO\""
  404. echo " chown -R ${app_name}:${app_name} \"${app_dir}\""
  405. fi
  406. if [ $app_daemon ]; then
  407. echo " systemctl restart ${app_name}"
  408. fi
  409. fi
  410. echo '}'
  411. echo ''
  412. echo "function backup_local_${app_name} {"
  413. if [ $app_webui ]; then
  414. echo " ${app_name_upper}_DOMAIN_NAME='${app_name}'"
  415. echo " if grep -q \"${app_name} domain\" \"\$COMPLETION_FILE\"; then"
  416. echo " ${app_name_upper}_DOMAIN_NAME=\$(get_completion_param \"${app_name} domain\")"
  417. echo ' fi'
  418. echo ''
  419. fi
  420. if [ ! "$app_dir" ]; then
  421. echo " source_directory=/var/www/\${${app_name_upper}_DOMAIN_NAME}/htdocs"
  422. else
  423. echo " source_directory=${app_dir}"
  424. fi
  425. if [ $app_webui ]; then
  426. echo ''
  427. echo " suspend_site \"\${${app_name_upper}_DOMAIN_NAME}\""
  428. fi
  429. if [ $app_daemon ]; then
  430. echo ''
  431. echo " systemctl stop ${app_name}"
  432. fi
  433. echo ''
  434. echo " dest_directory=${app_name}"
  435. echo " backup_directory_to_usb \"\$source_directory\" \$dest_directory"
  436. echo ''
  437. if [[ "$database_type" == "mariadb" || "$database_type" == "mysql" ]]; then
  438. echo " backup_database_to_usb ${app_name}"
  439. echo ''
  440. fi
  441. if [[ "$database_type" == "postgres"* ]]; then
  442. echo ' USE_POSTGRESQL=1'
  443. echo " backup_database_to_usb ${app_name}"
  444. echo ''
  445. fi
  446. if [[ "$database_type" == "mongo"* ]]; then
  447. echo ' USE_MONGODB=1'
  448. echo " backup_database_to_usb ${app_name}"
  449. echo ''
  450. fi
  451. if [ $app_webui ]; then
  452. echo ' restart_site'
  453. fi
  454. if [ $app_daemon ]; then
  455. echo " systemctl start ${app_name}"
  456. fi
  457. echo '}'
  458. echo ''
  459. echo "function restore_local_${app_name} {"
  460. if [ $app_webui ]; then
  461. echo " if ! grep -q \"${app_name} domain\" \"\$COMPLETION_FILE\"; then"
  462. echo ' return'
  463. echo ' fi'
  464. echo " ${app_name_upper}_DOMAIN_NAME=\$(get_completion_param \"${app_name} domain\")"
  465. echo " if [ ! \"\$${app_name_upper}_DOMAIN_NAME\" ]; then"
  466. echo " return"
  467. echo " fi"
  468. fi
  469. if [ $app_webui ]; then
  470. echo " suspend_site \"\${${app_name_upper}_DOMAIN_NAME}\""
  471. fi
  472. if [ $app_daemon ]; then
  473. echo " systemctl stop ${app_name}"
  474. echo ''
  475. fi
  476. echo " temp_restore_dir=/root/temp${app_name}"
  477. if [ ! "$app_dir" ]; then
  478. echo " ${app_name}_dir=/var/www/\${${app_name_upper}_DOMAIN_NAME}/htdocs"
  479. else
  480. echo " ${app_name}_dir=${app_dir}"
  481. fi
  482. echo ''
  483. if [[ "$database_type" == "mariadb" || "$database_type" == "mysql" ]]; then
  484. echo " ${app_name}_create_database"
  485. echo ''
  486. echo " restore_database ${app_name}"
  487. echo " if [ -d \$temp_restore_dir ]; then"
  488. echo " rm -rf \$temp_restore_dir"
  489. echo ' fi'
  490. echo ''
  491. fi
  492. if [[ "$database_type" == "postgres"* ]]; then
  493. echo " ${app_name}_create_database"
  494. echo ''
  495. echo ' USE_POSTGRESQL=1'
  496. echo " restore_database ${app_name}"
  497. echo " if [ -d \$temp_restore_dir ]; then"
  498. echo " rm -rf \$temp_restore_dir"
  499. echo ' fi'
  500. echo ''
  501. fi
  502. if [[ "$database_type" == "mongo"* ]]; then
  503. echo " ${app_name}_create_database"
  504. echo ''
  505. echo ' USE_MONGODB=1'
  506. echo " restore_database ${app_name}"
  507. echo " if [ -d \$temp_restore_dir ]; then"
  508. echo " rm -rf \$temp_restore_dir"
  509. echo ' fi'
  510. echo ''
  511. fi
  512. echo " restore_directory_from_usb \$temp_restore_dir ${app_name}"
  513. echo " if [ -d \$temp_restore_dir ]; then"
  514. echo " if [ -d \"\$temp_restore_dir\$${app_name}_dir\" ]; then"
  515. echo " cp -rp \"\$temp_restore_dir\$${app_name}_dir\"/* \"\$${app_name}_dir\"/"
  516. echo ' else'
  517. echo " if [ ! -d \"\$${app_name}_dir\" ]; then"
  518. echo " mkdir \"\$${app_name}_dir\""
  519. echo ' fi'
  520. echo " cp -rp \"\$temp_restore_dir\"/* \"\$${app_name}_dir\"/"
  521. echo ' fi'
  522. if [[ ! "$app_dir" ]]; then
  523. echo " chown -R www-data:www-data \"\$${app_name}_dir\""
  524. else
  525. echo " chown -R ${app_name}:${app_name} \"\$${app_name}_dir\""
  526. fi
  527. echo " rm -rf \$temp_restore_dir"
  528. echo ' fi'
  529. if [ $app_daemon ]; then
  530. echo " systemctl start ${app_name}"
  531. echo ''
  532. fi
  533. if [ $app_webui ]; then
  534. echo ' restart_site'
  535. fi
  536. echo '}'
  537. echo ''
  538. echo "function backup_remote_${app_name} {"
  539. if [ $app_webui ]; then
  540. echo " ${app_name_upper}_DOMAIN_NAME='${app_name}'"
  541. echo " if grep -q \"${app_name} domain\" \"\$COMPLETION_FILE\"; then"
  542. echo " ${app_name_upper}_DOMAIN_NAME=\$(get_completion_param \"${app_name} domain\")"
  543. echo ' fi'
  544. echo ''
  545. fi
  546. if [ ! "$app_dir" ]; then
  547. echo " source_directory=/var/www/\${${app_name_upper}_DOMAIN_NAME}/htdocs"
  548. else
  549. echo " source_directory=${app_dir}"
  550. fi
  551. if [ $app_webui ]; then
  552. echo ''
  553. echo " suspend_site \"\${${app_name_upper}_DOMAIN_NAME}\""
  554. fi
  555. if [ $app_daemon ]; then
  556. echo " systemctl stop ${app_name}"
  557. fi
  558. echo ''
  559. echo " dest_directory=${app_name}"
  560. echo " backup_directory_to_friend \"\$source_directory\" \$dest_directory"
  561. if [[ "$database_type" == "mariadb" || "$database_type" == "mysql" ]]; then
  562. echo " backup_database_to_friend ${app_name}"
  563. echo ''
  564. fi
  565. if [[ "$database_type" == "postgres"* ]]; then
  566. echo ' USE_POSTGRESQL=1'
  567. echo " backup_database_to_friend ${app_name}"
  568. echo ''
  569. fi
  570. if [[ "$database_type" == "mongo"* ]]; then
  571. echo ' USE_MONGODB=1'
  572. echo " backup_database_to_friend ${app_name}"
  573. echo ''
  574. fi
  575. if [ $app_daemon ]; then
  576. echo ''
  577. echo " systemctl start ${app_name}"
  578. fi
  579. if [ $app_webui ]; then
  580. echo ''
  581. echo ' restart_site'
  582. fi
  583. echo '}'
  584. echo ''
  585. echo "function restore_remote_${app_name} {"
  586. if [ $app_webui ]; then
  587. echo " if ! grep -q \"${app_name} domain\" \"\$COMPLETION_FILE\"; then"
  588. echo ' return'
  589. echo ' fi'
  590. echo " ${app_name_upper}_DOMAIN_NAME=\$(get_completion_param \"${app_name} domain\")"
  591. echo " if [ ! \"\$${app_name_upper}_DOMAIN_NAME\" ]; then"
  592. echo " return"
  593. echo " fi"
  594. fi
  595. if [ $app_webui ]; then
  596. echo " suspend_site \"\${${app_name_upper}_DOMAIN_NAME}\""
  597. fi
  598. if [ $app_daemon ]; then
  599. echo " systemctl stop ${app_name}"
  600. echo ''
  601. fi
  602. echo " temp_restore_dir=/root/temp${app_name}"
  603. if [ ! "$app_dir" ]; then
  604. echo " ${app_name}_dir=/var/www/\${${app_name_upper}_DOMAIN_NAME}/htdocs"
  605. else
  606. echo " ${app_name}_dir=${app_dir}"
  607. fi
  608. echo ''
  609. if [[ "$database_type" == "mariadb" || "$database_type" == "mysql" ]]; then
  610. echo " ${app_name}_create_database"
  611. echo ''
  612. echo " restore_database_from_friend ${app_name}"
  613. echo " if [ -d \"\$temp_restore_dir\" ]; then"
  614. echo " rm -rf \$temp_restore_dir"
  615. echo ' fi'
  616. echo ''
  617. fi
  618. if [[ "$database_type" == "postgres"* ]]; then
  619. echo " ${app_name}_create_database"
  620. echo ''
  621. echo ' USE_POSTGRESQL=1'
  622. echo " restore_database_from_friend ${app_name}"
  623. echo " if [ -d \"\$temp_restore_dir\" ]; then"
  624. echo " rm -rf \$temp_restore_dir"
  625. echo ' fi'
  626. echo ''
  627. fi
  628. if [[ "$database_type" == "mongo"* ]]; then
  629. echo " ${app_name}_create_database"
  630. echo ''
  631. echo ' USE_MONGODB=1'
  632. echo " restore_database_from_friend ${app_name}"
  633. echo " if [ -d \"\$temp_restore_dir\" ]; then"
  634. echo " rm -rf \$temp_restore_dir"
  635. echo ' fi'
  636. echo ''
  637. fi
  638. echo " restore_directory_from_friend \$temp_restore_dir ${app_name}"
  639. echo " if [ -d \$temp_restore_dir ]; then"
  640. echo " if [ -d \"\$temp_restore_dir\$${app_name}_dir\" ]; then"
  641. echo " cp -rp \"\$temp_restore_dir\$${app_name}_dir\"/* \"\$${app_name}_dir\"/"
  642. echo ' else'
  643. echo " if [ ! -d \"\$${app_name}_dir\" ]; then"
  644. echo " mkdir \"\$${app_name}_dir\""
  645. echo ' fi'
  646. echo " cp -rp \$temp_restore_dir/* \"\$${app_name}_dir\"/"
  647. echo ' fi'
  648. if [[ ! "$app_dir" ]]; then
  649. echo " chown -R www-data:www-data \"\$${app_name}_dir\""
  650. else
  651. echo " chown -R ${app_name}:${app_name} \"\$${app_name}_dir\""
  652. fi
  653. echo " rm -rf \$temp_restore_dir"
  654. echo ' fi'
  655. if [ $app_daemon ]; then
  656. echo " systemctl start ${app_name}"
  657. echo ''
  658. fi
  659. if [ $app_webui ]; then
  660. echo ' restart_site'
  661. fi
  662. echo '}'
  663. echo ''
  664. echo "function remove_${app_name} {"
  665. if [ $app_webui ]; then
  666. echo " nginx_dissite \"\$${app_name_upper}_DOMAIN_NAME\""
  667. echo " remove_certs \"\$${app_name_upper}_DOMAIN_NAME\""
  668. echo ''
  669. fi
  670. if [ $app_daemon ]; then
  671. echo " if [ -f /etc/systemd/system/${app_name}.service ]; then"
  672. echo " systemctl stop ${app_name}"
  673. echo " systemctl disable ${app_name}"
  674. echo " rm /etc/systemd/system/${app_name}.service"
  675. echo ' fi'
  676. echo " userdel -r ${app_name}"
  677. fi
  678. if [ "$app_nodeapp" ]; then
  679. echo " npm uninstall -g ${app_nodeapp}"
  680. echo ''
  681. fi
  682. if [[ "$app_node" == 'yes' ]]; then
  683. echo " remove_nodejs ${app_name}"
  684. echo ''
  685. fi
  686. if [ $app_webui ]; then
  687. echo ''
  688. echo " if [ -d \"/var/www/\$${app_name_upper}_DOMAIN_NAME\" ]; then"
  689. echo " rm -rf \"/var/www/\$${app_name_upper}_DOMAIN_NAME\""
  690. echo ' fi'
  691. echo " if [ -f \"/etc/nginx/sites-available/\$${app_name_upper}_DOMAIN_NAME\" ]; then"
  692. echo " rm \"/etc/nginx/sites-available/\$${app_name_upper}_DOMAIN_NAME\""
  693. echo ' fi'
  694. fi
  695. if [[ "$database_type" == "mariadb" || "$database_type" == "mysql" ]]; then
  696. echo " drop_database ${app_name}"
  697. fi
  698. if [[ "$database_type" == "postgres"* ]]; then
  699. echo " drop_database_postgresql ${app_name}"
  700. fi
  701. if [[ "$database_type" == "mongo"* ]]; then
  702. echo " drop_database_mongodb ${app_name}"
  703. fi
  704. echo " remove_onion_service ${app_name} \"\${${app_name_upper}_ONION_PORT}\""
  705. echo " if grep -q \"${app_name}\" /etc/crontab; then"
  706. echo " sed -i \"/${app_name}/d\" /etc/crontab"
  707. echo ' fi'
  708. echo " remove_app ${app_name}"
  709. echo " remove_completion_param install_${app_name}"
  710. echo " sed -i '/${app_name}/d' \"\$COMPLETION_FILE\""
  711. if [ "$app_port" ]; then
  712. echo ''
  713. echo " firewall_remove ${app_port} tcp"
  714. fi
  715. if [ $app_webui ]; then
  716. echo ''
  717. echo " remove_ddns_domain \"\$${app_name_upper}_DOMAIN_NAME\""
  718. fi
  719. if [ "$snap_packages" ]; then
  720. echo ''
  721. echo " snap remove ${snap_packages}"
  722. fi
  723. echo '}'
  724. echo ''
  725. echo "function install_${app_name} {"
  726. if [ "$debian_packages" ]; then
  727. echo " apt-get -qy install ${debian_packages}"
  728. echo ''
  729. fi
  730. if [ "$snap_packages" ]; then
  731. echo ' apt-get -qy install snapd'
  732. echo " snap install ${snap_packages}"
  733. echo ''
  734. fi
  735. if [[ "$database_type" == "mariadb" || "$database_type" == "mysql" ]]; then
  736. echo ' install_mariadb'
  737. echo ''
  738. echo ' get_mariadb_password'
  739. echo ''
  740. fi
  741. if [[ "$database_type" == "postgres"* ]]; then
  742. echo ' install_postgresql'
  743. echo ''
  744. fi
  745. if [[ "$database_type" == "mongo"* ]]; then
  746. echo ' install_mongodb'
  747. echo ''
  748. fi
  749. if [[ "$app_node" == 'yes' ]]; then
  750. echo " install_nodejs ${app_name}"
  751. fi
  752. if [ "$app_nodeapp" ]; then
  753. echo " npm install -g ${app_nodeapp}"
  754. fi
  755. if [[ "$app_php" == 'yes' ]]; then
  756. echo ' apt-get -yq install php-gettext php-curl php-gd php-mysql git curl'
  757. echo ' apt-get -yq install memcached php-memcached php-intl exiftool libfcgi0ldbl'
  758. echo ''
  759. fi
  760. if [ $app_webui ]; then
  761. echo " if [ ! \"\$${app_name_upper}_DOMAIN_NAME\" ]; then"
  762. echo " echo \$'No domain name was given'"
  763. echo ' exit 3568356'
  764. echo ' fi'
  765. echo ''
  766. echo " if [ -d \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\" ]; then"
  767. echo " rm -rf \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\""
  768. echo ' fi'
  769. fi
  770. if [ "$app_repo" ]; then
  771. echo " if [ -d /repos/${app_name} ]; then"
  772. if [ $app_webui ]; then
  773. echo " mkdir \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\""
  774. fi
  775. if [ ! "$app_dir" ]; then
  776. echo " cp -r -p /repos/${app_name}/. \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\""
  777. echo " cd \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\" || exit 324687356"
  778. else
  779. echo " cp -r -p /repos/${app_name}/. \"${app_dir}\""
  780. echo " cd \"${app_dir}\" || exit 36487365"
  781. fi
  782. echo ' git pull'
  783. echo ' else'
  784. if [ ! "$app_dir" ]; then
  785. echo " git_clone \"\$${app_name_upper}_REPO\" \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\""
  786. else
  787. echo " git_clone \"\$${app_name_upper}_REPO\" \"${app_dir}\""
  788. fi
  789. echo ' fi'
  790. echo ''
  791. if [ ! "$app_dir" ]; then
  792. echo " if [ ! -d \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\" ]; then"
  793. else
  794. echo " if [ ! -d \"${app_dir}\" ]; then"
  795. fi
  796. echo " echo \$'Unable to clone ${app_name} repo'"
  797. echo ' exit 87525'
  798. echo ' fi'
  799. echo ''
  800. else
  801. echo " mkdir -p \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\""
  802. if [ "$app_dir" ]; then
  803. echo " mkdir \"${app_dir}\""
  804. fi
  805. fi
  806. if [ ! "$app_dir" ]; then
  807. echo " cd \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\" || exit 36587356"
  808. else
  809. echo " cd \"${app_dir}\" || exit 3463754637"
  810. fi
  811. if [ "$app_repo" ]; then
  812. echo " git checkout \"\$${app_name_upper}_COMMIT\" -b \"\$${app_name_upper}_COMMIT\""
  813. echo " set_completion_param \"${app_name} commit\" \"\$${app_name_upper}_COMMIT\""
  814. fi
  815. if [ $app_webui ]; then
  816. echo ''
  817. echo " chmod g+w \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\""
  818. echo " chown -R www-data:www-data \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\""
  819. fi
  820. if [[ "$database_type" == "mariadb" || "$database_type" == "mysql" || "$database_type" == "postgres"* || "$database_type" == "mongo"* ]]; then
  821. echo ''
  822. echo " ${app_name}_create_database"
  823. fi
  824. if [ $app_webui ]; then
  825. echo ''
  826. echo " add_ddns_domain \"\$${app_name_upper}_DOMAIN_NAME\""
  827. fi
  828. echo ''
  829. echo " ${app_name_upper}_ONION_HOSTNAME=\$(add_onion_service ${app_name} 80 \"\${${app_name_upper}_ONION_PORT}\")"
  830. if [ $app_webui ]; then
  831. echo ''
  832. echo " ${app_name}_nginx_site=/etc/nginx/sites-available/\$${app_name_upper}_DOMAIN_NAME"
  833. if [ ! $app_onion_only ]; then
  834. echo " if [[ \"\$ONION_ONLY\" == \"no\" ]]; then"
  835. if [[ "$app_php" == 'yes' ]]; then
  836. echo " nginx_http_redirect \"\$${app_name_upper}_DOMAIN_NAME\" \"index index.php\""
  837. else
  838. echo " nginx_http_redirect \"\$${app_name_upper}_DOMAIN_NAME\" \"index index.html\""
  839. fi
  840. echo " { echo 'server {';"
  841. echo " echo ' listen 443 ssl;';"
  842. echo " echo ' #listen [::]:443 ssl;';"
  843. echo " echo \" server_name \$${app_name_upper}_DOMAIN_NAME;\";"
  844. echo " echo ''; } >> \"\$${app_name}_nginx_site\""
  845. echo " nginx_compress \"\$${app_name_upper}_DOMAIN_NAME\""
  846. echo " echo '' >> \"\$${app_name}_nginx_site\""
  847. echo " echo ' # Security' >> \"\$${app_name}_nginx_site\""
  848. echo " nginx_ssl \"\$${app_name_upper}_DOMAIN_NAME\""
  849. echo ''
  850. echo " nginx_security_options \"\$${app_name_upper}_DOMAIN_NAME\""
  851. echo ''
  852. echo " { echo ' add_header Strict-Transport-Security max-age=15768000;';"
  853. echo " echo '';"
  854. echo " echo ' access_log /dev/null;';"
  855. echo " echo ' error_log /dev/null;';"
  856. echo " echo '';"
  857. echo " echo \" root /var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs;\";"
  858. echo " echo '';"
  859. if [[ "$app_php" == 'yes' ]]; then
  860. echo " echo ' index index.php;';"
  861. echo " echo ' location ~ \\.php {';"
  862. echo " echo ' include snippets/fastcgi-php.conf;';"
  863. echo " echo ' fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;';"
  864. echo " echo ' fastcgi_read_timeout 30;';"
  865. echo " echo ' fastcgi_param HTTPS on;';"
  866. echo " echo ' }';"
  867. echo " echo '';"
  868. else
  869. echo " echo ' index index.html;';"
  870. fi
  871. echo " echo ' # Location';"
  872. echo " echo ' location / {'; } >> \"\$${app_name}_nginx_site\""
  873. echo " nginx_limits \"\$${app_name_upper}_DOMAIN_NAME\" '15m'"
  874. if [ ! $app_daemon ]; then
  875. if [[ "$app_php" != 'yes' ]]; then
  876. echo " { echo \" try_files \\\$uri \\\$uri/ /index.html;\";"
  877. else
  878. echo " { echo \" try_files \\\$uri \\\$uri/ /index.php?\\\$args;\";"
  879. fi
  880. else
  881. echo " { echo \" proxy_pass http://localhost:\$${app_name_upper}_PORT_INTERNAL;\";"
  882. fi
  883. echo " echo ' }';"
  884. echo " echo '}'; } >> \"\$${app_name}_nginx_site\""
  885. echo ' else'
  886. echo " echo -n '' > \"\$${app_name}_nginx_site\""
  887. echo ' fi'
  888. else
  889. echo " echo -n '' > \"\$${app_name}_nginx_site\""
  890. fi
  891. echo " { echo 'server {';"
  892. echo " echo \" listen 127.0.0.1:\$${app_name_upper}_ONION_PORT default_server;\";"
  893. echo " echo \" server_name \$${app_name_upper}_ONION_HOSTNAME;\";"
  894. echo " echo ''; } >> \"\$${app_name}_nginx_site\""
  895. echo " nginx_compress \"\$${app_name_upper}_DOMAIN_NAME\""
  896. echo " echo '' >> \"\$${app_name}_nginx_site\""
  897. echo " nginx_security_options \"\$${app_name_upper}_DOMAIN_NAME\""
  898. echo " { echo '';"
  899. echo " echo ' access_log /dev/null;';"
  900. echo " echo ' error_log /dev/null;';"
  901. echo " echo '';"
  902. echo " echo \" root /var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs;\";"
  903. echo " echo '';"
  904. if [[ "$app_php" == 'yes' ]]; then
  905. echo " echo ' index index.php;';"
  906. echo " echo ' location ~ \\.php {';"
  907. echo " echo ' include snippets/fastcgi-php.conf;';"
  908. echo " echo ' fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;';"
  909. echo " echo ' fastcgi_read_timeout 30;';"
  910. echo " echo ' fastcgi_param HTTPS off;';"
  911. echo " echo ' }';"
  912. echo " echo '';"
  913. else
  914. echo " echo ' index index.html;';"
  915. fi
  916. echo " echo ' # Location';"
  917. echo " echo ' location / {'; } >> \"\$${app_name}_nginx_site\""
  918. echo " nginx_limits \"\$${app_name_upper}_DOMAIN_NAME\" '15m'"
  919. if [ ! $app_daemon ]; then
  920. if [[ "$app_php" != 'yes' ]]; then
  921. echo " { echo \" try_files \\\$uri \\\$uri/ index.html;\";"
  922. else
  923. echo " { echo \" try_files \\\$uri \\\$uri/ index.php?\\\$args;\";"
  924. fi
  925. else
  926. echo " { echo \" proxy_pass http://localhost:\$${app_name_upper}_PORT_INTERNAL;\";"
  927. fi
  928. echo " echo ' }';"
  929. echo " echo '}'; } >> \"\$${app_name}_nginx_site\""
  930. if [[ "$app_php" == 'yes' ]]; then
  931. echo ''
  932. echo ' configure_php'
  933. fi
  934. fi
  935. if [ $app_daemon ]; then
  936. echo ''
  937. if [[ ! "$app_dir" ]]; then
  938. echo " adduser --system --home=\"TODO_PATH_TO_INSTALL\" --group ${app_name}"
  939. else
  940. echo " adduser --system --home=\"${app_dir}\" --group ${app_name}"
  941. fi
  942. echo ''
  943. echo " { echo '[Unit]';"
  944. echo " echo 'Description=${app_name}';"
  945. echo " echo 'After=syslog.target';"
  946. echo " echo 'After=network.target';"
  947. echo " echo \"Documentation=\$${app_name_upper}_REPO\";";
  948. echo " echo '';"
  949. echo " echo '[Service]';"
  950. echo " echo 'Type=simple';"
  951. echo " echo 'User=${app_name}';"
  952. echo " echo 'Group=${app_name}';"
  953. if [ ! "$app_dir" ]; then
  954. echo " echo 'WorkingDirectory=TODO';"
  955. else
  956. echo " echo 'WorkingDirectory=${app_dir}';"
  957. fi
  958. if [[ ! "$app_nodeapp" ]]; then
  959. if [ ! $app_node ]; then
  960. echo " echo 'ExecStart=TODO';"
  961. else
  962. echo " echo 'ExecStart=/usr/local/bin/npm start';"
  963. echo " echo 'ExecStop=/usr/local/bin/npm stop';"
  964. fi
  965. else
  966. echo " echo 'ExecStart=/usr/local/bin/node $app_nodeapp';"
  967. echo " echo 'Environment=NODE_ENV=production';"
  968. fi
  969. echo " echo 'Environment=USER=${app_name}';"
  970. echo " echo 'Restart=always';"
  971. echo " echo 'StandardError=syslog';"
  972. echo " echo '';"
  973. echo " echo '[Install]';"
  974. echo " echo 'WantedBy=multi-user.target'; } >> \"/etc/systemd/system/${app_name}.service\""
  975. echo " systemctl enable ${app_name}"
  976. if [ "$app_dir" ]; then
  977. echo " chown -R ${app_name}:${app_name} \"${app_dir}\""
  978. fi
  979. echo " systemctl start ${app_name}"
  980. fi
  981. if [ $app_webui ]; then
  982. if [ ! $app_onion_only ]; then
  983. echo ''
  984. echo " create_site_certificate \"\$${app_name_upper}_DOMAIN_NAME\" 'yes'"
  985. fi
  986. echo ''
  987. echo " nginx_ensite \"\$${app_name_upper}_DOMAIN_NAME\""
  988. fi
  989. if [[ "$database_type" == "mariadb" || "$database_type" == "mysql" ]]; then
  990. echo ''
  991. echo ' systemctl restart mariadb'
  992. fi
  993. if [ $app_webui ]; then
  994. if [[ "$app_php" == 'yes' ]]; then
  995. echo ''
  996. echo ' systemctl restart php7.0-fpm'
  997. fi
  998. echo ''
  999. echo ' systemctl restart nginx'
  1000. fi
  1001. echo ''
  1002. echo " \"\${PROJECT_NAME}-pass\" -u \"\$MY_USERNAME\" -a ${app_name} -p \"\$${app_name_upper}_ADMIN_PASSWORD\""
  1003. if [ $app_webui ]; then
  1004. echo " set_completion_param \"${app_name} domain\" \"\$${app_name_upper}_DOMAIN_NAME\""
  1005. fi
  1006. if [ "$app_port" ]; then
  1007. echo ''
  1008. echo " firewall_add ${app_name} ${app_port} tcp"
  1009. fi
  1010. echo ''
  1011. echo ' APP_INSTALLED=1'
  1012. echo '}'
  1013. echo ''
  1014. echo '# NOTE: deliberately there is no "exit 0"'