Назад | Перейти на главную страницу

Плагин Rsync для многих локальных установок WordPress через скрипт или cli

Я поддерживаю большое количество установок Wordpress на производственном сервере, и мы планируем развернуть InfiniteWP для управления этими установками. Я ищу способ сценария распространения папки плагина для всех этих установок.

На сервере wp-prod все сайты хранятся в / srv / sitename / site /. Плагин необходимо скопировать из ~ / iws-plugin в / srv / sitename / site / wp-content / plugins /

Вот какой-то псевдокод, объясняющий, что мне нужно делать:

array dirs = <all folders in /srv>
for each d in dirs
   if exits "/srv/d/site/wp-content/plugins"
     rsync -avzh --log-file=~/d.log ~/plugin_base_folder /srv/d/site/wp-content/plugins/
   else
     touch d.log
     echo 'plugin folder for "d" not found' >> ~/d.log
   end
end

Я просто не знаю, как это сделать из cli или через bash. Я могу (и буду) возиться с сценарием bash или ruby ​​на моем тестовом сервере, но я думаю, что командная строка здесь, в SF, достаточно сильна, чтобы справиться с этой проблемой гораздо быстрее, чем я могу собрать решение.

Спасибо!

Я написал это через несколько часов после того, как вопрос был опубликован, но у меня нет репутации и я отвечу на мой собственный вопрос без ожидания, поэтому я отправляю его сейчас. Мне кажется, что команды cli или сценарий bash могли бы сделать это намного более кратко, но это то, что я написал для выполнения этой работы, и это довольно ясно (даже до того, как я так подробно задокументировал это)

Будем очень благодарны за любые отзывы об этом или альтернативных решениях:

#!/usr/bin/env ruby

# rrdist.rb
# Utility script to copy the contents of a folder to multiple destinations
# ****LOCAL USE ONLY (FOR NOW)******
# TODO: Make it interactive (get source and destination via std in or file)
#       Make it work remotely (rsync over ssh)

require 'pathname'

#set the log folder location
log_folder = Pathname(File.expand_path('~')).join('logs')
#TODO: get this at runtime and validate it


#set the source folder
source_folder = Pathname(File.expand_path('~')).join('iwp-client')
#TODO: get this at runtime and validate it

#set the destination parent folder
dest_parent_folder = '/srv'
#TODO: get this at runtime and validate it

#get all the subfolders of the parent
target_dirs = Dir.glob('/srv/*')

#process each child folder
target_dirs.each do |folder|
    #first, build the destination string for the rsync command
    destination = "#{folder}/site/wp-content/plugins/"

        #set up the name of the log file
        vhost = (Pathname(folder).each_filename.to_a)[1]
    #TO-DO: If the destination is gotten at run time, then this will not work - FIX IT!

    #set up the actual log
    log = "#{log_folder}/#{vhost}.rrdist.log"

    #make sure the destination exists!
    if  File.directory?(destination)
        #build the rsync command
        command = "rsync -avzh --log-file=#{log} #{source_folder} #{destination}"
        puts "Executing #{command}"
        #check if the command exit code was 0
        exit_code = system("#{command}")
        if !exit_code
            File.open("#{log}", 'a+') do |f|
                            f.write("#{Time.now} -- [ERROR] -- #{folder} -- rsync command failed: #{command} \n")
                    end
        end
    #when the destination isn't there, log it
    else
        puts "#{destination} doesn't exist!"
        #puts "Logfile written to #{log_folder}/#{vhost}.log"
        #write the log file (append or create if not there)
        File.open("#{log}", 'a+') do |f|
            f.write("#{Time.now} -- [ERROR] -- #{folder} -- Missing Plugin folder \n")
        end
    end
end

хорошо, вот немного bash .. во-первых, чтобы получить список всех сайтов с каталогами плагинов, вы можете использовать globbing и ls -d (т.е. не спускаться по каталогу, давать только запись в каталоге)

например.:

for i in `ls -d /srv/*/site/wp-content/plugins`
do
   #whatever rsync command you want to do, $i will evaluate to the directory name
   e.g rsync -avzh /source/plugindir $i
done

# второй проход, чтобы найти все случаи, когда каталог плагинов не существует.

LOGFILE = "/some/log"
echo 

    for i in ` ls -d /srv/*/site/wpcontent`
    do
      if [ ! -d ${i}"/plugins" ]
      then
         echo ${i}"is evil" > $LOGFILE
     fi 
    done

Я проигнорировал часть о наличии специализированных файлов журнала rsync для каждого каталога .. Я не был уверен, что вы имели в виду под путем ~ / d.log. вы можете сделать что-нибудь с sed, чтобы изменить косую черту на тире, если вы действительно хотите иметь отдельные файлы журнала для rsync, или вы можете использовать awk и выделить только имя сайта и использовать его как базовое имя для файла журнала. например:

LOG=`echo $i | awk -F/ '{print $2}'`