#!/bin/bash # _____ _ _ # | __|___ ___ ___ _| |___ _____| |_ ___ ___ ___ # | __| _| -_| -_| . | . | | . | . | | -_| # |__| |_| |___|___|___|___|_|_|_|___|___|_|_|___| # # Freedom in the Cloud # # Command to create app templates # # License # ======= # # Copyright (C) 2018 Bob Mottram # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . PROJECT_NAME='freedombone' app_name='noapp' app_name_lower=$(echo "${app_name}" | tr '[:upper:]' '[:lower:]') app_name=$app_name_lower app_name_upper=$(echo "${app_name}" | tr '[:lower:]' '[:upper:]') app_repo= app_repo_commit='TODO' app_php= app_node= app_nodeapp= app_onion_only= app_port= app_port_internal= app_daemon= app_dir= app_webui=1 your_name='' your_email='' SHOW_ON_ABOUT=1 database_type='' debian_packages= snap_packages= function show_help { echo '' echo $"${PROJECT_NAME}-template --app [myappname] --php yes -n \"My Name\" -e \"myname@mydomain\" > src/${PROJECT_NAME}-app-myappname" echo '' echo $'Creates a new app script which can then be filled in' echo '' echo '' echo $' -h --help Show help' echo $' -a --app [name] Name of the application' echo $' -n --name [name] Your name' echo $' -e --email [address] Your email address' echo $' -r --repo [url] Git repo url for the app' echo $' -c --commit [hash] Git commit' echo $' --port [number] Port number for the app' echo $' --portinternal [number] Internal port between a daemon and the web server' echo $' --node [yes|no] Is this a nodejs app?' echo $' --nodeapp [package] Specify a nodejs package to install' echo $' -o --onion [yes|no] Is this app only available on an onion address?' echo $' -p --php [yes|no] Is this a PHP app?' echo $' --packages [list of deb package names] Debian packages to be installed' echo $' --snaps [list of snap package names] Snap packages to be installed' echo $' -s --daemon [yes|no] Add a daemon' echo $' -d --database [mariadb|postgresql|mongodb] Type of database' echo $' -w --web [yes|no] Whether there is a web user interface (default is yes)' echo $' --dir [directory] Where to install to' echo $' -i --internalport [number] Internal port number for the daemon' echo '' exit 0 } while [ $# -gt 1 ] do key="$1" case $key in -h|--help) show_help ;; -a|--app|--appname) shift app_name="$1" app_name_lower=$(echo "${app_name}" | tr '[:upper:]' '[:lower:]') app_name=$app_name_lower app_name_upper=$(echo "${app_name}" | tr '[:lower:]' '[:upper:]') ;; -r|--repo) shift app_repo="$1" ;; -c|--commit) shift app_repo_commit="$1" ;; -n|--name) shift your_name="$1" ;; -e|--email) shift your_email="$1" ;; -d|--database) shift database_type="$1" ;; -i|--internal|--internalport) shift app_port_internal="$1" ;; -p|--php) shift app_php="$1" ;; --node|--nodejs) shift app_node="$1" ;; --nodeapp) shift app_nodeapp="$1" ;; -s|--daemon|--systemd) shift if [[ "$1" == 'yes' ]]; then app_daemon=1 fi ;; -o|--onion) shift if [[ "$1" == 'yes' ]]; then app_onion_only=1 fi ;; -w|--web) shift if [[ "$1" == $'n'* || "$1" == $'N'* ]]; then app_webui= fi ;; --port) shift app_port="$1" ;; --portinternal|--portint) shift app_port_internal="$1" ;; --dir) shift app_dir="$1" ;; --packages|--package) shift debian_packages="$1" ;; --snaps|--snap) shift snap_packages="$1" ;; *) # unknown option ;; esac shift done if [[ "$app_name" == 'noapp' ]]; then show_help exit 1 fi if [[ "$app_name" == *' '* ]]; then echo $'app name should not contain any spaces' exit 2 fi if [[ "$app_name" == *'_'* ]]; then echo $'app name should not contain any underscore characters' exit 3 fi if [[ "$app_name" == *'-'* ]]; then echo $'app name should not contain any hyphen characters' exit 4 fi if [ ${#app_name} -lt 3 ]; then echo $'app name should be at least three characters' exit 5 fi if [ ${#your_name} -lt 2 ]; then echo $'Specify your name with --name' exit 6 fi if [ ${#your_email} -lt 3 ]; then echo $'Specify your email address with --email' exit 7 fi if [[ "$your_email" != *'@'* ]]; then echo $"That doesn't look like an email address" exit 8 fi if [ "$app_nodeapp" ]; then app_node='yes' fi if [ ! $app_webui ]; then if [ ! "$app_dir" ]; then app_dir=/etc/${app_name} fi app_php= fi echo '#!/bin/bash' echo '#' echo '# _____ _ _' echo '# | __|___ ___ ___ _| |___ _____| |_ ___ ___ ___' echo '# | __| _| -_| -_| . | . | | . | . | | -_|' echo '# |__| |_| |___|___|___|___|_|_|_|___|___|_|_|___|' echo '#' echo '# Freedom in the Cloud' echo '#' echo '# License' echo '# =======' echo '#' echo "# Copyright (C) $(date +%Y) ${your_name} <${your_email}>" echo '#' echo '# This program is free software: you can redistribute it and/or modify' echo '# it under the terms of the GNU Affero General Public License as published by' echo '# the Free Software Foundation, either version 3 of the License, or' echo '# (at your option) any later version.' echo '#' echo '# This program is distributed in the hope that it will be useful,' echo '# but WITHOUT ANY WARRANTY; without even the implied warranty of' echo '# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the' echo '# GNU Affero General Public License for more details.' echo '#' echo '# You should have received a copy of the GNU Affero General Public License' echo '# along with this program. If not, see .' echo '' echo "VARIANTS='full full-vim'" echo '' echo 'IN_DEFAULT_INSTALL=0' echo "SHOW_ON_ABOUT=${SHOW_ON_ABOUT}" if [ $app_onion_only ]; then echo 'SHOW_ICANN_ADDRESS_ON_ABOUT=0' fi echo '' echo "${app_name_upper}_DOMAIN_NAME=" echo "${app_name_upper}_CODE=" if [ "$app_port" ]; then echo "${app_name_upper}_PORT=$app_port" fi echo "${app_name_upper}_ONION_PORT=$(( ( RANDOM % 1000 ) + 9010 ))" if [ "$app_repo" ]; then echo "${app_name_upper}_REPO=\"${app_repo}\"" echo "${app_name_upper}_COMMIT='${app_repo_commit}'" fi if [ $app_daemon ]; then if [ ! "$app_port_internal" ]; then echo "${app_name_upper}_PORT_INTERNAL=TODO" else echo "${app_name_upper}_PORT_INTERNAL=$app_port_internal" fi fi echo '' echo $'# These parameters are used by the FreedomBox mobile app' echo "${app_name_upper}_SHORT_DESCRIPTION=" echo "${app_name_upper}_DESCRIPTION=" echo "${app_name_upper}_MOBILE_APP_URL=" echo '' echo "${app_name}_variables=(ONION_ONLY" echo " ${app_name_upper}_DOMAIN_NAME" echo " ${app_name_upper}_CODE" echo ' DDNS_PROVIDER' echo " MY_USERNAME)" echo '' echo "function logging_on_${app_name} {" echo " echo -n ''" echo "}" echo '' echo "function logging_off_${app_name} {" echo " echo -n ''" echo '}' echo '' echo "function remove_user_${app_name} {" echo " remove_username=\"\$1\"" echo '' echo " \"\${PROJECT_NAME}-pass\" -u \"\$remove_username\" --rmapp ${app_name}" echo '}' echo '' echo "function add_user_${app_name} {" echo " new_username=\"\$1\"" echo " new_user_password=\"\$2\"" echo '' echo " \"\${PROJECT_NAME}-pass\" -u \"\$new_username\" -a ${app_name} -p \"\$new_user_password\"" echo " echo '0'" echo '}' echo '' echo "function install_interactive_${app_name} {" if [ ! $app_onion_only ]; then if [ $app_webui ]; then echo " if [ ! \"\$ONION_ONLY\" ]; then" echo " ONION_ONLY='no'" echo ' fi' echo '' echo " if [[ \"\$ONION_ONLY\" != \"no\" ]]; then" echo " ${app_name_upper}_DOMAIN_NAME='${app_name}.local'" echo " write_config_param \"${app_name_upper}_DOMAIN_NAME\" \"\$${app_name_upper}_DOMAIN_NAME\"" echo ' else' echo " interactive_site_details \"${app_name}\" \"${app_name_upper}_DOMAIN_NAME\" \"${app_name_upper}_CODE\"" echo ' fi' else echo " echo -n ''" fi else echo " echo -n ''" fi echo ' APP_INSTALLED=1' echo '}' echo '' echo "function change_password_${app_name} {" echo " curr_username=\"\$1\"" echo " new_user_password=\"\$2\"" if [ $app_webui ]; then echo '' echo " read_config_param '${app_name_upper}_DOMAIN_NAME'" fi echo '' echo " \"\${PROJECT_NAME}-pass\" -u \"\$curr_username\" -a ${app_name} -p \"\$new_user_password\"" echo '}' if [[ "$database_type" == "mariadb" || "$database_type" == "mysql" || "$database_type" == "postgres"* || "$database_type" == "mongo"* ]]; then echo '' echo "function ${app_name}_create_database {" echo " if [ -f \"\$IMAGE_PASSWORD_FILE\" ]; then" echo " ${app_name_upper}_ADMIN_PASSWORD=\"\$(printf \"%d\" \"\$(cat \"$IMAGE_PASSWORD_FILE\")\")\"" echo ' else' echo " if [ ! \"\$${app_name_upper}_ADMIN_PASSWORD\" ]; then" echo " ${app_name_upper}_ADMIN_PASSWORD=\$(create_password \"\${MINIMUM_PASSWORD_LENGTH}\")" echo ' fi' echo ' fi' echo " if [ ! \"\$${app_name_upper}_ADMIN_PASSWORD\" ]; then" echo ' return' echo ' fi' echo '' if [[ "$database_type" = "mysql" || "$database_type" = "mariadb" ]]; then echo " create_database ${app_name} \"\$${app_name_upper}_ADMIN_PASSWORD\" \"\$MY_USERNAME\"" fi if [[ "$database_type" = "mongo"* ]]; then echo " create_database_mongodb ${app_name} \"\$${app_name_upper}_ADMIN_PASSWORD\" \"\$MY_USERNAME\"" fi if [[ "$database_type" == "postgres"* ]]; then echo ' systemctl restart postgresql' echo " run_system_query_postgresql \"CREATE USER peertube WITH PASSWORD '\$${app_name_upper}_ADMIN_PASSWORD';\"" echo " run_system_query_postgresql \"CREATE DATABASE ${app_name} OWNER ${app_name};\"" echo " run_system_query_postgresql \"GRANT ALL PRIVILEGES ON DATABASE ${app_name} to ${app_name};\"" echo " run_system_query_postgresql \"set statement_timeout to 40000;\"" fi echo '}' fi echo '' echo "function reconfigure_${app_name} {" echo ' # This is used if you need to switch identity. Dump old keys and generate new ones' echo " echo -n ''" echo '}' echo '' echo "function configure_interactive_${app_name} {" echo ' W=(1 $"Option 1"' echo ' 2 $"Option 2")' echo '' echo ' while true' echo ' do' echo ' # shellcheck disable=SC2068' 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)" echo '' echo " if [ ! \"\$selection\" ]; then" echo ' break' echo ' fi' echo " case \$selection in" echo ' 1) # call some function for option 1' echo ' ;;' echo ' 2) # call some function for option 2' echo ' ;;' echo ' esac' echo ' done' echo '}' echo '' echo "function upgrade_${app_name} {" if [ ! "$app_repo" ]; then echo "echo -n ''" else echo " CURR_${app_name_upper}_COMMIT=\$(get_completion_param \"${app_name} commit\")" echo " if [[ \"\$CURR_${app_name_upper}_COMMIT\" == \"\$${app_name_upper}_COMMIT\" ]]; then" echo ' return' echo ' fi' if [ $app_webui ]; then echo '' echo " if grep -q \"${app_name} domain\" \"\$COMPLETION_FILE\"; then" echo " ${app_name_upper}_DOMAIN_NAME=\$(get_completion_param \"${app_name} domain\")" echo ' fi' fi echo '' echo ' # update to the next commit' if [ ! "$app_dir" ]; then echo " set_repo_commit \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\" \"${app_name} commit\" \"\$${app_name_upper}_COMMIT\" \"\$${app_name_upper}_REPO\"" echo " chown -R www-data:www-data \"/var/www/\${${app_name_upper}_DOMAIN_NAME}/htdocs\"" else echo " set_repo_commit \"${app_dir}\" \"${app_name} commit\" \"\$${app_name_upper}_COMMIT\" \"\$${app_name_upper}_REPO\"" echo " chown -R ${app_name}:${app_name} \"${app_dir}\"" fi if [ $app_daemon ]; then echo " systemctl restart ${app_name}" fi fi echo '}' echo '' echo "function backup_local_${app_name} {" if [ $app_webui ]; then echo " ${app_name_upper}_DOMAIN_NAME='${app_name}'" echo " if grep -q \"${app_name} domain\" \"\$COMPLETION_FILE\"; then" echo " ${app_name_upper}_DOMAIN_NAME=\$(get_completion_param \"${app_name} domain\")" echo ' fi' echo '' fi if [ ! "$app_dir" ]; then echo " source_directory=/var/www/\${${app_name_upper}_DOMAIN_NAME}/htdocs" else echo " source_directory=${app_dir}" fi if [ $app_webui ]; then echo '' echo " suspend_site \"\${${app_name_upper}_DOMAIN_NAME}\"" fi if [ $app_daemon ]; then echo '' echo " systemctl stop ${app_name}" fi echo '' echo " dest_directory=${app_name}" echo " backup_directory_to_usb \"\$source_directory\" \$dest_directory" echo '' if [[ "$database_type" == "mariadb" || "$database_type" == "mysql" ]]; then echo " backup_database_to_usb ${app_name}" echo '' fi if [[ "$database_type" == "postgres"* ]]; then echo ' USE_POSTGRESQL=1' echo " backup_database_to_usb ${app_name}" echo '' fi if [[ "$database_type" == "mongo"* ]]; then echo ' USE_MONGODB=1' echo " backup_database_to_usb ${app_name}" echo '' fi if [ $app_webui ]; then echo ' restart_site' fi if [ $app_daemon ]; then echo " systemctl start ${app_name}" fi echo '}' echo '' echo "function restore_local_${app_name} {" if [ $app_webui ]; then echo " if ! grep -q \"${app_name} domain\" \"\$COMPLETION_FILE\"; then" echo ' return' echo ' fi' echo " ${app_name_upper}_DOMAIN_NAME=\$(get_completion_param \"${app_name} domain\")" echo " if [ ! \"\$${app_name_upper}_DOMAIN_NAME\" ]; then" echo " return" echo " fi" fi if [ $app_webui ]; then echo " suspend_site \"\${${app_name_upper}_DOMAIN_NAME}\"" fi if [ $app_daemon ]; then echo " systemctl stop ${app_name}" echo '' fi echo " temp_restore_dir=/root/temp${app_name}" if [ ! "$app_dir" ]; then echo " ${app_name}_dir=/var/www/\${${app_name_upper}_DOMAIN_NAME}/htdocs" else echo " ${app_name}_dir=${app_dir}" fi echo '' if [[ "$database_type" == "mariadb" || "$database_type" == "mysql" ]]; then echo " ${app_name}_create_database" echo '' echo " restore_database ${app_name}" echo " if [ -d \$temp_restore_dir ]; then" echo " rm -rf \$temp_restore_dir" echo ' fi' echo '' fi if [[ "$database_type" == "postgres"* ]]; then echo " ${app_name}_create_database" echo '' echo ' USE_POSTGRESQL=1' echo " restore_database ${app_name}" echo " if [ -d \$temp_restore_dir ]; then" echo " rm -rf \$temp_restore_dir" echo ' fi' echo '' fi if [[ "$database_type" == "mongo"* ]]; then echo " ${app_name}_create_database" echo '' echo ' USE_MONGODB=1' echo " restore_database ${app_name}" echo " if [ -d \$temp_restore_dir ]; then" echo " rm -rf \$temp_restore_dir" echo ' fi' echo '' fi echo " restore_directory_from_usb \$temp_restore_dir ${app_name}" echo " if [ -d \$temp_restore_dir ]; then" echo " if [ -d \"\$temp_restore_dir\$${app_name}_dir\" ]; then" echo " cp -rp \"\$temp_restore_dir\$${app_name}_dir\"/* \"\$${app_name}_dir\"/" echo ' else' echo " if [ ! -d \"\$${app_name}_dir\" ]; then" echo " mkdir \"\$${app_name}_dir\"" echo ' fi' echo " cp -rp \"\$temp_restore_dir\"/* \"\$${app_name}_dir\"/" echo ' fi' if [[ ! "$app_dir" ]]; then echo " chown -R www-data:www-data \"\$${app_name}_dir\"" else echo " chown -R ${app_name}:${app_name} \"\$${app_name}_dir\"" fi echo " rm -rf \$temp_restore_dir" echo ' fi' if [ $app_daemon ]; then echo " systemctl start ${app_name}" echo '' fi if [ $app_webui ]; then echo ' restart_site' fi echo '}' echo '' echo "function backup_remote_${app_name} {" if [ $app_webui ]; then echo " ${app_name_upper}_DOMAIN_NAME='${app_name}'" echo " if grep -q \"${app_name} domain\" \"\$COMPLETION_FILE\"; then" echo " ${app_name_upper}_DOMAIN_NAME=\$(get_completion_param \"${app_name} domain\")" echo ' fi' echo '' fi if [ ! "$app_dir" ]; then echo " source_directory=/var/www/\${${app_name_upper}_DOMAIN_NAME}/htdocs" else echo " source_directory=${app_dir}" fi if [ $app_webui ]; then echo '' echo " suspend_site \"\${${app_name_upper}_DOMAIN_NAME}\"" fi if [ $app_daemon ]; then echo " systemctl stop ${app_name}" fi echo '' echo " dest_directory=${app_name}" echo " backup_directory_to_friend \"\$source_directory\" \$dest_directory" if [[ "$database_type" == "mariadb" || "$database_type" == "mysql" ]]; then echo " backup_database_to_friend ${app_name}" echo '' fi if [[ "$database_type" == "postgres"* ]]; then echo ' USE_POSTGRESQL=1' echo " backup_database_to_friend ${app_name}" echo '' fi if [[ "$database_type" == "mongo"* ]]; then echo ' USE_MONGODB=1' echo " backup_database_to_friend ${app_name}" echo '' fi if [ $app_daemon ]; then echo '' echo " systemctl start ${app_name}" fi if [ $app_webui ]; then echo '' echo ' restart_site' fi echo '}' echo '' echo "function restore_remote_${app_name} {" if [ $app_webui ]; then echo " if ! grep -q \"${app_name} domain\" \"\$COMPLETION_FILE\"; then" echo ' return' echo ' fi' echo " ${app_name_upper}_DOMAIN_NAME=\$(get_completion_param \"${app_name} domain\")" echo " if [ ! \"\$${app_name_upper}_DOMAIN_NAME\" ]; then" echo " return" echo " fi" fi if [ $app_webui ]; then echo " suspend_site \"\${${app_name_upper}_DOMAIN_NAME}\"" fi if [ $app_daemon ]; then echo " systemctl stop ${app_name}" echo '' fi echo " temp_restore_dir=/root/temp${app_name}" if [ ! "$app_dir" ]; then echo " ${app_name}_dir=/var/www/\${${app_name_upper}_DOMAIN_NAME}/htdocs" else echo " ${app_name}_dir=${app_dir}" fi echo '' if [[ "$database_type" == "mariadb" || "$database_type" == "mysql" ]]; then echo " ${app_name}_create_database" echo '' echo " restore_database_from_friend ${app_name}" echo " if [ -d \"\$temp_restore_dir\" ]; then" echo " rm -rf \$temp_restore_dir" echo ' fi' echo '' fi if [[ "$database_type" == "postgres"* ]]; then echo " ${app_name}_create_database" echo '' echo ' USE_POSTGRESQL=1' echo " restore_database_from_friend ${app_name}" echo " if [ -d \"\$temp_restore_dir\" ]; then" echo " rm -rf \$temp_restore_dir" echo ' fi' echo '' fi if [[ "$database_type" == "mongo"* ]]; then echo " ${app_name}_create_database" echo '' echo ' USE_MONGODB=1' echo " restore_database_from_friend ${app_name}" echo " if [ -d \"\$temp_restore_dir\" ]; then" echo " rm -rf \$temp_restore_dir" echo ' fi' echo '' fi echo " restore_directory_from_friend \$temp_restore_dir ${app_name}" echo " if [ -d \$temp_restore_dir ]; then" echo " if [ -d \"\$temp_restore_dir\$${app_name}_dir\" ]; then" echo " cp -rp \"\$temp_restore_dir\$${app_name}_dir\"/* \"\$${app_name}_dir\"/" echo ' else' echo " if [ ! -d \"\$${app_name}_dir\" ]; then" echo " mkdir \"\$${app_name}_dir\"" echo ' fi' echo " cp -rp \$temp_restore_dir/* \"\$${app_name}_dir\"/" echo ' fi' if [[ ! "$app_dir" ]]; then echo " chown -R www-data:www-data \"\$${app_name}_dir\"" else echo " chown -R ${app_name}:${app_name} \"\$${app_name}_dir\"" fi echo " rm -rf \$temp_restore_dir" echo ' fi' if [ $app_daemon ]; then echo " systemctl start ${app_name}" echo '' fi if [ $app_webui ]; then echo ' restart_site' fi echo '}' echo '' echo "function remove_${app_name} {" if [ $app_webui ]; then echo " nginx_dissite \"\$${app_name_upper}_DOMAIN_NAME\"" echo " remove_certs \"\$${app_name_upper}_DOMAIN_NAME\"" echo '' fi if [ $app_daemon ]; then echo " if [ -f /etc/systemd/system/${app_name}.service ]; then" echo " systemctl stop ${app_name}" echo " systemctl disable ${app_name}" echo " rm /etc/systemd/system/${app_name}.service" echo ' fi' echo " userdel -r ${app_name}" fi if [ "$app_nodeapp" ]; then echo " npm uninstall -g ${app_nodeapp}" echo '' fi if [[ "$app_node" == 'yes' ]]; then echo " remove_nodejs ${app_name}" echo '' fi if [ $app_webui ]; then echo '' echo " if [ -d \"/var/www/\$${app_name_upper}_DOMAIN_NAME\" ]; then" echo " rm -rf \"/var/www/\$${app_name_upper}_DOMAIN_NAME\"" echo ' fi' echo " if [ -f \"/etc/nginx/sites-available/\$${app_name_upper}_DOMAIN_NAME\" ]; then" echo " rm \"/etc/nginx/sites-available/\$${app_name_upper}_DOMAIN_NAME\"" echo ' fi' fi if [[ "$database_type" == "mariadb" || "$database_type" == "mysql" ]]; then echo " drop_database ${app_name}" fi if [[ "$database_type" == "postgres"* ]]; then echo " drop_database_postgresql ${app_name}" fi if [[ "$database_type" == "mongo"* ]]; then echo " drop_database_mongodb ${app_name}" fi echo " remove_onion_service ${app_name} \"\${${app_name_upper}_ONION_PORT}\"" echo " if grep -q \"${app_name}\" /etc/crontab; then" echo " sed -i \"/${app_name}/d\" /etc/crontab" echo ' fi' echo " remove_app ${app_name}" echo " remove_completion_param install_${app_name}" echo " sed -i '/${app_name}/d' \"\$COMPLETION_FILE\"" if [ "$app_port" ]; then echo '' echo " firewall_remove ${app_port} tcp" fi if [ $app_webui ]; then echo '' echo " remove_ddns_domain \"\$${app_name_upper}_DOMAIN_NAME\"" fi if [ "$snap_packages" ]; then echo '' echo " snap remove ${snap_packages}" fi echo '}' echo '' echo "function install_${app_name} {" if [ "$debian_packages" ]; then echo " apt-get -qy install ${debian_packages}" echo '' fi if [ "$snap_packages" ]; then echo ' apt-get -qy install snapd' echo " snap install ${snap_packages}" echo '' fi if [[ "$database_type" == "mariadb" || "$database_type" == "mysql" ]]; then echo ' install_mariadb' echo '' echo ' get_mariadb_password' echo '' fi if [[ "$database_type" == "postgres"* ]]; then echo ' install_postgresql' echo '' fi if [[ "$database_type" == "mongo"* ]]; then echo ' install_mongodb' echo '' fi if [[ "$app_node" == 'yes' ]]; then echo " install_nodejs ${app_name}" fi if [ "$app_nodeapp" ]; then echo " npm install -g ${app_nodeapp}" fi if [[ "$app_php" == 'yes' ]]; then echo ' apt-get -yq install php-gettext php-curl php-gd php-mysql git curl' echo ' apt-get -yq install memcached php-memcached php-intl exiftool libfcgi0ldbl' echo '' fi if [ $app_webui ]; then echo " if [ ! \"\$${app_name_upper}_DOMAIN_NAME\" ]; then" echo " echo \$'No domain name was given'" echo ' exit 3568356' echo ' fi' echo '' echo " if [ -d \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\" ]; then" echo " rm -rf \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\"" echo ' fi' fi if [ "$app_repo" ]; then echo " if [ -d /repos/${app_name} ]; then" if [ $app_webui ]; then echo " mkdir \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\"" fi if [ ! "$app_dir" ]; then echo " cp -r -p /repos/${app_name}/. \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\"" echo " cd \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\" || exit 324687356" else echo " cp -r -p /repos/${app_name}/. \"${app_dir}\"" echo " cd \"${app_dir}\" || exit 36487365" fi echo ' git pull' echo ' else' if [ ! "$app_dir" ]; then echo " git_clone \"\$${app_name_upper}_REPO\" \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\"" else echo " git_clone \"\$${app_name_upper}_REPO\" \"${app_dir}\"" fi echo ' fi' echo '' if [ ! "$app_dir" ]; then echo " if [ ! -d \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\" ]; then" else echo " if [ ! -d \"${app_dir}\" ]; then" fi echo " echo \$'Unable to clone ${app_name} repo'" echo ' exit 87525' echo ' fi' echo '' else echo " mkdir -p \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\"" if [ "$app_dir" ]; then echo " mkdir \"${app_dir}\"" fi fi if [ ! "$app_dir" ]; then echo " cd \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\" || exit 36587356" else echo " cd \"${app_dir}\" || exit 3463754637" fi if [ "$app_repo" ]; then echo " git checkout \"\$${app_name_upper}_COMMIT\" -b \"\$${app_name_upper}_COMMIT\"" echo " set_completion_param \"${app_name} commit\" \"\$${app_name_upper}_COMMIT\"" fi if [ $app_webui ]; then echo '' echo " chmod g+w \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\"" echo " chown -R www-data:www-data \"/var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs\"" fi if [[ "$database_type" == "mariadb" || "$database_type" == "mysql" || "$database_type" == "postgres"* || "$database_type" == "mongo"* ]]; then echo '' echo " ${app_name}_create_database" fi if [ $app_webui ]; then echo '' echo " add_ddns_domain \"\$${app_name_upper}_DOMAIN_NAME\"" fi echo '' echo " ${app_name_upper}_ONION_HOSTNAME=\$(add_onion_service ${app_name} 80 \"\${${app_name_upper}_ONION_PORT}\")" if [ $app_webui ]; then echo '' echo " ${app_name}_nginx_site=/etc/nginx/sites-available/\$${app_name_upper}_DOMAIN_NAME" if [ ! $app_onion_only ]; then echo " if [[ \"\$ONION_ONLY\" == \"no\" ]]; then" if [[ "$app_php" == 'yes' ]]; then echo " nginx_http_redirect \"\$${app_name_upper}_DOMAIN_NAME\" \"index index.php\"" else echo " nginx_http_redirect \"\$${app_name_upper}_DOMAIN_NAME\" \"index index.html\"" fi echo " { echo 'server {';" echo " echo ' listen 443 ssl;';" echo " echo ' #listen [::]:443 ssl;';" echo " echo \" server_name \$${app_name_upper}_DOMAIN_NAME;\";" echo " echo ''; } >> \"\$${app_name}_nginx_site\"" echo " nginx_compress \"\$${app_name_upper}_DOMAIN_NAME\"" echo " echo '' >> \"\$${app_name}_nginx_site\"" echo " echo ' # Security' >> \"\$${app_name}_nginx_site\"" echo " nginx_ssl \"\$${app_name_upper}_DOMAIN_NAME\"" echo '' echo " nginx_security_options \"\$${app_name_upper}_DOMAIN_NAME\"" echo '' echo " { echo ' add_header Strict-Transport-Security max-age=15768000;';" echo " echo '';" echo " echo ' access_log /dev/null;';" echo " echo ' error_log /dev/null;';" echo " echo '';" echo " echo \" root /var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs;\";" echo " echo '';" if [[ "$app_php" == 'yes' ]]; then echo " echo ' index index.php;';" echo " echo ' location ~ \\.php {';" echo " echo ' include snippets/fastcgi-php.conf;';" echo " echo ' fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;';" echo " echo ' fastcgi_read_timeout 30;';" echo " echo ' fastcgi_param HTTPS on;';" echo " echo ' }';" echo " echo '';" else echo " echo ' index index.html;';" fi echo " echo ' # Location';" echo " echo ' location / {'; } >> \"\$${app_name}_nginx_site\"" echo " nginx_limits \"\$${app_name_upper}_DOMAIN_NAME\" '15m'" if [ ! $app_daemon ]; then if [[ "$app_php" != 'yes' ]]; then echo " { echo \" try_files \\\$uri \\\$uri/ /index.html;\";" else echo " { echo \" try_files \\\$uri \\\$uri/ /index.php?\\\$args;\";" fi else echo " { echo \" proxy_pass http://localhost:\$${app_name_upper}_PORT_INTERNAL;\";" fi echo " echo ' }';" echo " echo '}'; } >> \"\$${app_name}_nginx_site\"" echo ' else' echo " echo -n '' > \"\$${app_name}_nginx_site\"" echo ' fi' else echo " echo -n '' > \"\$${app_name}_nginx_site\"" fi echo " { echo 'server {';" echo " echo \" listen 127.0.0.1:\$${app_name_upper}_ONION_PORT default_server;\";" echo " echo \" server_name \$${app_name_upper}_ONION_HOSTNAME;\";" echo " echo ''; } >> \"\$${app_name}_nginx_site\"" echo " nginx_compress \"\$${app_name_upper}_DOMAIN_NAME\"" echo " echo '' >> \"\$${app_name}_nginx_site\"" echo " nginx_security_options \"\$${app_name_upper}_DOMAIN_NAME\"" echo " { echo '';" echo " echo ' access_log /dev/null;';" echo " echo ' error_log /dev/null;';" echo " echo '';" echo " echo \" root /var/www/\$${app_name_upper}_DOMAIN_NAME/htdocs;\";" echo " echo '';" if [[ "$app_php" == 'yes' ]]; then echo " echo ' index index.php;';" echo " echo ' location ~ \\.php {';" echo " echo ' include snippets/fastcgi-php.conf;';" echo " echo ' fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;';" echo " echo ' fastcgi_read_timeout 30;';" echo " echo ' fastcgi_param HTTPS off;';" echo " echo ' }';" echo " echo '';" else echo " echo ' index index.html;';" fi echo " echo ' # Location';" echo " echo ' location / {'; } >> \"\$${app_name}_nginx_site\"" echo " nginx_limits \"\$${app_name_upper}_DOMAIN_NAME\" '15m'" if [ ! $app_daemon ]; then if [[ "$app_php" != 'yes' ]]; then echo " { echo \" try_files \\\$uri \\\$uri/ index.html;\";" else echo " { echo \" try_files \\\$uri \\\$uri/ index.php?\\\$args;\";" fi else echo " { echo \" proxy_pass http://localhost:\$${app_name_upper}_PORT_INTERNAL;\";" fi echo " echo ' }';" echo " echo '}'; } >> \"\$${app_name}_nginx_site\"" if [[ "$app_php" == 'yes' ]]; then echo '' echo ' configure_php' fi fi if [ $app_daemon ]; then echo '' if [[ ! "$app_dir" ]]; then echo " adduser --system --home=\"TODO_PATH_TO_INSTALL\" --group ${app_name}" else echo " adduser --system --home=\"${app_dir}\" --group ${app_name}" fi echo '' echo " { echo '[Unit]';" echo " echo 'Description=${app_name}';" echo " echo 'After=syslog.target';" echo " echo 'After=network.target';" echo " echo \"Documentation=\$${app_name_upper}_REPO\";"; echo " echo '';" echo " echo '[Service]';" echo " echo 'Type=simple';" echo " echo 'User=${app_name}';" echo " echo 'Group=${app_name}';" if [ ! "$app_dir" ]; then echo " echo 'WorkingDirectory=TODO';" else echo " echo 'WorkingDirectory=${app_dir}';" fi if [[ ! "$app_nodeapp" ]]; then if [ ! $app_node ]; then echo " echo 'ExecStart=TODO';" else echo " echo 'ExecStart=/usr/local/bin/npm start';" echo " echo 'ExecStop=/usr/local/bin/npm stop';" fi else echo " echo 'ExecStart=/usr/local/bin/node $app_nodeapp';" echo " echo 'Environment=NODE_ENV=production';" fi echo " echo 'Environment=USER=${app_name}';" echo " echo 'Restart=always';" echo " echo 'StandardError=syslog';" echo " echo '';" echo " echo '[Install]';" echo " echo 'WantedBy=multi-user.target'; } > \"/etc/systemd/system/${app_name}.service\"" echo " systemctl enable ${app_name}" if [ "$app_dir" ]; then echo " chown -R ${app_name}:${app_name} \"${app_dir}\"" fi echo " systemctl start ${app_name}" fi if [ $app_webui ]; then if [ ! $app_onion_only ]; then echo '' echo " create_site_certificate \"\$${app_name_upper}_DOMAIN_NAME\" 'yes'" fi echo '' echo " nginx_ensite \"\$${app_name_upper}_DOMAIN_NAME\"" fi if [[ "$database_type" == "mariadb" || "$database_type" == "mysql" ]]; then echo '' echo ' systemctl restart mariadb' fi if [ $app_webui ]; then if [[ "$app_php" == 'yes' ]]; then echo '' echo ' systemctl restart php7.0-fpm' fi echo '' echo ' systemctl restart nginx' fi echo '' echo " \"\${PROJECT_NAME}-pass\" -u \"\$MY_USERNAME\" -a ${app_name} -p \"\$${app_name_upper}_ADMIN_PASSWORD\"" if [ $app_webui ]; then echo " set_completion_param \"${app_name} domain\" \"\$${app_name_upper}_DOMAIN_NAME\"" fi if [ "$app_port" ]; then echo '' echo " firewall_add ${app_name} ${app_port} tcp" fi echo '' echo ' APP_INSTALLED=1' echo '}' echo '' echo '# NOTE: deliberately there is no "exit 0"'