aboutsummaryrefslogtreecommitdiff
path: root/files/drupal
diff options
context:
space:
mode:
Diffstat (limited to 'files/drupal')
-rwxr-xr-xfiles/drupal453
1 files changed, 453 insertions, 0 deletions
diff --git a/files/drupal b/files/drupal
new file mode 100755
index 0000000..948ed43
--- /dev/null
+++ b/files/drupal
@@ -0,0 +1,453 @@
+#!/bin/bash
+#
+# Drupal management script.
+#
+
+BASE=${BASE:="/var/www/data"}
+SITES=${SITES:="$BASE/drupal"}
+SERIES="5 6 7"
+
+# Read a parameter from user
+function drupal_user_input {
+ local input
+ param="$1"
+ default="$2"
+ shift 2
+
+ if echo $param | grep -q 'passwd'; then
+ read -s -rep "$* (defaults to $default): " input
+ else
+ read -rep "$* (defaults to $default): " input
+ fi
+
+ if [ -z "$input" ]; then
+ export $param="$default"
+ else
+ export $param="$input"
+ fi
+}
+
+# Get drupal major version
+function drupal_get_major {
+ echo $1 | sed -e 's/\(^.\).*/\1/'
+}
+
+# Check for existing installations
+function drupal_check_existing {
+ if [ -e "$BASE/drupal-$1" ]; then
+ echo "Folder $BASE/drupal-$1 already exists, skipping"
+ exit 1
+ fi
+}
+
+# Check for non existing installations
+function drupal_check_not_existing {
+ if [ ! -e "$BASE/drupal-$1" ]; then
+ echo "Folder $BASE/drupal-$1 does not exist, skipping"
+ exit 1
+ fi
+}
+
+# Iterate through all drupal instances
+function drupal_iterate {
+ local command="$1"
+
+ if [ -z "$command" ]; then
+ return
+ fi
+
+ if [ "$command" != "cron" ] && [ "$SILENT" != "yes" ]; then
+ echo "Issuing $command in all installed instances..."
+ fi
+
+ for version in $SERIES; do
+ # Setup base folder
+ base="$BASE/drupal-$version"
+
+ if [ ! -d "$base/sites" ]; then
+ continue
+ fi
+
+ # Setup site folders with .onion sites in the end of the list
+ # and ignoring site names without dots
+ cd $base/sites
+ drupals="`ls -1 -I default -I all -I example.sites.php -I '*.onion' | grep "\." | xargs`"
+ drupals="$drupals `ls -1 | grep '.onion$' | xargs`"
+
+ # Issue updates
+ for drupal in $drupals; do
+ if [ -e "$drupal/settings.php" ]; then
+ hash="`sha1sum $drupal/settings.php | cut -d ' ' -f 1`"
+ # Process sites just once, avoiding symlinks
+ if echo $settings_hash | grep -q -v "$command:$hash"; then
+ settings_hash="$settings_hash-$command:$hash"
+ if [ "$command" != "cron" ] && [ "$SILENT" != "yes" ]; then
+ echo "Processing $drupal..."
+ fi
+
+ if [ "$command" == "update" ] || [ "$command" == "cron-update" ]; then
+ shift
+ drupal_update $command $drupal $*
+ else
+ drush -l $drupal $*
+ fi
+ fi
+ fi
+ done
+
+ # Fix permissions
+ if [ -e "$base/sites/all/modules" ]; then
+ chown -R root.root $base/sites/all/modules
+ fi
+ if [ -e "$base/sites/all/themes" ]; then
+ chown -R root.root $base/sites/all/themes
+ fi
+ done
+}
+
+# Update a drupal instance
+function drupal_update {
+ local method="$1"
+ local instance="$2"
+ local confirm
+ local line
+ shift 2
+
+ if [ "$method" == "cron-update" ]; then
+ confirm="-y"
+ fi
+
+ # See https://drupal.org/node/823146#comment-3319070
+ drush -l $instance up -u 1 --pipe | \
+ grep -v -E 'Unknown|Up-to-date|Atualizado|Desconhecido|^Array$|^\($|^\)$|OK' | while read line ; do
+ # Avoid automated core updates
+ code="`echo $line | cut -d " " -f1`"
+ if [ "$code" == "drupal" ]; then
+ echo "Core update available: $line"
+ else
+ echo "Updating $code on instance $instance..."
+ drush -l $instance up -u 1 $confirm $* $code
+ fi
+ done
+}
+
+# Deploy a fresh drupal tree
+function drupal_download {
+ if [ -z "$1" ]; then
+ echo "Usage: `basename $0` download <version> [--upgrade]"
+ exit 1
+ fi
+
+ # Setup
+ new="$1"
+ drupal_series="`drupal_get_major $new`"
+ cd $BASE
+ drupal_check_existing $new
+
+ # Deploy a fresh drupal tree
+ wget http://ftp.drupal.org/files/projects/drupal-$new.tar.gz
+ tar zxvf drupal-$new.tar.gz && rm drupal-$new.tar.gz
+ chown -R root.root drupal-$new/
+
+ # Upgrade mode, erase sites folder as the previous should be copied.
+ if [ "$2" == "--upgrade" ]; then
+ cd drupal-$new && rm -rf sites
+ fi
+
+ # Make symlink if needed.
+ if [ ! -e "$BASE/drupal-$drupal_series/CHANGELOG.txt" ]; then
+ # Deal with a possibly empty drupal folder
+ rmdir $BASE/drupal-$drupal_series &> /dev/null
+ ( cd $BASE && ln -s drupal-$new drupal-$drupal_series )
+ fi
+}
+
+# Upgrade a drupal instance using upstream source
+function drupal_upgrade {
+ if [ "$#" != "2" ]; then
+ echo "Usage: `basename $0` upgrade <old_version> <new_version>"
+ exit 1
+ fi
+
+ # Setup
+ old="$1"
+ new="$2"
+ old_major="`drupal_get_major $old`"
+ new_major="`drupal_get_major $new`"
+ extra_folders=""
+
+ if [ "$old_major" != "$new_major" ]; then
+ echo "Major versions doesn't match"
+ exit 1
+ fi
+
+ drupal_check_existing $new
+ drupal_check_not_existing $old
+
+ # Set drupal series
+ if [ "$new_major" == "4" ]; then
+ # Get minor versions
+ new_minor="`echo $new | sed -e "s/^$new_major\.//"`"
+ old_minor="`echo $old | sed -e "s/^$old_major\.//"`"
+
+ if [ "$old_minor" != "$new_minor" ]; then
+ echo "Minor versions doesn't match"
+ exit 1
+ fi
+ drupal_series="$new_major.$new_minor"
+ else
+ drupal_series="$new_major"
+ fi
+
+ cd $BASE
+
+ # Deploy a fresh drupal tree
+ drupal_download $new --upgrade
+
+ # Ensure we're in the new drupal folder
+ cd $BASE/drupal-$new
+
+ # Copy files
+ for file in .htaccess favicon.ico files sites; do
+ if [ ! -h "../drupal-$old/$file" ]; then
+ cp -a ../drupal-$old/$file . &> /dev/null
+ else
+ # Symlink handling
+ ln -sf $file `readlink ../drupal-$old/$file`
+ fi
+ done
+
+ # Extra folder
+ for extra_folder in $extra_folders; do
+ if [ -d ../drupal-$old/$extra_folder ]; then
+ cp -Rp ../drupal-$old/$extra_folder .
+ fi
+ done
+
+ # Legacy stuff for Drupal 4.x.x
+ if [ "$new_major" == "4" ]; then
+ rsync -av ../drupal-$old/themes/ themes/
+ for module in `ls ../drupal-$old/modules`; do
+ if [ -d "../drupal-$old/modules/$module" ]; then
+ cp -Rp ../drupal-$old/modules/$module modules/
+ fi
+ done
+ fi
+
+ # Copy installation profiles for Drupal 5.x or newer
+ if [ "$new_major" != "4" ]; then
+ rsync -av --exclude=default ../drupal-$old/profiles/ profiles/
+ fi
+
+ # Misc: copy image.imagemagick.inc to includes/ folder
+ if [ -e "../drupal-$old/sites/all/modules/image/image.imagemagick.inc" ]; then
+ cp ../drupal-$old/sites/all/modules/image/image.imagemagick.inc includes/
+ fi
+
+ # Modules that need stuff in the root folder
+ if [ -d "sites/all/modules/chatroom" ]; then
+ ln -s sites/all/modules/chatroom/chatroomread.php
+ fi
+
+ # Change symlink to point to the new location
+ cd $BASE ; rm -rf drupal-$drupal_series && ln -s drupal-$new drupal-$drupal_series
+
+ # Done
+ echo "Audit: `du -hs drupal-$old`"
+ echo "Audit: `du -hs drupal-$new`"
+ echo "Check procedure and remove drupal-$old once you make sure that everything is fine."
+}
+
+# Run a drupal makefile
+function drupal_make {
+ if [ -z "$1" ]; then
+ echo "Usage: `basename $0` make <series>"
+ exit 1
+ fi
+
+ series="$1"
+ base="$BASE/drupal-$series"
+ makefile="/usr/local/share/drupal/drupal$series.make"
+ makefile_themes="/usr/local/share/drupal/themes$series.make"
+
+ if [ -e "$makefile" ]; then
+ if [ ! -e "$base" ]; then
+ echo "Please download drupal code at $base first"
+ exit 1
+ fi
+ drush dl drush_make
+ ( cd $base && drush make -y --no-core $makefile )
+ ( cd $base && drush make -y --no-core $makefile_themes )
+ else
+ echo "Makefile not found: $makefile"
+ exit 1
+ fi
+}
+
+# Run the video scheduler
+function drupal_video_scheduler {
+ if [ -z "$2" ]; then
+ echo "Usage: `basename $0` video-scheduler <site> <series>"
+ exit 1
+ fi
+
+ site="$1"
+ version="$2"
+ drupal_folder="$BASE/drupal-$version"
+ scheduler="$drupal_folder/sites/all/modules/video/video_scheduler.php"
+ site_folder="$drupal_folder/sites/$site"
+
+ if [ -f "$scheduler" ] && [ -e "$site" ]; then
+ php $scheduler -r $drupal_folder -s $site
+ fi
+}
+
+# Install a new instance
+function drupal_install {
+ if [ -z "$2" ]; then
+ echo "Usage: `basename $0` install <series> <name> [aliases]"
+ exit 1
+ fi
+
+ # Required arguments
+ series="$1"
+ site="$2"
+ shift 2
+
+ # Site aliases
+ aliases="$*"
+
+ # Other parameters
+ domain="`facter domain`"
+
+ if [ "$series" != "6" ]; then
+ # Installation parameters
+ drupal_user_input name "$site" "Site name"
+ drupal_user_input site_email "$site@$domain" "Site email"
+ drupal_user_input profile "standard" "Installation profile"
+ drupal_user_input locale "pt-br" "Installation language"
+ drupal_user_input admin "$site" "Admin user"
+ drupal_user_input admin_email "$admin@$domain" "Admin email"
+ fi
+
+ if [ -e "$BASE/drupal-$series/sites/$site" ]; then
+ echo "Drupal $site already installed at $BASE/drupal-$series"
+ echo "Installation will be overwritten"
+ else
+ # Check installation
+ if [ ! -e "$BASE/drupal-$series" ]; then
+ echo "Please download your drupal $series farm first"
+ exit 1
+ fi
+
+ echo "Creating $SITES/$site/drupal/ structure..."
+ mkdir -p $SITES/$site/drupal/{files,themes,modules,libraries}
+
+ echo "Copying default configuration file..."
+ cp $BASE/drupal-$series/sites/default/default.settings.php $SITES/$site/drupal/settings.php
+ chmod 640 $SITES/$site/drupal/settings.php
+
+ (
+ echo "Creating symlinks..."
+ cd $BASE/drupal-$series/sites
+ ln -s $SITES/$site/drupal $site
+ ln -s $SITES/$site/drupal $site.$domain
+
+ for alias in $aliases; do
+ ln -s $SITES/$site/drupal $alias
+ done
+ )
+
+ # Aditional parameters
+ drupal_user_input dbname "$site" "Database name"
+ drupal_user_input dbuser "$site" "Database user"
+ drupal_user_input dbpasswd "$site" "Database passwd"
+ echo ""
+
+ echo "Configuring settings.php"
+ if [ "$series" == "7" ]; then
+ cat >> $SITES/$site/drupal/settings.php <<-EOF
+\$databases['default']['default'] = array(
+'driver' => 'mysql',
+'database' => '$dbname',
+'username' => '$dbuser',
+'password' => '$dbpasswd',
+'host' => 'localhost',
+'prefix' => '',
+);
+EOF
+ elif [ "$series" == "6" ]; then
+ cat >> $SITES/$site/drupal/settings.php <<-EOF
+\$db_url = 'mysql://$dbuser:$dbpasswd@localhost/$dbname';
+EOF
+ fi
+ fi
+
+ if [ "$series" != "6" ]; then
+ (
+ echo "Installing drupal $series for $site using $profile profile..."
+ cd $BASE/drupal-$series/
+ drush site-install $profile --site-name="$name" --site-mail="$site_email" --locale=$locale \
+ --uri="$site" --sites-subdir="$site" --account-name="$admin" --account-mail="$admin_email"
+ )
+ fi
+
+ # Fix permissions
+ if grep -qe "^$site:" /etc/passwd; then
+ chown root.$site $SITES/$site/drupal/settings.php
+ chown $site.$site $SITES/$site/drupal/{files,themes,modules,libraries}
+ else
+ chown root.www-data $SITES/$site/drupal/settings.php
+ chown www-data.www-data $SITES/$site/drupal/{files,themes,modules,libraries}
+ fi
+
+ if [ "$series" == "6" ]; then
+ echo "Now please access http://$site.$domain/install.php to continue with the installation."
+ else
+ echo "Done. Please check your installation."
+ fi
+}
+
+# Main procedure
+if [ -z "$1" ]; then
+ echo "Usage: `basename $0` <cron|download|update|updatedb|upgrade|run|make|video-scheduler|install> [arguments]"
+ exit 1
+elif [ "$1" == "cron" ]; then
+ drupal_iterate cron
+elif [ "$1" == "cron-update" ]; then
+ SILENT="yes"
+ drupal_iterate pm-refresh &> /dev/null
+ drupal_iterate cron-update
+elif [ "$1" == "download" ] || [ "$1" == "dl" ]; then
+ shift
+ drupal_download $*
+elif [ "$1" == "update" ]; then
+ shift
+ drupal_iterate pm-refresh
+ drupal_iterate update $*
+
+ # Update alone might not trigger updatedb in a farm for all instances.
+ drupal_iterate updatedb $*
+ drupal_iterate cc all $*
+elif [ "$1" == "updatedb" ]; then
+ shift
+ drupal_iterate updatedb $*
+elif [ "$1" == "upgrade" ]; then
+ shift
+ drupal_upgrade $*
+elif [ "$1" == "run" ]; then
+ shift
+ drupal_iterate $*
+elif [ "$1" == "make" ]; then
+ shift
+ drupal_make $*
+elif [ "$1" == "video-scheduler" ]; then
+ shift
+ drupal_video_scheduler $*
+elif [ "$1" == "install" ]; then
+ shift
+ drupal_install $*
+else
+ echo "No action $1"
+ exit 1
+fi