Я поддерживаю большое количество установок 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}'`