Last active
May 30, 2019 19:34
-
-
Save rickybell/77583fa62be725cf70815f461ea7ffa0 to your computer and use it in GitHub Desktop.
Script de cópia de sincronização de arquivos entre uma máquina cliente e um servidor.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ruby | |
require 'filewatcher' | |
require 'net/ssh' | |
require 'net/sftp' | |
## Validando a entrado dos parâmetros. | |
if (ARGV.size == 2) | |
# diretorio local | |
local_path = ARGV[0] | |
# diretório remoto | |
remote_path_data = ARGV[1].split("|") | |
# dados de acesso do servidor | |
server = remote_path_data[0] | |
port = remote_path_data[1] | |
user = remote_path_data[2] | |
password = remote_path_data[3] | |
remote_path = remote_path_data[4] | |
# definição das options para conexão. | |
options = { | |
:password => password, | |
} | |
if port.size > 0 | |
options[:port] = port | |
end | |
# Watcher de monitoração | |
Filewatcher.new(local_path).watch do |local_path_file_name, event| | |
# nome do arquivo manipulado | |
file_name = File.basename(local_path_file_name) | |
# definição dos paths do arquivo local e remoto. | |
local_file_path = [local_path,file_name].join("/") | |
remote_file_path = [remote_path,file_name].join("/") | |
# iniciando variaveis de validação das alterações | |
local_file_changed = nil | |
remote_file_modified_date = nil | |
#Conexão com servidor. | |
Net::SSH.start(server, user, options) do |ssh| | |
ssh.sftp.connect do |sftp| | |
#verificando qual o evento ocorreu com o arquivo, aqui atualização ou criação. | |
if(event == :updated || event == :created) | |
#verificação se não é diretório ou arquivos inválidos. | |
if !(File.directory?(file_name) || file_name=="." || file_name=="..") | |
begin | |
# recuperando as infos do arquivo remoto, se existe e sua última atualização. | |
sftp.dir.glob(remote_path,file_name).each do |file_name_remote| | |
remote_file_modified_date = Time.at(file_name_remote.attributes.mtime) | |
end | |
# obtendo se ouve mudança no arquivo | |
local_file_changed = File.stat(local_file_path).mtime > remote_file_modified_date | |
rescue | |
not_uploaded = true | |
end | |
# validando e executando o envio para o servidor | |
if not_uploaded or local_file_changed | |
puts "#{file_name} has changed and will be uploaded" , sftp | |
sftp.upload! local_file_path, remote_file_path | |
end | |
end | |
end | |
# executando a remoção do arquivo, caso tenha sido deletado. | |
if(event == :deleted) | |
# removendo | |
sftp.remove!(remote_file_path) | |
puts "arquivo deletado " + remote_file_path | |
end | |
end | |
end | |
end | |
else | |
puts "Numero de parametros errado." | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
File_sync.rb
Como descrito acima este é um script de sincronização de arquivos entre duas maquinas, um cliente e um servidor.
A linguagem escolhida foi o Ruby devido a fluencia no terminal que temos com ela.
Funcionamento:
O funcionamento do script foi pensado para ser incluído no crontab de uma máquina Linux ou alguma derivação Nix.
É necessário o informe de dois parâmetros, descritos abaixo.
Dependências:
Não há dependências muito elaboradas, não tem dependências externas, sendo escritas em Ruby mesmo, abaixo seguem os links das páginas de acesso e instalação:
Filewatcher
Net::SFTP
Net::SSH
gem install net-sftp
gem install net-ssh
gem install filewatcher
Nome do script:
file_sync.rb
Parametros:
<caminho_do_diretorio_local>
<servidor ou host>|<porta>|<usuario>|<password>|<caminho_do_diretorio_remoto>
Exemplo:
ruby file_sync.rb '/path/diretório/local' 'server|porta|usuario|senha|/path/diretório/remoto