#!/bin/bash #====================================== # Author: ulyc #====================================== set -eo pipefail red='\e[91m' green='\e[92m' yellow='\e[93m' magenta='\e[95m' cyan='\e[96m' none='\e[0m' _red() { echo -e "${red}$*${none}"; } _green() { echo -e "${green}$*${none}"; } _yellow() { echo -e "${yellow}$*${none}"; } _magenta() { echo -e "${magenta}$*${none}"; } _cyan() { echo -e "${cyan}$*${none}"; } domain_name="http://localhost" modules="" meta_module="meta.sr.ht" git_module="git.sr.ht" hg_module="hg.sr.ht" build_module="builds.sr.ht" list_module="lists.sr.ht" man_module="man.sr.ht" paste_module="paste.sr.ht" todo_module="todo.sr.ht" function add_module() { read -r input echo if [[ "$input" -le 1 ]]; then modules=$modules" "$1 echo -e "$yellow $1 is selected${none}" fi } function progress() { echo "$2 IS RUNNING..." printf "[▓" while kill -0 "$1" 2>/dev/null; do printf "▓" sleep 0.05 done wait "$1" printf "▓] done!" } function generate_config() { service_key=$(grep "genkeys"}' } function build_base_image() { docker build -t sr.ht-base:dev ./base/ && echo } function generate_launch_shell() { md="$(echo "$meta_module $1" | awk '{ gsub(/\./,""); print $0 }')" md_count=$(echo "$md" | awk '{print NF}') cp ./template/config.ini.template config.ini echo "" >"start.sh" for ((i = 1; i <= "$md_count"; i++)); do m=$(echo "$md" | awk -v i="$i" '{print $i }') mp="500$i" echo "/usr/bin/gunicorn $m.app:app -b 0.0.0.0:$mp -D" >>"start.sh" m_domain="$m.$domain_name" if [[ "$domain_name" == "http://localhost" ]]; then m_domain=$domain_name:$mp fi tp="{{"$m"_domain}}" sed -i "s@$tp@$m_domain@" config.ini done sed "s/{{PORTS}}/5001-500$md_count:5001-500$md_count/" ./template/docker-compose.yml.template >docker-compose.yml echo "tail -f /dev/null" >>start.sh } function select_version_control() { # Git or Mercurial or Both echo -e "Select your distributed version control system ${cyan}1.Git${none} or ${cyan}2.Mercurial${none} or ${cyan}3.Both${none}?" read -r version_control_system_input echo if [[ "$version_control_system_input" -le 1 ]]; then modules=$modules" "$git_module echo -e "$yellow $modules is selected${none}" elif [[ "$version_control_system_input" -le 2 ]]; then modules=$modules" "$hg_module echo -e "$yellow $modules is selected${none}" else modules=$modules' '$git_module' '$hg_module echo -e "$yellow $modules are selected${none}" fi } function advance_config() { # CI # builds.sr.ht echo -e "Do you want to use ${cyan} Sourcehut CI ${none}? ${cyan}1.Yes${none} or ${cyan}2.No${none}?" add_module "$build_module" echo -e "Do you want to use ${cyan}Mailing list service${none}? ${cyan}1.Yes${none} or ${cyan}2.No${none}?" add_module "$list_module" # wiki service # man.sr.ht echo -e "Do you want to use ${cyan}Wiki service${none}? ${cyan}1.Yes${none} or ${cyan}2.No${none}?" add_module "$man_module" # Syntax highlighting # paste.sr.ht echo -e "Do you want to use ${cyan}Syntax highlighting${none}? ${cyan}1.Yes${none} or ${cyan}2.No${none}?" add_module "$paste_module" # issue and bug tracker service # todo.sr.ht echo -e "Do you want to use ${cyan}issue and bug tracker service${none}? ${cyan}1.Yes${none} or ${cyan}2.No${none}?" add_module "$todo_module" } function select_mode() { min_mode="Minimal Installation(Install only required modules)" max_mod="Maximize Installation(Install all modules)" adv_mod="Advanced Mode(Choose your own personalized modules)" quit="Quit" mode=("$min_mode" "$max_mod" "$adv_mod" "$quit") PS3="Select the installation mode: " select item in "${mode[@]}"; do case $item in "$min_mode") echo "$item" select_version_control break ;; "$max_mod") echo "$item" modules=$modules"$git_module $hg_module $build_module $list_module $man_module $paste_module $todo_module" break ;; "$adv_mod") echo "$item" advance_config break ;; "$quit") exit ;; quit) break ;; *) echo "Invalid option $REPLY" ;; esac done } ## Start select_mode # Set Domain echo -e "Set your ${cyan} Domain name (no http(s) prefix )${none} or ${cyan}s (skip) to use localhost${none}?" read -r domain_input echo echo "domain_input :$domain_input" if [[ "$domain_input" == 's' || -z "$domain_input" ]]; then echo -e "$yellow skip${none}" else domain_name=$domain_input fi echo "domain: $domain_name" echo echo generate_launch_shell "$modules" & progress $! "🤖 Generate Launch Shell" echo echo sed "s/{{MODULES}}/$modules/" ./template/Dockerfile.template >Dockerfile & progress $! "🐋 Generate Dockerfile" echo echo build_base_image & progress $! "🐋 Build Base Image" echo echo generate_keys & progress $! "🔒 Generate Keys" echo echo echo -e "$(