From edadf945545572929eaaa24c87907ffeb9cb0ebe Mon Sep 17 00:00:00 2001
From: Derek Crudgington <derek@federated.company>
Date: Wed, 5 Apr 2023 20:49:41 +0000
Subject: [PATCH] Added .env file and upgrade additions

---
 bin/.env                 | 12 ++++++
 bin/install-federated.sh | 43 ++++++++++++++--------
 bin/upgrade.sh           |  5 +++
 lib/functions.sh         | 79 ++++++++++++++++++++++++++++++++++++++++
 lib/latest-versions      | 15 ++++++++
 5 files changed, 138 insertions(+), 16 deletions(-)
 create mode 100644 bin/.env
 create mode 100755 bin/upgrade.sh
 create mode 100644 lib/latest-versions

diff --git a/bin/.env b/bin/.env
new file mode 100644
index 0000000..904bbbd
--- /dev/null
+++ b/bin/.env
@@ -0,0 +1,12 @@
+# Domain name
+DOMAIN="test.com"
+
+# Company name
+COMPANY="Fang Free Inc"
+
+# Country 
+COUNTRY="US"
+
+# Administrator password
+ADMINPASS="d3r3k123"
+
diff --git a/bin/install-federated.sh b/bin/install-federated.sh
index 36473d7..285f238 100755
--- a/bin/install-federated.sh
+++ b/bin/install-federated.sh
@@ -37,24 +37,33 @@ get_config() {
   . /federated/lib/calcom.sh
   . /federated/lib/gitea.sh
   . /federated/lib/caddy.sh
-
+  
   COUNTRIES=("AF" "AL" "DZ" "AS" "AD" "AO" "AI" "AQ" "AG" "AR" "AM" "AW" "AU" "AT" "AZ" "BS" "BH" "BD" "BB" "BY" "BE" "BZ" "BJ" "BM" "BT" "BO" "BO" "BA" "BW" "BV" "BR" "IO" "BN" "BN" "BG" "BF" "BI" "KH" "CM" "CA" "CV" "KY" "CF" "TD" "CL" "CN" "CX" "CC" "CO" "KM" "CG" "CD" "CK" "CR" "CI" "CI" "HR" "CU" "CY" "CZ" "DK" "DJ" "DM" "DO" "EC" "EG" "SV" "GQ" "ER" "EE" "ET" "FK" "FO" "FJ" "FI" "FR" "GF" "PF" "TF" "GA" "GM" "GE" "DE" "GH" "GI" "GR" "GL" "GD" "GP" "GU" "GT" "GG" "GN" "GW" "GY" "HT" "HM" "VA" "HN" "HK" "HU" "IS" "IN" "ID" "IR" "IQ" "IE" "IM" "IL" "IT" "JM" "JP" "JE" "JO" "KZ" "KE" "KI" "KP" "KR" "KR" "KW" "KG" "LA" "LV" "LB" "LS" "LR" "LY" "LY" "LI" "LT" "LU" "MO" "MK" "MG" "MW" "MY" "MV" "ML" "MT" "MH" "MQ" "MR" "MU" "YT" "MX" "FM" "MD" "MC" "MN" "ME" "MS" "MA" "MZ" "MM" "MM" "NA" "NR" "NP" "NL" "AN" "NC" "NZ" "NI" "NE" "NG" "NU" "NF" "MP" "NO" "OM" "PK" "PW" "PS" "PA" "PG" "PY" "PE" "PH" "PN" "PL" "PT" "PR" "QA" "RE" "RO" "RU" "RU" "RW" "SH" "KN" "LC" "PM" "VC" "VC" "VC" "WS" "SM" "ST" "SA" "SN" "RS" "SC" "SL" "SG" "SK" "SI" "SB" "SO" "ZA" "GS" "SS" "ES" "LK" "SD" "SR" "SJ" "SZ" "SE" "CH" "SY" "TW" "TW" "TJ" "TZ" "TH" "TL" "TG" "TK" "TO" "TT" "TN" "TR" "TM" "TC" "TV" "UG" "UA" "AE" "GB" "US" "UM" "UY" "UZ" "VU" "VE" "VE" "VN" "VN" "VG" "VI" "WF" "EH" "YE" "ZM" "ZW")
 
-  echo -ne "\nFederated Stack install script\n\n"
-  read -p '* Enter domain name (domain.com): ' DOMAIN
-  read -p '* Enter company name (Domain Company): ' COMPANY
-  read -p '* Enter country code: ' COUNTRY
-  while [ true ]; do
-    if printf '%s\0' "${COUNTRIES[@]}" | grep -Fxqz -- "$COUNTRY"; then
-      break
-    else
-      read -p "* Invalid, choose a country code (US, GB, HK, etc): " COUNTRY
-    fi
-  done
-  read -sp '* Enter admin password to use for initial login: ' ADMINPASS
-  [ -z "$DOMAIN" ] && failcheck "Must enter a domain name"
-  [ -z "$COMPANY" ] && failcheck "Must enter a company name"
-  [ -z "$ADMINPASS" ] && failcheck "Must enter a admin password"
+  if [ -f "/federated/bin/.env" ]; then
+    . /federated/bin/.env
+    [ -z "$DOMAIN" ] && failcheck "/federated/bin/.env doesn't include DOMAIN"
+    [ -z "$COMPANY" ] && failcheck "/federated/bin/.env doesn't include COMPANY"
+    [ -z "$COUNTRY" ] && failcheck "/federated/bin/.env doesn't include COUNTRY"
+    [ -z "$ADMINPASS" ] && failcheck "/federated/bin/.env doesn't include ADMINPASS"
+    exit 5;
+  else
+    echo -ne "\nFederated Stack install script\n\n"
+    read -p '* Enter domain name (domain.com): ' DOMAIN
+    read -p '* Enter company name (Domain Company): ' COMPANY
+    read -p '* Enter country code: ' COUNTRY
+    while [ true ]; do
+      if printf '%s\0' "${COUNTRIES[@]}" | grep -Fxqz -- "$COUNTRY"; then
+        break
+      else
+        read -p "* Invalid, choose a country code (US, GB, HK, etc): " COUNTRY
+      fi
+    done
+    read -sp '* Enter admin password to use for initial login: ' ADMINPASS
+    [ -z "$DOMAIN" ] && failcheck "Must enter a domain name"
+    [ -z "$COMPANY" ] && failcheck "Must enter a company name"
+    [ -z "$ADMINPASS" ] && failcheck "Must enter a admin password"
+  fi
 }
 
 while getopts d OPTION; do
@@ -66,6 +75,8 @@ done
 # Download lib scripts and take in setup variables
 get_config
 
+exit 99;
+
 echo -ne "\n\nStarting Federated install for $DOMAIN\n"
 
 # Check that we have docker installed.  Check that
diff --git a/bin/upgrade.sh b/bin/upgrade.sh
new file mode 100755
index 0000000..4489319
--- /dev/null
+++ b/bin/upgrade.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+. /federated/lib/functions.sh
+
+upgrade_federated
diff --git a/lib/functions.sh b/lib/functions.sh
index 25bdcc0..ea4a2bb 100644
--- a/lib/functions.sh
+++ b/lib/functions.sh
@@ -26,6 +26,53 @@ spin() {
       sleep 1
     done
   done
+}
+install_federated() {
+  [ -d "/federated" ] && fail "Directory /federated already exists. Already installed?"
+  API_TOKEN="92d97f5aa371d420ebce7bc9a008ea8c6ec5d334"
+  git clone https://derek:$API_TOKEN@code.federated.company/federatedcomputer/Core /federated
+}
+upgrade_federated() {
+  echo -ne "\n* Updating federated install.."
+  [ ! -d "/federated" ] && fail "Directory /federated doesn't exist."
+
+  echo -ne "\n* Grabbing the latest version from Gitea.."
+
+  API_TOKEN="92d97f5aa371d420ebce7bc9a008ea8c6ec5d334"
+  cd /federated && git pull https://derek:$API_TOKEN@code.federated.company/federatedcomputer/Core &> /dev/null
+  [ $? -ne 0 ] && fail "Git pull not working on update of federated."
+
+  echo -ne "\n* Checking installed app versions with the latest.."
+
+  [ ! -f "/federated/lib/latest-versions" ] && fail "File /federated/lib/latest-version doesn't exist."
+  for i in `cat /federated/lib/latest-versions`; do
+    SERVICE=(${i//=/ });
+    APP="${SERVICE[0]}"
+    VERSION="${SERVICE[1]}"
+    echo -ne "\n** Checking $APP.."
+
+    [ ! -f "/federated/apps/$APP/.env" ] && fail "File /federated/apps/$APP/.env doesn't exist."
+    APP_VERSION=`grep IMAGE_VERSION /federated/apps/$APP/.env | awk -F= '{ print $2 }'`
+
+    if [ "$APP_VERSION" = "$VERSION" ]; then
+      echo -ne "\n   $APP is already at the latest version."
+    else
+      NC_COMMAND=`grep start_service /federated/lib/$APP.sh  | awk -F\" '{ print $4 }'`
+      echo -ne "\n   Upgrading $APP.."
+      echo -ne "\n   Shutting Down $APP.."
+      cd /federated/apps/$APP && docker-compose -f docker-compose.yml -p $APP down
+      sed -i "s#VERSION=.*#VERSION=$VERSION#g" /federated/apps/$APP/.env
+      echo -ne "\n   Starting Up $APP.."
+      start_service_upgrade "$APP" "$NC_COMMAND"
+      echo -ne "\n   Done Updating $APP to $VERSION."
+    fi
+  done
+
+  echo -ne "\n\n"
+
+#  kill -9 $SPINPID &> /dev/null
+#  echo -ne "done."
+
 }
 create_password() {
 #	eval $1_var=$1
@@ -33,6 +80,38 @@ create_password() {
   SECRET=`tr -cd '[:alnum:]' < /dev/urandom | fold -w32 | head -n1`
   echo "$SECRET";
 }
+start_service_upgrade() {
+  SERVICE="$1"
+  COMMAND="$2"
+
+  # Start /federated/apps/SERVICE with output to /dev/null
+  echo -ne "\n* Starting /federated/apps/$SERVICE service.."
+
+  if [ $DEBUG ]; then
+    # Start /federated/apps/SERVICE with output to console for debug
+    docker-compose -f /federated/apps/$SERVICE/docker-compose.yml -p $SERVICE up
+    [ $? -eq 0 ] && echo -ne "done.\n" || fail "There was a problem starting service /federated/apps/$SERVICE"
+  else
+    docker-compose -f /federated/apps/$SERVICE/docker-compose.yml -p $SERVICE up -d &> /dev/null
+
+    # Keep trying service port to make sure it's up before
+    # we proceed
+    RETRY="30"
+    while [ $RETRY -gt 0 ]; do
+      bash -c "$COMMAND" &> /dev/null
+      if [ $? -eq 0 ]; then
+        break
+      else
+        if [ "$RETRY" == 1 ]; then
+          docker-compose -f /federated/apps/$SERVICE/docker-compose.yml -p $SERVICE down &> /dev/null
+          fail "There was a problem starting service /federated/apps/$SERVICE\nCheck the output of 'docker logs $SERVICE' or turn on\ndebug with -d"
+        fi
+        ((RETRY--))
+        sleep 7
+      fi
+    done
+  fi
+}
 start_service() {
   SERVICE="$1"
   COMMAND="$2"
diff --git a/lib/latest-versions b/lib/latest-versions
new file mode 100644
index 0000000..e617571
--- /dev/null
+++ b/lib/latest-versions
@@ -0,0 +1,15 @@
+baserow=1.14.0
+calcom=1.0
+postgresql=14
+proxy=1.1
+nextcloud=25.0.3
+listmonk=v2.4.0
+panel=v1.11
+vaultwarden=1.28.0
+matrix=v1.75.0
+element=v1.11.19
+mail=11.3.1
+ldap=1.5.0
+dns=3.17.1
+wireguard=1.0.20210914
+gitea=1.19.0