Plugin Rsync para muitas instalações locais do wordpress via script ou cli

1

Estou mantendo um grande número de instalações do wordpress em um servidor de produção e estamos procurando implantar o InfiniteWP para gerenciar essas instalações. Eu estou procurando uma maneira de roteirizar a distribuição da pasta do plugin para todas essas instalações.

No servidor wp-prod, todos os sites são armazenados em / srv / sitename / site / O plugin precisa ser copiado de ~ / iws-plugin para / srv / sitename / site / wp-content / plugins /

Aqui está um pseudo código para explicar o que preciso fazer:

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

Eu só não sei como fazer isso acontecer a partir do cli ou via bash. Eu posso (e vou) mexer com um script bash ou ruby no meu servidor de teste, mas eu estou pensando que o comando-line-fu aqui no SF é strong o suficiente para lidar com esse problema muito mais rapidamente do que eu posso hackear uma solução.

Obrigado!

    
por Nick Abbey 06.06.2014 / 17:20

2 respostas

0

ok aqui está um pouco de bash .. primeiro, para obter uma lista de todos os sites com diretórios de plugins que você pode usar globbing e ls -d (isto é, não desce o diretório, forneça apenas a entrada de diretório)

por exemplo:

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

#segundo passe para encontrar todos os casos em que o diretório de plugins não existe.

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

Eu ignorei a parte de ter arquivos de log rsync especializados para cada diretório. Eu não tinha certeza do que você queria dizer com o caminho ~ / d.log. você poderia fazer algo com sed para alterar as barras em traços se realmente quisesse ter arquivos de log separados para o rsync, ou poderia usar o awk e dividir apenas o nome do site e usá-lo como um nome base para o arquivo de log. por exemplo:

LOG='echo $i | awk -F/ '{print $2}''
    
por 07.06.2014 / 08:29
0

Eu escrevi isso algumas horas após a publicação da postagem, mas não tenho o representante e faço minha própria pergunta sem esperar, então estou postando agora. Eu sinto que comandos cli ou um script bash poderiam fazer isso de forma muito mais concisa, mas é isso que eu escrevi para fazer o trabalho e está bem claro (mesmo antes de documentar isso tão strongmente)

Qualquer comentário sobre isso ou soluções alternativas será muito apreciado:

#!/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
    
por 09.06.2014 / 16:57