Skip to content

Instantly share code, notes, and snippets.

@rickybell
Last active May 30, 2019 19:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rickybell/77583fa62be725cf70815f461ea7ffa0 to your computer and use it in GitHub Desktop.
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.
#!/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
@rickybell
Copy link
Author

rickybell commented May 29, 2019

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:

  1. Caminho completo do diretório de origem dos dados no cliente.
    <caminho_do_diretorio_local>
  2. Caminho e dados de acesso do servidor, sendo:
    <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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment