DrupALL (α) — обновление ядра Drupal всех сайтов

Ядро Drupal необходимо обновлять примерно раз в месяц, связано это с требованиями безопасности. В архив ядра входит более 1200 файлов, которые необходимо загружать на каждый сайт как можно быстрее, при выходе каждой новой версии. Задача по обновлению ядра легко решается на выделенном сервере посредством Drush, однако на обычных хостингах приходится обходиться классическим обновлением файлов по FTP. А когда сайтов становится больше и больше, их оперативное обновление становится рутиной.

DrupALL — скрипт, позволяющий массово обновлять ядра нескольких разных Drupal сайтов на разных хостингах. Для работы скрипту нужен файл drupall.accounts содержащий FTP аккаунты и директории назначения (собственно, где и установлены ядра). Необходимо принять меры по защите данного файла.

# This file contains drupal FTP accounts data: core versions, usernames, passwords, servers, destination folders
# Format:
# 7.x username password servername.tld /path/to/drupal
7.x drupal_ftp_user1 drupal1password drupalsite1.com /public_html
7.x drupal_ftp_user2 drupal2password drupalsite2.net /www/drupalsite2.net
7.x drupal_ftp_user3 drupal3password drupalsite3.org /httpdocs/

Для работы скрипта необходима установка утилит NcFTP.

sudo apt install ncftp
Файл скрипта drupall.sh:

#!/bin/bash

DRUPALL_DIR=`dirname $0`;
CORE_DIR=$DRUPALL_DIR/core;
DRUPALL_ACCOUNTS=$DRUPALL_DIR/drupall.accounts;
PWD=`pwd`;
cd $DRUPALL_DIR;
mkdir -p $CORE_DIR;
touch drupall.control.log;
NOW=`date +"%Y-%m-%d %H:%M:%S"`;
echo $NOW DrupALL : Drupal core updater for all sites is ready!;

#TODO: Parse RSS feed to extract link
URL=`echo https://ftp.drupal.org/files/projects/drupal-7.78.tar.gz`;
ARC=`basename $URL`; # drupal-7.78.tar.gz
WITHOUT_GZ=${ARC%.*}; # cut .gz:  drupal-7.78.tar
DIR=${WITHOUT_GZ%.*}; # cut .tar: drupal-7.78

NOW=`date +"%Y-%m-%d %H:%M:%S"`;
if [ ! -f $CORE_DIR/$ARC ]; then
    echo $NOW Downloading $URL
    wget -P $CORE_DIR $URL >> drupall.detailed.log 2>&1
else
    echo $NOW $ARC already downloaded
fi

NOW=`date +"%Y-%m-%d %H:%M:%S"`;
if [ ! -d $CORE_DIR/$DIR ]; then
    echo $NOW Extracting $ARC
    tar -xvzf core/$ARC -C $CORE_DIR >> drupall.detailed.log 2>&1
    # TODO .htaccess editing!
else
    echo $NOW $ARC already extracted
fi

cat $DRUPALL_ACCOUNTS | grep 7.x | while read LINE
do
    USER=`echo $LINE | awk '{print $2}'`;
    PASS=`echo $LINE | awk '{print $3}'`;
    HOST=`echo $LINE | awk '{print $4}'`;
    DEST=`echo $LINE | awk '{print $5}'`;

    flag=`cat drupall.control.log | grep -c "$DIR to [email protected]$HOST/$DEST"`;
    if [ $flag -eq 0 ]
    then
    NOW=`date +"%Y-%m-%d %H:%M:%S"`;
    echo $NOW Uploading $DIR to [email protected]$HOST/$DEST
    START_TIME=$SECONDS
    ncftpput -R -v -u $USER -p $PASS $HOST $DEST core/$DIR/*  >> drupall.detailed.log 2>&1
    ELAPSED_TIME=$(($SECONDS - $START_TIME))
    NOW=`date +"%Y-%m-%d %H:%M:%S"`;
    mm=$(($ELAPSED_TIME/60));
    ss=$(($ELAPSED_TIME%60));
    echo $NOW Uploading duration: $mm min $ss sec
    echo $NOW Uploaded $DIR to [email protected]$HOST/$DEST. Duration $mm min $ss sec  >> drupall.control.log
    else
    NOW=`date +"%Y-%m-%d %H:%M:%S"`;
    echo $NOW Skipping [email protected]$HOST/$DEST;
    fi
done

cd $PWD;

NOW=`date +"%Y-%m-%d %H:%M:%S"`;
echo $NOW DrupALL is finished! $DIR uploaded to all sites!