new files implementing cakephp site management
authorChris Koeritz <fred@gruntose.com>
Sat, 4 Nov 2017 23:38:23 +0000 (19:38 -0400)
committerChris Koeritz <fred@gruntose.com>
Sat, 4 Nov 2017 23:38:23 +0000 (19:38 -0400)
these are targeted mostly for site avenger sites, but can also be used with regular cakephp sites.

scripts/site_avenger/avcoreup [new file with mode: 0644]
scripts/site_avenger/powerup [new file with mode: 0644]
scripts/site_avenger/satis-refresh [new file with mode: 0644]
scripts/site_avenger/shared_site_mgr.sh [new file with mode: 0644]
scripts/site_avenger/site_avenger.config [new file with mode: 0644]
scripts/site_avenger/sitepush [new file with mode: 0644]
scripts/site_avenger/siteup [new file with mode: 0644]

diff --git a/scripts/site_avenger/avcoreup b/scripts/site_avenger/avcoreup
new file mode 100644 (file)
index 0000000..7ae0b6b
--- /dev/null
@@ -0,0 +1,58 @@
+#!/bin/bash
+
+# Author: Kevin Wentworth
+# Author: Chris Koeritz
+
+# updates just the site avenger core portion of an app.
+
+export WORKDIR="$( \cd "$(\dirname "$0")" && \pwd )"  # obtain the script's working directory.
+source "$WORKDIR/shared_site_mgr.sh"
+
+# get our defaults.
+source "$WORKDIR/site_avenger.config"
+
+############################
+
+# main body of script.
+
+# check for parameters.
+app_dirname="$1"; shift
+
+sep
+
+check_application_dir "$APPLICATION_DIR"
+
+# find proper webroot where the site will be initialized.
+if [ -z "$app_dirname" ]; then
+  # no dir was passed, so guess it.
+  find_app_folder "$APPLICATION_DIR"
+else
+  test_app_folder "$APPLICATION_DIR" "$app_dirname"
+fi
+
+# where we expect to find our checkout folder underneath.
+full_app_dir="$APPLICATION_DIR/$app_dirname"
+
+# simplistic approach here; just go to the folder and pull the changes.
+
+pushd "$full_app_dir" &>/dev/null
+check_result "Changing to app path '$full_app_dir'"
+
+dir="avenger5/vendor/siteavenger/avcore"
+if [ ! -d $dir ]; then
+  echo "The application doesn't seem to use avcore: $full_app_dir"
+else
+  pushd "$dir" &>/dev/null
+
+  git pull
+  check_result "Pulling git repo for avcore under '$full_app_dir'"
+
+  echo "Finished updating the avcore portion of site in ${app_dirname}."
+
+  popd &>/dev/null
+fi
+
+popd &>/dev/null
+
+sep
+
diff --git a/scripts/site_avenger/powerup b/scripts/site_avenger/powerup
new file mode 100644 (file)
index 0000000..7498261
--- /dev/null
@@ -0,0 +1,84 @@
+#!/bin/bash
+
+# Author: Kevin Wentworth
+# Author: Chris Koeritz
+
+# This script "powers up" a cakephp site by running the database migrations,
+# cleaning out the ORM cache, and fixing file permissions.
+# Note that the mysql database must already exist and allow permissions to
+# the configured username/password in config/app.php.
+# This script is currently highly specific to site avenger.
+
+# General Info:
+#
+# The naming scheme here is a little complex, but it's basically this...
+# A git repository is expected to be provided, and we will get all the code
+# for the web site from there.  The repository is expected to have a single
+# application "name" and one or more "themes".  By convention, the name
+# and the theme are often the same.
+# For example, let's say our app name is "turtle" and our theme name is "box".
+# The repo is checked out to a folder called "~/apps/turtle".
+# This script will want to use "turtle" as the app name.
+# It will have to be told the theme name, but will assume it's 'Turtle' to
+# start with.  The concept of the theme comes from cakephp.
+
+export WORKDIR="$( \cd "$(\dirname "$0")" && \pwd )"  # obtain the script's working directory.
+source "$WORKDIR/shared_site_mgr.sh"
+
+# get our defaults.
+source "$WORKDIR/site_avenger.config"
+
+############################
+
+# main body of script.
+
+# check for parameters.
+app_dirname="$1"; shift
+repo_name="$1"; shift
+theme_name="$1"; shift
+
+sep
+
+check_application_dir "$APPLICATION_DIR"
+
+# find proper webroot where the site will be initialized.
+if [ -z "$app_dirname" ]; then
+  # no dir was passed, so guess it.
+  find_app_folder "$APPLICATION_DIR"
+else
+  test_app_folder "$APPLICATION_DIR" "$app_dirname"
+fi
+
+# where we expect to find our checkout folder underneath.
+full_app_dir="$APPLICATION_DIR/$app_dirname"
+
+# use our default values for the repository and theme if they're not provided.
+if [ -z "$repo_name" ]; then
+  repo_name="$app_dirname"
+fi
+if [ -z "$theme_name" ]; then
+  theme_name="$(capitalize_first_char ${app_dirname})"
+fi
+
+echo "Repository: $repo_name"
+echo "Theme name: $theme_name"
+sep
+
+# this should set the site_store_path variable if everything goes well.
+update_repo "$full_app_dir" "$CHECKOUT_DIR_NAME" "$DEFAULT_REPOSITORY_ROOT" "$repo_name"
+check_result "Updating the repository storage directory"
+
+# update the site to load dependencies.
+sep
+composer_repuff "$site_store_path"
+check_result "Installing site dependencies with composer"
+
+# set up the symbolic links needed to achieve siteliness.
+sep
+
+create_site_links "$site_store_path" "$theme_name"
+
+sep
+
+echo "Finished powering up the site in '${app_dirname}'."
+
diff --git a/scripts/site_avenger/satis-refresh b/scripts/site_avenger/satis-refresh
new file mode 100644 (file)
index 0000000..eb002dd
--- /dev/null
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+# Author: Kevin Wentworth
+
+#hmmm: have not done anything with this yet.
+
+# Reference:
+# http://askubuntu.com/a/465113 - where to put scripts
+# chmod +x satis-refresh - for execute permissions
+
+cd /srv/users/avenger/apps/avenger-packages/satis
+
+php bin/satis build /srv/users/avenger/apps/avenger-packages/satis/satis.json /srv/users/avenger/apps/avenger-packages/public -n
+
+echo "DONE"
diff --git a/scripts/site_avenger/shared_site_mgr.sh b/scripts/site_avenger/shared_site_mgr.sh
new file mode 100644 (file)
index 0000000..3bd9665
--- /dev/null
@@ -0,0 +1,305 @@
+#!/bin/bash
+
+# Author: Kevin Wentworth
+# Author: Chris Koeritz
+
+# This contains a bunch of reusable functions that help out in managing websites.
+
+source "$FEISTY_MEOW_SCRIPTS/core/launch_feisty_meow.sh"
+
+# configure feisty revision control to ignore vendor folders.
+export NO_CHECKIN_VENDOR=true
+
+# tests that the main storage folder for apps exists.
+function check_application_dir()
+{
+  local appdir="$1"; shift
+  if [ ! -d "$appdir" ]; then
+    echo "Creating the apps directory: $appdir"
+    mkdir "$appdir"
+    check_result "Making apps directory when not already present"
+  fi
+}
+
+# this function will seek out top-level directories in the target directory passed in.
+# if there is only one directory, then it is returned (in the app_dirname variable).
+# otherwise, the user is asked which directory to use.
+# important: this sets a global variable app_dirname to the application's directory name.
+function find_app_folder()
+{
+  local appsdir="$1"; shift
+
+  # throw away any prior value so no confusion arises.
+  unset app_dirname
+  
+  # count number of directories...  if exactly one, then choose it.
+  numdirs=$(count_directories "$appsdir")
+
+  if [ $numdirs -eq 0 ]; then
+    sep
+    echo "There are no directories in the application directory:"
+    echo "  $appsdir"
+    echo "Please create a directory for the site storage, based on the application"
+    echo "name that you want to work on.  Or you can just pass the directory name"
+    echo "on the command line, e.g.:"
+    echo "  $(basename $0) turtle"
+    sep
+    exit 1
+  elif [ $numdirs -eq 1 ]; then
+    app_dirname="$(basename $(find "$appsdir" -mindepth 1 -maxdepth 1 -type d) )"
+    check_result "Guessing application folder"
+  else
+    # if more than one folder, force user to choose.
+    # Reference: https://askubuntu.com/questions/1705/how-can-i-create-a-select-menu-in-a-shell-script
+    holdps3="$PS3"
+    PS3='Please pick a folder for site initialization: '
+    options=( $(find "$appsdir" -mindepth 1 -maxdepth 1 -type d -exec basename {} ';') "Quit")
+    select app_dirname in "${options[@]}"; do
+      case $app_dirname in
+        "Quit") echo ; echo "Quitting from the script."; exit 1; ;;
+        *) echo ; echo "You picked folder '$app_dirname'" ; break; ;;
+      esac
+    done
+    if [ -z "$app_dirname" ]; then
+      echo "The folder was not provided.  This script needs a directory name"
+      echo "within which to initialize the site."
+      exit 1
+    fi
+    PS3="$holdps3"
+  fi
+  test_app_folder "$appsdir" "$app_dirname"
+  check_result "Testing application folder: $app_dirname"
+
+  echo "Application folder is: $app_dirname"
+}
+
+# ensures that the app directory name is valid.
+function test_app_folder()
+{
+  local appsdir="$1"; shift
+  local dir="$1"; shift
+
+  local combo="$appsdir/$dir"
+
+  if [ ! -d "$combo" ]; then
+    echo "Creating app directory: $combo"
+    mkdir "$combo"
+    check_result "Making application directory when not already present"
+  fi
+}
+
+# eases some permissions to enable apache to write log files and do other shopkeeping.
+function fix_site_perms()
+{
+  local site_dir="$1"; shift
+
+  if [ -f "$site_dir/bin/cake" ]; then
+    chmod -R a+rx "$site_dir/bin/cake"
+    check_result "Enabling execute bit on cake binary"
+  fi
+
+  if [ -d "$site_dir/logs" ]; then
+    chmod -R g+w "$site_dir/logs"
+    check_result "Enabling group write on site's Logs directory"
+  fi
+
+  if [ -d "$site_dir/tmp" ]; then
+    chmod -R g+w "$site_dir/tmp"
+    check_result "Enabling group write on site's tmp directory"
+  fi
+}
+
+# tosses out any cached object data that originated from the database.
+function clear_orm_cache()
+{
+  local site_dir="$1"; shift
+
+  if [ -f "$site_dir/bin/cake" ]; then
+    # flush any cached objects from db.
+    "$site_dir/bin/cake" orm_cache clear
+    check_result "Clearing ORM cache"
+  fi
+}
+
+# updates the revision control repository passed in.  this expects that the
+# repo will live in a folder called "checkout_dirname" under the app path,
+# which is the standard for our deployed sites.
+# important: this also sets a global variable called site_store_path to the full
+# path of the application.
+function update_repo()
+{
+  local full_app_dir="$1"; shift
+  local checkout_dirname="$1"; shift
+  local repo_root="$1"; shift
+  local repo_name="$1"; shift
+
+  # forget any prior value, since we are going to validate the path.
+  unset site_store_path
+
+  pushd "$full_app_dir" &>/dev/null
+  check_result "Switching to our app dir '$full_app_dir'"
+
+  local complete_path="$full_app_dir/$checkout_dirname"
+
+  # see if the checkout directory exits.  the repo_found variable is set to
+  # non-empty if we find it and it's a valid git repo.
+  repo_found=
+  if [ -d "$checkout_dirname" ]; then
+    # checkout directory exists, so let's check it.
+    pushd "$checkout_dirname" &>/dev/null
+    check_result "Switching to our checkout directory: $checkout_dirname"
+
+    # ask for repository name (without .git).
+    if git rev-parse --git-dir > /dev/null 2>&1; then
+      # this is a valid git repo.
+      repo_found=yes
+    fi
+    # we don't consider the state of having the dir exist but the repo be wrong as good.
+    if [ -z "$repo_found" ]; then
+      echo "There is a problem; this folder is not a valid repository:"
+      echo "  $full_app_dir"
+      echo "This script cannot continue unless the git repository is valid."
+      exit 1
+    fi
+    popd &>/dev/null
+  fi
+
+  if [ ! -z "$repo_found" ]; then
+    # a repository was found, so update the version here and leave.
+    echo "Repository $repo_name exists.  Updating it."
+    rgetem
+    check_result "Recursive checkout on: $complete_path"
+  else
+    # clone the repo since it wasn't found.
+    echo "Cloning repository $repo_name now."
+    git clone "$repo_root/$repo_name.git" $checkout_dirname
+    check_result "Git clone of repository: $repo_name"
+  fi
+
+  fix_site_perms "$complete_path"
+
+  # construct the full path to where the app will actually live.
+  site_store_path="$complete_path"
+
+  popd &>/dev/null
+}
+
+# this function goes to the directory specified and makes it right with
+# composer install.  this is as opposed to composer update, which could
+# change the state. 
+function composer_repuff()
+{
+  local site_store_path="$1"; shift
+
+  pushd "$site_store_path" &>/dev/null
+  check_result "Switching to our app dir '$site_store_path'"
+
+  echo "Updating site with composer..."
+
+  composer -n install
+  check_result "Composer installation step on '$site_store_path'."
+  echo "Site updated."
+
+#hmmm: argh global
+  dir="$site_store_path/$CHECKOUT_DIR_NAME/vendor/siteavenger/avcore"
+  if [ -d "$dir" ]; then
+    echo "Running avcore database migrations..."
+    logfile="$TMP/problem-avcore_db_migration-$(date_stringer).log"
+    ./bin/cake migrations migrate -p Avcore &>"$logfile"
+    if [ $? -ne 0 ]; then
+      echo "** FAILED: Database migrations for avcore.  Check log file in: $logfile"
+      # we keep going, because some sites aren't ready for this yet.
+    else
+      \rm "$logfile"
+      echo "Database for avcore migrated."
+    fi
+  fi
+
+  clear_orm_cache
+
+  popd &>/dev/null
+}
+
+# this function creates the links needed to make the site function properly given our
+# various dependencies and infrastructure.
+function create_site_links()
+{
+  local site_store_path="$1"; shift
+  local theme_name="$1"; shift
+
+  echo "Creating symbolic links for site assets..."
+
+  # jump into the site path so we can start making relative links.
+  pushd "$site_store_path" &>/dev/null
+  check_result "Switching to our app dir '$site_store_path'"
+
+  pushd webroot &>/dev/null
+
+  # remove all symlinks that might plague us.
+  find . -maxdepth 1 -type l -exec rm -f {} ';'
+  check_result "Cleaning out links in webroot"
+
+  # link in the avcore plugin.
+  make_safe_link "../vendor/siteavenger/avcore/webroot" avcore
+
+  # make the link for our theme as a lower-case version of the theme.
+  themelower=${theme_name,,}
+  make_safe_link "../plugins/$theme_name/webroot" "$themelower"
+
+  # link in any favicon files.
+  if [ -d "../plugins/$theme_name/favicon" ]; then
+    local fave
+    for fave in "../plugins/$theme_name/favicon"/*; do
+      make_safe_link "$fave" .
+    done
+  fi
+
+  # get back out of webroot.
+  popd &>/dev/null
+
+  # hop up a level above where we had been.
+  pushd .. &>/dev/null
+
+  # link 'public' to webroot.
+  if [ -L public ]; then
+    # public is a symlink.
+    \rm public
+    check_result "Removing public directory symlink"
+  elif [ -d public ]; then
+    # public is a folder with default files.
+#hmmm: is that safe?
+    \rm -rf public
+    check_result "Removing public directory and contents"
+  fi
+
+  # create the main 'public' symlink
+#hmmm: argh global
+  make_safe_link $CHECKOUT_DIR_NAME/webroot public
+  check_result "Creating link to webroot called 'public'"
+
+#hmmm: public/$themelower/im will be created automatically by system user with appropriate permissions
+
+  echo Created symbolic links.
+
+  popd &>/dev/null
+  popd &>/dev/null
+}
+
+# fetches composer to make sure it's up to date.
+# (if powerup runs, composer install doesn't update git origin.)
+function update_composer_repository()
+{
+  local site_store_path="$1"; shift
+
+  pushd "$site_store_path" &>/dev/null
+
+  if git config remote.composer.url &>/dev/null; then
+    git pull composer
+    echo "Updated the composer repository."
+  else
+    echo "No composer repository was found for updating."
+  fi
+}
+
+
diff --git a/scripts/site_avenger/site_avenger.config b/scripts/site_avenger/site_avenger.config
new file mode 100644 (file)
index 0000000..b5467dc
--- /dev/null
@@ -0,0 +1,8 @@
+
+# this script provides the default values for the variables used in our site management scripts.
+
+APPLICATION_DIR="$HOME/apps"
+DEFAULT_REPOSITORY_ROOT="git@github.com:kwentworth"
+CHECKOUT_DIR_NAME="avenger5"
+
+
diff --git a/scripts/site_avenger/sitepush b/scripts/site_avenger/sitepush
new file mode 100644 (file)
index 0000000..99a8cbe
--- /dev/null
@@ -0,0 +1,93 @@
+#!/bin/bash
+
+# Author: Kevin Wentworth
+# Author: Chris Koeritz
+
+# checks the chosen site into the online git repository.
+
+export WORKDIR="$( \cd "$(\dirname "$0")" && \pwd )"  # obtain the script's working directory.
+source "$WORKDIR/shared_site_mgr.sh"
+
+# get our defaults.
+source "$WORKDIR/site_avenger.config"
+
+############################
+
+# main body of script.
+
+# check for parameters.
+app_dirname="$1"; shift
+repo_name="$1"; shift
+
+sep
+
+check_application_dir "$APPLICATION_DIR"
+
+# find proper webroot where the site will be initialized.
+if [ -z "$app_dirname" ]; then
+  # no dir was passed, so guess it.
+  find_app_folder "$APPLICATION_DIR"
+else
+  test_app_folder "$APPLICATION_DIR" "$app_dirname"
+fi
+
+# where we expect to find our checkout folder underneath.
+full_app_dir="$APPLICATION_DIR/$app_dirname"
+
+# use our default values for the repository and theme if they're not provided.
+if [ -z "$repo_name" ]; then
+  repo_name="$app_dirname"
+fi
+
+echo "Repository: $repo_name"
+sep
+
+# this should set the site_store_path variable if everything goes well.
+update_repo "$full_app_dir" "$CHECKOUT_DIR_NAME" "$DEFAULT_REPOSITORY_ROOT" "$repo_name"
+check_result "Updating the repository storage directory"
+
+sep
+
+update_composer_repository "$site_store_path" 
+
+sep
+
+# now finally do the real check-in for our site.
+
+pushd "$site_store_path" &>/dev/null
+rcheckin
+
+sep
+
+echo "Finished checking in the site at ${app_dirname}."
+
+
+
+
+
+
+echo bailing before deprecated code is run.; exit 0
+
+
+# see if there are any unmerged files, if so, do not try to push files
+if [[ `git ls-files -u` ]]; then
+  echo "Git: local changes!"
+  echo "Aborting. Please resolve manually and re-run this script"
+else
+  # http://stackoverflow.com/questions/5143795/how-can-i-check-in-a-bash-script-if-my-local-git-repo-has-changes
+  # see if there are any new files that need pushing (status will show new files)
+  if [[ `git status --porcelain` ]]; then
+    # changes
+    git add . -A
+    git commit -m "SERVER. Adding user uploaded files. [via sitepush]"
+    git push origin master
+    echo "Git: changes pushed to [master]"
+  else
+    # no changes
+    echo "Git: nothing to push. [master] up to date."
+  fi
+fi
+
+####
+
+
diff --git a/scripts/site_avenger/siteup b/scripts/site_avenger/siteup
new file mode 100644 (file)
index 0000000..205f342
--- /dev/null
@@ -0,0 +1,54 @@
+#!/bin/bash
+
+# Author: Kevin Wentworth
+# Author: Chris Koeritz
+
+# updates a site avenger app.
+
+export WORKDIR="$( \cd "$(\dirname "$0")" && \pwd )"  # obtain the script's working directory.
+source "$WORKDIR/shared_site_mgr.sh"
+
+# get our defaults.
+source "$WORKDIR/site_avenger.config"
+
+############################
+
+# main body of script.
+
+# check for parameters.
+app_dirname="$1"; shift
+repo_name="$1"; shift
+
+sep
+
+check_application_dir "$APPLICATION_DIR"
+
+# find proper webroot where the site will be initialized.
+if [ -z "$app_dirname" ]; then
+  # no dir was passed, so guess it.
+  find_app_folder "$APPLICATION_DIR"
+else
+  test_app_folder "$APPLICATION_DIR" "$app_dirname"
+fi
+
+# where we expect to find our checkout folder underneath.
+full_app_dir="$APPLICATION_DIR/$app_dirname"
+
+# use our default values for the repository and theme if they're not provided.
+if [ -z "$repo_name" ]; then
+  repo_name="$app_dirname"
+fi
+
+echo "Repository: $repo_name"
+sep
+
+# this should set the site_store_path variable if everything goes well.
+update_repo "$full_app_dir" "$CHECKOUT_DIR_NAME" "$DEFAULT_REPOSITORY_ROOT" "$repo_name"
+check_result "Updating the repository storage directory"
+
+####
+
+sep
+
+echo "Finished updating the site in ${app_dirname}."
+