我在生产服务器上维护大量 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 上的命令行功能足够强大,可以比我拼凑解决方案更快地处理此问题。
谢谢!
答案1
好的,这里有一些 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 是什么意思。如果你真的想要为 rsync 保留单独的日志文件,你可以使用 sed 将斜杠更改为破折号,或者你可以使用 awk 并分离出站点名称并将其用作日志文件的基本名称。例如:
LOG=`echo $i | awk -F/ '{print $2}'`
答案2
我在问题发布几个小时后写了这篇文章,但没有得到代表的回复,所以我现在就发布了。我觉得 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