Skip to content

Instantly share code, notes, and snippets.

@jamesdabbs
Created February 2, 2015 01:46
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 jamesdabbs/0e9074745677459f841d to your computer and use it in GitHub Desktop.
Save jamesdabbs/0e9074745677459f841d to your computer and use it in GitHub Desktop.
Sample script for syncing laptop with home server, suitable for cron-ing
#!/usr/bin/env ruby
require 'json'
require 'open3'
home = "/Users/james"
name = `hostname`.downcase
server = "walt.local"
mirror = "#{server}:/storage/mirrors/#{name}"
mirrors = {
"Documents" => ["#{home}/Documents", mirror],
"Pictures" => ["#{home}/Pictures", mirror],
"Code" => ["#{home}/src", mirror],
"Music" => ["#{server}:music/", "#{home}/Box Sync/Music"],
"Podcasts" => ["#{server}:podcasts/", "#{home}/Podcasts"]
}
logfile = "#{__FILE__}.log"
logs = File.exists?(logfile) ? JSON.parse(File.read logfile) : {}
at_exit do
File.open(logfile, "w") { |f| f.puts logs.to_json }
end
_, status = Open3.capture2e "ping -q -c3 #{server}"
if status.success?
mirrors.each do |name, map|
puts "Starting #{name}" if ENV["VERBOSE"]
logs[name] ||= {}
from, to = map
log, status = Open3.capture2e "rsync -avz --delete '#{from}' '#{to}'"
puts log if ENV["VERBOSE"]
logs[name][:last_run] = Time.now if status.success?
logs[name][:logs] ||= []
logs[name][:logs].unshift log: log, status: status.to_i
logs[name][:logs] = logs[name][:logs][0..20]
end
end
days = 24 * 60 * 60
late = logs.select { |name, data| Time.parse(data["last_run"]) < Time.now - 3 * days }
if late.any?
warn "The following mirrors have not run for at least 3 days: #{late.join ', '}"
warn "Sample log: #{late.first['log']}"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment